Bug 1323791 - Part 3: Add dynamic vertex shaders
MozReview-Commit-ID: H92wpa7QKMY
--- a/gfx/layers/d3d11/CompositorD3D11.hlsl
+++ b/gfx/layers/d3d11/CompositorD3D11.hlsl
@@ -38,16 +38,21 @@ Texture2D tCr : register(ps, t3);
Texture2D tRGBWhite : register(ps, t4);
Texture2D tMask : register(ps, t5);
Texture2D tBackdrop : register(ps, t6);
struct VS_INPUT {
float2 vPosition : POSITION;
};
+struct VS_TEX_INPUT {
+ float2 vPosition : POSITION;
+ float2 vTexCoords : TEXCOORD0;
+};
+
struct VS_OUTPUT {
float4 vPosition : SV_Position;
float2 vTexCoords : TEXCOORD0;
};
struct VS_MASK_OUTPUT {
float4 vPosition : SV_Position;
float2 vTexCoords : TEXCOORD0;
@@ -160,16 +165,48 @@ VS_MASK_OUTPUT LayerQuadMaskVS(const VS_
outp.vMaskCoords.z = 1;
outp.vMaskCoords *= position.w;
outp.vTexCoords = TexCoords(aVertex.vPosition.xy);
return outp;
}
+VS_OUTPUT LayerDynamicVS(const VS_TEX_INPUT aVertex)
+{
+ VS_OUTPUT outp;
+
+ float4 position = float4(aVertex.vPosition, 0, 1);
+ position = mul(mLayerTransform, position);
+ outp.vPosition = VertexPosition(position);
+
+ outp.vTexCoords = aVertex.vTexCoords;
+
+ return outp;
+}
+
+VS_MASK_OUTPUT LayerDynamicMaskVS(const VS_TEX_INPUT aVertex)
+{
+ VS_MASK_OUTPUT outp;
+
+ float4 position = float4(aVertex.vPosition, 0, 1);
+ position = mul(mLayerTransform, position);
+ outp.vPosition = VertexPosition(position);
+
+ // calculate the position on the mask texture
+ outp.vMaskCoords.x = (position.x - vMaskQuad.x) / vMaskQuad.z;
+ outp.vMaskCoords.y = (position.y - vMaskQuad.y) / vMaskQuad.w;
+ outp.vMaskCoords.z = 1;
+ outp.vMaskCoords *= position.w;
+
+ outp.vTexCoords = aVertex.vTexCoords;
+
+ return outp;
+}
+
float4 RGBAShaderMask(const VS_MASK_OUTPUT aVertex) : SV_Target
{
float2 maskCoords = aVertex.vMaskCoords.xy / aVertex.vMaskCoords.z;
float mask = tMask.Sample(sSampler, maskCoords).r;
return tRGB.Sample(sSampler, aVertex.vTexCoords) * fLayerOpacity * mask;
}
float4 RGBShaderMask(const VS_MASK_OUTPUT aVertex) : SV_Target
@@ -308,16 +345,40 @@ VS_BLEND_OUTPUT LayerQuadBlendMaskVS(con
VS_BLEND_OUTPUT o;
o.vPosition = v.vPosition;
o.vTexCoords = v.vTexCoords;
o.vMaskCoords = v.vMaskCoords;
o.vBackdropCoords = BackdropPosition(v.vPosition);
return o;
}
+VS_BLEND_OUTPUT LayerDynamicBlendVS(const VS_TEX_INPUT aVertex)
+{
+ VS_OUTPUT v = LayerDynamicVS(aVertex);
+
+ VS_BLEND_OUTPUT o;
+ o.vPosition = v.vPosition;
+ o.vTexCoords = v.vTexCoords;
+ o.vMaskCoords = float3(0, 0, 0);
+ o.vBackdropCoords = BackdropPosition(v.vPosition);
+ return o;
+}
+
+VS_BLEND_OUTPUT LayerDynamicBlendMaskVS(const VS_TEX_INPUT aVertex)
+{
+ VS_MASK_OUTPUT v = LayerDynamicMaskVS(aVertex);
+
+ VS_BLEND_OUTPUT o;
+ o.vPosition = v.vPosition;
+ o.vTexCoords = v.vTexCoords;
+ o.vMaskCoords = v.vMaskCoords;
+ o.vBackdropCoords = BackdropPosition(v.vPosition);
+ return o;
+}
+
// The layer type and mask type are specified as constants. We use these to
// call the correct pixel shader to determine the source color for blending.
// Unfortunately this also requires some boilerplate to convert VS_BLEND_OUTPUT
// to a compatible pixel shader input.
float4 ComputeBlendSourceColor(const VS_BLEND_OUTPUT aVertex)
{
if (iBlendConfig.y == PS_MASK_NONE) {
VS_OUTPUT tmp;
--- a/gfx/layers/d3d11/genshaders.sh
+++ b/gfx/layers/d3d11/genshaders.sh
@@ -25,26 +25,30 @@ makeShaderPS() {
}
SRC=CompositorD3D11.hlsl
DEST=CompositorD3D11Shaders.h
rm -f $DEST
echo "struct ShaderBytes { const void* mData; size_t mLength; };" >> $DEST;
makeShaderVS LayerQuadVS
+makeShaderVS LayerDynamicVS
makeShaderPS SolidColorShader
makeShaderPS RGBShader
makeShaderPS RGBAShader
makeShaderPS ComponentAlphaShader
makeShaderPS YCbCrShader
makeShaderVS LayerQuadMaskVS
+makeShaderVS LayerDynamicMaskVS
makeShaderPS SolidColorShaderMask
makeShaderPS RGBShaderMask
makeShaderPS RGBAShaderMask
makeShaderPS YCbCrShaderMask
makeShaderPS ComponentAlphaShaderMask
# Mix-blend shaders
makeShaderVS LayerQuadBlendVS
makeShaderVS LayerQuadBlendMaskVS
+makeShaderVS LayerDynamicBlendVS
+makeShaderVS LayerDynamicBlendMaskVS
makeShaderPS BlendShader
rm $tempfile