From 32c9728c0cb558c3fbdd1e15b038ff20d827e39b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Mon, 14 Dec 2020 19:34:41 +0100 Subject: [PATCH] Some cleanups in GL feature and shader language detection. Gets rid of many wrong or bad checks for IsCoreContext. --- Common/GPU/OpenGL/GLFeatures.cpp | 20 ++++++------- Common/GPU/OpenGL/GLQueueRunner.cpp | 6 ++-- Common/GPU/OpenGL/thin3d_gl.cpp | 44 ++++++++++++++--------------- GPU/GLES/FramebufferManagerGLES.cpp | 2 +- GPU/GLES/GPU_GLES.cpp | 3 -- GPU/GPUState.h | 2 +- GPU/Software/SoftGpu.cpp | 2 +- Qt/QtMain.cpp | 8 ++++-- 8 files changed, 41 insertions(+), 46 deletions(-) diff --git a/Common/GPU/OpenGL/GLFeatures.cpp b/Common/GPU/OpenGL/GLFeatures.cpp index a5d12aae07..3e129bd176 100644 --- a/Common/GPU/OpenGL/GLFeatures.cpp +++ b/Common/GPU/OpenGL/GLFeatures.cpp @@ -138,14 +138,20 @@ void CheckGLExtensions() { memset(&gl_extensions, 0, sizeof(gl_extensions)); gl_extensions.IsCoreContext = useCoreContext; -#ifdef USING_GLES2 - gl_extensions.IsGLES = !useCoreContext; -#endif - const char *renderer = (const char *)glGetString(GL_RENDERER); const char *versionStr = (const char *)glGetString(GL_VERSION); const char *glslVersionStr = (const char *)glGetString(GL_SHADING_LANGUAGE_VERSION); + +#ifdef USING_GLES2 + gl_extensions.IsGLES = !useCoreContext; +#else + if (strstr(versionStr, "OpenGL ES") == versionStr) { + // For desktops running GLES. + gl_extensions.IsGLES = true; + } +#endif + // Check vendor string to try and guess GPU const char *cvendor = (char *)glGetString(GL_VENDOR); // TODO: move this stuff to gpu_features.cpp @@ -218,12 +224,6 @@ void CheckGLExtensions() { } } -#ifndef USING_GLES2 - if (strstr(versionStr, "OpenGL ES") == versionStr) { - // For desktops running GLES. - gl_extensions.IsGLES = true; - } -#endif if (!gl_extensions.IsGLES) { // For desktop GL gl_extensions.ver[0] = parsed[0]; diff --git a/Common/GPU/OpenGL/GLQueueRunner.cpp b/Common/GPU/OpenGL/GLQueueRunner.cpp index d81688189a..44e0a2da27 100644 --- a/Common/GPU/OpenGL/GLQueueRunner.cpp +++ b/Common/GPU/OpenGL/GLQueueRunner.cpp @@ -43,7 +43,8 @@ void GLQueueRunner::CreateDeviceObjects() { // An eternal optimist. sawOutOfMemory_ = false; - // Populate some strings from the GL thread. + // Populate some strings from the GL thread so they can be queried from thin3d. + // TODO: Merge with GLFeatures.cpp/h auto populate = [&](int name) { const GLubyte *value = glGetString(name); if (!value) @@ -55,9 +56,6 @@ void GLQueueRunner::CreateDeviceObjects() { populate(GL_RENDERER); populate(GL_VERSION); populate(GL_SHADING_LANGUAGE_VERSION); - if (!gl_extensions.IsCoreContext) { // Not OK to query this in core profile! - populate(GL_EXTENSIONS); - } CHECK_GL_ERROR_IF_DEBUG(); useDebugGroups_ = !gl_extensions.IsGLES && gl_extensions.VersionGEThan(4, 3); diff --git a/Common/GPU/OpenGL/thin3d_gl.cpp b/Common/GPU/OpenGL/thin3d_gl.cpp index 8b1f043473..cd1d35c8de 100644 --- a/Common/GPU/OpenGL/thin3d_gl.cpp +++ b/Common/GPU/OpenGL/thin3d_gl.cpp @@ -620,30 +620,28 @@ OpenGLContext::OpenGLContext() { } } } else { - if (gl_extensions.IsCoreContext) { - if (gl_extensions.VersionGEThan(3, 3, 0)) { - shaderLanguageDesc_.shaderLanguage = ShaderLanguage::GLSL_3xx; - shaderLanguageDesc_.fragColor0 = "fragColor0"; - shaderLanguageDesc_.texture = "texture"; - shaderLanguageDesc_.glslES30 = true; + // I don't know why we were checking for IsCoreContext here before. + if (gl_extensions.VersionGEThan(3, 3, 0)) { + shaderLanguageDesc_.shaderLanguage = ShaderLanguage::GLSL_3xx; + shaderLanguageDesc_.fragColor0 = "fragColor0"; + shaderLanguageDesc_.texture = "texture"; + shaderLanguageDesc_.glslES30 = true; + shaderLanguageDesc_.bitwiseOps = true; + shaderLanguageDesc_.texelFetch = "texelFetch"; + shaderLanguageDesc_.varying_vs = "out"; + shaderLanguageDesc_.varying_fs = "in"; + shaderLanguageDesc_.attribute = "in"; + } else if (gl_extensions.VersionGEThan(3, 0, 0)) { + shaderLanguageDesc_.shaderLanguage = ShaderLanguage::GLSL_1xx; + shaderLanguageDesc_.fragColor0 = "fragColor0"; + shaderLanguageDesc_.bitwiseOps = true; + shaderLanguageDesc_.texelFetch = "texelFetch"; + } else { + // This too... + shaderLanguageDesc_.shaderLanguage = ShaderLanguage::GLSL_1xx; + if (gl_extensions.EXT_gpu_shader4) { shaderLanguageDesc_.bitwiseOps = true; - shaderLanguageDesc_.texelFetch = "texelFetch"; - shaderLanguageDesc_.varying_vs = "out"; - shaderLanguageDesc_.varying_fs = "in"; - shaderLanguageDesc_.attribute = "in"; - } else if (gl_extensions.VersionGEThan(3, 0, 0)) { - // Hm, I think this is wrong. This should be outside "if (gl_extensions.IsCoreContext)". - shaderLanguageDesc_.shaderLanguage = ShaderLanguage::GLSL_1xx; - shaderLanguageDesc_.fragColor0 = "fragColor0"; - shaderLanguageDesc_.bitwiseOps = true; - shaderLanguageDesc_.texelFetch = "texelFetch"; - } else { - // This too... - shaderLanguageDesc_.shaderLanguage = ShaderLanguage::GLSL_1xx; - if (gl_extensions.EXT_gpu_shader4) { - shaderLanguageDesc_.bitwiseOps = true; - shaderLanguageDesc_.texelFetch = "texelFetch2D"; - } + shaderLanguageDesc_.texelFetch = "texelFetch2D"; } } } diff --git a/GPU/GLES/FramebufferManagerGLES.cpp b/GPU/GLES/FramebufferManagerGLES.cpp index 2251c3fb90..ecd9ce5a53 100644 --- a/GPU/GLES/FramebufferManagerGLES.cpp +++ b/GPU/GLES/FramebufferManagerGLES.cpp @@ -105,7 +105,7 @@ FramebufferManagerGLES::FramebufferManagerGLES(Draw::DrawContext *draw, GLRender needGLESRebinds_ = true; CreateDeviceObjects(); render_ = (GLRenderManager *)draw_->GetNativeObject(Draw::NativeObject::RENDER_MANAGER); - presentation_->SetLanguage(gl_extensions.IsCoreContext ? GLSL_3xx : GLSL_1xx); + presentation_->SetLanguage(draw_->GetShaderLanguageDesc().shaderLanguage); } void FramebufferManagerGLES::Init() { diff --git a/GPU/GLES/GPU_GLES.cpp b/GPU/GLES/GPU_GLES.cpp index 192c7f832b..064edf6f57 100644 --- a/GPU/GLES/GPU_GLES.cpp +++ b/GPU/GLES/GPU_GLES.cpp @@ -185,9 +185,6 @@ void GPU_GLES::CheckGPUFeatures() { if (gl_extensions.ARB_framebuffer_object || gl_extensions.NV_framebuffer_blit || gl_extensions.GLES3) { features |= GPU_SUPPORTS_FRAMEBUFFER_BLIT | GPU_SUPPORTS_FRAMEBUFFER_BLIT_TO_DEPTH; } - if (gl_extensions.ARB_vertex_array_object && gl_extensions.IsCoreContext) { - features |= GPU_SUPPORTS_VAO; - } if ((gl_extensions.gpuVendor == GPU_VENDOR_NVIDIA) || (gl_extensions.gpuVendor == GPU_VENDOR_AMD)) features |= GPU_PREFER_REVERSE_COLOR_ORDER; diff --git a/GPU/GPUState.h b/GPU/GPUState.h index 262a227b74..afb8c716d5 100644 --- a/GPU/GPUState.h +++ b/GPU/GPUState.h @@ -482,7 +482,7 @@ enum { GPU_SUPPORTS_32BIT_INT_FSHADER = FLAG_BIT(15), GPU_SUPPORTS_DEPTH_TEXTURE = FLAG_BIT(16), GPU_SUPPORTS_ACCURATE_DEPTH = FLAG_BIT(17), - GPU_SUPPORTS_VAO = FLAG_BIT(18), + // Free bit: 18, GPU_SUPPORTS_COPY_IMAGE = FLAG_BIT(19), GPU_SUPPORTS_ANY_FRAMEBUFFER_FETCH = FLAG_BIT(20), GPU_SCALE_DEPTH_FROM_24BIT_TO_16BIT = FLAG_BIT(21), diff --git a/GPU/Software/SoftGpu.cpp b/GPU/Software/SoftGpu.cpp index 7f3547c401..364001bd26 100644 --- a/GPU/Software/SoftGpu.cpp +++ b/GPU/Software/SoftGpu.cpp @@ -72,7 +72,7 @@ SoftGPU::SoftGPU(GraphicsContext *gfxCtx, Draw::DrawContext *draw) switch (GetGPUBackend()) { case GPUBackend::OPENGL: - presentation_->SetLanguage(gl_extensions.IsCoreContext ? GLSL_3xx : GLSL_1xx); + presentation_->SetLanguage(draw_->GetShaderLanguageDesc().shaderLanguage); break; case GPUBackend::DIRECT3D9: ShaderTranslationInit(); diff --git a/Qt/QtMain.cpp b/Qt/QtMain.cpp index cb2e2ab26a..8e84fb230a 100644 --- a/Qt/QtMain.cpp +++ b/Qt/QtMain.cpp @@ -533,17 +533,19 @@ void MainUI::initializeGL() { g_Config.iGPUBackend = (int)GPUBackend::OPENGL; } - SetGLCoreContext(format().profile() == QGLFormat::CoreProfile); + bool useCoreContext = format().profile() == QGLFormat::CoreProfile; + + SetGLCoreContext(useCoreContext); #ifndef USING_GLES2 // Some core profile drivers elide certain extensions from GL_EXTENSIONS/etc. // glewExperimental allows us to force GLEW to search for the pointers anyway. - if (gl_extensions.IsCoreContext) { + if (useCoreContext) { glewExperimental = true; } glewInit(); // Unfortunately, glew will generate an invalid enum error, ignore. - if (gl_extensions.IsCoreContext) { + if (useCoreContext) { glGetError(); } #endif