GLES: Keep the GLRShader desc around.

This way we can also log it on link errors.  It's not much data.
This commit is contained in:
Unknown W. Brackets 2018-01-20 08:46:34 -08:00 committed by Henrik Rydgård
parent 48a07474f8
commit 3380ab8705
5 changed files with 12 additions and 17 deletions

View File

@ -44,12 +44,11 @@
#include "GPU/GLES/DrawEngineGLES.h"
#include "FramebufferManagerGLES.h"
Shader::Shader(GLRenderManager *render, const char *code, const char *desc, uint32_t glShaderType, bool useHWTransform, uint32_t attrMask, uint64_t uniformMask)
Shader::Shader(GLRenderManager *render, const char *code, const std::string &desc, uint32_t glShaderType, bool useHWTransform, uint32_t attrMask, uint64_t uniformMask)
: render_(render), failed_(false), useHWTransform_(useHWTransform), attrMask_(attrMask), uniformMask_(uniformMask) {
PROFILE_THIS_SCOPE("shadercomp");
isFragment_ = glShaderType == GL_FRAGMENT_SHADER;
source_ = code;
std::string descstr(desc);
#ifdef SHADERLOG
#ifdef _WIN32
OutputDebugStringUTF8(code);
@ -57,7 +56,7 @@ Shader::Shader(GLRenderManager *render, const char *code, const char *desc, uint
printf("%s\n", code);
#endif
#endif
shader = render->CreateShader(glShaderType, source_, descstr);
shader = render->CreateShader(glShaderType, source_, desc);
}
Shader::~Shader() {
@ -609,7 +608,7 @@ Shader *ShaderManagerGLES::CompileFragmentShader(FShaderID FSID) {
return nullptr;
}
std::string desc = FragmentShaderDesc(FSID);
return new Shader(render_, codeBuffer_, desc.c_str(), GL_FRAGMENT_SHADER, false, 0, uniformMask);
return new Shader(render_, codeBuffer_, desc, GL_FRAGMENT_SHADER, false, 0, uniformMask);
}
Shader *ShaderManagerGLES::CompileVertexShader(VShaderID VSID) {
@ -618,7 +617,7 @@ Shader *ShaderManagerGLES::CompileVertexShader(VShaderID VSID) {
uint64_t uniformMask;
GenerateVertexShader(VSID, codeBuffer_, &attrMask, &uniformMask);
std::string desc = VertexShaderDesc(VSID);
return new Shader(render_, codeBuffer_, desc.c_str(), GL_VERTEX_SHADER, useHWTransform, attrMask, uniformMask);
return new Shader(render_, codeBuffer_, desc, GL_VERTEX_SHADER, useHWTransform, attrMask, uniformMask);
}
Shader *ShaderManagerGLES::ApplyVertexShader(int prim, u32 vertType, VShaderID *VSID) {
@ -668,7 +667,7 @@ Shader *ShaderManagerGLES::ApplyVertexShader(int prim, u32 vertType, VShaderID *
uint32_t attrMask;
uint64_t uniformMask;
GenerateVertexShader(vsidTemp, codeBuffer_, &attrMask, &uniformMask);
vs = new Shader(render_, codeBuffer_, VertexShaderDesc(vsidTemp).c_str(), GL_VERTEX_SHADER, false, attrMask, uniformMask);
vs = new Shader(render_, codeBuffer_, VertexShaderDesc(vsidTemp), GL_VERTEX_SHADER, false, attrMask, uniformMask);
}
vsCache_.Insert(*VSID, vs);

View File

@ -125,7 +125,7 @@ public:
class Shader {
public:
Shader(GLRenderManager *render, const char *code, const char *desc, uint32_t glShaderType, bool useHWTransform, uint32_t attrMask, uint64_t uniformMask);
Shader(GLRenderManager *render, const char *code, const std::string &desc, uint32_t glShaderType, bool useHWTransform, uint32_t attrMask, uint64_t uniformMask);
~Shader();
GLRShader *shader;

View File

@ -156,10 +156,10 @@ void GLQueueRunner::RunInitSteps(const std::vector<GLRInitStep> &steps) {
ELOG("Error in shader compilation! %s\n", infoLog);
ELOG("Shader source:\n%s\n", (const char *)code);
#endif
ERROR_LOG(G3D, "Error in shader compilation for: %s", step.create_shader.desc);
ERROR_LOG(G3D, "Error in shader compilation for: %s", step.create_shader.shader->desc.c_str());
ERROR_LOG(G3D, "Info log: %s", infoLog);
ERROR_LOG(G3D, "Shader source:\n%s\n", (const char *)code);
Reporting::ReportMessage("Error in shader compilation: info: %s\n%s\n%s", infoLog, step.create_shader.desc, (const char *)code);
Reporting::ReportMessage("Error in shader compilation: info: %s\n%s\n%s", infoLog, step.create_shader.shader->desc.c_str(), (const char *)code);
#ifdef SHADERLOG
OutputDebugStringUTF8(infoLog);
#endif
@ -167,7 +167,6 @@ void GLQueueRunner::RunInitSteps(const std::vector<GLRInitStep> &steps) {
step.create_shader.shader->failed = true;
}
delete[] step.create_shader.code;
delete[] step.create_shader.desc;
step.create_shader.shader->valid = true;
break;
}

View File

@ -199,9 +199,8 @@ struct GLRInitStep {
} create_texture;
struct {
GLRShader *shader;
// These char arrays need to be allocated with new[].
// This char arrays needs to be allocated with new[].
char *code;
char *desc; // For error logging.
GLuint stage;
} create_shader;
struct {

View File

@ -75,6 +75,7 @@ public:
bool valid = false;
// Warning: Won't know until a future frame.
bool failed = false;
std::string desc;
};
class GLRProgram {
@ -227,16 +228,13 @@ public:
return step.create_buffer.buffer;
}
GLRShader *CreateShader(GLuint stage, std::string code, std::string desc) {
GLRShader *CreateShader(GLuint stage, const std::string &code, const std::string &desc) {
GLRInitStep step{ GLRInitStepType::CREATE_SHADER };
step.create_shader.shader = new GLRShader();
step.create_shader.shader->desc = desc;
step.create_shader.stage = stage;
step.create_shader.code = new char[code.size() + 1];
memcpy(step.create_shader.code, code.data(), code.size() + 1);
if (!desc.empty()) {
step.create_shader.desc = desc.size() ? new char[desc.size() + 1] : nullptr;
memcpy(step.create_shader.desc, desc.data(), desc.size() + 1);
}
initSteps_.push_back(step);
return step.create_shader.shader;
}