Fix D3D12 compute pipeline unit coverage

This commit is contained in:
2026-03-27 21:48:23 +08:00
parent 126860e79d
commit 1ea00a1879
5 changed files with 113 additions and 118 deletions

View File

@@ -2,6 +2,8 @@
#include "XCEngine/RHI/OpenGL/OpenGLShader.h"
#include "XCEngine/RHI/OpenGL/OpenGLCommandList.h"
#include <string>
using namespace XCEngine::RHI;
TEST_F(OpenGLTestFixture, Shader_Compile_VertexFragment) {
@@ -74,12 +76,15 @@ TEST_F(OpenGLTestFixture, Shader_Compile_InvalidSource) {
undefined_symbol;
}
)";
OpenGLShader shader;
testing::internal::CaptureStdout();
bool result = shader.Compile(invalidSource, "void main() { }");
const std::string output = testing::internal::GetCapturedStdout();
EXPECT_FALSE(result);
EXPECT_FALSE(shader.IsValid());
EXPECT_NE(output.find("ERROR::SHADER_COMPILATION_ERROR"), std::string::npos);
shader.Shutdown();
}

View File

@@ -5,23 +5,39 @@
using namespace XCEngine::RHI;
TEST_P(RHITestFixture, ComputeShader_Compile_ValidShader) {
namespace {
ShaderCompileDesc MakeComputeShaderDesc(RHIType backendType) {
ShaderCompileDesc desc = {};
if (GetBackendType() == RHIType::D3D12) {
desc.fileName = L"tests/RHI/D3D12/integration/quad/Res/Shader/quad.hlsl";
if (backendType == RHIType::D3D12) {
static const char* cs = R"(
[numthreads(1, 1, 1)]
void MainCS(uint3 dispatchThreadId : SV_DispatchThreadID) {
}
)";
desc.source.assign(cs, cs + std::strlen(cs));
desc.sourceLanguage = ShaderLanguage::HLSL;
desc.entryPoint = L"MainCS";
desc.profile = L"cs_5_0";
} else {
desc.sourceLanguage = ShaderLanguage::GLSL;
static const char* cs = R"(
#version 460
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
void main() {
}
)";
desc.source.assign(cs, cs + strlen(cs));
desc.source.assign(cs, cs + std::strlen(cs));
desc.sourceLanguage = ShaderLanguage::GLSL;
}
return desc;
}
} // namespace
TEST_P(RHITestFixture, ComputeShader_Compile_ValidShader) {
ShaderCompileDesc desc = MakeComputeShaderDesc(GetBackendType());
RHIShader* shader = GetDevice()->CreateShader(desc);
if (shader != nullptr) {
EXPECT_TRUE(shader->IsValid());
@@ -32,21 +48,7 @@ TEST_P(RHITestFixture, ComputeShader_Compile_ValidShader) {
}
TEST_P(RHITestFixture, ComputeShader_GetType_ReturnsCompute) {
ShaderCompileDesc desc = {};
if (GetBackendType() == RHIType::D3D12) {
desc.fileName = L"tests/RHI/D3D12/integration/quad/Res/Shader/quad.hlsl";
desc.entryPoint = L"MainCS";
desc.profile = L"cs_5_0";
} else {
desc.sourceLanguage = ShaderLanguage::GLSL;
static const char* cs = R"(
#version 460
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
void main() {
}
)";
desc.source.assign(cs, cs + strlen(cs));
}
ShaderCompileDesc desc = MakeComputeShaderDesc(GetBackendType());
RHIShader* shader = GetDevice()->CreateShader(desc);
if (shader != nullptr) {
@@ -57,21 +59,7 @@ TEST_P(RHITestFixture, ComputeShader_GetType_ReturnsCompute) {
}
TEST_P(RHITestFixture, ComputeShader_Shutdown_Invalidates) {
ShaderCompileDesc desc = {};
if (GetBackendType() == RHIType::D3D12) {
desc.fileName = L"tests/RHI/D3D12/integration/quad/Res/Shader/quad.hlsl";
desc.entryPoint = L"MainCS";
desc.profile = L"cs_5_0";
} else {
desc.sourceLanguage = ShaderLanguage::GLSL;
static const char* cs = R"(
#version 460
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
void main() {
}
)";
desc.source.assign(cs, cs + strlen(cs));
}
ShaderCompileDesc desc = MakeComputeShaderDesc(GetBackendType());
RHIShader* shader = GetDevice()->CreateShader(desc);
if (shader != nullptr) {
@@ -89,21 +77,7 @@ TEST_P(RHITestFixture, PipelineState_SetComputeShader) {
return;
}
ShaderCompileDesc shaderDesc = {};
if (GetBackendType() == RHIType::D3D12) {
shaderDesc.fileName = L"tests/RHI/D3D12/integration/quad/Res/Shader/quad.hlsl";
shaderDesc.entryPoint = L"MainCS";
shaderDesc.profile = L"cs_5_0";
} else {
shaderDesc.sourceLanguage = ShaderLanguage::GLSL;
static const char* cs = R"(
#version 460
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
void main() {
}
)";
shaderDesc.source.assign(cs, cs + strlen(cs));
}
ShaderCompileDesc shaderDesc = MakeComputeShaderDesc(GetBackendType());
RHIShader* computeShader = GetDevice()->CreateShader(shaderDesc);
if (computeShader != nullptr) {
@@ -126,21 +100,7 @@ TEST_P(RHITestFixture, PipelineState_HasComputeShader_ReturnsTrue) {
EXPECT_FALSE(pso->HasComputeShader());
ShaderCompileDesc shaderDesc = {};
if (GetBackendType() == RHIType::D3D12) {
shaderDesc.fileName = L"tests/RHI/D3D12/integration/quad/Res/Shader/quad.hlsl";
shaderDesc.entryPoint = L"MainCS";
shaderDesc.profile = L"cs_5_0";
} else {
shaderDesc.sourceLanguage = ShaderLanguage::GLSL;
static const char* cs = R"(
#version 460
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
void main() {
}
)";
shaderDesc.source.assign(cs, cs + strlen(cs));
}
ShaderCompileDesc shaderDesc = MakeComputeShaderDesc(GetBackendType());
RHIShader* computeShader = GetDevice()->CreateShader(shaderDesc);
if (computeShader != nullptr) {
@@ -163,21 +123,7 @@ TEST_P(RHITestFixture, PipelineState_GetType_Compute) {
EXPECT_EQ(pso->GetType(), PipelineType::Graphics);
ShaderCompileDesc shaderDesc = {};
if (GetBackendType() == RHIType::D3D12) {
shaderDesc.fileName = L"tests/RHI/D3D12/integration/quad/Res/Shader/quad.hlsl";
shaderDesc.entryPoint = L"MainCS";
shaderDesc.profile = L"cs_5_0";
} else {
shaderDesc.sourceLanguage = ShaderLanguage::GLSL;
static const char* cs = R"(
#version 460
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
void main() {
}
)";
shaderDesc.source.assign(cs, cs + strlen(cs));
}
ShaderCompileDesc shaderDesc = MakeComputeShaderDesc(GetBackendType());
RHIShader* computeShader = GetDevice()->CreateShader(shaderDesc);
if (computeShader != nullptr) {
@@ -198,21 +144,7 @@ TEST_P(RHITestFixture, PipelineState_EnsureValid_Compute) {
return;
}
ShaderCompileDesc shaderDesc = {};
if (GetBackendType() == RHIType::D3D12) {
shaderDesc.fileName = L"tests/RHI/D3D12/integration/quad/Res/Shader/quad.hlsl";
shaderDesc.entryPoint = L"MainCS";
shaderDesc.profile = L"cs_5_0";
} else {
shaderDesc.sourceLanguage = ShaderLanguage::GLSL;
static const char* cs = R"(
#version 460
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
void main() {
}
)";
shaderDesc.source.assign(cs, cs + strlen(cs));
}
ShaderCompileDesc shaderDesc = MakeComputeShaderDesc(GetBackendType());
RHIShader* computeShader = GetDevice()->CreateShader(shaderDesc);
if (computeShader != nullptr) {
@@ -243,21 +175,7 @@ TEST_P(RHITestFixture, CommandList_Dispatch_Basic) {
RHIPipelineState* pso = GetDevice()->CreatePipelineState(desc);
if (pso != nullptr) {
ShaderCompileDesc shaderDesc = {};
if (GetBackendType() == RHIType::D3D12) {
shaderDesc.fileName = L"tests/RHI/D3D12/integration/quad/Res/Shader/quad.hlsl";
shaderDesc.entryPoint = L"MainCS";
shaderDesc.profile = L"cs_5_0";
} else {
shaderDesc.sourceLanguage = ShaderLanguage::GLSL;
static const char* cs = R"(
#version 460
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
void main() {
}
)";
shaderDesc.source.assign(cs, cs + strlen(cs));
}
ShaderCompileDesc shaderDesc = MakeComputeShaderDesc(GetBackendType());
RHIShader* computeShader = GetDevice()->CreateShader(shaderDesc);
if (computeShader != nullptr) {