Add RHI buffer SRV and UAV view support

This commit is contained in:
2026-04-08 18:05:00 +08:00
parent 162f1cc12e
commit 4728b09ae8
28 changed files with 988 additions and 43 deletions

View File

@@ -57,5 +57,9 @@ target_include_directories(rhi_unit_tests PRIVATE
${CMAKE_SOURCE_DIR}/mvs/OpenGL/package/include/
)
if(MSVC)
target_compile_options(rhi_unit_tests PRIVATE /FS)
endif()
include(GoogleTest)
gtest_discover_tests(rhi_unit_tests)

View File

@@ -2,6 +2,7 @@
#include "XCEngine/RHI/D3D12/D3D12DescriptorSet.h"
#include "XCEngine/RHI/RHIDescriptorPool.h"
#include "XCEngine/RHI/RHIDescriptorSet.h"
#include "XCEngine/RHI/RHIBuffer.h"
#include "XCEngine/RHI/RHISampler.h"
#include "XCEngine/RHI/RHIResourceView.h"
#include "XCEngine/RHI/RHITexture.h"
@@ -362,6 +363,59 @@ TEST_P(RHITestFixture, DescriptorSet_ConstantBufferSize) {
delete pool;
}
TEST_P(RHITestFixture, DescriptorSet_Update_BufferResourceView) {
DescriptorPoolDesc poolDesc = {};
poolDesc.type = DescriptorHeapType::CBV_SRV_UAV;
poolDesc.descriptorCount = 10;
poolDesc.shaderVisible = true;
RHIDescriptorPool* pool = GetDevice()->CreateDescriptorPool(poolDesc);
ASSERT_NE(pool, nullptr);
BufferDesc bufferDesc = {};
bufferDesc.size = 256;
bufferDesc.stride = 16;
bufferDesc.bufferType = static_cast<uint32_t>(BufferType::Storage);
RHIBuffer* buffer = GetDevice()->CreateBuffer(bufferDesc);
ASSERT_NE(buffer, nullptr);
ResourceViewDesc viewDesc = {};
viewDesc.dimension = ResourceViewDimension::StructuredBuffer;
viewDesc.structureByteStride = 16;
viewDesc.elementCount = 16;
RHIResourceView* srv = GetDevice()->CreateShaderResourceView(buffer, viewDesc);
ASSERT_NE(srv, nullptr);
DescriptorSetLayoutBinding binding = {};
binding.binding = 0;
binding.type = static_cast<uint32_t>(DescriptorType::SRV);
binding.count = 1;
binding.visibility = static_cast<uint32_t>(ShaderVisibility::All);
binding.resourceDimension = ResourceViewDimension::StructuredBuffer;
DescriptorSetLayoutDesc layoutDesc = {};
layoutDesc.bindingCount = 1;
layoutDesc.bindings = &binding;
RHIDescriptorSet* set = pool->AllocateSet(layoutDesc);
ASSERT_NE(set, nullptr);
ASSERT_NE(set->GetBindings(), nullptr);
EXPECT_EQ(set->GetBindings()[0].resourceDimension, ResourceViewDimension::StructuredBuffer);
set->Update(0, srv);
set->Shutdown();
delete set;
srv->Shutdown();
delete srv;
buffer->Shutdown();
delete buffer;
pool->Shutdown();
delete pool;
}
TEST_P(RHITestFixture, DescriptorSet_MultipleAllocations_AdvanceDescriptorOffsets) {
DescriptorPoolDesc poolDesc = {};
poolDesc.type = DescriptorHeapType::CBV_SRV_UAV;
@@ -402,3 +456,69 @@ TEST_P(RHITestFixture, DescriptorSet_MultipleAllocations_AdvanceDescriptorOffset
pool->Shutdown();
delete pool;
}
TEST_P(RHITestFixture, DescriptorSet_Update_BufferViews) {
DescriptorPoolDesc poolDesc = {};
poolDesc.type = DescriptorHeapType::CBV_SRV_UAV;
poolDesc.descriptorCount = 8;
poolDesc.shaderVisible = true;
RHIDescriptorPool* pool = GetDevice()->CreateDescriptorPool(poolDesc);
ASSERT_NE(pool, nullptr);
BufferDesc bufferDesc = {};
bufferDesc.size = 256;
bufferDesc.stride = 16;
bufferDesc.bufferType = static_cast<uint32_t>(BufferType::Storage);
RHIBuffer* buffer = GetDevice()->CreateBuffer(bufferDesc);
ASSERT_NE(buffer, nullptr);
ResourceViewDesc srvDesc = {};
srvDesc.dimension = ResourceViewDimension::StructuredBuffer;
srvDesc.structureByteStride = 16;
srvDesc.elementCount = 8;
ResourceViewDesc uavDesc = {};
uavDesc.dimension = ResourceViewDimension::RawBuffer;
uavDesc.firstElement = 4;
uavDesc.elementCount = 8;
RHIResourceView* srv = GetDevice()->CreateShaderResourceView(buffer, srvDesc);
RHIResourceView* uav = GetDevice()->CreateUnorderedAccessView(buffer, uavDesc);
ASSERT_NE(srv, nullptr);
ASSERT_NE(uav, nullptr);
DescriptorSetLayoutBinding bindings[2] = {};
bindings[0].binding = 0;
bindings[0].type = static_cast<uint32_t>(DescriptorType::SRV);
bindings[0].count = 1;
bindings[0].resourceDimension = ResourceViewDimension::StructuredBuffer;
bindings[1].binding = 1;
bindings[1].type = static_cast<uint32_t>(DescriptorType::UAV);
bindings[1].count = 1;
bindings[1].resourceDimension = ResourceViewDimension::RawBuffer;
DescriptorSetLayoutDesc layoutDesc = {};
layoutDesc.bindings = bindings;
layoutDesc.bindingCount = 2;
RHIDescriptorSet* set = pool->AllocateSet(layoutDesc);
ASSERT_NE(set, nullptr);
set->Update(0, srv);
set->Update(1, uav);
set->Bind();
set->Unbind();
set->Shutdown();
delete set;
srv->Shutdown();
delete srv;
uav->Shutdown();
delete uav;
buffer->Shutdown();
delete buffer;
pool->Shutdown();
delete pool;
}

View File

@@ -236,6 +236,57 @@ TEST_P(RHITestFixture, Device_CreateIndexBufferView) {
delete buffer;
}
TEST_P(RHITestFixture, Device_CreateStructuredBufferShaderResourceView) {
BufferDesc bufferDesc = {};
bufferDesc.size = 256;
bufferDesc.stride = 16;
bufferDesc.bufferType = static_cast<uint32_t>(BufferType::Storage);
RHIBuffer* buffer = GetDevice()->CreateBuffer(bufferDesc);
ASSERT_NE(buffer, nullptr);
ResourceViewDesc viewDesc = {};
viewDesc.dimension = ResourceViewDimension::StructuredBuffer;
viewDesc.structureByteStride = 16;
viewDesc.elementCount = 16;
RHIResourceView* srv = GetDevice()->CreateShaderResourceView(buffer, viewDesc);
ASSERT_NE(srv, nullptr);
EXPECT_TRUE(srv->IsValid());
EXPECT_EQ(srv->GetViewType(), ResourceViewType::ShaderResource);
EXPECT_EQ(srv->GetDimension(), ResourceViewDimension::StructuredBuffer);
srv->Shutdown();
delete srv;
buffer->Shutdown();
delete buffer;
}
TEST_P(RHITestFixture, Device_CreateRawBufferUnorderedAccessView) {
BufferDesc bufferDesc = {};
bufferDesc.size = 256;
bufferDesc.stride = 4;
bufferDesc.bufferType = static_cast<uint32_t>(BufferType::Storage);
RHIBuffer* buffer = GetDevice()->CreateBuffer(bufferDesc);
ASSERT_NE(buffer, nullptr);
ResourceViewDesc viewDesc = {};
viewDesc.dimension = ResourceViewDimension::RawBuffer;
viewDesc.elementCount = 64;
RHIResourceView* uav = GetDevice()->CreateUnorderedAccessView(buffer, viewDesc);
ASSERT_NE(uav, nullptr);
EXPECT_TRUE(uav->IsValid());
EXPECT_EQ(uav->GetViewType(), ResourceViewType::UnorderedAccess);
EXPECT_EQ(uav->GetDimension(), ResourceViewDimension::RawBuffer);
uav->Shutdown();
delete uav;
buffer->Shutdown();
delete buffer;
}
TEST_P(RHITestFixture, Device_CreateRenderTargetView_Multiple) {
TextureDesc texDesc = {};
texDesc.width = 256;