aboutsummaryrefslogtreecommitdiff
path: root/system
diff options
context:
space:
mode:
authorCrystalPT <CrystalPT@svn>2010-07-10 01:39:42 +0000
committerCrystalPT <CrystalPT@svn>2010-07-10 01:39:42 +0000
commitbd64b1952a361b08d3d4a76e40b2f1041b8f8b7e (patch)
tree784122db5d22837977d295f3ad0e8f9cbbf0b37b /system
parentb4d9cd5e6cd9d944dc508c4d9ce0928050a54600 (diff)
Merge branch 'commit-shaders'
git-svn-id: https://xbmc.svn.sourceforge.net/svnroot/xbmc/trunk@31685 568bbfeb-2a22-0410-94d2-cc84cf5bfa90
Diffstat (limited to 'system')
-rw-r--r--system/shaders/convolution-4x4_d3d.fx115
-rw-r--r--system/shaders/convolution-6x6_d3d.fx123
-rw-r--r--system/shaders/yuv2rgb_4x4_d3d.fx132
-rw-r--r--system/shaders/yuv2rgb_6x6_d3d.fx141
-rw-r--r--system/shaders/yuv2rgb_d3d.fx49
5 files changed, 283 insertions, 277 deletions
diff --git a/system/shaders/convolution-4x4_d3d.fx b/system/shaders/convolution-4x4_d3d.fx
new file mode 100644
index 0000000000..b169e9adf3
--- /dev/null
+++ b/system/shaders/convolution-4x4_d3d.fx
@@ -0,0 +1,115 @@
+/*
+ * Copyright (C) 2005-2010 Team XBMC
+ * http://www.xbmc.org
+ *
+ * This Program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This Program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with XBMC; see the file COPYING. If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ */
+
+texture g_Texture;
+texture g_KernelTexture;
+float2 g_StepXY;
+
+sampler RGBSampler =
+ sampler_state {
+ Texture = <g_Texture>;
+ AddressU = CLAMP;
+ AddressV = CLAMP;
+ MipFilter = LINEAR;
+ MinFilter = POINT;
+ MagFilter = POINT;
+ };
+
+sampler KernelSampler =
+ sampler_state
+ {
+ Texture = <g_KernelTexture>;
+ AddressU = CLAMP;
+ AddressV = CLAMP;
+ MipFilter = LINEAR;
+ MinFilter = LINEAR;
+ MagFilter = LINEAR;
+ };
+
+struct VS_OUTPUT
+{
+ float4 Position : POSITION;
+ float2 TextureUV : TEXCOORD0;
+};
+
+struct PS_OUTPUT
+{
+ float4 RGBColor : COLOR0;
+};
+
+half4 weight(float pos)
+{
+ return tex1D(KernelSampler, pos);
+}
+
+half3 pixel(float xpos, float ypos)
+{
+ return tex2D(RGBSampler, float2(xpos, ypos)).rgb;
+}
+
+half3 getLine(float ypos, float4 xpos, half4 linetaps)
+{
+ return
+ pixel(xpos.r, ypos) * linetaps.r +
+ pixel(xpos.g, ypos) * linetaps.g +
+ pixel(xpos.b, ypos) * linetaps.b +
+ pixel(xpos.a, ypos) * linetaps.a;
+}
+
+PS_OUTPUT CONVOLUTION4x4(VS_OUTPUT In)
+{
+ PS_OUTPUT OUT;
+
+ float2 pos = In.TextureUV + g_StepXY * 0.5;
+ float2 f = frac(pos / g_StepXY);
+
+ half4 linetaps = weight(1.0 - f.x);
+ half4 columntaps = weight(1.0 - f.y);
+
+ // kernel generation code made sure taps add up to 1, no need to adjust here.
+
+ float2 xystart = (-1.0 - f) * g_StepXY + In.TextureUV;
+ float4 xpos = float4(
+ xystart.x,
+ xystart.x + g_StepXY.x,
+ xystart.x + g_StepXY.x * 2.0,
+ xystart.x + g_StepXY.x * 3.0);
+
+ OUT.RGBColor.rgb =
+ getLine(xystart.y , xpos, linetaps) * columntaps.r +
+ getLine(xystart.y + g_StepXY.y , xpos, linetaps) * columntaps.g +
+ getLine(xystart.y + g_StepXY.y * 2.0, xpos, linetaps) * columntaps.b +
+ getLine(xystart.y + g_StepXY.y * 3.0, xpos, linetaps) * columntaps.a;
+
+ OUT.RGBColor.a = 1.0;
+ return OUT;
+}
+
+technique SCALER_T
+{
+ pass P0
+ {
+ PixelShader = compile ps_3_0 CONVOLUTION4x4();
+ ZEnable = False;
+ FillMode = Solid;
+ FogEnable = False;
+ }
+};
diff --git a/system/shaders/convolution-6x6_d3d.fx b/system/shaders/convolution-6x6_d3d.fx
new file mode 100644
index 0000000000..e95344684e
--- /dev/null
+++ b/system/shaders/convolution-6x6_d3d.fx
@@ -0,0 +1,123 @@
+/*
+ * Copyright (C) 2005-2010 Team XBMC
+ * http://www.xbmc.org
+ *
+ * This Program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This Program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with XBMC; see the file COPYING. If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ */
+
+texture g_Texture;
+texture g_KernelTexture;
+float2 g_StepXY;
+
+sampler RGBSampler =
+ sampler_state {
+ Texture = <g_Texture>;
+ AddressU = CLAMP;
+ AddressV = CLAMP;
+ MipFilter = LINEAR;
+ MinFilter = POINT;
+ MagFilter = POINT;
+ };
+
+sampler KernelSampler =
+ sampler_state
+ {
+ Texture = <g_KernelTexture>;
+ AddressU = CLAMP;
+ AddressV = CLAMP;
+ MipFilter = LINEAR;
+ MinFilter = LINEAR;
+ MagFilter = LINEAR;
+ };
+
+struct VS_OUTPUT
+{
+ float4 Position : POSITION;
+ float2 TextureUV : TEXCOORD0;
+};
+
+struct PS_OUTPUT
+{
+ float4 RGBColor : COLOR0;
+};
+
+half3 weight(float pos)
+{
+ return tex1D(KernelSampler, pos).rgb;
+}
+
+half3 pixel(float xpos, float ypos)
+{
+ return tex2D(RGBSampler, float2(xpos, ypos)).rgb;
+}
+
+half3 getLine(float ypos, float3 xpos1, float3 xpos2, half3 linetaps1, half3 linetaps2)
+{
+ return
+ pixel(xpos1.r, ypos) * linetaps1.r +
+ pixel(xpos1.g, ypos) * linetaps2.r +
+ pixel(xpos1.b, ypos) * linetaps1.g +
+ pixel(xpos2.r, ypos) * linetaps2.g +
+ pixel(xpos2.g, ypos) * linetaps1.b +
+ pixel(xpos2.b, ypos) * linetaps2.b;
+}
+
+PS_OUTPUT CONVOLUTION6x6(VS_OUTPUT In)
+{
+ PS_OUTPUT OUT;
+
+ float2 pos = In.TextureUV + g_StepXY * 0.5;
+ float2 f = frac(pos / g_StepXY);
+
+ half3 linetaps1 = weight((1.0 - f.x) / 2.0);
+ half3 linetaps2 = weight((1.0 - f.x) / 2.0 + 0.5);
+ half3 columntaps1 = weight((1.0 - f.y) / 2.0);
+ half3 columntaps2 = weight((1.0 - f.y) / 2.0 + 0.5);
+
+ // kernel generation code made sure taps add up to 1, no need to adjust here.
+
+ float2 xystart = (-2.0 - f) * g_StepXY + In.TextureUV;
+ float3 xpos1 = float3(
+ xystart.x,
+ xystart.x + g_StepXY.x,
+ xystart.x + g_StepXY.x * 2.0);
+ float3 xpos2 = half3(
+ xystart.x + g_StepXY.x * 3.0,
+ xystart.x + g_StepXY.x * 4.0,
+ xystart.x + g_StepXY.x * 5.0);
+
+ OUT.RGBColor.rgb = getLine(xystart.y , xpos1, xpos2, linetaps1, linetaps2) * columntaps1.r +
+ getLine(xystart.y + g_StepXY.y , xpos1, xpos2, linetaps1, linetaps2) * columntaps2.r +
+ getLine(xystart.y + g_StepXY.y * 2.0, xpos1, xpos2, linetaps1, linetaps2) * columntaps1.g +
+ getLine(xystart.y + g_StepXY.y * 3.0, xpos1, xpos2, linetaps1, linetaps2) * columntaps2.g +
+ getLine(xystart.y + g_StepXY.y * 4.0, xpos1, xpos2, linetaps1, linetaps2) * columntaps1.b +
+ getLine(xystart.y + g_StepXY.y * 5.0, xpos1, xpos2, linetaps1, linetaps2) * columntaps2.b;
+
+ OUT.RGBColor.a = 1.0;
+ return OUT;
+}
+
+technique SCALER_T
+{
+ pass P0
+ {
+ PixelShader = compile ps_3_0 CONVOLUTION6x6();
+ ZEnable = False;
+ FillMode = Solid;
+ FogEnable = False;
+ }
+};
diff --git a/system/shaders/yuv2rgb_4x4_d3d.fx b/system/shaders/yuv2rgb_4x4_d3d.fx
deleted file mode 100644
index 18ae0257f0..0000000000
--- a/system/shaders/yuv2rgb_4x4_d3d.fx
+++ /dev/null
@@ -1,132 +0,0 @@
-texture g_YTexture;
-texture g_UTexture;
-texture g_VTexture;
-texture g_KernelTexture;
-
-float2 g_YStep;
-float2 g_UVStep;
-
-float4x4 g_ColorMatrix;
-
-sampler YSampler =
- sampler_state {
- Texture = <g_YTexture>;
- AddressU = CLAMP;
- AddressV = CLAMP;
- MipFilter = LINEAR;
- MinFilter = POINT;
- MagFilter = POINT;
- };
-
-sampler USampler =
- sampler_state {
- Texture = <g_UTexture>;
- AddressU = CLAMP;
- AddressV = CLAMP;
- MipFilter = LINEAR;
- MinFilter = POINT;
- MagFilter = POINT;
- };
-
-sampler VSampler =
- sampler_state
- {
- Texture = <g_VTexture>;
- AddressU = CLAMP;
- AddressV = CLAMP;
- MipFilter = LINEAR;
- MinFilter = POINT;
- MagFilter = POINT;
- };
-
-sampler KernelSampler =
- sampler_state
- {
- Texture = <g_KernelTexture>;
- AddressU = CLAMP;
- AddressV = CLAMP;
- MipFilter = LINEAR;
- MinFilter = LINEAR;
- MagFilter = LINEAR;
- };
-
-struct VS_OUTPUT
-{
- float4 Position : POSITION;
- float2 TextureY : TEXCOORD0;
- float2 TextureU : TEXCOORD1;
- float2 TextureV : TEXCOORD2;
-};
-
-struct PS_OUTPUT
-{
- float4 RGBColor : COLOR0;
-};
-
-float4 weight(float pos)
-{
- return tex1D(KernelSampler, pos);
-}
-
-float pixel(sampler tex, float xpos, float ypos)
-{
- return tex2D(tex, float2(xpos, ypos)).r;
-}
-
-float getLine(sampler tex, float ypos, float4 xpos, float4 linetaps)
-{
- float pixels;
-
- pixels = pixel(tex, xpos.r, ypos) * linetaps.r;
- pixels += pixel(tex, xpos.g, ypos) * linetaps.g;
- pixels += pixel(tex, xpos.b, ypos) * linetaps.b;
- pixels += pixel(tex, xpos.a, ypos) * linetaps.a;
-
- return pixels;
-}
-
-float getPixel(sampler tex, float2 texCoord, float2 step)
-{
- float xf = frac(texCoord.x / step.x);
- float yf = frac(texCoord.y / step.y);
-
- float4 linetaps = weight(1.0 - xf);
- float4 columntaps = weight(1.0 - yf);
-
- float4 xpos = float4(
- (-0.5 - xf) * step.x + texCoord.x,
- ( 0.5 - xf) * step.x + texCoord.x,
- ( 1.5 - xf) * step.x + texCoord.x,
- ( 2.5 - xf) * step.x + texCoord.x);
-
- float fragColor;
- fragColor = getLine(tex, (-0.5 - yf) * step.y + texCoord.y, xpos, linetaps) * columntaps.r;
- fragColor += getLine(tex, ( 0.5 - yf) * step.y + texCoord.y, xpos, linetaps) * columntaps.g;
- fragColor += getLine(tex, ( 1.5 - yf) * step.y + texCoord.y, xpos, linetaps) * columntaps.b;
- fragColor += getLine(tex, ( 2.5 - yf) * step.y + texCoord.y, xpos, linetaps) * columntaps.a;
-
- return fragColor;
-}
-
-PS_OUTPUT YUV2RGB(VS_OUTPUT In)
-{
- PS_OUTPUT OUT;
- float4 YUV = float4(getPixel (YSampler, In.TextureY, g_YStep)
- , getPixel (USampler, In.TextureU, g_UVStep)
- , getPixel (VSampler, In.TextureV, g_UVStep)
- , 1.0);
- OUT.RGBColor = mul(YUV, g_ColorMatrix);
- OUT.RGBColor.a = 1.0;
- return OUT;
-}
-
-technique YUV2RGB_T
-{
- pass P0
- {
- PixelShader = compile ps_3_0 YUV2RGB();
- ZEnable = False;
- FillMode = Solid;
- FogEnable = False;
- }
-};
diff --git a/system/shaders/yuv2rgb_6x6_d3d.fx b/system/shaders/yuv2rgb_6x6_d3d.fx
deleted file mode 100644
index 9fce0b2c49..0000000000
--- a/system/shaders/yuv2rgb_6x6_d3d.fx
+++ /dev/null
@@ -1,141 +0,0 @@
-texture g_YTexture;
-texture g_UTexture;
-texture g_VTexture;
-texture g_KernelTexture;
-
-float2 g_YStep;
-float2 g_UVStep;
-
-float4x4 g_ColorMatrix;
-
-sampler YSampler =
- sampler_state {
- Texture = <g_YTexture>;
- AddressU = CLAMP;
- AddressV = CLAMP;
- MipFilter = LINEAR;
- MinFilter = POINT;
- MagFilter = POINT;
- };
-
-sampler USampler =
- sampler_state {
- Texture = <g_UTexture>;
- AddressU = CLAMP;
- AddressV = CLAMP;
- MipFilter = LINEAR;
- MinFilter = POINT;
- MagFilter = POINT;
- };
-
-sampler VSampler =
- sampler_state
- {
- Texture = <g_VTexture>;
- AddressU = CLAMP;
- AddressV = CLAMP;
- MipFilter = LINEAR;
- MinFilter = POINT;
- MagFilter = POINT;
- };
-
-sampler KernelSampler =
- sampler_state
- {
- Texture = <g_KernelTexture>;
- AddressU = CLAMP;
- AddressV = CLAMP;
- MipFilter = LINEAR;
- MinFilter = LINEAR;
- MagFilter = LINEAR;
- };
-
-struct VS_OUTPUT
-{
- float4 Position : POSITION;
- float2 TextureY : TEXCOORD0;
- float2 TextureU : TEXCOORD1;
- float2 TextureV : TEXCOORD2;
-};
-
-struct PS_OUTPUT
-{
- float4 RGBColor : COLOR0;
-};
-
-float3 weight(float pos)
-{
- return tex1D(KernelSampler, pos).rgb;
-}
-
-float pixel(sampler tex, float xpos, float ypos)
-{
- return tex2D(tex, float2(xpos, ypos)).r;
-}
-
-float getLine(sampler tex, float ypos, float3 xpos1, float3 xpos2, float3 linetaps1, float3 linetaps2)
-{
- float pixels;
-
- pixels = pixel(tex, xpos1.r, ypos) * linetaps1.r;
- pixels += pixel(tex, xpos1.g, ypos) * linetaps2.r;
- pixels += pixel(tex, xpos1.b, ypos) * linetaps1.g;
- pixels += pixel(tex, xpos2.r, ypos) * linetaps2.g;
- pixels += pixel(tex, xpos2.g, ypos) * linetaps1.b;
- pixels += pixel(tex, xpos2.b, ypos) * linetaps2.b;
-
- return pixels;
-}
-
-float getPixel(sampler tex, float2 texCoord, float2 step)
-{
- float xf = frac(texCoord.x / step.x);
- float yf = frac(texCoord.y / step.y);
-
- float3 linetaps1 = weight((1.0 - xf) / 2.0);
- float3 linetaps2 = weight((1.0 - xf) / 2.0 + 0.5);
- float3 columntaps1 = weight((1.0 - yf) / 2.0);
- float3 columntaps2 = weight((1.0 - yf) / 2.0 + 0.5);
-
- float3 xpos1 = float3(
- (-1.5 - xf) * step.x + texCoord.x,
- (-0.5 - xf) * step.x + texCoord.x,
- ( 0.5 - xf) * step.x + texCoord.x);
- float3 xpos2 = float3(
- ( 1.5 - xf) * step.x + texCoord.x,
- ( 2.5 - xf) * step.x + texCoord.x,
- ( 3.5 - xf) * step.x + texCoord.x);
-
- float fragColor;
- fragColor = getLine(tex, (-1.5 - yf) * step.y + texCoord.y, xpos1, xpos2, linetaps1, linetaps2) * columntaps1.r;
- fragColor += getLine(tex, (-0.5 - yf) * step.y + texCoord.y, xpos1, xpos2, linetaps1, linetaps2) * columntaps2.r;
- fragColor += getLine(tex, ( 0.5 - yf) * step.y + texCoord.y, xpos1, xpos2, linetaps1, linetaps2) * columntaps1.g;
- fragColor += getLine(tex, ( 1.5 - yf) * step.y + texCoord.y, xpos1, xpos2, linetaps1, linetaps2) * columntaps2.g;
- fragColor += getLine(tex, ( 2.5 - yf) * step.y + texCoord.y, xpos1, xpos2, linetaps1, linetaps2) * columntaps1.b;
- fragColor += getLine(tex, ( 3.5 - yf) * step.y + texCoord.y, xpos1, xpos2, linetaps1, linetaps2) * columntaps2.b;
-
- return fragColor;
-}
-
-PS_OUTPUT YUV2RGB(VS_OUTPUT In)
-{
- PS_OUTPUT OUT;
- float4 YUV = float4(getPixel (YSampler, In.TextureY, g_YStep)
- , getPixel (USampler, In.TextureU, g_UVStep)
- , getPixel (VSampler, In.TextureV, g_UVStep)
- , 1.0);
- OUT.RGBColor = mul(YUV, g_ColorMatrix);
- OUT.RGBColor.a = 1.0;
- return OUT;
-}
-
-technique YUV2RGB_T
-{
- pass P0
- {
- PixelShader = compile ps_3_0 YUV2RGB();
- ZEnable = False;
- FillMode = Solid;
- FogEnable = False;
- }
-};
diff --git a/system/shaders/yuv2rgb_d3d.fx b/system/shaders/yuv2rgb_d3d.fx
index 6d5aab954b..a71b8f6b75 100644
--- a/system/shaders/yuv2rgb_d3d.fx
+++ b/system/shaders/yuv2rgb_d3d.fx
@@ -1,8 +1,33 @@
+/*
+ * Copyright (C) 2005-2010 Team XBMC
+ * http://www.xbmc.org
+ *
+ * This Program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This Program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with XBMC; see the file COPYING. If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ */
+
texture g_YTexture;
texture g_UTexture;
texture g_VTexture;
float4x4 g_ColorMatrix;
+#ifdef SINGLEPASS
+
+// Color conversion + bilinear resize in one pass
+
sampler YSampler =
sampler_state {
Texture = <g_YTexture>;
@@ -13,7 +38,23 @@ sampler YSampler =
MagFilter = LINEAR;
};
-sampler USampler =
+#else
+
+// Color conversion only
+
+sampler YSampler =
+ sampler_state {
+ Texture = <g_YTexture>;
+ AddressU = CLAMP;
+ AddressV = CLAMP;
+ MipFilter = LINEAR;
+ MinFilter = POINT;
+ MagFilter = POINT;
+ };
+
+#endif
+
+sampler USampler =
sampler_state {
Texture = <g_UTexture>;
AddressU = CLAMP;
@@ -23,7 +64,7 @@ sampler USampler =
MagFilter = LINEAR;
};
-sampler VSampler =
+sampler VSampler =
sampler_state
{
Texture = <g_VTexture>;
@@ -38,8 +79,8 @@ struct VS_OUTPUT
{
float4 Position : POSITION;
float2 TextureY : TEXCOORD0;
- float2 TextureU : TEXCOORD0;
- float2 TextureV : TEXCOORD0;
+ float2 TextureU : TEXCOORD1;
+ float2 TextureV : TEXCOORD2;
};
struct PS_OUTPUT