|
857 | 857 | ]]>
|
858 | 858 | </Shader>
|
859 | 859 | </ShaderOp>
|
| 860 | + <ShaderOp Name="SampleCmpLevel" PS="PS" VS="VS" CS="CS" AS="AS" MS="MS" TopologyType="TRIANGLE"> |
| 861 | + <RootSignature> |
| 862 | + RootFlags(ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT), |
| 863 | + DescriptorTable(SRV(t0,numDescriptors=1), UAV(u0), UAV(u1), UAV(u2)), |
| 864 | + StaticSampler(s0, addressU = TEXTURE_ADDRESS_WRAP, addressV = TEXTURE_ADDRESS_WRAP, filter = FILTER_MIN_MAG_LINEAR_MIP_POINT), |
| 865 | + StaticSampler(s1, addressU = TEXTURE_ADDRESS_WRAP, addressV = TEXTURE_ADDRESS_WRAP, filter = FILTER_COMPARISON_MIN_MAG_LINEAR_MIP_POINT) |
| 866 | + </RootSignature> |
| 867 | + <Resource Name="VBuffer" Dimension="BUFFER" InitialResourceState="COPY_DEST" Init="FromBytes" Topology="TRIANGLELIST"> |
| 868 | + { { -1.0f, 1.0f, 0.0f }, { 0.0f, 0.0f } }, |
| 869 | + { { 1.0f, 1.0f, 0.0f }, { 1.0f, 0.0f } }, |
| 870 | + { { -1.0f, -1.0f, 0.0f }, { 0.0f, 1.0f } }, |
| 871 | + |
| 872 | + { { -1.0f, -1.0f, 0.0f }, { 0.0f, 1.0f } }, |
| 873 | + { { 1.0f, 1.0f, 0.0f }, { 1.0f, 0.0f } }, |
| 874 | + { { 1.0f, -1.0f, 0.0f }, { 1.0f, 1.0f } } |
| 875 | + </Resource> |
| 876 | + <Resource Name="T0" Dimension="Texture2D" Width="336" Height="336" MipLevels="7" InitialResourceState="COPY_DEST" Init="ByName" Format="R32_FLOAT" /> |
| 877 | + <Resource Name="RTarget" Dimension="TEXTURE2D" Width="84" Height="4" Format="R32G32B32A32_FLOAT" Flags="ALLOW_RENDER_TARGET" InitialResourceState="COPY_DEST" /> |
| 878 | + <Resource Name="U0" Dimension="BUFFER" Width="8192" |
| 879 | + Flags="ALLOW_UNORDERED_ACCESS" InitialResourceState="COPY_DEST" |
| 880 | + Init="Zero" ReadBack="true" /> |
| 881 | + <Resource Name="U1" Dimension="BUFFER" Width="1024" |
| 882 | + Flags="ALLOW_UNORDERED_ACCESS" InitialResourceState="COPY_DEST" |
| 883 | + Init="Zero" ReadBack="true" /> |
| 884 | + <Resource Name="U2" Dimension="BUFFER" Width="1024" |
| 885 | + Flags="ALLOW_UNORDERED_ACCESS" InitialResourceState="COPY_DEST" |
| 886 | + Init="Zero" ReadBack="true" /> |
| 887 | + |
| 888 | + <RootValues> |
| 889 | + <RootValue HeapName="ResHeap" /> |
| 890 | + </RootValues> |
| 891 | + <DescriptorHeap Name="ResHeap" Type="CBV_SRV_UAV"> |
| 892 | + <Descriptor Name='T0' Kind='SRV' ResName='T0' /> |
| 893 | + <Descriptor Name='U0' Kind='UAV' ResName='U0' |
| 894 | + NumElements="336" StructureByteStride="8" /> |
| 895 | + <Descriptor Name='U1' Kind='UAV' ResName='U1' |
| 896 | + NumElements="128" StructureByteStride="8" /> |
| 897 | + <Descriptor Name='U2' Kind='UAV' ResName='U2' |
| 898 | + NumElements="128" StructureByteStride="8" /> |
| 899 | + </DescriptorHeap> |
| 900 | + <DescriptorHeap Name="RtvHeap" NumDescriptors="1" Type="RTV"> |
| 901 | + <Descriptor Name="RTarget" Kind="RTV"/> |
| 902 | + </DescriptorHeap> |
| 903 | + |
| 904 | + <InputElements> |
| 905 | + <InputElement SemanticName="POSITION" Format="R32G32B32_FLOAT" AlignedByteOffset="0" /> |
| 906 | + <InputElement SemanticName="TEXCOORD" Format="R32G32_FLOAT" AlignedByteOffset="12" /> |
| 907 | + </InputElements> |
| 908 | + <RenderTargets> |
| 909 | + <RenderTarget Name="RTarget"/> |
| 910 | + </RenderTargets> |
| 911 | + <Shader Name="CS" Target="cs_6_7" EntryPoint="CSMain" Text="@PS"/> |
| 912 | + <Shader Name="AS" Target="as_6_7" EntryPoint="ASMain" Text="@PS"/> |
| 913 | + <Shader Name="MS" Target="ms_6_7" EntryPoint="MSMain" Text="@PS"/> |
| 914 | + <Shader Name="VS" Target="vs_6_7" EntryPoint="VSMain" Text="@PS"/> |
| 915 | + <Shader Name="PS" Target="ps_6_7" EntryPoint="PSMain"> |
| 916 | + <![CDATA[ |
| 917 | + #define MAX_MIP 7 |
| 918 | + struct PSInput { |
| 919 | + float4 position : SV_POSITION; |
| 920 | + float2 uv : TEXCOORD; |
| 921 | + }; |
| 922 | +
|
| 923 | + Texture2D<float> g_tex : register(t0); |
| 924 | + RWStructuredBuffer<uint2> g_bufMain : register(u0); |
| 925 | + RWStructuredBuffer<uint2> g_bufMesh : register(u1); |
| 926 | + RWStructuredBuffer<uint2> g_bufAmp : register(u2); |
| 927 | +
|
| 928 | + SamplerState g_samp : register(s0); // Just used for the pre-6.7 fakes |
| 929 | + SamplerComparisonState g_sampCmp : register(s1); |
| 930 | +
|
| 931 | + uint2 DoSampleCmpLevel( float2 coord, uint lod ) { |
| 932 | + float expected = float(lod) + 0.5; |
| 933 | +#if __SHADER_TARGET_MAJOR > 6 || (__SHADER_TARGET_MAJOR == 6 && __SHADER_TARGET_MINOR >= 7) |
| 934 | + return uint2( g_tex.SampleCmpLevelZero(g_sampCmp, coord, expected) == g_tex.SampleCmpLevel(g_sampCmp, coord, expected, 0), |
| 935 | + g_tex.SampleCmpLevel(g_sampCmp, coord, expected, lod)); |
| 936 | +#else |
| 937 | + // The initial compare is meaningless here, so just give the value expected |
| 938 | + return uint2(1, g_tex.SampleLevel(g_samp, coord, lod) == expected); |
| 939 | +#endif |
| 940 | + } |
| 941 | +
|
| 942 | + static float4 g_Verts[6] = { |
| 943 | + { -1.0f, 1.0f, 0.0f, 1.0f }, |
| 944 | + { 1.0f, 1.0f, 0.0f, 1.0f }, |
| 945 | + { -1.0f, -1.0f, 0.0f, 1.0f }, |
| 946 | +
|
| 947 | + { -1.0f, -1.0f, 0.0f, 1.0f }, |
| 948 | + { 1.0f, 1.0f, 0.0f, 1.0f }, |
| 949 | + { 1.0f, -1.0f, 0.0f, 1.0f }}; |
| 950 | +
|
| 951 | + static float2 g_UV[6] = { |
| 952 | + { 0.0f, 0.0f }, |
| 953 | + { 1.0f, 0.0f }, |
| 954 | + { 0.0f, 1.0f }, |
| 955 | +
|
| 956 | + { 0.0f, 1.0f }, |
| 957 | + { 1.0f, 0.0f }, |
| 958 | + { 1.0f, 1.0f }}; |
| 959 | +
|
| 960 | + struct Payload { |
| 961 | + uint nothing; |
| 962 | + }; |
| 963 | +
|
| 964 | + [NumThreads(8, 2, 1)] |
| 965 | + void ASMain(uint ix : SV_GroupIndex) { |
| 966 | + Payload payload; |
| 967 | + g_bufAmp[ix % MAX_MIP] = DoSampleCmpLevel(float2(0.5, 0.5), ix % MAX_MIP); |
| 968 | + payload.nothing = 0; |
| 969 | + DispatchMesh(1, 1, 1, payload); |
| 970 | + } |
| 971 | +
|
| 972 | + [NumThreads(8, 2, 1)] |
| 973 | + [OutputTopology("triangle")] |
| 974 | + void MSMain( |
| 975 | + uint ix : SV_GroupIndex, |
| 976 | + in payload Payload payload, |
| 977 | + out vertices PSInput verts[6], |
| 978 | + out indices uint3 tris[2]) { |
| 979 | + SetMeshOutputCounts(6, 2); |
| 980 | + // Assign static fullscreen 2 tri quad |
| 981 | + verts[ix%6].position = g_Verts[ix%6]; |
| 982 | + verts[ix%6].uv = g_UV[ix%6]; |
| 983 | + tris[ix&1] = uint3((ix&1)*3, (ix&1)*3 + 1, (ix&1)*3 + 2); |
| 984 | + g_bufMesh[ix % MAX_MIP] = DoSampleCmpLevel(float2(0.5, 0.5), ix % MAX_MIP); |
| 985 | + } |
| 986 | +
|
| 987 | +
|
| 988 | + PSInput VSMain(float3 position : POSITION, float2 uv : TEXCOORD) { |
| 989 | + PSInput result; |
| 990 | + result.position = float4(position, 1.0); |
| 991 | + result.uv = uv; |
| 992 | + return result; |
| 993 | + } |
| 994 | +
|
| 995 | + float4 PSMain(PSInput input) : SV_TARGET { |
| 996 | + uint ix = uint(input.uv.x * 336); |
| 997 | + g_bufMain[ix % MAX_MIP] = DoSampleCmpLevel(input.uv, ix % MAX_MIP); |
| 998 | + return 1; |
| 999 | + } |
| 1000 | +
|
| 1001 | + [NumThreads(16, 1, 1)] |
| 1002 | + void CSMain(uint ix : SV_GroupIndex) { |
| 1003 | + // all mip levels contain the same values, so 0.5,0.5 is just as good as any |
| 1004 | + g_bufMain[ix % MAX_MIP] = DoSampleCmpLevel(float2(0.5, 0.5), ix % MAX_MIP); |
| 1005 | + } |
| 1006 | +
|
| 1007 | + ]]> |
| 1008 | + </Shader> |
| 1009 | + </ShaderOp> |
860 | 1010 | <ShaderOp Name="OOB" PS="PS" VS="VS">
|
861 | 1011 | <RootSignature>RootFlags(ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT), CBV(b0), DescriptorTable(SRV(t0,numDescriptors=2))</RootSignature>
|
862 | 1012 | <Resource Name="CB0" Dimension="BUFFER" InitialResourceState="COPY_DEST" Init="FromBytes" TransitionTo="VERTEX_AND_CONSTANT_BUFFER">
|
|
0 commit comments