From d1270c47a9f6d7d06e5d7aa6259a609097b1a802 Mon Sep 17 00:00:00 2001 From: Asuro Date: Sun, 9 Feb 2025 16:08:56 +0100 Subject: [PATCH] deal with broken shaders --- src/game/rendering/Rendering.cpp | 50 +++++++++++++++++++++++++------- 1 file changed, 39 insertions(+), 11 deletions(-) diff --git a/src/game/rendering/Rendering.cpp b/src/game/rendering/Rendering.cpp index b799033..fe5aa9d 100644 --- a/src/game/rendering/Rendering.cpp +++ b/src/game/rendering/Rendering.cpp @@ -6,6 +6,9 @@ #include "bx/timer.h" #include #include +#include + +using namespace std::chrono_literals; namespace Game { @@ -88,17 +91,30 @@ namespace Game Log("Loading shader at %s", buffer); - FILE* file = fopen(buffer, "rb"); - fseek(file, 0, SEEK_END); - long fileSize = ftell(file); - fseek(file, 0, SEEK_SET); + FILE* file; + for (int32_t i = 0; i < 3; ++i) + { + file = fopen(buffer, "rb"); + if (file == nullptr) + { + std::this_thread::sleep_for(100ms); + break; + } + + fseek(file, 0, SEEK_END); + long fileSize = ftell(file); + fseek(file, 0, SEEK_SET); - const bgfx::Memory* mem = bgfx::alloc(fileSize + 1); - fread(mem->data, 1, fileSize, file); - mem->data[mem->size - 1] = '\0'; - fclose(file); + const bgfx::Memory* mem = bgfx::alloc(fileSize + 1); + fread(mem->data, 1, fileSize, file); + mem->data[mem->size - 1] = '\0'; + fclose(file); - return bgfx::createShader(mem); + return bgfx::createShader(mem); + } + + Log("Failed to load shader %s", FILENAME); + return {}; } } @@ -158,10 +174,22 @@ namespace Game { shared.Dev.ChangedShaderCount = 0; - bgfx::destroy(Shader); + // TODO: when to destroy shader? + // bgfx::destroy(Shader); bgfx::ShaderHandle vertexShader = loadShader("vert"); bgfx::ShaderHandle fragmentShader = loadShader("frag"); - Shader = bgfx::createProgram(vertexShader, fragmentShader, true); + if (isValid(vertexShader) && isValid(fragmentShader)) + { + bgfx::ProgramHandle newProgram = bgfx::createProgram(vertexShader, fragmentShader, true); + if (isValid(newProgram)) + { + Shader = newProgram; + } + else + { + Log("Failed to load shader!"); + } + } } int64_t tickDelta = bx::getHPCounter() - GetInstance().StartTime;