#if defined(XCENGINE_SUPPORT_VULKAN) #include "fixtures/VulkanTestFixture.h" #include using namespace XCEngine::RHI; namespace { TEST_F(VulkanGraphicsFixture, CreateShaderFromSpirvProducesValidComputeShader) { RHIShader* shader = CreateWriteRedComputeShader(); ASSERT_NE(shader, nullptr); EXPECT_TRUE(shader->IsValid()); EXPECT_EQ(shader->GetType(), ShaderType::Compute); EXPECT_NE(shader->GetNativeHandle(), nullptr); shader->Shutdown(); delete shader; } TEST_F(VulkanGraphicsFixture, CreateShaderFromGlslSourceProducesValidVertexShader) { static const char* vertexSource = R"(#version 450 layout(location = 0) in vec4 aPosition; void main() { gl_Position = aPosition; } )"; ShaderCompileDesc shaderDesc = {}; shaderDesc.sourceLanguage = ShaderLanguage::GLSL; shaderDesc.profile = L"vs"; shaderDesc.source.assign(vertexSource, vertexSource + std::strlen(vertexSource)); RHIShader* shader = m_device->CreateShader(shaderDesc); ASSERT_NE(shader, nullptr); EXPECT_TRUE(shader->IsValid()); EXPECT_EQ(shader->GetType(), ShaderType::Vertex); EXPECT_NE(shader->GetNativeHandle(), nullptr); shader->Shutdown(); delete shader; } TEST_F(VulkanGraphicsFixture, CreateShaderFromGlslFileProducesValidVertexShader) { ShaderCompileDesc shaderDesc = {}; shaderDesc.fileName = ResolveShaderPath(L"tests/RHI/integration/triangle/Res/Shader/triangle_vulkan.vert"); shaderDesc.entryPoint = L"main"; shaderDesc.profile = L"vs"; RHIShader* shader = m_device->CreateShader(shaderDesc); ASSERT_NE(shader, nullptr); EXPECT_TRUE(shader->IsValid()); EXPECT_EQ(shader->GetType(), ShaderType::Vertex); EXPECT_NE(shader->GetNativeHandle(), nullptr); shader->Shutdown(); delete shader; } TEST_F(VulkanGraphicsFixture, CreateShaderFromHlslSourceProducesValidVertexShader) { static const char* vertexSource = R"( float4 MainVS(uint vertexId : SV_VertexID) : SV_POSITION { const float x = (vertexId == 1u) ? 0.5f : -0.5f; const float y = (vertexId == 2u) ? -0.5f : 0.5f; return float4(x, y, 0.0f, 1.0f); } )"; ShaderCompileDesc shaderDesc = {}; shaderDesc.sourceLanguage = ShaderLanguage::HLSL; shaderDesc.entryPoint = L"MainVS"; shaderDesc.profile = L"vs_5_0"; shaderDesc.source.assign(vertexSource, vertexSource + std::strlen(vertexSource)); RHIShader* shader = m_device->CreateShader(shaderDesc); ASSERT_NE(shader, nullptr); EXPECT_TRUE(shader->IsValid()); EXPECT_EQ(shader->GetType(), ShaderType::Vertex); EXPECT_NE(shader->GetNativeHandle(), nullptr); shader->Shutdown(); delete shader; } TEST_F(VulkanGraphicsFixture, CreateShaderFromHlslSourceProducesValidFragmentShader) { static const char* fragmentSource = R"( float4 MainPS() : SV_TARGET { return float4(1.0f, 0.0f, 0.0f, 1.0f); } )"; ShaderCompileDesc shaderDesc = {}; shaderDesc.sourceLanguage = ShaderLanguage::HLSL; shaderDesc.entryPoint = L"MainPS"; shaderDesc.profile = L"ps_5_0"; shaderDesc.source.assign(fragmentSource, fragmentSource + std::strlen(fragmentSource)); RHIShader* shader = m_device->CreateShader(shaderDesc); ASSERT_NE(shader, nullptr); EXPECT_TRUE(shader->IsValid()); EXPECT_EQ(shader->GetType(), ShaderType::Fragment); EXPECT_NE(shader->GetNativeHandle(), nullptr); shader->Shutdown(); delete shader; } TEST_F(VulkanGraphicsFixture, CreateShaderFromGlslSourceInfersComputeShader) { RHIShader* shader = CreateWriteRedComputeShaderFromGlsl(); ASSERT_NE(shader, nullptr); EXPECT_TRUE(shader->IsValid()); EXPECT_EQ(shader->GetType(), ShaderType::Compute); EXPECT_NE(shader->GetNativeHandle(), nullptr); shader->Shutdown(); delete shader; } } // namespace #endif