119 lines
3.7 KiB
C++
119 lines
3.7 KiB
C++
#if defined(XCENGINE_SUPPORT_VULKAN)
|
|
|
|
#include "fixtures/VulkanTestFixture.h"
|
|
|
|
#include <cstring>
|
|
|
|
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
|