aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbobo1on1 <bobo1on1@svn>2010-05-21 18:02:30 +0000
committerbobo1on1 <bobo1on1@svn>2010-05-21 18:02:30 +0000
commit9e5c4c5df61ace4370c924fe0528700ecc762426 (patch)
treed68cd79acf8debc4a4b38ba2cf8776a8d0e37ba7
parentd99129093df52d32ac3df63f85b9575ef57241bf (diff)
fixed: usage of GL_TEXTURE_1D/GL_TEXTURE_2D in VideoFilterShader.cpp
git-svn-id: https://xbmc.svn.sourceforge.net/svnroot/xbmc/trunk@30386 568bbfeb-2a22-0410-94d2-cc84cf5bfa90
-rw-r--r--system/shaders/convolution-4x4.glsl26
-rw-r--r--system/shaders/convolution-6x6.glsl26
-rw-r--r--xbmc/cores/VideoRenderers/VideoShaders/VideoFilterShader.cpp59
3 files changed, 75 insertions, 36 deletions
diff --git a/system/shaders/convolution-4x4.glsl b/system/shaders/convolution-4x4.glsl
index fa3f8c11ec..c02578f874 100644
--- a/system/shaders/convolution-4x4.glsl
+++ b/system/shaders/convolution-4x4.glsl
@@ -1,8 +1,13 @@
uniform sampler2D img;
-uniform sampler1D kernelTex;
uniform vec2 stepxy;
uniform float m_stretch;
+#if (USE1DTEXTURE)
+ uniform sampler1D kernelTex;
+#else
+ uniform sampler2D kernelTex;
+#endif
+
//nvidia's half is a 16 bit float and can bring some speed improvements
//without affecting quality
#ifndef __GLSL_CG_DATA_TYPES
@@ -11,17 +16,22 @@ uniform float m_stretch;
#define half4 vec4
#endif
-#if (HAS_FLOAT_TEXTURE)
half4 weight(float pos)
{
- return texture1D(kernelTex, pos);
-}
+#if (HAS_FLOAT_TEXTURE)
+ #if (USE1DTEXTURE)
+ return texture1D(kernelTex, pos);
+ #else
+ return texture2D(kernelTex, vec2(pos, 0.5));
+ #endif
#else
-half4 weight(float pos)
-{
- return texture1D(kernelTex, pos) * 2.0 - 1.0;
-}
+ #if (USE1DTEXTURE)
+ return texture1D(kernelTex, pos) * 2.0 - 1.0;
+ #else
+ return texture2D(kernelTex, vec2(pos, 0.5)) * 2.0 - 1.0;
+ #endif
#endif
+}
vec2 stretch(vec2 pos)
{
diff --git a/system/shaders/convolution-6x6.glsl b/system/shaders/convolution-6x6.glsl
index f37dd6105a..a455076e0b 100644
--- a/system/shaders/convolution-6x6.glsl
+++ b/system/shaders/convolution-6x6.glsl
@@ -1,8 +1,13 @@
uniform sampler2D img;
-uniform sampler1D kernelTex;
uniform vec2 stepxy;
uniform float m_stretch;
+#if (USE1DTEXTURE)
+ uniform sampler1D kernelTex;
+#else
+ uniform sampler2D kernelTex;
+#endif
+
//nvidia's half is a 16 bit float and can bring some speed improvements
//without affecting quality
#ifndef __GLSL_CG_DATA_TYPES
@@ -11,17 +16,22 @@ uniform float m_stretch;
#define half4 vec4
#endif
-#if (HAS_FLOAT_TEXTURE)
half3 weight(float pos)
{
- return texture1D(kernelTex, pos).rgb;
-}
+#if (HAS_FLOAT_TEXTURE)
+ #if (USE1DTEXTURE)
+ return texture1D(kernelTex, pos).rgb;
+ #else
+ return texture2D(kernelTex, vec2(pos, 0.5)).rgb;
+ #endif
#else
-half3 weight(float pos)
-{
- return texture1D(kernelTex, pos).rgb * 2.0 - 1.0;
-}
+ #if (USE1DTEXTURE)
+ return texture1D(kernelTex, pos).rgb * 2.0 - 1.0;
+ #else
+ return texture2D(kernelTex, vec2(pos, 0.5)).rgb * 2.0 - 1.0;
+ #endif
#endif
+}
vec2 stretch(vec2 pos)
{
diff --git a/xbmc/cores/VideoRenderers/VideoShaders/VideoFilterShader.cpp b/xbmc/cores/VideoRenderers/VideoShaders/VideoFilterShader.cpp
index 932acccf67..fc397324cb 100644
--- a/xbmc/cores/VideoRenderers/VideoShaders/VideoFilterShader.cpp
+++ b/xbmc/cores/VideoRenderers/VideoShaders/VideoFilterShader.cpp
@@ -31,6 +31,13 @@
using namespace Shaders;
using namespace std;
+#if defined(HAS_GL)
+ #define USE1DTEXTURE
+ #define TEXTARGET GL_TEXTURE_1D
+#else
+ #define TEXTARGET GL_TEXTURE_2D
+#endif
+
//////////////////////////////////////////////////////////////////////
// BaseVideoFilterShader - base class for video filter shaders
//////////////////////////////////////////////////////////////////////
@@ -106,6 +113,13 @@ ConvolutionFilterShader::ConvolutionFilterShader(ESCALINGMETHOD method, bool str
else
defines += "#define XBMC_STRETCH 0\n";
+ //tell shader if we're using a 1D texture
+#ifdef USE1DTEXTURE
+ defines += "#define USE1DTEXTURE 1\n";
+#else
+ defines += "#define USE1DTEXTURE 0\n";
+#endif
+
CLog::Log(LOGDEBUG, "GL: ConvolutionFilterShader: using %s defines: %s", shadername.c_str(), defines.c_str());
PixelShader()->LoadSource(shadername, defines);
}
@@ -134,25 +148,35 @@ void ConvolutionFilterShader::OnCompiledAndLinked()
return;
}
+ //make a kernel texture on GL_TEXTURE2 and set clamping and interpolation
+ //TEXTARGET is set to GL_TEXTURE_1D or GL_TEXTURE_2D
glActiveTexture(GL_TEXTURE2);
-#if defined(HAS_GL)
- glBindTexture(GL_TEXTURE_1D, m_kernelTex1);
- glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+ glBindTexture(TEXTARGET, m_kernelTex1);
+ glTexParameteri(TEXTARGET, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri(TEXTARGET, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(TEXTARGET, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameteri(TEXTARGET, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
- //if float textures are supported, we can load the kernel as a 1d float texture
+ //if float textures are supported, we can load the kernel as a float texture
//if not we load it as 8 bit unsigned which gets converted back to float in the shader
+ GLenum format;
+ GLvoid* data;
if (m_floattex)
- glTexImage1D(GL_TEXTURE_1D, 0, m_internalformat, kernel.GetSize(), 0, GL_RGBA, GL_FLOAT, kernel.GetFloatPixels());
+ {
+ format = GL_FLOAT;
+ data = (GLvoid*)kernel.GetFloatPixels();
+ }
else
- glTexImage1D(GL_TEXTURE_1D, 0, m_internalformat, kernel.GetSize(), 0, GL_RGBA, GL_UNSIGNED_BYTE, kernel.GetUint8Pixels());
-#elif HAS_GLES == 2
- //TODO: This need fixups see orginal at
- // http://trac.xbmc.org/browser/branches/arm-camelot/trunk/xbmc/cores/VideoRenderers/VideoShaders/VideoFilterShader.cpp
- //TODO: GL_RGBA16F_ARB for GLES!?
- //glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, size, 1, 0, GL_RGBA, GL_FLOAT, img);
+ {
+ format = GL_UNSIGNED_BYTE;
+ data = (GLvoid*)kernel.GetUint8Pixels();
+ }
+
+ //upload as 1D texture or as 2D texture with height of 1
+#ifdef USE1DTEXTURE
+ glTexImage1D(TEXTARGET, 0, m_internalformat, kernel.GetSize(), 0, GL_RGBA, format, data);
+#else
+ glTexImage2D(TEXTARGET, 0, m_internalformat, kernel.GetSize(), 1, 0, GL_RGBA, format, data);
#endif
glActiveTexture(GL_TEXTURE0);
@@ -164,12 +188,7 @@ bool ConvolutionFilterShader::OnEnabled()
{
// set shader attributes once enabled
glActiveTexture(GL_TEXTURE2);
-#if defined(HAS_GL)
- glBindTexture(GL_TEXTURE_1D, m_kernelTex1);
-#elif HAS_GLES == 2
- // TODO: OpenGL/ES does not have GL_TEXTURE_1D
- //glBindTexture(GL_TEXTURE_2D, m_kernelTex1);
-#endif
+ glBindTexture(TEXTARGET, m_kernelTex1);
glActiveTexture(GL_TEXTURE0);
glUniform1i(m_hSourceTex, m_sourceTexUnit);