aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris "Koying" Browet <cbro@semperpax.com>2015-01-17 20:06:05 +0100
committerChris "koying" Browet <cbro@semperpax.com>2015-01-20 14:17:09 +0100
commit4b709f5a5abcc7ffc37a83659351e758ee699726 (patch)
tree7ed9ac913b4459f7a2c1aade231c909c861feff2
parentd16066960f7fc50f6043460fd7906cd60461ec74 (diff)
ADD: [gles] enable contrast & brightness controls
-rw-r--r--system/shaders/guishader_frag_rgba.glsl10
-rw-r--r--system/shaders/guishader_frag_rgba_bob.glsl9
-rw-r--r--system/shaders/guishader_frag_rgba_bob_oes.glsl9
-rw-r--r--system/shaders/guishader_frag_rgba_oes.glsl10
-rw-r--r--xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp34
-rw-r--r--xbmc/guilib/GUIShader.cpp6
-rw-r--r--xbmc/guilib/GUIShader.h4
-rw-r--r--xbmc/rendering/gles/RenderSystemGLES.cpp16
-rw-r--r--xbmc/rendering/gles/RenderSystemGLES.h2
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;