| // |
| // Copyright 2017 The ANGLE Project Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| // |
| |
| // Clear11.hlsl: Shaders for clearing RTVs and DSVs using draw calls and |
| // specifying float depth values and either float, uint or sint clear colors. |
| // Notes: |
| // - UINT & SINT clears can only be compiled with FL10+ |
| // - VS_Clear_FL9 requires a VB to be bound with vertices to create |
| // a primitive covering the entire surface (in clip co-ordinates) |
| |
| // Constants |
| static const float2 g_Corners[6] = |
| { |
| float2(-1.0f, 1.0f), |
| float2( 1.0f, -1.0f), |
| float2(-1.0f, -1.0f), |
| float2(-1.0f, 1.0f), |
| float2( 1.0f, 1.0f), |
| float2( 1.0f, -1.0f), |
| }; |
| |
| // Vertex Shaders |
| void VS_Clear(in uint id : SV_VertexID, |
| out float4 outPosition : SV_POSITION) |
| { |
| float2 corner = g_Corners[id]; |
| outPosition = float4(corner.x, corner.y, 0.0f, 1.0f); |
| } |
| |
| void VS_Multiview_Clear(in uint id : SV_VertexID, |
| in uint instanceID : SV_InstanceID, |
| out float4 outPosition : SV_POSITION, |
| out uint outLayerID : TEXCOORD0) |
| { |
| float2 corner = g_Corners[id]; |
| outPosition = float4(corner.x, corner.y, 0.0f, 1.0f); |
| outLayerID = instanceID; |
| } |
| |
| void VS_Clear_FL9( in float4 inPosition : POSITION, |
| out float4 outPosition : SV_POSITION) |
| { |
| outPosition = inPosition; |
| } |
| |
| // Geometry shader for clearing multiview layered textures |
| struct GS_INPUT |
| { |
| float4 inPosition : SV_Position; |
| uint inLayerID : TEXCOORD0; |
| }; |
| |
| struct GS_OUTPUT |
| { |
| float4 outPosition : SV_Position; |
| uint outLayerID : SV_RenderTargetArrayIndex; |
| }; |
| |
| [maxvertexcount(3)] |
| void GS_Multiview_Clear(triangle GS_INPUT input[3], inout TriangleStream<GS_OUTPUT> outStream) |
| { |
| GS_OUTPUT output = (GS_OUTPUT)0; |
| for (int i = 0; i < 3; i++) |
| { |
| output.outPosition = input[i].inPosition; |
| output.outLayerID = input[i].inLayerID; |
| outStream.Append(output); |
| } |
| outStream.RestartStrip(); |
| } |
| |
| // Pixel Shader Constant Buffers |
| cbuffer ColorAndDepthDataFloat : register(b0) |
| { |
| float4 color_Float : packoffset(c0); |
| float zValueF_Float : packoffset(c1); |
| } |
| |
| cbuffer ColorAndDepthDataSint : register(b0) |
| { |
| int4 color_Sint : packoffset(c0); |
| float zValueF_Sint : packoffset(c1); |
| } |
| |
| cbuffer ColorAndDepthDataUint : register(b0) |
| { |
| uint4 color_Uint : packoffset(c0); |
| float zValueF_Uint : packoffset(c1); |
| } |
| |
| cbuffer DepthOnlyData : register(b0) |
| { |
| float zValue_Depth : packoffset(c1); |
| } |
| |
| // Pixel Shader Output Structs |
| struct PS_OutputFloat_FL9 |
| { |
| float4 color0 : SV_TARGET0; |
| float4 color1 : SV_TARGET1; |
| float4 color2 : SV_TARGET2; |
| float4 color3 : SV_TARGET3; |
| float depth : SV_DEPTH; |
| }; |
| |
| struct PS_OutputFloat1 |
| { |
| float4 color0 : SV_TARGET0; |
| float depth : SV_DEPTH; |
| }; |
| |
| struct PS_OutputFloat2 |
| { |
| float4 color0 : SV_TARGET0; |
| float4 color1 : SV_TARGET1; |
| float depth : SV_DEPTH; |
| }; |
| |
| struct PS_OutputFloat3 |
| { |
| float4 color0 : SV_TARGET0; |
| float4 color1 : SV_TARGET1; |
| float4 color2 : SV_TARGET2; |
| float depth : SV_DEPTH; |
| }; |
| |
| struct PS_OutputFloat4 |
| { |
| float4 color0 : SV_TARGET0; |
| float4 color1 : SV_TARGET1; |
| float4 color2 : SV_TARGET2; |
| float4 color3 : SV_TARGET3; |
| float depth : SV_DEPTH; |
| }; |
| |
| struct PS_OutputFloat5 |
| { |
| float4 color0 : SV_TARGET0; |
| float4 color1 : SV_TARGET1; |
| float4 color2 : SV_TARGET2; |
| float4 color3 : SV_TARGET3; |
| float4 color4 : SV_TARGET4; |
| float depth : SV_DEPTH; |
| }; |
| |
| struct PS_OutputFloat6 |
| { |
| float4 color0 : SV_TARGET0; |
| float4 color1 : SV_TARGET1; |
| float4 color2 : SV_TARGET2; |
| float4 color3 : SV_TARGET3; |
| float4 color4 : SV_TARGET4; |
| float4 color5 : SV_TARGET5; |
| float depth : SV_DEPTH; |
| }; |
| |
| struct PS_OutputFloat7 |
| { |
| float4 color0 : SV_TARGET0; |
| float4 color1 : SV_TARGET1; |
| float4 color2 : SV_TARGET2; |
| float4 color3 : SV_TARGET3; |
| float4 color4 : SV_TARGET4; |
| float4 color5 : SV_TARGET5; |
| float4 color6 : SV_TARGET6; |
| float depth : SV_DEPTH; |
| }; |
| |
| struct PS_OutputFloat8 |
| { |
| float4 color0 : SV_TARGET0; |
| float4 color1 : SV_TARGET1; |
| float4 color2 : SV_TARGET2; |
| float4 color3 : SV_TARGET3; |
| float4 color4 : SV_TARGET4; |
| float4 color5 : SV_TARGET5; |
| float4 color6 : SV_TARGET6; |
| float4 color7 : SV_TARGET7; |
| float depth : SV_DEPTH; |
| }; |
| |
| struct PS_OutputUint1 |
| { |
| uint4 color0 : SV_TARGET0; |
| float depth : SV_DEPTH; |
| }; |
| |
| struct PS_OutputUint2 |
| { |
| uint4 color0 : SV_TARGET0; |
| uint4 color1 : SV_TARGET1; |
| float depth : SV_DEPTH; |
| }; |
| |
| struct PS_OutputUint3 |
| { |
| uint4 color0 : SV_TARGET0; |
| uint4 color1 : SV_TARGET1; |
| uint4 color2 : SV_TARGET2; |
| float depth : SV_DEPTH; |
| }; |
| |
| struct PS_OutputUint4 |
| { |
| uint4 color0 : SV_TARGET0; |
| uint4 color1 : SV_TARGET1; |
| uint4 color2 : SV_TARGET2; |
| uint4 color3 : SV_TARGET3; |
| float depth : SV_DEPTH; |
| }; |
| |
| struct PS_OutputUint5 |
| { |
| uint4 color0 : SV_TARGET0; |
| uint4 color1 : SV_TARGET1; |
| uint4 color2 : SV_TARGET2; |
| uint4 color3 : SV_TARGET3; |
| uint4 color4 : SV_TARGET4; |
| float depth : SV_DEPTH; |
| }; |
| |
| struct PS_OutputUint6 |
| { |
| uint4 color0 : SV_TARGET0; |
| uint4 color1 : SV_TARGET1; |
| uint4 color2 : SV_TARGET2; |
| uint4 color3 : SV_TARGET3; |
| uint4 color4 : SV_TARGET4; |
| uint4 color5 : SV_TARGET5; |
| float depth : SV_DEPTH; |
| }; |
| |
| struct PS_OutputUint7 |
| { |
| uint4 color0 : SV_TARGET0; |
| uint4 color1 : SV_TARGET1; |
| uint4 color2 : SV_TARGET2; |
| uint4 color3 : SV_TARGET3; |
| uint4 color4 : SV_TARGET4; |
| uint4 color5 : SV_TARGET5; |
| uint4 color6 : SV_TARGET6; |
| float depth : SV_DEPTH; |
| }; |
| |
| struct PS_OutputUint8 |
| { |
| uint4 color0 : SV_TARGET0; |
| uint4 color1 : SV_TARGET1; |
| uint4 color2 : SV_TARGET2; |
| uint4 color3 : SV_TARGET3; |
| uint4 color4 : SV_TARGET4; |
| uint4 color5 : SV_TARGET5; |
| uint4 color6 : SV_TARGET6; |
| uint4 color7 : SV_TARGET7; |
| float depth : SV_DEPTH; |
| }; |
| |
| struct PS_OutputSint1 |
| { |
| int4 color0 : SV_TARGET0; |
| float depth : SV_DEPTH; |
| }; |
| |
| struct PS_OutputSint2 |
| { |
| int4 color0 : SV_TARGET0; |
| int4 color1 : SV_TARGET1; |
| float depth : SV_DEPTH; |
| }; |
| |
| struct PS_OutputSint3 |
| { |
| int4 color0 : SV_TARGET0; |
| int4 color1 : SV_TARGET1; |
| int4 color2 : SV_TARGET2; |
| float depth : SV_DEPTH; |
| }; |
| |
| struct PS_OutputSint4 |
| { |
| int4 color0 : SV_TARGET0; |
| int4 color1 : SV_TARGET1; |
| int4 color2 : SV_TARGET2; |
| int4 color3 : SV_TARGET3; |
| float depth : SV_DEPTH; |
| }; |
| |
| struct PS_OutputSint5 |
| { |
| int4 color0 : SV_TARGET0; |
| int4 color1 : SV_TARGET1; |
| int4 color2 : SV_TARGET2; |
| int4 color3 : SV_TARGET3; |
| int4 color4 : SV_TARGET4; |
| float depth : SV_DEPTH; |
| }; |
| |
| struct PS_OutputSint6 |
| { |
| int4 color0 : SV_TARGET0; |
| int4 color1 : SV_TARGET1; |
| int4 color2 : SV_TARGET2; |
| int4 color3 : SV_TARGET3; |
| int4 color4 : SV_TARGET4; |
| int4 color5 : SV_TARGET5; |
| float depth : SV_DEPTH; |
| }; |
| |
| struct PS_OutputSint7 |
| { |
| int4 color0 : SV_TARGET0; |
| int4 color1 : SV_TARGET1; |
| int4 color2 : SV_TARGET2; |
| int4 color3 : SV_TARGET3; |
| int4 color4 : SV_TARGET4; |
| int4 color5 : SV_TARGET5; |
| int4 color6 : SV_TARGET6; |
| float depth : SV_DEPTH; |
| }; |
| |
| struct PS_OutputSint8 |
| { |
| int4 color0 : SV_TARGET0; |
| int4 color1 : SV_TARGET1; |
| int4 color2 : SV_TARGET2; |
| int4 color3 : SV_TARGET3; |
| int4 color4 : SV_TARGET4; |
| int4 color5 : SV_TARGET5; |
| int4 color6 : SV_TARGET6; |
| int4 color7 : SV_TARGET7; |
| float depth : SV_DEPTH; |
| }; |
| |
| struct PS_OutputDepth |
| { |
| float depth : SV_DEPTH; |
| }; |
| |
| // Pixel Shaders |
| PS_OutputFloat_FL9 PS_ClearFloat_FL9(in float4 inPosition : SV_POSITION) |
| { |
| PS_OutputFloat_FL9 outData; |
| outData.color0 = color_Float; |
| outData.color1 = color_Float; |
| outData.color2 = color_Float; |
| outData.color3 = color_Float; |
| outData.depth = zValueF_Float; |
| return outData; |
| } |
| |
| PS_OutputFloat1 PS_ClearFloat1(in float4 inPosition : SV_POSITION) |
| { |
| PS_OutputFloat1 outData; |
| outData.color0 = color_Float; |
| outData.depth = zValueF_Float; |
| return outData; |
| } |
| |
| PS_OutputFloat2 PS_ClearFloat2(in float4 inPosition : SV_POSITION) |
| { |
| PS_OutputFloat2 outData; |
| outData.color0 = color_Float; |
| outData.color1 = color_Float; |
| outData.depth = zValueF_Float; |
| return outData; |
| } |
| |
| PS_OutputFloat3 PS_ClearFloat3(in float4 inPosition : SV_POSITION) |
| { |
| PS_OutputFloat3 outData; |
| outData.color0 = color_Float; |
| outData.color1 = color_Float; |
| outData.color2 = color_Float; |
| outData.depth = zValueF_Float; |
| return outData; |
| } |
| |
| PS_OutputFloat4 PS_ClearFloat4(in float4 inPosition : SV_POSITION) |
| { |
| PS_OutputFloat4 outData; |
| outData.color0 = color_Float; |
| outData.color1 = color_Float; |
| outData.color2 = color_Float; |
| outData.color3 = color_Float; |
| outData.depth = zValueF_Float; |
| return outData; |
| } |
| |
| PS_OutputFloat5 PS_ClearFloat5(in float4 inPosition : SV_POSITION) |
| { |
| PS_OutputFloat5 outData; |
| outData.color0 = color_Float; |
| outData.color1 = color_Float; |
| outData.color2 = color_Float; |
| outData.color3 = color_Float; |
| outData.color4 = color_Float; |
| outData.depth = zValueF_Float; |
| return outData; |
| } |
| |
| PS_OutputFloat6 PS_ClearFloat6(in float4 inPosition : SV_POSITION) |
| { |
| PS_OutputFloat6 outData; |
| outData.color0 = color_Float; |
| outData.color1 = color_Float; |
| outData.color2 = color_Float; |
| outData.color3 = color_Float; |
| outData.color4 = color_Float; |
| outData.color5 = color_Float; |
| outData.depth = zValueF_Float; |
| return outData; |
| } |
| |
| PS_OutputFloat7 PS_ClearFloat7(in float4 inPosition : SV_POSITION) |
| { |
| PS_OutputFloat7 outData; |
| outData.color0 = color_Float; |
| outData.color1 = color_Float; |
| outData.color2 = color_Float; |
| outData.color3 = color_Float; |
| outData.color4 = color_Float; |
| outData.color5 = color_Float; |
| outData.color6 = color_Float; |
| outData.depth = zValueF_Float; |
| return outData; |
| } |
| |
| PS_OutputFloat8 PS_ClearFloat8(in float4 inPosition : SV_POSITION) |
| { |
| PS_OutputFloat8 outData; |
| outData.color0 = color_Float; |
| outData.color1 = color_Float; |
| outData.color2 = color_Float; |
| outData.color3 = color_Float; |
| outData.color4 = color_Float; |
| outData.color5 = color_Float; |
| outData.color6 = color_Float; |
| outData.color7 = color_Float; |
| outData.depth = zValueF_Float; |
| return outData; |
| } |
| |
| PS_OutputUint1 PS_ClearUint1(in float4 inPosition : SV_POSITION) |
| { |
| PS_OutputUint1 outData; |
| outData.color0 = color_Uint; |
| outData.depth = zValueF_Uint; |
| return outData; |
| } |
| |
| PS_OutputUint2 PS_ClearUint2(in float4 inPosition : SV_POSITION) |
| { |
| PS_OutputUint2 outData; |
| outData.color0 = color_Uint; |
| outData.color1 = color_Uint; |
| outData.depth = zValueF_Uint; |
| return outData; |
| } |
| |
| PS_OutputUint3 PS_ClearUint3(in float4 inPosition : SV_POSITION) |
| { |
| PS_OutputUint3 outData; |
| outData.color0 = color_Uint; |
| outData.color1 = color_Uint; |
| outData.color2 = color_Uint; |
| outData.depth = zValueF_Uint; |
| return outData; |
| } |
| |
| PS_OutputUint4 PS_ClearUint4(in float4 inPosition : SV_POSITION) |
| { |
| PS_OutputUint4 outData; |
| outData.color0 = color_Uint; |
| outData.color1 = color_Uint; |
| outData.color2 = color_Uint; |
| outData.color3 = color_Uint; |
| outData.depth = zValueF_Uint; |
| return outData; |
| } |
| |
| PS_OutputUint5 PS_ClearUint5(in float4 inPosition : SV_POSITION) |
| { |
| PS_OutputUint5 outData; |
| outData.color0 = color_Uint; |
| outData.color1 = color_Uint; |
| outData.color2 = color_Uint; |
| outData.color3 = color_Uint; |
| outData.color4 = color_Uint; |
| outData.depth = zValueF_Uint; |
| return outData; |
| } |
| |
| PS_OutputUint6 PS_ClearUint6(in float4 inPosition : SV_POSITION) |
| { |
| PS_OutputUint6 outData; |
| outData.color0 = color_Uint; |
| outData.color1 = color_Uint; |
| outData.color2 = color_Uint; |
| outData.color3 = color_Uint; |
| outData.color4 = color_Uint; |
| outData.color5 = color_Uint; |
| outData.depth = zValueF_Uint; |
| return outData; |
| } |
| |
| PS_OutputUint7 PS_ClearUint7(in float4 inPosition : SV_POSITION) |
| { |
| PS_OutputUint7 outData; |
| outData.color0 = color_Uint; |
| outData.color1 = color_Uint; |
| outData.color2 = color_Uint; |
| outData.color3 = color_Uint; |
| outData.color4 = color_Uint; |
| outData.color5 = color_Uint; |
| outData.color6 = color_Uint; |
| outData.depth = zValueF_Uint; |
| return outData; |
| } |
| |
| PS_OutputUint8 PS_ClearUint8(in float4 inPosition : SV_POSITION) |
| { |
| PS_OutputUint8 outData; |
| outData.color0 = color_Uint; |
| outData.color1 = color_Uint; |
| outData.color2 = color_Uint; |
| outData.color3 = color_Uint; |
| outData.color4 = color_Uint; |
| outData.color5 = color_Uint; |
| outData.color6 = color_Uint; |
| outData.color7 = color_Uint; |
| outData.depth = zValueF_Uint; |
| return outData; |
| } |
| |
| PS_OutputSint1 PS_ClearSint1(in float4 inPosition : SV_POSITION) |
| { |
| PS_OutputSint1 outData; |
| outData.color0 = color_Sint; |
| outData.depth = zValueF_Sint; |
| return outData; |
| } |
| |
| PS_OutputSint2 PS_ClearSint2(in float4 inPosition : SV_POSITION) |
| { |
| PS_OutputSint2 outData; |
| outData.color0 = color_Sint; |
| outData.color1 = color_Sint; |
| outData.depth = zValueF_Sint; |
| return outData; |
| } |
| |
| PS_OutputSint3 PS_ClearSint3(in float4 inPosition : SV_POSITION) |
| { |
| PS_OutputSint3 outData; |
| outData.color0 = color_Sint; |
| outData.color1 = color_Sint; |
| outData.color2 = color_Sint; |
| outData.depth = zValueF_Sint; |
| return outData; |
| } |
| |
| PS_OutputSint4 PS_ClearSint4(in float4 inPosition : SV_POSITION) |
| { |
| PS_OutputSint4 outData; |
| outData.color0 = color_Sint; |
| outData.color1 = color_Sint; |
| outData.color2 = color_Sint; |
| outData.color3 = color_Sint; |
| outData.depth = zValueF_Sint; |
| return outData; |
| } |
| |
| PS_OutputSint5 PS_ClearSint5(in float4 inPosition : SV_POSITION) |
| { |
| PS_OutputSint5 outData; |
| outData.color0 = color_Sint; |
| outData.color1 = color_Sint; |
| outData.color2 = color_Sint; |
| outData.color3 = color_Sint; |
| outData.color4 = color_Sint; |
| outData.depth = zValueF_Sint; |
| return outData; |
| } |
| |
| PS_OutputSint6 PS_ClearSint6(in float4 inPosition : SV_POSITION) |
| { |
| PS_OutputSint6 outData; |
| outData.color0 = color_Sint; |
| outData.color1 = color_Sint; |
| outData.color2 = color_Sint; |
| outData.color3 = color_Sint; |
| outData.color4 = color_Sint; |
| outData.color5 = color_Sint; |
| outData.depth = zValueF_Sint; |
| return outData; |
| } |
| |
| PS_OutputSint7 PS_ClearSint7(in float4 inPosition : SV_POSITION) |
| { |
| PS_OutputSint7 outData; |
| outData.color0 = color_Sint; |
| outData.color1 = color_Sint; |
| outData.color2 = color_Sint; |
| outData.color3 = color_Sint; |
| outData.color4 = color_Sint; |
| outData.color5 = color_Sint; |
| outData.color6 = color_Sint; |
| outData.depth = zValueF_Sint; |
| return outData; |
| } |
| |
| PS_OutputSint8 PS_ClearSint8(in float4 inPosition : SV_POSITION) |
| { |
| PS_OutputSint8 outData; |
| outData.color0 = color_Sint; |
| outData.color1 = color_Sint; |
| outData.color2 = color_Sint; |
| outData.color3 = color_Sint; |
| outData.color4 = color_Sint; |
| outData.color5 = color_Sint; |
| outData.color6 = color_Sint; |
| outData.color7 = color_Sint; |
| outData.depth = zValueF_Sint; |
| return outData; |
| } |
| |
| PS_OutputDepth PS_ClearDepth(in float4 inPosition : SV_POSITION) |
| { |
| PS_OutputDepth outData; |
| outData.depth = zValue_Depth; |
| return outData; |
| } |