mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-09-22 21:55:52 +00:00
Add Interlocked* tests to D3D12_Groupshared
This commit is contained in:
@@ -41,6 +41,7 @@ cbuffer rootconsts : register(b0)
|
||||
}
|
||||
|
||||
groupshared float gsmData[MAX_THREADS];
|
||||
groupshared int gsmIntData[MAX_THREADS];
|
||||
|
||||
#define IsTest(x) (root_test == x)
|
||||
|
||||
@@ -49,6 +50,11 @@ float GetGSMValue(uint i)
|
||||
return gsmData[i % MAX_THREADS];
|
||||
}
|
||||
|
||||
int GetGSMIntValue(uint i)
|
||||
{
|
||||
return gsmIntData[i % MAX_THREADS];
|
||||
}
|
||||
|
||||
[numthreads(MAX_THREADS,1,1)]
|
||||
void main(uint3 gid : SV_GroupThreadID)
|
||||
{
|
||||
@@ -64,6 +70,16 @@ void main(uint3 gid : SV_GroupThreadID)
|
||||
gsmData[7] = 1.25f;
|
||||
gsmData[8] = 1.25f;
|
||||
for(int i=8; i < MAX_THREADS; i++) gsmData[i] = 1.25f;
|
||||
gsmIntData[0] = 125;
|
||||
gsmIntData[1] = 125;
|
||||
gsmIntData[2] = 125;
|
||||
gsmIntData[3] = 125;
|
||||
gsmIntData[4] = 125;
|
||||
gsmIntData[5] = 125;
|
||||
gsmIntData[6] = 125;
|
||||
gsmIntData[7] = 125;
|
||||
gsmIntData[8] = 125;
|
||||
for(int j=8; j < MAX_THREADS; j++) gsmIntData[j] = 125;
|
||||
}
|
||||
|
||||
GroupMemoryBarrierWithGroupSync();
|
||||
@@ -126,6 +142,127 @@ void main(uint3 gid : SV_GroupThreadID)
|
||||
outval.z = GetGSMValue(gid.x + 2);
|
||||
outval.w = GetGSMValue(gid.x + 3);
|
||||
}
|
||||
else if (IsTest(3))
|
||||
{
|
||||
int value = (int)(indata[gid.x] * 100.0);
|
||||
int u = gid.x;
|
||||
gsmIntData[gid.x] = (float)gid.x;
|
||||
GroupMemoryBarrierWithGroupSync();
|
||||
InterlockedAdd(gsmIntData[u], value);
|
||||
InterlockedAdd(gsmIntData[u], -value);
|
||||
GroupMemoryBarrierWithGroupSync();
|
||||
outval.x = (float)GetGSMIntValue(u+0);
|
||||
outval.y = (float)GetGSMIntValue(u+1);
|
||||
outval.z = (float)GetGSMIntValue(u+2);
|
||||
outval.w = (float)GetGSMIntValue(u+3);
|
||||
}
|
||||
else if (IsTest(4))
|
||||
{
|
||||
int value = (int)(indata[gid.x] * 100.0);
|
||||
int u = gid.x;
|
||||
gsmIntData[gid.x] = (float)gid.x;
|
||||
GroupMemoryBarrierWithGroupSync();
|
||||
InterlockedAnd(gsmIntData[u], value);
|
||||
GroupMemoryBarrierWithGroupSync();
|
||||
outval.x = (float)GetGSMIntValue(u+0);
|
||||
outval.y = (float)GetGSMIntValue(u+1);
|
||||
outval.z = (float)GetGSMIntValue(u+2);
|
||||
outval.w = (float)GetGSMIntValue(u+3);
|
||||
}
|
||||
else if (IsTest(5))
|
||||
{
|
||||
int value = (int)(indata[gid.x] * 100.0);
|
||||
int u = gid.x;
|
||||
gsmIntData[gid.x] = (float)gid.x;
|
||||
GroupMemoryBarrierWithGroupSync();
|
||||
InterlockedOr(gsmIntData[u], value);
|
||||
GroupMemoryBarrierWithGroupSync();
|
||||
outval.x = (float)GetGSMIntValue(u+0);
|
||||
outval.y = (float)GetGSMIntValue(u+1);
|
||||
outval.z = (float)GetGSMIntValue(u+2);
|
||||
outval.w = (float)GetGSMIntValue(u+3);
|
||||
}
|
||||
else if (IsTest(6))
|
||||
{
|
||||
int value = (int)(indata[gid.x] * 100.0);
|
||||
int u = gid.x;
|
||||
gsmIntData[gid.x] = (float)gid.x;
|
||||
GroupMemoryBarrierWithGroupSync();
|
||||
InterlockedXor(gsmIntData[u], value);
|
||||
InterlockedXor(gsmIntData[u], value);
|
||||
GroupMemoryBarrierWithGroupSync();
|
||||
outval.x = (float)GetGSMIntValue(u+0);
|
||||
outval.y = (float)GetGSMIntValue(u+1);
|
||||
outval.z = (float)GetGSMIntValue(u+2);
|
||||
outval.w = (float)GetGSMIntValue(u+3);
|
||||
}
|
||||
else if (IsTest(7))
|
||||
{
|
||||
int value = (int)(indata[gid.x] * 100.0);
|
||||
int u = gid.x;
|
||||
gsmIntData[gid.x] = (float)gid.x;
|
||||
GroupMemoryBarrierWithGroupSync();
|
||||
InterlockedMin(gsmIntData[u], value);
|
||||
GroupMemoryBarrierWithGroupSync();
|
||||
outval.x = (float)GetGSMIntValue(u+0);
|
||||
outval.y = (float)GetGSMIntValue(u+1);
|
||||
outval.z = (float)GetGSMIntValue(u+2);
|
||||
outval.w = (float)GetGSMIntValue(u+3);
|
||||
}
|
||||
else if (IsTest(8))
|
||||
{
|
||||
int value = (int)(indata[gid.x] * 100.0);
|
||||
int u = gid.x;
|
||||
gsmIntData[gid.x] = (float)gid.x;
|
||||
GroupMemoryBarrierWithGroupSync();
|
||||
InterlockedMax(gsmIntData[u], value);
|
||||
GroupMemoryBarrierWithGroupSync();
|
||||
outval.x = (float)GetGSMIntValue(u+0);
|
||||
outval.y = (float)GetGSMIntValue(u+1);
|
||||
outval.z = (float)GetGSMIntValue(u+2);
|
||||
outval.w = (float)GetGSMIntValue(u+3);
|
||||
}
|
||||
else if (IsTest(9))
|
||||
{
|
||||
int value = (int)(indata[gid.x] * 100.0);
|
||||
int u = gid.x;
|
||||
gsmIntData[gid.x] = (float)gid.x;
|
||||
GroupMemoryBarrierWithGroupSync();
|
||||
int original;
|
||||
InterlockedExchange(gsmIntData[u], value, original);
|
||||
GroupMemoryBarrierWithGroupSync();
|
||||
outval.x = (float)GetGSMIntValue(u+0);
|
||||
outval.y = (float)GetGSMIntValue(u+1);
|
||||
outval.z = (float)GetGSMIntValue(u+2);
|
||||
outval.w = (float)GetGSMIntValue(u+3);
|
||||
}
|
||||
else if (IsTest(10))
|
||||
{
|
||||
int value = (int)(indata[gid.x] * 100.0);
|
||||
int u = gid.x;
|
||||
gsmIntData[gid.x] = (float)gid.x;
|
||||
GroupMemoryBarrierWithGroupSync();
|
||||
int original;
|
||||
InterlockedCompareExchange(gsmIntData[u], value, value+1, original);
|
||||
GroupMemoryBarrierWithGroupSync();
|
||||
outval.x = (float)GetGSMIntValue(u+0);
|
||||
outval.y = (float)GetGSMIntValue(u+1);
|
||||
outval.z = (float)GetGSMIntValue(u+2);
|
||||
outval.w = (float)GetGSMIntValue(u+3);
|
||||
}
|
||||
else if (IsTest(11))
|
||||
{
|
||||
int value = (int)(indata[gid.x] * 100.0);
|
||||
int u = gid.x;
|
||||
gsmIntData[gid.x] = (float)gid.x;
|
||||
GroupMemoryBarrierWithGroupSync();
|
||||
InterlockedCompareStore(gsmIntData[u], value, value+1);
|
||||
GroupMemoryBarrierWithGroupSync();
|
||||
outval.x = (float)GetGSMIntValue(u+0);
|
||||
outval.y = (float)GetGSMIntValue(u+1);
|
||||
outval.z = (float)GetGSMIntValue(u+2);
|
||||
outval.w = (float)GetGSMIntValue(u+3);
|
||||
}
|
||||
|
||||
outdata[gid.x] = outval;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user