From d12f74d49b9b5351100101d43a55784320aaa35b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Wed, 14 Oct 2015 17:44:50 +0200 Subject: [PATCH] Slightly more elegant error handling --- GPU/GLES/FragmentShaderGenerator.cpp | 12 +++++++----- GPU/GLES/FragmentShaderGenerator.h | 2 +- GPU/GLES/ShaderManager.cpp | 4 +++- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/GPU/GLES/FragmentShaderGenerator.cpp b/GPU/GLES/FragmentShaderGenerator.cpp index 52c91c449a..20a09bd314 100644 --- a/GPU/GLES/FragmentShaderGenerator.cpp +++ b/GPU/GLES/FragmentShaderGenerator.cpp @@ -422,7 +422,7 @@ void ComputeFragmentShaderID(ShaderID *id_out, uint32_t vertType) { } // Missing: Z depth range -void GenerateFragmentShader(const ShaderID &id, char *buffer) { +bool GenerateFragmentShader(const ShaderID &id, char *buffer) { char *p = buffer; // In GLSL ES 3.0, you use "in" variables instead of varying. @@ -1017,8 +1017,8 @@ void GenerateFragmentShader(const ShaderID &id, char *buffer) { break; default: - WRITE(p, "ERROR STA"); - break; + ERROR_LOG(G3D, "Bad stencil-to-alpha type, corrupt ID?"); + return false; } LogicOpReplaceType replaceLogicOpType = (LogicOpReplaceType)id.Bits(BIT_REPLACE_LOGIC_OP_TYPE, 2); @@ -1033,8 +1033,8 @@ void GenerateFragmentShader(const ShaderID &id, char *buffer) { break; default: - WRITE(p, "ERROR LTA"); - break; + ERROR_LOG(G3D, "Bad logic op type, corrupt ID?"); + return false; } #ifdef DEBUG_SHADER @@ -1046,5 +1046,7 @@ void GenerateFragmentShader(const ShaderID &id, char *buffer) { } #endif WRITE(p, "}\n"); + + return true; } diff --git a/GPU/GLES/FragmentShaderGenerator.h b/GPU/GLES/FragmentShaderGenerator.h index f4c50b29a3..7b7bf976ec 100644 --- a/GPU/GLES/FragmentShaderGenerator.h +++ b/GPU/GLES/FragmentShaderGenerator.h @@ -22,7 +22,7 @@ struct ShaderID; void ComputeFragmentShaderID(ShaderID *id, uint32_t vertType); -void GenerateFragmentShader(const ShaderID &id, char *buffer); +bool GenerateFragmentShader(const ShaderID &id, char *buffer); enum StencilValueType { STENCIL_VALUE_UNIFORM, diff --git a/GPU/GLES/ShaderManager.cpp b/GPU/GLES/ShaderManager.cpp index 51ca2085a2..fc78cb2331 100644 --- a/GPU/GLES/ShaderManager.cpp +++ b/GPU/GLES/ShaderManager.cpp @@ -839,7 +839,9 @@ LinkedShader *ShaderManager::ApplyFragmentShader(Shader *vs, int prim, u32 vertT Shader *fs; if (fsIter == fsCache_.end()) { // Fragment shader not in cache. Let's compile it. - GenerateFragmentShader(FSID, codeBuffer_); + if (!GenerateFragmentShader(FSID, codeBuffer_)) { + return nullptr; + } fs = new Shader(codeBuffer_, GL_FRAGMENT_SHADER, vs->UseHWTransform(), FSID); fsCache_[FSID] = fs; } else {