From d25c392cec57e8c561899bf75668da79c4e67aed Mon Sep 17 00:00:00 2001 From: Chuyan Zhang Date: Wed, 9 Oct 2024 22:11:24 -0700 Subject: add shader compile infra --- src/shader.cpp | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 src/shader.cpp (limited to 'src/shader.cpp') diff --git a/src/shader.cpp b/src/shader.cpp new file mode 100644 index 0000000..95a7904 --- /dev/null +++ b/src/shader.cpp @@ -0,0 +1,67 @@ +#include "shader.h" +#include +#include +#include +#include + +namespace iris { + +ShaderDesc::ShaderDesc(const std::string_view path) { + // Load the shader from file + std::ifstream file("example.txt"); + if (!file.is_open()) { + spdlog::error("Failed to open shader file: {}", path); + abort(); + } + std::ostringstream file_stream; + file_stream << file.rdbuf(); + this->source = file_stream.str(); + file.close(); + + // Determine the shader type + size_t last_dot = path.find_last_of('.'); + if (last_dot == std::string::npos) { + spdlog::error("Invalid shader file type: {}", path); + abort(); + } + size_t last_slash = path.find_last_of('/'); + if (last_slash == std::string::npos) { + last_slash = 0; + } + this->name = path.substr(last_slash, last_dot - last_slash - 1); + this->type = shader_type_from_string(path.substr(last_dot + 1)); + + // Compile the shader to SPIR-V + shaderc::Compiler compiler; + shaderc::CompileOptions options; + options.SetTargetEnvironment(shaderc_target_env_vulkan, shaderc_env_version_vulkan_1_3); + + shaderc::SpvCompilationResult result = compiler.CompileGlslToSpv( + this->source, shaderc_glsl_compute_shader, path.data(), options); + if (result.GetCompilationStatus() != shaderc_compilation_status_success) { + spdlog::error("Failed to compile shader: {}", result.GetErrorMessage()); + abort(); + } + this->compiled_binary = std::vector(result.cbegin(), result.cend()); +} + +ShaderDesc::Type ShaderDesc::shader_type_from_string(std::string_view type) { + if (type == "rgen") { + return ShaderDesc::Type::eRayGen; + } else if (type == "rmiss") { + return ShaderDesc::Type::eMiss; + } else if (type == "rchit") { + return ShaderDesc::Type::eClosestHit; + } else if (type == "rahit") { + return ShaderDesc::Type::eAnyHit; + } else if (type == "rint") { + return ShaderDesc::Type::eIntersection; + } else if (type == "comp") { + return ShaderDesc::Type::eCompute; + } else { + spdlog::error("Unknown shader type: {}", type); + abort(); + } +} + +} // namespace iris \ No newline at end of file -- cgit v1.2.3-70-g09d2