diff options
author | CrystalPT <CrystalPT@svn> | 2010-07-10 01:39:42 +0000 |
---|---|---|
committer | CrystalPT <CrystalPT@svn> | 2010-07-10 01:39:42 +0000 |
commit | bd64b1952a361b08d3d4a76e40b2f1041b8f8b7e (patch) | |
tree | 784122db5d22837977d295f3ad0e8f9cbbf0b37b /system | |
parent | b4d9cd5e6cd9d944dc508c4d9ce0928050a54600 (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.fx | 115 | ||||
-rw-r--r-- | system/shaders/convolution-6x6_d3d.fx | 123 | ||||
-rw-r--r-- | system/shaders/yuv2rgb_4x4_d3d.fx | 132 | ||||
-rw-r--r-- | system/shaders/yuv2rgb_6x6_d3d.fx | 141 | ||||
-rw-r--r-- | system/shaders/yuv2rgb_d3d.fx | 49 |
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 |