From 539df6a03afd43daba9637cfa3455af81d28f605 Mon Sep 17 00:00:00 2001 From: ssdfasd <2156608475@qq.com> Date: Sat, 28 Mar 2026 00:13:02 +0800 Subject: [PATCH] Add Vulkan resource view unit coverage --- tests/RHI/Vulkan/TEST_SPEC.md | 2 + tests/RHI/Vulkan/unit/CMakeLists.txt | 1 + tests/RHI/Vulkan/unit/test_views.cpp | 86 ++++++++++++++++++++++++++++ 3 files changed, 89 insertions(+) create mode 100644 tests/RHI/Vulkan/unit/test_views.cpp diff --git a/tests/RHI/Vulkan/TEST_SPEC.md b/tests/RHI/Vulkan/TEST_SPEC.md index 71cc0881..944c2c04 100644 --- a/tests/RHI/Vulkan/TEST_SPEC.md +++ b/tests/RHI/Vulkan/TEST_SPEC.md @@ -53,6 +53,8 @@ tests/RHI/Vulkan/ - SPIR-V / GLSL 两条 shader 创建路径 - 基于 GLSL 的 graphics pipeline 创建 - UAV 视图创建与 compute dispatch 写纹理链路 +- RTV / DSV / SRV 视图创建与原生 image-view 句柄有效性 +- `Sampler` 创建与原生 sampler 句柄有效性 - `DescriptorSet` 的原生句柄、绑定布局元数据与常量缓冲脏标记行为 - `PipelineLayout` 的显式 set-layout 聚合与 flat-count 合成逻辑 diff --git a/tests/RHI/Vulkan/unit/CMakeLists.txt b/tests/RHI/Vulkan/unit/CMakeLists.txt index 4b78fa68..fffc2d7a 100644 --- a/tests/RHI/Vulkan/unit/CMakeLists.txt +++ b/tests/RHI/Vulkan/unit/CMakeLists.txt @@ -16,6 +16,7 @@ set(TEST_SOURCES test_pipeline_layout.cpp test_render_pass.cpp test_shader.cpp + test_views.cpp ) add_executable(rhi_vulkan_tests ${TEST_SOURCES}) diff --git a/tests/RHI/Vulkan/unit/test_views.cpp b/tests/RHI/Vulkan/unit/test_views.cpp new file mode 100644 index 00000000..7c113c59 --- /dev/null +++ b/tests/RHI/Vulkan/unit/test_views.cpp @@ -0,0 +1,86 @@ +#if defined(XCENGINE_SUPPORT_VULKAN) + +#include "fixtures/VulkanTestFixture.h" +#include "XCEngine/RHI/RHIResourceView.h" +#include "XCEngine/RHI/RHISampler.h" +#include "XCEngine/RHI/Vulkan/VulkanResourceView.h" +#include "XCEngine/RHI/Vulkan/VulkanSampler.h" + +using namespace XCEngine::RHI; + +namespace { + +TEST_F(VulkanGraphicsFixture, CreateRenderTargetViewProducesValidNativeImageView) { + RHITexture* texture = m_device->CreateTexture(CreateColorTextureDesc(8, 8)); + ASSERT_NE(texture, nullptr); + + RHIResourceView* rtv = m_device->CreateRenderTargetView(texture, {}); + ASSERT_NE(rtv, nullptr); + EXPECT_TRUE(rtv->IsValid()); + EXPECT_EQ(rtv->GetViewType(), ResourceViewType::RenderTarget); + EXPECT_NE(rtv->GetNativeHandle(), nullptr); + EXPECT_NE(static_cast(rtv)->GetImageView(), VK_NULL_HANDLE); + + rtv->Shutdown(); + delete rtv; + texture->Shutdown(); + delete texture; +} + +TEST_F(VulkanGraphicsFixture, CreateDepthStencilViewProducesValidNativeImageView) { + RHITexture* texture = m_device->CreateTexture(CreateDepthTextureDesc(8, 8)); + ASSERT_NE(texture, nullptr); + + RHIResourceView* dsv = m_device->CreateDepthStencilView(texture, {}); + ASSERT_NE(dsv, nullptr); + EXPECT_TRUE(dsv->IsValid()); + EXPECT_EQ(dsv->GetViewType(), ResourceViewType::DepthStencil); + EXPECT_NE(dsv->GetNativeHandle(), nullptr); + EXPECT_NE(static_cast(dsv)->GetImageView(), VK_NULL_HANDLE); + + dsv->Shutdown(); + delete dsv; + texture->Shutdown(); + delete texture; +} + +TEST_F(VulkanGraphicsFixture, CreateShaderResourceViewProducesValidNativeImageView) { + RHITexture* texture = m_device->CreateTexture(CreateColorTextureDesc(8, 8)); + ASSERT_NE(texture, nullptr); + + RHIResourceView* srv = m_device->CreateShaderResourceView(texture, {}); + ASSERT_NE(srv, nullptr); + EXPECT_TRUE(srv->IsValid()); + EXPECT_EQ(srv->GetViewType(), ResourceViewType::ShaderResource); + EXPECT_NE(srv->GetNativeHandle(), nullptr); + EXPECT_NE(static_cast(srv)->GetImageView(), VK_NULL_HANDLE); + + srv->Shutdown(); + delete srv; + texture->Shutdown(); + delete texture; +} + +TEST_F(VulkanGraphicsFixture, CreateSamplerProducesValidNativeSampler) { + SamplerDesc desc = {}; + desc.filter = static_cast(FilterMode::Linear); + desc.addressU = static_cast(TextureAddressMode::Clamp); + desc.addressV = static_cast(TextureAddressMode::Clamp); + desc.addressW = static_cast(TextureAddressMode::Clamp); + desc.comparisonFunc = static_cast(ComparisonFunc::Always); + desc.maxAnisotropy = 1; + desc.minLod = 0.0f; + desc.maxLod = 1000.0f; + + RHISampler* sampler = m_device->CreateSampler(desc); + ASSERT_NE(sampler, nullptr); + EXPECT_NE(sampler->GetNativeHandle(), nullptr); + EXPECT_NE(static_cast(sampler)->GetSampler(), VK_NULL_HANDLE); + + sampler->Shutdown(); + delete sampler; +} + +} // namespace + +#endif