diff options
author | Chris "Koying" Browet <cbro@semperpax.com> | 2015-01-17 20:06:05 +0100 |
---|---|---|
committer | Chris "koying" Browet <cbro@semperpax.com> | 2015-01-20 14:17:09 +0100 |
commit | 4b709f5a5abcc7ffc37a83659351e758ee699726 (patch) | |
tree | 7ed9ac913b4459f7a2c1aade231c909c861feff2 | |
parent | d16066960f7fc50f6043460fd7906cd60461ec74 (diff) |
ADD: [gles] enable contrast & brightness controls
-rw-r--r-- | system/shaders/guishader_frag_rgba.glsl | 10 | ||||
-rw-r--r-- | system/shaders/guishader_frag_rgba_bob.glsl | 9 | ||||
-rw-r--r-- | system/shaders/guishader_frag_rgba_bob_oes.glsl | 9 | ||||
-rw-r--r-- | system/shaders/guishader_frag_rgba_oes.glsl | 10 | ||||
-rw-r--r-- | xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp | 34 | ||||
-rw-r--r-- | xbmc/guilib/GUIShader.cpp | 6 | ||||
-rw-r--r-- | xbmc/guilib/GUIShader.h | 4 | ||||
-rw-r--r-- | xbmc/rendering/gles/RenderSystemGLES.cpp | 16 | ||||
-rw-r--r-- | xbmc/rendering/gles/RenderSystemGLES.h | 2 |
9 files changed, 92 insertions, 8 deletions
diff --git a/system/shaders/guishader_frag_rgba.glsl b/system/shaders/guishader_frag_rgba.glsl index e65419d68f..bbda050a9c 100644 --- a/system/shaders/guishader_frag_rgba.glsl +++ b/system/shaders/guishader_frag_rgba.glsl @@ -26,8 +26,14 @@ varying vec4 m_cord1; varying lowp vec4 m_colour; uniform int m_method; -// SM_TEXTURE_NOBLEND +uniform float m_brightness; +uniform float m_contrast; + void main () { - gl_FragColor.rgba = texture2D(m_samp0, m_cord0.xy).rgba; + vec4 color = texture2D(m_samp0, m_cord0.xy).rgba; + color = color * m_contrast; + color = color + m_brightness; + + gl_FragColor.rgba = color; } diff --git a/system/shaders/guishader_frag_rgba_bob.glsl b/system/shaders/guishader_frag_rgba_bob.glsl index 3b02726496..d2d75f977b 100644 --- a/system/shaders/guishader_frag_rgba_bob.glsl +++ b/system/shaders/guishader_frag_rgba_bob.glsl @@ -28,6 +28,9 @@ uniform int m_method; uniform int m_field; uniform float m_step; +uniform float m_brightness; +uniform float m_contrast; + void main () { vec2 source; @@ -43,5 +46,9 @@ void main () below.x = source.x; below.y = source.y + (2.0*m_step*bstep); - gl_FragColor = mix(texture2D(m_samp0, source), texture2D(m_samp0, below), 0.5); + vec4 color = mix(texture2D(m_samp0, source), texture2D(m_samp0, below), 0.5); + color = color * m_contrast; + color = color + m_brightness; + + gl_FragColor.rgba = color; } diff --git a/system/shaders/guishader_frag_rgba_bob_oes.glsl b/system/shaders/guishader_frag_rgba_bob_oes.glsl index 9b7be39744..767e553587 100644 --- a/system/shaders/guishader_frag_rgba_bob_oes.glsl +++ b/system/shaders/guishader_frag_rgba_bob_oes.glsl @@ -30,6 +30,9 @@ uniform int m_method; uniform int m_field; uniform float m_step; +uniform float m_brightness; +uniform float m_contrast; + void main () { vec2 source; @@ -45,5 +48,9 @@ void main () below.x = source.x; below.y = source.y + (2.0*m_step*bstep); - gl_FragColor = mix(texture2D(m_samp0, source), texture2D(m_samp0, below), 0.5); + vec4 color = mix(texture2D(m_samp0, source), texture2D(m_samp0, below), 0.5); + color = color * m_contrast; + color = color + m_brightness; + + gl_FragColor.rgba = color; } diff --git a/system/shaders/guishader_frag_rgba_oes.glsl b/system/shaders/guishader_frag_rgba_oes.glsl index 828d48bef3..a47f46e86a 100644 --- a/system/shaders/guishader_frag_rgba_oes.glsl +++ b/system/shaders/guishader_frag_rgba_oes.glsl @@ -24,8 +24,14 @@ precision mediump float; uniform samplerExternalOES m_samp0; varying vec4 m_cord0; -// SM_TEXTURE_OES +uniform float m_brightness; +uniform float m_contrast; + void main () { - gl_FragColor.rgba = texture2D(m_samp0, m_cord0.xy).rgba; + vec4 color = texture2D(m_samp0, m_cord0.xy).rgba; + color = color * m_contrast; + color = color + m_brightness; + + gl_FragColor.rgba = color; } diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp b/xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp index 7c94afcc81..060c44f4dc 100644 --- a/xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp +++ b/xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp @@ -1359,6 +1359,11 @@ void CLinuxRendererGLES::RenderSoftware(int index, int field) g_Windowing.EnableGUIShader(SM_TEXTURE_RGBA); + GLint contrastLoc = g_Windowing.GUIShaderGetContrast(); + glUniform1f(contrastLoc, CMediaSettings::Get().GetCurrentVideoSettings().m_Contrast * 0.02f); + GLint brightnessLoc = g_Windowing.GUIShaderGetBrightness(); + glUniform1f(brightnessLoc, CMediaSettings::Get().GetCurrentVideoSettings().m_Brightness * 0.01f - 0.5f); + GLubyte idx[4] = {0, 1, 3, 2}; //determines order of triangle strip GLfloat ver[4][4]; GLfloat tex[4][2]; @@ -1424,6 +1429,11 @@ void CLinuxRendererGLES::RenderOpenMax(int index, int field) g_Windowing.EnableGUIShader(SM_TEXTURE_RGBA); + GLint contrastLoc = g_Windowing.GUIShaderGetContrast(); + glUniform1f(contrastLoc, CMediaSettings::Get().GetCurrentVideoSettings().m_Contrast * 0.02f); + GLint brightnessLoc = g_Windowing.GUIShaderGetBrightness(); + glUniform1f(brightnessLoc, CMediaSettings::Get().GetCurrentVideoSettings().m_Brightness * 0.01f - 0.5f); + GLubyte idx[4] = {0, 1, 3, 2}; //determines order of triangle strip GLfloat ver[4][4]; GLfloat tex[4][2]; @@ -1510,6 +1520,11 @@ void CLinuxRendererGLES::RenderEglImage(int index, int field) else g_Windowing.EnableGUIShader(SM_TEXTURE_RGBA); + GLint contrastLoc = g_Windowing.GUIShaderGetContrast(); + glUniform1f(contrastLoc, CMediaSettings::Get().GetCurrentVideoSettings().m_Contrast * 0.02f); + GLint brightnessLoc = g_Windowing.GUIShaderGetBrightness(); + glUniform1f(brightnessLoc, CMediaSettings::Get().GetCurrentVideoSettings().m_Brightness * 0.01f - 0.5f); + GLubyte idx[4] = {0, 1, 3, 2}; //determines order of triangle strip GLfloat ver[4][4]; GLfloat tex[4][2]; @@ -1599,6 +1614,11 @@ void CLinuxRendererGLES::RenderSurfaceTexture(int index, int field) else g_Windowing.EnableGUIShader(SM_TEXTURE_RGBA_OES); + GLint contrastLoc = g_Windowing.GUIShaderGetContrast(); + glUniform1f(contrastLoc, CMediaSettings::Get().GetCurrentVideoSettings().m_Contrast * 0.02f); + GLint brightnessLoc = g_Windowing.GUIShaderGetBrightness(); + glUniform1f(brightnessLoc, CMediaSettings::Get().GetCurrentVideoSettings().m_Brightness * 0.01f - 0.5f); + glUniformMatrix4fv(g_Windowing.GUIShaderGetCoord0Matrix(), 1, GL_FALSE, m_textureMatrix); GLubyte idx[4] = {0, 1, 3, 2}; //determines order of triangle strip @@ -1684,6 +1704,11 @@ void CLinuxRendererGLES::RenderCoreVideoRef(int index, int field) g_Windowing.EnableGUIShader(SM_TEXTURE_RGBA); + GLint contrastLoc = g_Windowing.GUIShaderGetContrast(); + glUniform1f(contrastLoc, CMediaSettings::Get().GetCurrentVideoSettings().m_Contrast * 0.02f); + GLint brightnessLoc = g_Windowing.GUIShaderGetBrightness(); + glUniform1f(brightnessLoc, CMediaSettings::Get().GetCurrentVideoSettings().m_Brightness * 0.01f - 0.5f); + GLubyte idx[4] = {0, 1, 3, 2}; //determines order of triangle strip GLfloat ver[4][4]; GLfloat tex[4][2]; @@ -1757,6 +1782,11 @@ void CLinuxRendererGLES::RenderIMXMAPTexture(int index, int field) g_Windowing.EnableGUIShader(SM_TEXTURE_RGBA); + GLint contrastLoc = g_Windowing.GUIShaderGetContrast(); + glUniform1f(contrastLoc, CMediaSettings::Get().GetCurrentVideoSettings().m_Contrast * 0.02f); + GLint brightnessLoc = g_Windowing.GUIShaderGetBrightness(); + glUniform1f(brightnessLoc, CMediaSettings::Get().GetCurrentVideoSettings().m_Brightness * 0.01f - 0.5f); + GLubyte idx[4] = {0, 1, 3, 2}; //determines order of triangle strip GLfloat ver[4][4]; GLfloat tex[4][2]; @@ -2842,10 +2872,10 @@ bool CLinuxRendererGLES::Supports(ERENDERFEATURE feature) } if(feature == RENDERFEATURE_BRIGHTNESS) - return false; + return true; if(feature == RENDERFEATURE_CONTRAST) - return false; + return true; if(feature == RENDERFEATURE_GAMMA) return false; diff --git a/xbmc/guilib/GUIShader.cpp b/xbmc/guilib/GUIShader.cpp index a31abf4111..ea78bcb801 100644 --- a/xbmc/guilib/GUIShader.cpp +++ b/xbmc/guilib/GUIShader.cpp @@ -44,6 +44,8 @@ CGUIShader::CGUIShader( const char *shader ) : CGLSLShaderProgram("guishader_ver m_hCoord0Matrix = 0; m_hField = 0; m_hStep = 0; + m_hContrast = 0; + m_hBrightness = 0; m_proj = NULL; m_model = NULL; @@ -59,6 +61,8 @@ void CGUIShader::OnCompiledAndLinked() m_hUniCol = glGetUniformLocation(ProgramHandle(), "m_unicol"); m_hField = glGetUniformLocation(ProgramHandle(), "m_field"); m_hStep = glGetUniformLocation(ProgramHandle(), "m_step"); + m_hContrast = glGetUniformLocation(ProgramHandle(), "m_contrast"); + m_hBrightness = glGetUniformLocation(ProgramHandle(), "m_brightness"); // Variables passed directly to the Vertex shader m_hProj = glGetUniformLocation(ProgramHandle(), "m_proj"); @@ -94,6 +98,8 @@ bool CGUIShader::OnEnabled() glUniformMatrix4fv(m_hProj, 1, GL_FALSE, glMatrixProject.Get()); glUniformMatrix4fv(m_hModel, 1, GL_FALSE, glMatrixModview.Get()); + glUniform1f(m_hBrightness, 0.0f); + glUniform1f(m_hContrast, 1.0f); return true; } diff --git a/xbmc/guilib/GUIShader.h b/xbmc/guilib/GUIShader.h index 2df6b1daf8..764e0090cc 100644 --- a/xbmc/guilib/GUIShader.h +++ b/xbmc/guilib/GUIShader.h @@ -41,6 +41,8 @@ public: GLint GetCoord0MatrixLoc() { return m_hCoord0Matrix; } GLint GetFieldLoc() { return m_hField; } GLint GetStepLoc() { return m_hStep; } + GLint GetContrastLoc() { return m_hContrast; } + GLint GetBrightnessLoc() { return m_hBrightness; } protected: GLint m_hTex0; @@ -55,6 +57,8 @@ protected: GLint m_hCoord0Matrix; GLint m_hField; GLint m_hStep; + GLint m_hContrast; + GLint m_hBrightness; GLfloat *m_proj; GLfloat *m_model; diff --git a/xbmc/rendering/gles/RenderSystemGLES.cpp b/xbmc/rendering/gles/RenderSystemGLES.cpp index 2270a69e7c..a2a99db704 100644 --- a/xbmc/rendering/gles/RenderSystemGLES.cpp +++ b/xbmc/rendering/gles/RenderSystemGLES.cpp @@ -667,6 +667,22 @@ GLint CRenderSystemGLES::GUIShaderGetStep() return -1; } +GLint CRenderSystemGLES::GUIShaderGetContrast() +{ + if (m_pGUIshader[m_method]) + return m_pGUIshader[m_method]->GetContrastLoc(); + + return -1; +} + +GLint CRenderSystemGLES::GUIShaderGetBrightness() +{ + if (m_pGUIshader[m_method]) + return m_pGUIshader[m_method]->GetBrightnessLoc(); + + return -1; +} + bool CRenderSystemGLES::SupportsStereo(RENDER_STEREO_MODE mode) { switch(mode) diff --git a/xbmc/rendering/gles/RenderSystemGLES.h b/xbmc/rendering/gles/RenderSystemGLES.h index e5f55c53a2..03cedeb9ab 100644 --- a/xbmc/rendering/gles/RenderSystemGLES.h +++ b/xbmc/rendering/gles/RenderSystemGLES.h @@ -93,6 +93,8 @@ public: GLint GUIShaderGetCoord0Matrix(); GLint GUIShaderGetField(); GLint GUIShaderGetStep(); + GLint GUIShaderGetContrast(); + GLint GUIShaderGetBrightness(); protected: virtual void SetVSyncImpl(bool enable) = 0; |