Add RHI buffer SRV and UAV view support
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user