From ab29013c01c6527d5e4db8cd42577af6425d249e Mon Sep 17 00:00:00 2001 From: ssdfasd <2156608475@qq.com> Date: Sat, 14 Mar 2026 14:20:57 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8DVertexBuffer/IndexBuff?= =?UTF-8?q?er=20SizeInBytes=E9=94=99=E8=AF=AF=E5=8F=8AFence=20Signal?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- engine/src/RHI/D3D12/D3D12Device.cpp | 14 ++++++++------ engine/src/RHI/D3D12/D3D12RenderContext.cpp | 8 ++++++-- engine/src/RHI/D3D12/D3D12StaticMeshComponent.cpp | 8 ++++++++ 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/engine/src/RHI/D3D12/D3D12Device.cpp b/engine/src/RHI/D3D12/D3D12Device.cpp index 50f8b45a..cd1332e3 100644 --- a/engine/src/RHI/D3D12/D3D12Device.cpp +++ b/engine/src/RHI/D3D12/D3D12Device.cpp @@ -1,5 +1,7 @@ #include "D3D12RHI.h" +#include "D3D12Resources.h" #include +#include #include #include #include @@ -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(buffer); + D3D12VertexBuffer* vb = static_cast(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(buffer); + D3D12IndexBuffer* ib = static_cast(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); } } diff --git a/engine/src/RHI/D3D12/D3D12RenderContext.cpp b/engine/src/RHI/D3D12/D3D12RenderContext.cpp index 5411f4ea..aaed20fd 100644 --- a/engine/src/RHI/D3D12/D3D12RenderContext.cpp +++ b/engine/src/RHI/D3D12/D3D12RenderContext.cpp @@ -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(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"); } diff --git a/engine/src/RHI/D3D12/D3D12StaticMeshComponent.cpp b/engine/src/RHI/D3D12/D3D12StaticMeshComponent.cpp index f17a26a5..23e6707a 100644 --- a/engine/src/RHI/D3D12/D3D12StaticMeshComponent.cpp +++ b/engine/src/RHI/D3D12/D3D12StaticMeshComponent.cpp @@ -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"); } } }