gfx/layers/d3d9/LayerManagerD3D9Shaders.hlsl
author Jeff Muizelaar <jmuizelaar@mozilla.com>
Wed, 01 Sep 2010 17:10:51 -0400
changeset 51853 d35f97d3fe5c21891924da8b4f6b540431b730c4
parent 42922 c458465578e05553463703065a793280ccf36855
child 51963 388e25a30cab946c4d7beb3b8f914eeae9c5fa98
permissions -rw-r--r--
Bug 589395. d3d9: adjust vertex locations in the vertex shader. r=bas,a=blocking Previously we adjusted the vertex locations directly, now they have an implicit adjustment that happens in the vertex shader. This should let us ignore the pixel center differences between opengl/d3d9/d3d10.

float4x4 mLayerQuadTransform;
float4x4 mLayerTransform;
float4 vRenderTargetOffset;
float4x4 mProjection;

texture tex0;
sampler s2D;
sampler s2DY;
sampler s2DCb;
sampler s2DCr;

float fLayerOpacity;
float4 fLayerColor;

struct VS_INPUT {
  float4 vPosition : POSITION;
};

struct VS_OUTPUT {
  float4 vPosition : POSITION;
  float2 vTexCoords : TEXCOORD0;
};

VS_OUTPUT LayerQuadVS(const VS_INPUT aVertex)
{
  VS_OUTPUT outp;
  outp.vPosition = aVertex.vPosition;
  outp.vPosition = mul(mLayerQuadTransform, outp.vPosition);
  outp.vPosition = mul(mLayerTransform, outp.vPosition);
  outp.vPosition = outp.vPosition - vRenderTargetOffset;
  
  // adjust our vertices to match d3d9's pixel coordinate system
  // which has pixel centers at integer locations
  outp.vPosition.xy -= 0.5;
  
  outp.vPosition = mul(mProjection, outp.vPosition);
  
  outp.vTexCoords = aVertex.vPosition.xy;
  return outp;
}

float4 RGBShader(const VS_OUTPUT aVertex) : COLOR
{
  return tex2D(s2D, aVertex.vTexCoords) * fLayerOpacity;
}

float4 YCbCrShader(const VS_OUTPUT aVertex) : COLOR
{
  float4 yuv;
  float4 color;

  yuv.r = tex2D(s2DCr, aVertex.vTexCoords).r - 0.5;
  yuv.g = tex2D(s2DY, aVertex.vTexCoords).r - 0.0625;
  yuv.b = tex2D(s2DCb, aVertex.vTexCoords).r - 0.5;

  color.r = yuv.g * 1.164 + yuv.r * 1.596;
  color.g = yuv.g * 1.164 - 0.813 * yuv.r - 0.391 * yuv.b;
  color.b = yuv.g * 1.164 + yuv.b * 2.018;
  color.a = 1.0f;
 
  return color * fLayerOpacity;
}

float4 SolidColorShader(const VS_OUTPUT aVertex) : COLOR
{
  return fLayerColor;
}