deal with broken shaders
This commit is contained in:
@@ -6,6 +6,9 @@
|
||||
#include "bx/timer.h"
|
||||
#include <bx/file.h>
|
||||
#include <bgfx/bgfx.h>
|
||||
#include <thread>
|
||||
|
||||
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;
|
||||
|
||||
Reference in New Issue
Block a user