From 20a59fc1d1d4eb50cbe3e93b7e68a1b0af5237bf Mon Sep 17 00:00:00 2001 From: jamylak Date: Sun, 18 Aug 2024 21:35:00 +1000 Subject: [PATCH] make sure errors in shader compilation on hot reload don't segfault --- src/sdf_renderer.cpp | 11 ++++++++++- src/shader_utils.cpp | 5 +++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/sdf_renderer.cpp b/src/sdf_renderer.cpp index 8e53245..f80b680 100644 --- a/src/sdf_renderer.cpp +++ b/src/sdf_renderer.cpp @@ -88,7 +88,16 @@ void SDFRenderer::setupRenderContext() { void SDFRenderer::createPipeline() { pipelineLayout = vkutils::createPipelineLayout(logicalDevice); - auto fragSpirvPath = shader_utils::compile(fragShaderPath, useToyTemplate); + std::filesystem::path fragSpirvPath; + try { + fragSpirvPath = shader_utils::compile(fragShaderPath, useToyTemplate); + } catch (const std::runtime_error &e) { + // An error occured while compiling the shader + // This can happen while doing live edits + // Just try find the old one until the error is fixed + fragSpirvPath = fragShaderPath; + fragSpirvPath.replace_extension(".spv"); + } fragShaderModule = vkutils::createShaderModule(logicalDevice, fragSpirvPath); pipeline = vkutils::createGraphicsPipeline( diff --git a/src/shader_utils.cpp b/src/shader_utils.cpp index e769575..b25d808 100644 --- a/src/shader_utils.cpp +++ b/src/shader_utils.cpp @@ -130,6 +130,11 @@ std::filesystem::path compile(const std::string &shaderFilename, spdlog::info("Shader linked: {}", linked); spdlog::info("Program info log: {}", program.getInfoLog()); + if (!linked) { + spdlog::error("Failed to link shader program"); + throw std::runtime_error("Failed to link shader program"); + } + // Now save SPIR-V binary to a file std::vector spirv; spv::SpvBuildLogger logger{};