From e46ef1dd45b975df879e54887823fe0a520e6715 Mon Sep 17 00:00:00 2001 From: Garrett Brown Date: Wed, 31 Jul 2019 00:10:08 -0700 Subject: [PATCH 1/2] CRenderSystemGLES: Add no-alpha texture shader --- .../GLES/2.0/gles_shader_texture_noalpha.frag | 25 +++++++++++++++++++ xbmc/rendering/gles/RenderSystemGLES.cpp | 12 +++++++++ xbmc/rendering/gles/RenderSystemGLES.h | 1 + 3 files changed, 38 insertions(+) create mode 100644 system/shaders/GLES/2.0/gles_shader_texture_noalpha.frag diff --git a/system/shaders/GLES/2.0/gles_shader_texture_noalpha.frag b/system/shaders/GLES/2.0/gles_shader_texture_noalpha.frag new file mode 100644 index 0000000000000..9f478ed3da174 --- /dev/null +++ b/system/shaders/GLES/2.0/gles_shader_texture_noalpha.frag @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2019 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#version 100 + +precision mediump float; +uniform sampler2D m_samp0; +varying vec4 m_cord0; + +void main () +{ + vec3 rgb = texture2D(m_samp0, m_cord0.xy).rgb; + +#if defined(KODI_LIMITED_RANGE) + rgb *= (235.0 - 16.0) / 255.0; + rgb += 16.0 / 255.0; +#endif + + gl_FragColor = vec4(rgb, 1.0); +} diff --git a/xbmc/rendering/gles/RenderSystemGLES.cpp b/xbmc/rendering/gles/RenderSystemGLES.cpp index 60eecd2d599b5..e4d352b6c3792 100644 --- a/xbmc/rendering/gles/RenderSystemGLES.cpp +++ b/xbmc/rendering/gles/RenderSystemGLES.cpp @@ -481,6 +481,14 @@ void CRenderSystemGLES::InitialiseShaders() CLog::Log(LOGERROR, "GUI Shader gles_shader_rgba_bob_oes.frag - compile and link failed"); } } + + m_pShader[SM_TEXTURE_NOALPHA].reset(new CGLESShader("gles_shader_texture_noalpha.frag", defines)); + if (!m_pShader[SM_TEXTURE_NOALPHA]->CompileAndLink()) + { + m_pShader[SM_TEXTURE_NOALPHA]->Free(); + m_pShader[SM_TEXTURE_NOALPHA].reset(); + CLog::Log(LOGERROR, "GUI Shader gles_shader_texture_noalpha.frag - compile and link failed"); + } } void CRenderSystemGLES::ReleaseShaders() @@ -528,6 +536,10 @@ void CRenderSystemGLES::ReleaseShaders() if (m_pShader[SM_TEXTURE_RGBA_BOB_OES]) m_pShader[SM_TEXTURE_RGBA_BOB_OES]->Free(); m_pShader[SM_TEXTURE_RGBA_BOB_OES].reset(); + + if (m_pShader[SM_TEXTURE_NOALPHA]) + m_pShader[SM_TEXTURE_NOALPHA]->Free(); + m_pShader[SM_TEXTURE_NOALPHA].reset(); } void CRenderSystemGLES::EnableGUIShader(ESHADERMETHOD method) diff --git a/xbmc/rendering/gles/RenderSystemGLES.h b/xbmc/rendering/gles/RenderSystemGLES.h index 19603437c930e..f71b74ac5f865 100644 --- a/xbmc/rendering/gles/RenderSystemGLES.h +++ b/xbmc/rendering/gles/RenderSystemGLES.h @@ -28,6 +28,7 @@ enum ESHADERMETHOD SM_TEXTURE_RGBA_BLENDCOLOR, SM_TEXTURE_RGBA_BOB, SM_TEXTURE_RGBA_BOB_OES, + SM_TEXTURE_NOALPHA, SM_MAX }; From 777f5853c44a7ddfa3e293418bc3b84b7e47bb07 Mon Sep 17 00:00:00 2001 From: Garrett Brown Date: Wed, 31 Jul 2019 00:10:10 -0700 Subject: [PATCH 2/2] RetroPlayer/GLES: Use no-alpha texture shader Fixes black screen with RGB emulators on RPi. --- xbmc/cores/RetroPlayer/rendering/RenderContext.cpp | 2 ++ xbmc/cores/RetroPlayer/rendering/RenderContext.h | 1 + .../RetroPlayer/rendering/VideoRenderers/RPRendererOpenGLES.cpp | 2 +- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/xbmc/cores/RetroPlayer/rendering/RenderContext.cpp b/xbmc/cores/RetroPlayer/rendering/RenderContext.cpp index 7f7a6c5f07ae9..9ed7c281691e2 100644 --- a/xbmc/cores/RetroPlayer/rendering/RenderContext.cpp +++ b/xbmc/cores/RetroPlayer/rendering/RenderContext.cpp @@ -74,6 +74,8 @@ static ESHADERMETHOD TranslateShaderMethod(GL_SHADER_METHOD method) case GL_SHADER_METHOD::TEXTURE: return SM_TEXTURE; #if defined(HAS_GLES) case GL_SHADER_METHOD::TEXTURE_RGBA_OES: return SM_TEXTURE_RGBA_OES; + case GL_SHADER_METHOD::TEXTURE_NOALPHA: + return SM_TEXTURE_NOALPHA; #endif default: break; diff --git a/xbmc/cores/RetroPlayer/rendering/RenderContext.h b/xbmc/cores/RetroPlayer/rendering/RenderContext.h index 4315c1419f485..0173344a63ed9 100644 --- a/xbmc/cores/RetroPlayer/rendering/RenderContext.h +++ b/xbmc/cores/RetroPlayer/rendering/RenderContext.h @@ -27,6 +27,7 @@ enum class GL_SHADER_METHOD DEFAULT, TEXTURE, TEXTURE_RGBA_OES, + TEXTURE_NOALPHA, }; namespace KODI diff --git a/xbmc/cores/RetroPlayer/rendering/VideoRenderers/RPRendererOpenGLES.cpp b/xbmc/cores/RetroPlayer/rendering/VideoRenderers/RPRendererOpenGLES.cpp index a613f7674af1b..b616c7aa1d43d 100644 --- a/xbmc/cores/RetroPlayer/rendering/VideoRenderers/RPRendererOpenGLES.cpp +++ b/xbmc/cores/RetroPlayer/rendering/VideoRenderers/RPRendererOpenGLES.cpp @@ -264,7 +264,7 @@ void CRPRendererOpenGLES::Render(uint8_t alpha) glTexParameteri(m_textureTarget, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(m_textureTarget, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - m_context.EnableGUIShader(GL_SHADER_METHOD::TEXTURE); + m_context.EnableGUIShader(GL_SHADER_METHOD::TEXTURE_NOALPHA); GLubyte colour[4]; GLubyte idx[4] = {0, 1, 3, 2}; // Determines order of triangle strip