fix: 修复VertexBuffer/IndexBuffer SizeInBytes错误及Fence Signal类型问题
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
#include "D3D12RHI.h"
|
||||
#include "D3D12Resources.h"
|
||||
#include <RHI\RHIDefines.h>
|
||||
#include <Rendering\Resources.h>
|
||||
#include <string>
|
||||
#include <windows.h>
|
||||
#include <stdio.h>
|
||||
@@ -717,10 +719,10 @@ void D3D12CommandList::SetPrimitiveTopology(PrimitiveTopology topology) {
|
||||
|
||||
void D3D12CommandList::SetVertexBuffer(uint32_t slot, IResource* buffer, uint32_t offset, uint32_t stride) {
|
||||
if (buffer) {
|
||||
D3D12Resource* d3dBuffer = static_cast<D3D12Resource*>(buffer);
|
||||
D3D12VertexBuffer* vb = static_cast<D3D12VertexBuffer*>(buffer);
|
||||
D3D12_VERTEX_BUFFER_VIEW vbView = {};
|
||||
vbView.BufferLocation = d3dBuffer->GetNative()->GetGPUVirtualAddress() + offset;
|
||||
vbView.SizeInBytes = (UINT)stride;
|
||||
vbView.BufferLocation = vb->GetNative()->GetGPUVirtualAddress() + offset;
|
||||
vbView.SizeInBytes = (UINT)vb->GetDesc().size;
|
||||
vbView.StrideInBytes = stride;
|
||||
m_commandList->IASetVertexBuffers(slot, 1, &vbView);
|
||||
}
|
||||
@@ -728,11 +730,11 @@ void D3D12CommandList::SetVertexBuffer(uint32_t slot, IResource* buffer, uint32_
|
||||
|
||||
void D3D12CommandList::SetIndexBuffer(IResource* buffer, uint32_t offset) {
|
||||
if (buffer) {
|
||||
D3D12Resource* d3dBuffer = static_cast<D3D12Resource*>(buffer);
|
||||
D3D12IndexBuffer* ib = static_cast<D3D12IndexBuffer*>(buffer);
|
||||
D3D12_INDEX_BUFFER_VIEW ibView = {};
|
||||
ibView.BufferLocation = d3dBuffer->GetNative()->GetGPUVirtualAddress() + offset;
|
||||
ibView.BufferLocation = ib->GetNative()->GetGPUVirtualAddress() + offset;
|
||||
ibView.Format = DXGI_FORMAT_R32_UINT;
|
||||
ibView.SizeInBytes = 0;
|
||||
ibView.SizeInBytes = (UINT)ib->GetDesc().size;
|
||||
m_commandList->IASetIndexBuffer(&ibView);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -101,9 +101,13 @@ void RenderContext::EndFrame() {
|
||||
queue->ExecuteCommandLists(&cmdListPtr, 1);
|
||||
EngineLog("EndFrame: after Execute");
|
||||
|
||||
EngineLog("EndFrame: before Signal");
|
||||
m_fenceValue++;
|
||||
queue->Signal(m_fence, m_fenceValue);
|
||||
EngineLog("EndFrame: before Wait, fenceValue=%llu", (unsigned long long)m_fenceValue);
|
||||
D3D12Fence* d3d12Fence = static_cast<D3D12Fence*>(m_fence);
|
||||
queue->Signal(d3d12Fence->GetNativeFence(), m_fenceValue);
|
||||
EngineLog("EndFrame: after Signal");
|
||||
|
||||
EngineLog("EndFrame: before Wait");
|
||||
m_fence->Wait(m_fenceValue);
|
||||
EngineLog("EndFrame: after Wait");
|
||||
}
|
||||
|
||||
@@ -70,16 +70,24 @@ bool StaticMeshComponent::Initialize(ICommandList* commandList, const char* file
|
||||
void StaticMeshComponent::Render(ICommandList* commandList) {
|
||||
if (!m_vertexBuffer) return;
|
||||
|
||||
printf("StaticMesh::Render - before SetVertexBuffer\n");
|
||||
commandList->SetVertexBuffer(0, m_vertexBuffer, 0, sizeof(MeshVertex));
|
||||
printf("StaticMesh::Render - after SetVertexBuffer\n");
|
||||
|
||||
if (m_subMeshes.empty()) {
|
||||
printf("StaticMesh::Render - before DrawInstanced\n");
|
||||
commandList->DrawInstanced(m_vertexCount, 1, 0, 0);
|
||||
printf("StaticMesh::Render - after DrawInstanced\n");
|
||||
}
|
||||
else {
|
||||
for (auto& pair : m_subMeshes) {
|
||||
SubMesh* submesh = pair.second;
|
||||
printf("StaticMesh::Render - before SetIndexBuffer\n");
|
||||
commandList->SetIndexBuffer(submesh->indexBuffer, 0);
|
||||
printf("StaticMesh::Render - after SetIndexBuffer\n");
|
||||
printf("StaticMesh::Render - before DrawIndexedInstanced\n");
|
||||
commandList->DrawIndexedInstanced(submesh->indexCount, 1, 0, 0, 0);
|
||||
printf("StaticMesh::Render - after DrawIndexedInstanced\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user