From 7c420381d5625df7a584bc8386aeff7ebdd1b35f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Mon, 1 May 2023 12:11:34 +0200 Subject: [PATCH] OpenGL: Some paranoia checks around failed shader generation --- GPU/GLES/DrawEngineGLES.cpp | 7 ++++++- GPU/GLES/ShaderManagerGLES.cpp | 9 ++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/GPU/GLES/DrawEngineGLES.cpp b/GPU/GLES/DrawEngineGLES.cpp index 1db3fabde1..b191014219 100644 --- a/GPU/GLES/DrawEngineGLES.cpp +++ b/GPU/GLES/DrawEngineGLES.cpp @@ -414,7 +414,11 @@ void DrawEngineGLES::DoFlush() { ApplyDrawStateLate(result.setStencil, result.stencilValue); - shaderManager_->ApplyFragmentShader(vsid, vshader, pipelineState_, framebufferManager_->UseBufferedRendering()); + LinkedShader *linked = shaderManager_->ApplyFragmentShader(vsid, vshader, pipelineState_, framebufferManager_->UseBufferedRendering()); + if (!linked) { + // Not much we can do here. Let's skip drawing. + goto bail; + } if (result.action == SW_DRAW_PRIMITIVES) { if (result.drawIndexed) { @@ -458,6 +462,7 @@ void DrawEngineGLES::DoFlush() { decOptions_.applySkinInDecode = g_Config.bSoftwareSkinning; } +bail: gpuStats.numFlushes++; gpuStats.numDrawCalls += numDrawCalls; gpuStats.numVertsSubmitted += vertexCountInDrawCalls_; diff --git a/GPU/GLES/ShaderManagerGLES.cpp b/GPU/GLES/ShaderManagerGLES.cpp index 7718eedcbb..22669a0392 100644 --- a/GPU/GLES/ShaderManagerGLES.cpp +++ b/GPU/GLES/ShaderManagerGLES.cpp @@ -76,13 +76,15 @@ LinkedShader::LinkedShader(GLRenderManager *render, VShaderID VSID, Shader *vs, : render_(render), useHWTransform_(useHWTransform) { PROFILE_THIS_SCOPE("shaderlink"); + _assert_(vs); + _assert_(fs); + vs_ = vs; std::vector shaders; shaders.push_back(vs->shader); shaders.push_back(fs->shader); - std::vector semantics; semantics.reserve(7); semantics.push_back({ ATTR_POSITION, "position" }); @@ -874,6 +876,11 @@ LinkedShader *ShaderManagerGLES::ApplyFragmentShader(VShaderID VSID, Shader *vs, if (ls == nullptr) { _dbg_assert_(FSID.Bit(FS_BIT_FLATSHADE) == VSID.Bit(VS_BIT_FLATSHADE)); + if (vs == nullptr || fs == nullptr) { + // Can't draw. This shouldn't really happen. + return nullptr; + } + // Check if we can link these. ls = new LinkedShader(render_, VSID, vs, FSID, fs, vs->UseHWTransform()); ls->use(VSID);