forked from DerRM/VulkanRaytracingProceduralGeometry
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathshader.cxx
80 lines (62 loc) · 2.66 KB
/
shader.cxx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include "shader.hxx"
#define NV_EXTENSIONS
#include <shaderc/shaderc.hpp>
CShader::CShader(std::string const& name, EShaderType type, std::string const& source)
: m_name(name)
, m_type(type)
, m_source(source)
{
}
uint32_t CShader::shaderType2Internal(CShader::EShaderType type) {
switch (type) {
case SHADER_TYPE_VERTEX_SHADER:
return shaderc_vertex_shader;
case SHADER_TYPE_FRAGMENT_SHADER:
return shaderc_fragment_shader;
case SHADER_TYPE_GEOMETRY_SHADER:
return shaderc_geometry_shader;
case SHADER_TYPE_TESSELATION_CONTROL_SHADER:
return shaderc_tess_control_shader;
case SHADER_TYPE_TESSELATION_EVAL_SHADER:
return shaderc_tess_evaluation_shader;
case SHADER_TYPE_COMPUTE_SHADER:
return shaderc_compute_shader;
case SHADER_TYPE_RAY_GENERATION_SHADER:
return shaderc_raygen_shader;
case SHADER_TYPE_CLOSEST_HIT_SHADER:
return shaderc_closesthit_shader;
case SHADER_TYPE_MISS_SHADER:
return shaderc_miss_shader;
case SHADER_TYPE_ANY_HIT_SHADER:
return shaderc_anyhit_shader;
case SHADER_TYPE_INTERSECTION_SHADER:
return shaderc_intersection_shader;
default:
break;
}
return shaderc_vertex_shader;
}
std::vector<uint32_t> CShader::compileFile(bool optimize) {
shaderc::Compiler compiler;
shaderc::CompileOptions options;
if (optimize) options.SetOptimizationLevel(shaderc_optimization_level_size);
shaderc_shader_kind kind = static_cast<shaderc_shader_kind>(CShader::shaderType2Internal(m_type));
shaderc::SpvCompilationResult module = compiler.CompileGlslToSpv(m_source.c_str(), m_source.size(), kind, m_name.c_str(), "main", options);
if (module.GetCompilationStatus() != shaderc_compilation_status_success) {
printf("Shader compilation failed, reason: %s\n", module.GetErrorMessage().c_str());
return std::vector<uint32_t>();
}
return {module.cbegin(), module.cend()};
}
std::string CShader::compileFileToAssembly(bool optimize) {
shaderc::Compiler compiler;
shaderc::CompileOptions options;
if (optimize) options.SetOptimizationLevel(shaderc_optimization_level_size);
shaderc_shader_kind kind = static_cast<shaderc_shader_kind>(CShader::shaderType2Internal(m_type));
shaderc::AssemblyCompilationResult module = compiler.CompileGlslToSpvAssembly(m_source.c_str(), m_source.size(), kind, m_name.c_str(), "main", options);
if (module.GetCompilationStatus() != shaderc_compilation_status_success) {
printf("Shader compilation failed, reason: %s\n", module.GetErrorMessage().c_str());
return "";
}
return {module.cbegin(), module.cend()};
}