Add Vulkan coverage to generic RHI unit tests

This commit is contained in:
2026-03-27 20:21:36 +08:00
parent 5a49812ea9
commit 6aa0e73a05
10 changed files with 96 additions and 15 deletions

View File

@@ -8,12 +8,18 @@
#include "XCEngine/RHI/D3D12/D3D12CommandAllocator.h"
#include "XCEngine/RHI/D3D12/D3D12CommandList.h"
#include "XCEngine/RHI/OpenGL/OpenGLDevice.h"
#if defined(XCENGINE_SUPPORT_VULKAN)
#include "XCEngine/RHI/Vulkan/VulkanDevice.h"
#endif
namespace XCEngine {
namespace RHI {
INSTANTIATE_TEST_SUITE_P(D3D12, RHITestFixture, ::testing::Values(RHIType::D3D12));
INSTANTIATE_TEST_SUITE_P(OpenGL, RHITestFixture, ::testing::Values(RHIType::OpenGL));
#if defined(XCENGINE_SUPPORT_VULKAN)
INSTANTIATE_TEST_SUITE_P(Vulkan, RHITestFixture, ::testing::Values(RHIType::Vulkan));
#endif
void RHITestFixture::SetUpTestSuite() {
}
@@ -36,7 +42,7 @@ void RHITestFixture::SetUp() {
CW_USEDEFAULT, CW_USEDEFAULT, 800, 600, nullptr, nullptr, GetModuleHandle(nullptr), nullptr);
bool initResult = false;
if (GetParam() == RHIType::D3D12) {
if (GetParam() == RHIType::D3D12 || GetParam() == RHIType::Vulkan) {
RHIDeviceDesc desc = {};
desc.enableDebugLayer = false;
initResult = mDevice->Initialize(desc);
@@ -66,14 +72,19 @@ void RHITestFixture::SetUp() {
}
void RHITestFixture::WaitForGPU() {
if (mDevice == nullptr || mCommandQueue == nullptr || mFence == nullptr) {
if (mDevice == nullptr || mCommandQueue == nullptr) {
return;
}
if (GetParam() == RHIType::D3D12) {
if (mFence == nullptr) {
return;
}
mFenceValue++;
mCommandQueue->Signal(mFence, mFenceValue);
mFence->Wait(mFenceValue);
} else {
mCommandQueue->WaitForIdle();
}
}

View File

@@ -1,6 +1,9 @@
#include "fixtures/RHITestFixture.h"
#include "XCEngine/RHI/D3D12/D3D12PipelineLayout.h"
#include "XCEngine/RHI/OpenGL/OpenGLPipelineLayout.h"
#if defined(XCENGINE_SUPPORT_VULKAN)
#include "XCEngine/RHI/Vulkan/VulkanPipelineLayout.h"
#endif
#include "XCEngine/RHI/RHIPipelineLayout.h"
#include "XCEngine/RHI/RHIDescriptorSet.h"
@@ -181,6 +184,10 @@ TEST_P(RHITestFixture, PipelineLayout_DeepCopiesSetLayoutsAndInfersCounts) {
const RHIPipelineLayoutDesc* storedDesc = nullptr;
if (GetBackendType() == RHIType::D3D12) {
storedDesc = &static_cast<D3D12PipelineLayout*>(layout)->GetDesc();
#if defined(XCENGINE_SUPPORT_VULKAN)
} else if (GetBackendType() == RHIType::Vulkan) {
storedDesc = &static_cast<VulkanPipelineLayout*>(layout)->GetDesc();
#endif
} else {
storedDesc = &static_cast<OpenGLPipelineLayout*>(layout)->GetDesc();
}

View File

@@ -1,9 +1,24 @@
#include "fixtures/RHITestFixture.h"
#include "XCEngine/RHI/RHIShader.h"
#include <cstring>
#include <filesystem>
using namespace XCEngine::RHI;
namespace {
std::wstring ResolveShaderPath(const wchar_t* relativePath) {
wchar_t exePath[MAX_PATH] = {};
const DWORD length = GetModuleFileNameW(nullptr, exePath, MAX_PATH);
std::filesystem::path rootPath = length > 0 ? std::filesystem::path(exePath).parent_path() : std::filesystem::current_path();
for (int i = 0; i < 5; ++i) {
rootPath = rootPath.parent_path();
}
return (rootPath / relativePath).wstring();
}
} // namespace
TEST_P(RHITestFixture, Shader_Compile_EmptyDesc_ReturnsNullptr) {
ShaderCompileDesc desc = {};
RHIShader* shader = GetDevice()->CreateShader(desc);
@@ -13,7 +28,7 @@ TEST_P(RHITestFixture, Shader_Compile_EmptyDesc_ReturnsNullptr) {
TEST_P(RHITestFixture, Shader_Compile_ValidVertexShader) {
ShaderCompileDesc desc = {};
if (GetBackendType() == RHIType::D3D12) {
desc.fileName = L"tests/RHI/D3D12/integration/quad/Res/Shader/quad.hlsl";
desc.fileName = ResolveShaderPath(L"tests/RHI/D3D12/integration/quad/Res/Shader/quad.hlsl");
desc.entryPoint = L"MainVS";
desc.profile = L"vs_5_0";
} else {
@@ -36,7 +51,7 @@ TEST_P(RHITestFixture, Shader_Compile_ValidVertexShader) {
TEST_P(RHITestFixture, Shader_Compile_ValidFragmentShader) {
ShaderCompileDesc desc = {};
if (GetBackendType() == RHIType::D3D12) {
desc.fileName = L"tests/RHI/D3D12/integration/quad/Res/Shader/quad.hlsl";
desc.fileName = ResolveShaderPath(L"tests/RHI/D3D12/integration/quad/Res/Shader/quad.hlsl");
desc.entryPoint = L"MainPS";
desc.profile = L"ps_5_0";
} else {
@@ -59,7 +74,7 @@ TEST_P(RHITestFixture, Shader_Compile_ValidFragmentShader) {
TEST_P(RHITestFixture, Shader_GetType_VertexShader) {
ShaderCompileDesc desc = {};
if (GetBackendType() == RHIType::D3D12) {
desc.fileName = L"tests/RHI/D3D12/integration/quad/Res/Shader/quad.hlsl";
desc.fileName = ResolveShaderPath(L"tests/RHI/D3D12/integration/quad/Res/Shader/quad.hlsl");
desc.entryPoint = L"MainVS";
desc.profile = L"vs_5_0";
} else {
@@ -80,7 +95,7 @@ TEST_P(RHITestFixture, Shader_GetType_VertexShader) {
TEST_P(RHITestFixture, Shader_GetType_FragmentShader) {
ShaderCompileDesc desc = {};
if (GetBackendType() == RHIType::D3D12) {
desc.fileName = L"tests/RHI/D3D12/integration/quad/Res/Shader/quad.hlsl";
desc.fileName = ResolveShaderPath(L"tests/RHI/D3D12/integration/quad/Res/Shader/quad.hlsl");
desc.entryPoint = L"MainPS";
desc.profile = L"ps_5_0";
} else {
@@ -101,7 +116,7 @@ TEST_P(RHITestFixture, Shader_GetType_FragmentShader) {
TEST_P(RHITestFixture, Shader_GetNativeHandle_ValidShader) {
ShaderCompileDesc desc = {};
if (GetBackendType() == RHIType::D3D12) {
desc.fileName = L"tests/RHI/D3D12/integration/quad/Res/Shader/quad.hlsl";
desc.fileName = ResolveShaderPath(L"tests/RHI/D3D12/integration/quad/Res/Shader/quad.hlsl");
desc.entryPoint = L"MainVS";
desc.profile = L"vs_5_0";
} else {
@@ -123,7 +138,7 @@ TEST_P(RHITestFixture, Shader_GetNativeHandle_ValidShader) {
TEST_P(RHITestFixture, Shader_Shutdown_Invalidates) {
ShaderCompileDesc desc = {};
if (GetBackendType() == RHIType::D3D12) {
desc.fileName = L"tests/RHI/D3D12/integration/quad/Res/Shader/quad.hlsl";
desc.fileName = ResolveShaderPath(L"tests/RHI/D3D12/integration/quad/Res/Shader/quad.hlsl");
desc.entryPoint = L"MainVS";
desc.profile = L"vs_5_0";
} else {
@@ -145,11 +160,15 @@ TEST_P(RHITestFixture, Shader_Shutdown_Invalidates) {
TEST_P(RHITestFixture, Shader_Compile_FromFile_ReturnsValidShader) {
ShaderCompileDesc desc = {};
if (GetBackendType() == RHIType::D3D12) {
desc.fileName = L"tests/RHI/D3D12/integration/quad/Res/Shader/quad.hlsl";
desc.fileName = ResolveShaderPath(L"tests/RHI/D3D12/integration/quad/Res/Shader/quad.hlsl");
desc.entryPoint = L"MainVS";
desc.profile = L"vs_5_0";
} else if (GetBackendType() == RHIType::Vulkan) {
desc.fileName = ResolveShaderPath(L"tests/RHI/integration/triangle/Res/Shader/triangle_vulkan.vert");
desc.entryPoint = L"main";
desc.profile = L"vs";
} else {
desc.fileName = L"tests/RHI/OpenGL/integration/triangle/Res/Shader/triangle.vert";
desc.fileName = ResolveShaderPath(L"tests/RHI/OpenGL/integration/triangle/Res/Shader/triangle.vert");
desc.entryPoint = L"main";
desc.profile = L"vs_4_30";
}
@@ -165,11 +184,11 @@ TEST_P(RHITestFixture, Shader_Compile_FromFile_ReturnsValidShader) {
TEST_P(RHITestFixture, Shader_Compile_MissingFile_ReturnsNullptr) {
ShaderCompileDesc desc = {};
if (GetBackendType() == RHIType::D3D12) {
desc.fileName = L"tests/RHI/D3D12/integration/quad/Res/Shader/does_not_exist.hlsl";
desc.fileName = ResolveShaderPath(L"tests/RHI/D3D12/integration/quad/Res/Shader/does_not_exist.hlsl");
desc.entryPoint = L"MainVS";
desc.profile = L"vs_5_0";
} else {
desc.fileName = L"tests/RHI/OpenGL/integration/triangle/Res/Shader/does_not_exist.vert";
desc.fileName = ResolveShaderPath(L"tests/RHI/OpenGL/integration/triangle/Res/Shader/does_not_exist.vert");
desc.entryPoint = L"main";
desc.profile = L"vs_4_30";
}