From dd0409d68c49d864b1382a65739a938fa9b31ca2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Mon, 25 Jul 2022 12:22:50 +0200 Subject: [PATCH] OpenGL ES: Crash as early as possible if things are bad There's a huge variety of crash report in the Play Console of various opengl failures. Try to concentrate them to early points in initialization --- Common/GPU/OpenGL/thin3d_gl.cpp | 9 ++++++++- UI/NativeApp.cpp | 14 ++++++++++++-- android/jni/AndroidJavaGLContext.cpp | 7 ++++++- android/jni/app-android.cpp | 10 +++++++--- 4 files changed, 33 insertions(+), 7 deletions(-) diff --git a/Common/GPU/OpenGL/thin3d_gl.cpp b/Common/GPU/OpenGL/thin3d_gl.cpp index bd8a252e10..f004cbdc08 100644 --- a/Common/GPU/OpenGL/thin3d_gl.cpp +++ b/Common/GPU/OpenGL/thin3d_gl.cpp @@ -10,6 +10,7 @@ #include "Common/Data/Convert/SmallDataConvert.h" #include "Common/Math/math_util.h" #include "Common/Math/lin/matrix4x4.h" +#include "Common/Log.h" #include "Common/GPU/thin3d.h" #include "Common/GPU/Shader.h" #include "Common/GPU/OpenGL/DataFormatGL.h" @@ -249,9 +250,13 @@ bool OpenGLShaderModule::Compile(GLRenderManager *render, ShaderLanguage languag if (source_.find("#version") == source_.npos) { source_ = ApplyGLSLPrelude(source_, glstage_); } + } else { + // Unsupported shader type + return false; } shader_ = render->CreateShader(glstage_, source_, tag_); + _assert_(shader_ != nullptr); // normally can't fail since we defer creation, unless there's a memory error or similar. return true; } @@ -276,7 +281,9 @@ public: for (auto &iter : shaders) { iter->Release(); } - if (program_) render_->DeleteProgram(program_); + if (program_) { + render_->DeleteProgram(program_); + } } bool LinkShaders(); diff --git a/UI/NativeApp.cpp b/UI/NativeApp.cpp index d387e7064b..757fd2d77a 100644 --- a/UI/NativeApp.cpp +++ b/UI/NativeApp.cpp @@ -934,6 +934,16 @@ bool NativeInitGraphics(GraphicsContext *graphicsContext) { bool CreateGlobalPipelines() { using namespace Draw; + ShaderModule *vs_color_2d = g_draw->GetVshaderPreset(VS_COLOR_2D); + ShaderModule *fs_color_2d = g_draw->GetFshaderPreset(FS_COLOR_2D); + ShaderModule *vs_texture_color_2d = g_draw->GetVshaderPreset(VS_TEXTURE_COLOR_2D); + ShaderModule *fs_texture_color_2d = g_draw->GetFshaderPreset(FS_TEXTURE_COLOR_2D); + + if (!vs_color_2d || !fs_color_2d || !vs_texture_color_2d || !fs_texture_color_2d) { + ERROR_LOG(G3D, "Failed to get shader preset"); + return false; + } + InputLayout *inputLayout = ui_draw2d.CreateInputLayout(g_draw); BlendState *blendNormal = g_draw->CreateBlendState({ true, 0xF, BlendFactor::SRC_ALPHA, BlendFactor::ONE_MINUS_SRC_ALPHA }); DepthStencilState *depth = g_draw->CreateDepthStencilState({ false, false, Comparison::LESS }); @@ -941,12 +951,12 @@ bool CreateGlobalPipelines() { PipelineDesc colorDesc{ Primitive::TRIANGLE_LIST, - { g_draw->GetVshaderPreset(VS_COLOR_2D), g_draw->GetFshaderPreset(FS_COLOR_2D) }, + { vs_color_2d, fs_color_2d }, inputLayout, depth, blendNormal, rasterNoCull, &vsColBufDesc, }; PipelineDesc texColorDesc{ Primitive::TRIANGLE_LIST, - { g_draw->GetVshaderPreset(VS_TEXTURE_COLOR_2D), g_draw->GetFshaderPreset(FS_TEXTURE_COLOR_2D) }, + { vs_texture_color_2d, fs_texture_color_2d }, inputLayout, depth, blendNormal, rasterNoCull, &vsTexColBufDesc, }; diff --git a/android/jni/AndroidJavaGLContext.cpp b/android/jni/AndroidJavaGLContext.cpp index c435ee4451..f7f7b70444 100644 --- a/android/jni/AndroidJavaGLContext.cpp +++ b/android/jni/AndroidJavaGLContext.cpp @@ -13,13 +13,18 @@ AndroidJavaEGLGraphicsContext::AndroidJavaEGLGraphicsContext() { bool AndroidJavaEGLGraphicsContext::InitFromRenderThread(ANativeWindow *wnd, int desiredBackbufferSizeX, int desiredBackbufferSizeY, int backbufferFormat, int androidVersion) { INFO_LOG(G3D, "AndroidJavaEGLGraphicsContext::InitFromRenderThread"); CheckGLExtensions(); + // OpenGL handles rotated rendering in the driver. g_display_rotation = DisplayRotation::ROTATE_0; g_display_rot_matrix.setIdentity(); draw_ = Draw::T3DCreateGLContext(); // Can't fail renderManager_ = (GLRenderManager *)draw_->GetNativeObject(Draw::NativeObject::RENDER_MANAGER); renderManager_->SetInflightFrames(g_Config.iInflightFrames); - draw_->CreatePresets(); + + if (!draw_->CreatePresets()) { + _assert_msg_(false, "Failed to compile preset shaders"); + return false; + } return true; } diff --git a/android/jni/app-android.cpp b/android/jni/app-android.cpp index e6375a4b11..0ea64f935b 100644 --- a/android/jni/app-android.cpp +++ b/android/jni/app-android.cpp @@ -13,9 +13,8 @@ #include #include -#include - #ifndef _MSC_VER + #include #include #include @@ -286,7 +285,12 @@ static void EmuThreadFunc() { } else { INFO_LOG(SYSTEM, "Runloop: Graphics context available! %p", graphicsContext); } - NativeInitGraphics(graphicsContext); + + if (!NativeInitGraphics(graphicsContext)) { + _assert_msg_(false, "Failed to initialize graphics, might as well bail"); + emuThreadState = (int)EmuThreadState::QUIT_REQUESTED; + return; + } INFO_LOG(SYSTEM, "Graphics initialized. Entering loop.");