D3D12 Shader Debug Zoo : add a test for UAV Interlocked*

RWTexture<int>

InterlockedAdd
InterlockedAnd
InterlockedOr
InterlockedXor
InterlockedMin
InterlockedMax
InterlockedCompareExchange
InterlockedCompareStore
InterlockedExchange
This commit is contained in:
Jake Turner
2024-12-10 09:48:13 +00:00
parent 8f75a1658f
commit 8de06cf324
@@ -170,7 +170,8 @@ RWTexture2D<float> unbounduav2 : register(u5);
RWBuffer<float> narrowtypeduav : register(u6);
RWTexture2D<float4> textrwtest : register(u7);
RWTexture2D<float4> floattexrwtest : register(u7);
RWTexture2D<int> inttexrwtest : register(u8);
Buffer<float> narrowtypedsrv : register(t102);
@@ -184,7 +185,7 @@ Texture2D<float> dimtex_edge : register(t41);
#if (SM_6_2 || SM_6_6) && HAS_16BIT_SHADER_OPS
StructuredBuffer<int16_t> int16srv : register(t42);
#else
StructuredBuffer<int> int16srv : register(t42);
Buffer<int> int16srv : register(t42);
#endif
float4 main(v2f IN) : SV_Target0
@@ -765,13 +766,106 @@ float4 main(v2f IN) : SV_Target0
{
float4 value = float4(posone, posone/3, posone/4, posone/5);
int2 uv = int2(31,37);
textrwtest[uv] = value;
return textrwtest[uv];
floattexrwtest[uv] = value;
return floattexrwtest[uv];
}
#if SM_6_2 || SM_6_6
if(IN.tri == 84)
{
return float4(int16srv[0].x, int16srv[1].x, int16srv[2].x, int16srv[3].x);
#endif
}
// Only test Atomic operations on SM6_0 and above
#if SM_6_0 || SM_6_2 || SM_6_6
if(IN.tri == 85)
{
int value = IN.tri;
int original;
int u = 3 * (IN.tri - 85) + 17;
int2 uv = int2(u,37);
inttexrwtest[uv] = 100;
InterlockedAdd(inttexrwtest[uv], value, original);
InterlockedAdd(inttexrwtest[uv], -value, original);
return inttexrwtest[uv];
}
if(IN.tri == 86)
{
int value = IN.tri;
int original;
int u = 3 * (IN.tri - 85) + 17;
int2 uv = int2(u,37);
inttexrwtest[uv] = 100;
InterlockedAnd(inttexrwtest[uv], value, original);
return inttexrwtest[uv];
}
if(IN.tri == 87)
{
int value = IN.tri;
int original;
int u = 3 * (IN.tri - 85) + 17;
int2 uv = int2(u,37);
inttexrwtest[uv] = 100;
InterlockedOr(inttexrwtest[uv], value, original);
return inttexrwtest[uv];
}
if(IN.tri == 88)
{
int value = IN.tri;
int original;
int u = 3 * (IN.tri - 85) + 17;
int2 uv = int2(u,37);
inttexrwtest[uv] = 100;
InterlockedXor(inttexrwtest[uv], value, original);
return inttexrwtest[uv];
}
if(IN.tri == 89)
{
int value = IN.tri;
int original;
int u = 3 * (IN.tri - 85) + 17;
int2 uv = int2(u,37);
inttexrwtest[uv] = 100;
InterlockedMin(inttexrwtest[uv], value, original);
return inttexrwtest[uv];
}
if(IN.tri == 90)
{
int value = IN.tri;
int original;
int u = 3 * (IN.tri - 85) + 17;
int2 uv = int2(u,37);
inttexrwtest[uv] = 100;
InterlockedMax(inttexrwtest[uv], value, original);
return inttexrwtest[uv];
}
if(IN.tri == 91)
{
int value = IN.tri;
int original;
int u = 3 * (IN.tri - 85) + 17;
int2 uv = int2(u,37);
inttexrwtest[uv] = 100;
InterlockedExchange(inttexrwtest[uv], value, original);
return inttexrwtest[uv];
}
if(IN.tri == 92)
{
int value = IN.tri;
int original;
int u = 3 * (IN.tri - 85) + 17;
int2 uv = int2(u,37);
inttexrwtest[uv] = 100;
InterlockedCompareExchange(inttexrwtest[uv], value, value+1, original);
return inttexrwtest[uv];
}
if(IN.tri == 93)
{
int value = IN.tri;
int u = 3 * (IN.tri - 85) + 17;
int2 uv = int2(u,37);
inttexrwtest[uv] = 100;
InterlockedCompareStore(inttexrwtest[uv], value, value+1);
return inttexrwtest[uv];
}
#endif // #if SM_6_0 || SM_6_2 || SM_6_6
return float4(0.4f, 0.4f, 0.4f, 0.4f);
}
@@ -962,7 +1056,7 @@ void main()
tableParam(D3D12_SHADER_VISIBILITY_PIXEL, D3D12_DESCRIPTOR_RANGE_TYPE_SRV, 0, 0, 8, 0),
tableParam(D3D12_SHADER_VISIBILITY_PIXEL, D3D12_DESCRIPTOR_RANGE_TYPE_UAV, 0, 1, 2, 10),
tableParam(D3D12_SHADER_VISIBILITY_PIXEL, D3D12_DESCRIPTOR_RANGE_TYPE_SRV, 0, 100, 5, 20),
tableParam(D3D12_SHADER_VISIBILITY_PIXEL, D3D12_DESCRIPTOR_RANGE_TYPE_UAV, 0, 4, 4, 30),
tableParam(D3D12_SHADER_VISIBILITY_PIXEL, D3D12_DESCRIPTOR_RANGE_TYPE_UAV, 0, 4, 5, 30),
multiRangeParam,
uavParam(D3D12_SHADER_VISIBILITY_PIXEL, 0, 21),
srvParam(D3D12_SHADER_VISIBILITY_PIXEL, 0, 20),
@@ -1193,6 +1287,7 @@ void main()
MakeUAV(narrowtypedbuf).Format(DXGI_FORMAT_R16_FLOAT).CreateGPU(32);
MakeUAV(smiley).Format(DXGI_FORMAT_R8G8B8A8_UNORM).CreateGPU(33);
MakeUAV(smiley).Format(DXGI_FORMAT_R32_SINT).CreateGPU(34);
float structdata[220];
for(int i = 0; i < 220; i++)