// // Copyright (c) 2017 The ANGLE Project. 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 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; }