|
@@ -355,15 +355,15 @@
|
|
|
{ { 1.0f, 1.0f, 0.0f }, { 1.0f, 0.0f } },
|
|
|
{ { 1.0f, -1.0f, 0.0f }, { 1.0f, 1.0f } }
|
|
|
</Resource>
|
|
|
- <Resource Name="T0" Dimension="Texture2D" Width="64" Height="64" MipLevels="7" InitialResourceState="COPY_DEST" Init="ByName" Format="R32_FLOAT" />
|
|
|
- <Resource Name="RTarget" Dimension="TEXTURE2D" Width="8" Height="8" Format="R32G32B32A32_FLOAT" Flags="ALLOW_RENDER_TARGET" InitialResourceState="COPY_DEST" />
|
|
|
- <Resource Name="U0" Dimension="BUFFER" Width="1920"
|
|
|
+ <Resource Name="T0" Dimension="Texture2D" Width="1008" Height="1008" MipLevels="7" InitialResourceState="COPY_DEST" Init="ByName" Format="R32_FLOAT" />
|
|
|
+ <Resource Name="RTarget" Dimension="TEXTURE2D" Width="84" Height="4" Format="R32G32B32A32_FLOAT" Flags="ALLOW_RENDER_TARGET" InitialResourceState="COPY_DEST" />
|
|
|
+ <Resource Name="U0" Dimension="BUFFER" Width="16384"
|
|
|
Flags="ALLOW_UNORDERED_ACCESS" InitialResourceState="COPY_DEST"
|
|
|
Init="Zero" ReadBack="true" />
|
|
|
- <Resource Name="U1" Dimension="BUFFER" Width="1920"
|
|
|
+ <Resource Name="U1" Dimension="BUFFER" Width="2048"
|
|
|
Flags="ALLOW_UNORDERED_ACCESS" InitialResourceState="COPY_DEST"
|
|
|
Init="Zero" ReadBack="true" />
|
|
|
- <Resource Name="U2" Dimension="BUFFER" Width="1920"
|
|
|
+ <Resource Name="U2" Dimension="BUFFER" Width="2048"
|
|
|
Flags="ALLOW_UNORDERED_ACCESS" InitialResourceState="COPY_DEST"
|
|
|
Init="Zero" ReadBack="true" />
|
|
|
|
|
@@ -373,11 +373,11 @@
|
|
|
<DescriptorHeap Name="ResHeap" Type="CBV_SRV_UAV">
|
|
|
<Descriptor Name='T0' Kind='SRV' ResName='T0' />
|
|
|
<Descriptor Name='U0' Kind='UAV' ResName='U0'
|
|
|
- NumElements="64" StructureByteStride="16" />
|
|
|
+ NumElements="1008" StructureByteStride="16" />
|
|
|
<Descriptor Name='U1' Kind='UAV' ResName='U1'
|
|
|
- NumElements="64" StructureByteStride="16" />
|
|
|
+ NumElements="128" StructureByteStride="16" />
|
|
|
<Descriptor Name='U2' Kind='UAV' ResName='U2'
|
|
|
- NumElements="64" StructureByteStride="16" />
|
|
|
+ NumElements="128" StructureByteStride="16" />
|
|
|
</DescriptorHeap>
|
|
|
<DescriptorHeap Name="RtvHeap" NumDescriptors="1" Type="RTV">
|
|
|
<Descriptor Name="RTarget" Kind="RTV"/>
|
|
@@ -390,9 +390,12 @@
|
|
|
<RenderTargets>
|
|
|
<RenderTarget Name="RTarget"/>
|
|
|
</RenderTargets>
|
|
|
- <Shader Name="CS" Target="cs_6_6" EntryPoint="CSMain" Text="@PS"/>
|
|
|
- <Shader Name="AS" Target="as_6_6" EntryPoint="ASMain" Text="@PS"/>
|
|
|
- <Shader Name="MS" Target="ms_6_6" EntryPoint="MSMain" Text="@PS"/>
|
|
|
+ <Shader Name="CS" Target="cs_6_6" EntryPoint="CSMain1D" Text="@PS"/>
|
|
|
+ <Shader Name="AS" Target="as_6_6" EntryPoint="ASMain1D" Text="@PS"/>
|
|
|
+ <Shader Name="MS" Target="ms_6_6" EntryPoint="MSMain1D" Text="@PS"/>
|
|
|
+ <Shader Name="CS2" Target="cs_6_6" EntryPoint="CSMain2D" Text="@PS"/>
|
|
|
+ <Shader Name="AS2" Target="as_6_6" EntryPoint="ASMain2D" Text="@PS"/>
|
|
|
+ <Shader Name="MS2" Target="ms_6_6" EntryPoint="MSMain2D" Text="@PS"/>
|
|
|
<Shader Name="VS" Target="vs_6_0" EntryPoint="VSMain" Text="@PS"/>
|
|
|
<Shader Name="PS" Target="ps_6_0" EntryPoint="PSMain">
|
|
|
<![CDATA[
|
|
@@ -415,8 +418,7 @@
|
|
|
|
|
|
SamplerState g_samp : register(s0);
|
|
|
|
|
|
- uint4 DerivTest(uint ix, float left, float right, float top, float bot) {
|
|
|
- uint iy = ix>>1;
|
|
|
+ uint4 DerivTest(uint ix, uint iy, float left, float right, float top, float bot) {
|
|
|
return uint4(g_tex.CalculateLevelOfDetail(g_samp, float2(left, 0.5)) * (~ix&1) +
|
|
|
g_tex.CalculateLevelOfDetail(g_samp, float2(right, 0.5)) * (ix&1),
|
|
|
g_tex.Sample(g_samp, float2(left, 0.5)) * (~ix&1) +
|
|
@@ -429,10 +431,10 @@
|
|
|
|
|
|
// To avoid conditionals, two samples are performed one for left one for right
|
|
|
// They are step functioned on or off depending
|
|
|
- uint4 DerivTest(uint ix) {
|
|
|
+ uint4 DerivTest(uint ix, float threadCt) {
|
|
|
uint iy = ix>>1;
|
|
|
- return DerivTest(ix, ((ix^1)/64.0)*(ix&1), (ix/64.0)*(ix&1),
|
|
|
- ((ix^2)/64.0)*(iy&1), (ix/64.0)*(iy&1));
|
|
|
+ return DerivTest(ix, iy, ((ix^1)/threadCt)*(ix&1), (ix/threadCt)*(ix&1),
|
|
|
+ ((ix^2)/threadCt)*(iy&1), (ix/threadCt)*(iy&1));
|
|
|
}
|
|
|
|
|
|
static float4 g_Verts[6] = {
|
|
@@ -457,17 +459,37 @@
|
|
|
uint nothing;
|
|
|
};
|
|
|
|
|
|
- [NumThreads(8, 8, 1)]
|
|
|
- void ASMain(uint ix : SV_GroupIndex) {
|
|
|
+ uint convert2Dto1D(uint x, uint y, uint width) {
|
|
|
+ // Convert 2D coords to 1D for testing
|
|
|
+ // All completed rows of quads
|
|
|
+ uint prevRows = (y/2)*2*width;
|
|
|
+ // All previous full quads on this quad row
|
|
|
+ uint prevQuads = (x/2)*4;
|
|
|
+ // index into current quad
|
|
|
+ uint quadIx = (y&1)*2 + (x&1);
|
|
|
+ return prevRows + prevQuads + quadIx;
|
|
|
+ }
|
|
|
+
|
|
|
+ [NumThreads(116, 1, 1)]
|
|
|
+ void ASMain1D(uint ix : SV_GroupIndex) {
|
|
|
Payload payload;
|
|
|
- g_bufAmp[ix] = DerivTest(ix);
|
|
|
+ g_bufAmp[ix] = DerivTest(ix, 116);
|
|
|
+ payload.nothing = 0;
|
|
|
+ DispatchMesh(1, 1, 1, payload);
|
|
|
+ }
|
|
|
+
|
|
|
+ [NumThreads(42, 2, 1)]
|
|
|
+ void ASMain2D(uint3 id : SV_GroupThreadID) {
|
|
|
+ Payload payload;
|
|
|
+ uint ix = convert2Dto1D(id.x, id.y, 42);
|
|
|
+ g_bufAmp[ix] = DerivTest(ix, 42*2);
|
|
|
payload.nothing = 0;
|
|
|
DispatchMesh(1, 1, 1, payload);
|
|
|
}
|
|
|
|
|
|
- [NumThreads(8, 8, 1)]
|
|
|
+ [NumThreads(116, 1, 1)]
|
|
|
[OutputTopology("triangle")]
|
|
|
- void MSMain(
|
|
|
+ void MSMain1D(
|
|
|
uint ix : SV_GroupIndex,
|
|
|
in payload Payload payload,
|
|
|
out vertices PSInput verts[6],
|
|
@@ -477,19 +499,39 @@
|
|
|
verts[ix%6].position = g_Verts[ix%6];
|
|
|
verts[ix%6].uv = g_UV[ix%6];
|
|
|
tris[ix&1] = uint3((ix&1)*3, (ix&1)*3 + 1, (ix&1)*3 + 2);
|
|
|
- g_bufMesh[ix] = DerivTest(ix);
|
|
|
+ g_bufMesh[ix] = DerivTest(ix, 116);
|
|
|
+ }
|
|
|
+
|
|
|
+ [NumThreads(42, 2, 1)]
|
|
|
+ [OutputTopology("triangle")]
|
|
|
+ void MSMain2D(
|
|
|
+ uint3 id : SV_GroupThreadID,
|
|
|
+ in payload Payload payload,
|
|
|
+ out vertices PSInput verts[6],
|
|
|
+ out indices uint3 tris[2]) {
|
|
|
+ SetMeshOutputCounts(6, 2);
|
|
|
+ uint ix = convert2Dto1D(id.x, id.y, 42);
|
|
|
+ // Assign static fullscreen 2 tri quad
|
|
|
+ verts[ix%6].position = g_Verts[ix%6];
|
|
|
+ verts[ix%6].uv = g_UV[ix%6];
|
|
|
+ tris[ix&1] = uint3((ix&1)*3, (ix&1)*3 + 1, (ix&1)*3 + 2);
|
|
|
+ g_bufMesh[ix] = DerivTest(ix, 42*2);
|
|
|
}
|
|
|
|
|
|
float4 PSMain(PSInput input) : SV_TARGET {
|
|
|
- int ix = int(input.uv.y * 8) * 8 + int(input.uv.x * 8);
|
|
|
- // Contort the linear index into quad order by rotating relevant middle bits
|
|
|
- ix = (ix&~0xE)|((ix&0x8)>>2)|((ix&0x6)<<1);
|
|
|
- g_bufMain[ix] = DerivTest(ix);
|
|
|
+ uint ix = convert2Dto1D(input.uv.x, input.uv.y, 84);
|
|
|
+ g_bufMain[ix] = DerivTest(ix, 84*4*3);
|
|
|
return 1;
|
|
|
}
|
|
|
- [NumThreads(8, 8, 1)]
|
|
|
- void CSMain(uint ix : SV_GroupIndex) {
|
|
|
- g_bufMain[ix] = DerivTest(ix);
|
|
|
+ [NumThreads(1008, 1, 1)]
|
|
|
+ void CSMain1D(uint ix : SV_GroupIndex) {
|
|
|
+ g_bufMain[ix] = DerivTest(ix, 1008);
|
|
|
+ }
|
|
|
+
|
|
|
+ [NumThreads(84, 4, 3)]
|
|
|
+ void CSMain2D(uint3 id : SV_GroupThreadID) {
|
|
|
+ uint ix = convert2Dto1D(id.x, id.y, 84);
|
|
|
+ g_bufMain[ix] = DerivTest(ix, 84*4*3);
|
|
|
}
|
|
|
|
|
|
]]>
|