Add Interlocked* tests to D3D12_Groupshared

This commit is contained in:
Jake Turner
2025-10-05 07:50:05 +01:00
parent 823ae93845
commit 0e6fc382d7
+137
View File
@@ -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;
}