Skip to content

Commit cb2d51a

Browse files
WGSLUtils: improved atomic buffers detection
1 parent 270730f commit cb2d51a

File tree

4 files changed

+66
-14
lines changed

4 files changed

+66
-14
lines changed

Graphics/ShaderTools/src/WGSLUtils.cpp

Lines changed: 35 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -112,26 +112,47 @@ std::string ConvertSPIRVtoWGSL(const std::vector<uint32_t>& SPIRV)
112112

113113
static bool IsAtomic(const tint::core::type::Type* WGSLType)
114114
{
115-
if (WGSLType == nullptr || !WGSLType->Is<tint::core::type::Struct>())
115+
if (WGSLType == nullptr)
116116
return false;
117117

118-
const tint::core::type::Struct* WGSLStruct = WGSLType->As<tint::core::type::Struct>();
119-
if (WGSLStruct == nullptr || WGSLStruct->Members().IsEmpty())
120-
return false;
118+
if (WGSLType->Is<tint::core::type::Struct>())
119+
{
120+
const tint::core::type::Struct* WGSLStruct = WGSLType->As<tint::core::type::Struct>();
121+
if (WGSLStruct == nullptr || WGSLStruct->Members().IsEmpty())
122+
return false;
121123

122-
const tint::core::type::Type* WGSLMember = WGSLStruct->Members().Front()->Type();
123-
if (WGSLMember == nullptr || !WGSLMember->Is<tint::core::type::Array>())
124-
return false;
124+
for (const tint::core::type::StructMember* WGSLMember : WGSLStruct->Members())
125+
{
126+
const tint::core::type::Type* WGSLMemberType = WGSLMember->Type();
127+
if (WGSLMemberType == nullptr)
128+
return false;
125129

126-
const tint::core::type::Array* WGSLArray = WGSLMember->As<tint::core::type::Array>();
127-
if (WGSLArray == nullptr)
128-
return false;
130+
if (WGSLMemberType->Is<tint::core::type::Array>())
131+
{
132+
const tint::core::type::Array* WGSLArray = WGSLMemberType->As<tint::core::type::Array>();
133+
if (WGSLArray == nullptr)
134+
return false;
129135

130-
const tint::core::type::Type* WGSLArrayMember = WGSLArray->ElemType();
131-
if (WGSLArrayMember == nullptr)
132-
return false;
136+
const tint::core::type::Type* WGSLArrayElemType = WGSLArray->ElemType();
137+
if (WGSLArrayElemType == nullptr)
138+
return false;
139+
140+
if (IsAtomic(WGSLArrayElemType))
141+
return true;
142+
}
143+
else
144+
{
145+
if (IsAtomic(WGSLMemberType))
146+
return true;
147+
}
148+
}
133149

134-
return WGSLArrayMember->Is<tint::core::type::Atomic>();
150+
return false;
151+
}
152+
else
153+
{
154+
return WGSLType->Is<tint::core::type::Atomic>();
155+
}
135156
}
136157

137158
std::string GetWGSLResourceAlternativeName(const tint::Program& Program, const tint::inspector::ResourceBinding& Binding)

Tests/DiligentCoreTest/assets/shaders/WGSL/RWStructBuffers.psh

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,19 @@ struct BufferData1
88
float4 data;
99
};
1010

11+
struct BufferData2
12+
{
13+
int data;
14+
};
15+
16+
struct BufferData3
17+
{
18+
int data0;
19+
int data1;
20+
int data2;
21+
int data3;
22+
};
23+
1124
RWStructuredBuffer<BufferData0> g_RWBuff0;
1225
RWStructuredBuffer<BufferData0> g_RWBuff1;
1326
RWStructuredBuffer<BufferData1> g_RWBuff2;
@@ -22,6 +35,11 @@ RWStructuredBuffer<int> g_RWBuff1_atomic;
2235
RWStructuredBuffer<int> g_RWBuff0Atomic_atomic;
2336
RWStructuredBuffer<int> g_RWBuff1Atomic_atomic;
2437

38+
RWStructuredBuffer<BufferData2> g_RWBuff2Atomic;
39+
RWStructuredBuffer<BufferData3> g_RWBuff3Atomic;
40+
RWStructuredBuffer<BufferData2> g_RWBuff4Atomic_atomic;
41+
RWStructuredBuffer<BufferData3> g_RWBuff5Atomic_atomic;
42+
2543
float4 main() : SV_Target
2644
{
2745
BufferData0 Data0;
@@ -43,6 +61,11 @@ float4 main() : SV_Target
4361

4462
InterlockedAdd(g_RWBuff0Atomic_atomic[0], 1, OriginalListIdx);
4563
InterlockedAdd(g_RWBuff1Atomic_atomic[0], 1, OriginalListIdx);
64+
65+
InterlockedAdd(g_RWBuff2Atomic[0].data, 1, OriginalListIdx);
66+
InterlockedAdd(g_RWBuff3Atomic[0].data1, 1, OriginalListIdx);
67+
InterlockedAdd(g_RWBuff4Atomic_atomic[0].data, 1, OriginalListIdx);
68+
InterlockedAdd(g_RWBuff5Atomic_atomic[0].data3, 1, OriginalListIdx);
4669

4770
return float4(1.0, 0.0, 0.0, 1.0);
4871
}

Tests/DiligentCoreTest/src/ShaderTools/WGSLShaderResourcesTest.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,10 @@ TEST(WGSLShaderResources, RWStructBuffers)
188188
{"g_RWBuff1_atomic", WGSLResourceType::RWStorageBuffer, 1, RESOURCE_DIM_BUFFER},
189189
{"g_RWBuff0Atomic_atomic", WGSLResourceType::RWStorageBuffer, 1, RESOURCE_DIM_BUFFER},
190190
{"g_RWBuff1Atomic_atomic", WGSLResourceType::RWStorageBuffer, 1, RESOURCE_DIM_BUFFER},
191+
{"g_RWBuff2Atomic", WGSLResourceType::RWStorageBuffer, 1, RESOURCE_DIM_BUFFER},
192+
{"g_RWBuff3Atomic", WGSLResourceType::RWStorageBuffer, 1, RESOURCE_DIM_BUFFER},
193+
{"g_RWBuff4Atomic_atomic", WGSLResourceType::RWStorageBuffer, 1, RESOURCE_DIM_BUFFER},
194+
{"g_RWBuff5Atomic_atomic", WGSLResourceType::RWStorageBuffer, 1, RESOURCE_DIM_BUFFER},
191195
});
192196
}
193197

Tests/DiligentCoreTest/src/ShaderTools/WGSLUtilsTest.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,10 @@ TEST(WGSLUtils, RemapRWStructBuffers)
251251
{"g_RWBuff1_atomic", {15, 16}},
252252
{"g_RWBuff0Atomic_atomic", {17, 18}},
253253
{"g_RWBuff1Atomic_atomic", {19, 20}},
254+
{"g_RWBuff2Atomic", {21, 22}},
255+
{"g_RWBuff3Atomic", {23, 24}},
256+
{"g_RWBuff4Atomic_atomic", {25, 26}},
257+
{"g_RWBuff5Atomic_atomic", {27, 28}},
254258
});
255259
}
256260

0 commit comments

Comments
 (0)