From 8f9a2d17a53657208160ecc7a1abd997fc5587a5 Mon Sep 17 00:00:00 2001 From: ssdfasd <2156608475@qq.com> Date: Wed, 25 Mar 2026 23:34:12 +0800 Subject: [PATCH] Use indexed drawing in RHI triangle test --- tests/RHI/integration/triangle/main.cpp | 37 ++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/tests/RHI/integration/triangle/main.cpp b/tests/RHI/integration/triangle/main.cpp index a15fc4de..bde2a773 100644 --- a/tests/RHI/integration/triangle/main.cpp +++ b/tests/RHI/integration/triangle/main.cpp @@ -29,6 +29,8 @@ constexpr Vertex kTriangleVertices[] = { { { 0.5f, -0.5f, 0.0f, 1.0f }, { 0.0f, 0.0f, 1.0f, 1.0f } }, }; +constexpr uint32_t kTriangleIndices[] = { 0, 1, 2 }; + const char kTriangleHlsl[] = R"( struct VSInput { float4 position : POSITION; @@ -149,6 +151,8 @@ private: RHIBuffer* mVertexBuffer = nullptr; RHIResourceView* mVertexBufferView = nullptr; + RHIBuffer* mIndexBuffer = nullptr; + RHIResourceView* mIndexBufferView = nullptr; RHIPipelineState* mPipelineState = nullptr; }; @@ -180,6 +184,23 @@ void TriangleTest::InitializeTriangleResources() { mVertexBufferView = GetDevice()->CreateVertexBufferView(mVertexBuffer, viewDesc); ASSERT_NE(mVertexBufferView, nullptr); + BufferDesc indexBufferDesc = {}; + indexBufferDesc.size = sizeof(kTriangleIndices); + indexBufferDesc.stride = sizeof(uint32_t); + indexBufferDesc.bufferType = static_cast(BufferType::Index); + + mIndexBuffer = GetDevice()->CreateBuffer(indexBufferDesc); + ASSERT_NE(mIndexBuffer, nullptr); + mIndexBuffer->SetData(kTriangleIndices, sizeof(kTriangleIndices)); + mIndexBuffer->SetStride(sizeof(uint32_t)); + mIndexBuffer->SetBufferType(BufferType::Index); + + ResourceViewDesc indexViewDesc = {}; + indexViewDesc.dimension = ResourceViewDimension::Buffer; + indexViewDesc.format = static_cast(Format::R32_UInt); + mIndexBufferView = GetDevice()->CreateIndexBufferView(mIndexBuffer, indexViewDesc); + ASSERT_NE(mIndexBufferView, nullptr); + GraphicsPipelineDesc pipelineDesc = CreateTrianglePipelineDesc(GetBackendType()); mPipelineState = GetDevice()->CreatePipelineState(pipelineDesc); ASSERT_NE(mPipelineState, nullptr); @@ -201,16 +222,29 @@ void TriangleTest::ShutdownTriangleResources() { mVertexBufferView = nullptr; } + if (mIndexBufferView != nullptr) { + mIndexBufferView->Shutdown(); + delete mIndexBufferView; + mIndexBufferView = nullptr; + } + if (mVertexBuffer != nullptr) { mVertexBuffer->Shutdown(); delete mVertexBuffer; mVertexBuffer = nullptr; } + + if (mIndexBuffer != nullptr) { + mIndexBuffer->Shutdown(); + delete mIndexBuffer; + mIndexBuffer = nullptr; + } } void TriangleTest::RenderFrame() { ASSERT_NE(mPipelineState, nullptr); ASSERT_NE(mVertexBufferView, nullptr); + ASSERT_NE(mIndexBufferView, nullptr); RHICommandList* cmdList = GetCommandList(); RHICommandQueue* cmdQueue = GetCommandQueue(); @@ -233,7 +267,8 @@ void TriangleTest::RenderFrame() { uint64_t offsets[] = { 0 }; uint32_t strides[] = { sizeof(Vertex) }; cmdList->SetVertexBuffers(0, 1, vertexBuffers, offsets, strides); - cmdList->Draw(3); + cmdList->SetIndexBuffer(mIndexBufferView, 0); + cmdList->DrawIndexed(static_cast(sizeof(kTriangleIndices) / sizeof(kTriangleIndices[0]))); EndRender();