Skip to content

Commit 017f804

Browse files
[WebGPU, Dawn] Updated Dawn to support texture-tier-1 in the Tint converter
1 parent 3484ee9 commit 017f804

File tree

5 files changed

+96
-43
lines changed

5 files changed

+96
-43
lines changed

Graphics/GraphicsEngineWebGPU/src/ShaderWebGPUImpl.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,7 @@ void ShaderWebGPUImpl::Initialize(const ShaderCreateInfo& ShaderCI,
204204
}
205205

206206
StripGoogleHlslFunctionality(SPIRV);
207+
AddStorageImageExtendedFormats(SPIRV);
207208
m_WGSL = ConvertSPIRVtoWGSL(SPIRV);
208209
if (m_WGSL.empty())
209210
{

Graphics/ShaderTools/include/WGSLUtils.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ std::string RemapWGSLResourceBindings(const std::string& WGSL,
5959
/// New version of Tint can't translate SPIR-V to WGSL with certain HLSL-specific functionality,
6060
void StripGoogleHlslFunctionality(std::vector<uint32_t>& SPIRV);
6161

62+
/// Ensures the module declares `OpCapability StorageImageExtendedFormats`, which is required when using extended storage image formats
63+
void AddStorageImageExtendedFormats(std::vector<uint32_t>& SPIRV);
6264

6365
/// When WGSL is generated from SPIR-V, the names of resources may be mangled
6466
///

Graphics/ShaderTools/src/WGSLShaderResources.cpp

Lines changed: 41 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -259,44 +259,47 @@ TEXTURE_FORMAT TintTexelFormatToTextureFormat(const tint::inspector::ResourceBin
259259
switch (TintBinding.image_format)
260260
{
261261
// clang-format off
262-
case TintTexelFormat::kBgra8Unorm: return TEX_FORMAT_BGRA8_UNORM;
263-
case TintTexelFormat::kRgba8Unorm: return TEX_FORMAT_RGBA8_UNORM;
264-
case TintTexelFormat::kRgba8Snorm: return TEX_FORMAT_RGBA8_SNORM;
265-
case TintTexelFormat::kRgba8Uint: return TEX_FORMAT_RGBA8_UINT;
266-
case TintTexelFormat::kRgba8Sint: return TEX_FORMAT_RGBA8_SINT;
267-
case TintTexelFormat::kRgba16Uint: return TEX_FORMAT_RGBA16_UINT;
268-
case TintTexelFormat::kRgba16Sint: return TEX_FORMAT_RGBA16_SINT;
269-
case TintTexelFormat::kRgba16Float: return TEX_FORMAT_RGBA16_FLOAT;
270-
case TintTexelFormat::kRgba16Unorm: return TEX_FORMAT_RGBA16_UNORM;
271-
case TintTexelFormat::kRgba16Snorm: return TEX_FORMAT_RGBA16_SNORM;
272-
case TintTexelFormat::kR32Uint: return TEX_FORMAT_R32_UINT;
273-
case TintTexelFormat::kR32Sint: return TEX_FORMAT_R32_SINT;
274-
case TintTexelFormat::kR32Float: return TEX_FORMAT_R32_FLOAT;
275-
case TintTexelFormat::kRg32Uint: return TEX_FORMAT_RG32_UINT;
276-
case TintTexelFormat::kRg32Sint: return TEX_FORMAT_RG32_SINT;
277-
case TintTexelFormat::kRg32Float: return TEX_FORMAT_RG32_FLOAT;
278-
case TintTexelFormat::kRgba32Uint: return TEX_FORMAT_RGBA32_UINT;
279-
case TintTexelFormat::kRgba32Sint: return TEX_FORMAT_RGBA32_SINT;
280-
case TintTexelFormat::kRgba32Float: return TEX_FORMAT_RGBA32_FLOAT;
281-
case TintTexelFormat::kR8Unorm: return TEX_FORMAT_R8_UNORM;
282-
case TintTexelFormat::kR8Snorm: return TEX_FORMAT_R8_SNORM;
283-
case TintTexelFormat::kR8Uint: return TEX_FORMAT_R8_UINT;
284-
case TintTexelFormat::kR8Sint: return TEX_FORMAT_R8_SINT;
285-
case TintTexelFormat::kRg8Unorm: return TEX_FORMAT_RG8_UNORM;
286-
case TintTexelFormat::kRg8Snorm: return TEX_FORMAT_RG8_SNORM;
287-
case TintTexelFormat::kRg8Uint: return TEX_FORMAT_RG8_UINT;
288-
case TintTexelFormat::kRg8Sint: return TEX_FORMAT_RG8_SINT;
289-
case TintTexelFormat::kR16Uint: return TEX_FORMAT_R16_UINT;
290-
case TintTexelFormat::kR16Sint: return TEX_FORMAT_R16_SINT;
291-
case TintTexelFormat::kR16Float: return TEX_FORMAT_R16_FLOAT;
292-
case TintTexelFormat::kR16Unorm: return TEX_FORMAT_R16_UNORM;
293-
case TintTexelFormat::kR16Snorm: return TEX_FORMAT_R16_SNORM;
294-
case TintTexelFormat::kRg16Uint: return TEX_FORMAT_RG16_UINT;
295-
case TintTexelFormat::kRg16Sint: return TEX_FORMAT_RG16_SINT;
296-
case TintTexelFormat::kRg16Float: return TEX_FORMAT_RG16_FLOAT;
297-
case TintTexelFormat::kRg16Unorm: return TEX_FORMAT_RG16_UNORM;
298-
case TintTexelFormat::kRg16Snorm: return TEX_FORMAT_RG16_SNORM;
299-
case TintTexelFormat::kNone: return TEX_FORMAT_UNKNOWN;
262+
case TintTexelFormat::kBgra8Unorm: return TEX_FORMAT_BGRA8_UNORM;
263+
case TintTexelFormat::kRgba8Unorm: return TEX_FORMAT_RGBA8_UNORM;
264+
case TintTexelFormat::kRgba8Snorm: return TEX_FORMAT_RGBA8_SNORM;
265+
case TintTexelFormat::kRgba8Uint: return TEX_FORMAT_RGBA8_UINT;
266+
case TintTexelFormat::kRgba8Sint: return TEX_FORMAT_RGBA8_SINT;
267+
case TintTexelFormat::kRgba16Uint: return TEX_FORMAT_RGBA16_UINT;
268+
case TintTexelFormat::kRgba16Sint: return TEX_FORMAT_RGBA16_SINT;
269+
case TintTexelFormat::kRgba16Float: return TEX_FORMAT_RGBA16_FLOAT;
270+
case TintTexelFormat::kRgba16Unorm: return TEX_FORMAT_RGBA16_UNORM;
271+
case TintTexelFormat::kRgba16Snorm: return TEX_FORMAT_RGBA16_SNORM;
272+
case TintTexelFormat::kR32Uint: return TEX_FORMAT_R32_UINT;
273+
case TintTexelFormat::kR32Sint: return TEX_FORMAT_R32_SINT;
274+
case TintTexelFormat::kR32Float: return TEX_FORMAT_R32_FLOAT;
275+
case TintTexelFormat::kRg32Uint: return TEX_FORMAT_RG32_UINT;
276+
case TintTexelFormat::kRg32Sint: return TEX_FORMAT_RG32_SINT;
277+
case TintTexelFormat::kRg32Float: return TEX_FORMAT_RG32_FLOAT;
278+
case TintTexelFormat::kRgba32Uint: return TEX_FORMAT_RGBA32_UINT;
279+
case TintTexelFormat::kRgba32Sint: return TEX_FORMAT_RGBA32_SINT;
280+
case TintTexelFormat::kRgba32Float: return TEX_FORMAT_RGBA32_FLOAT;
281+
case TintTexelFormat::kR8Unorm: return TEX_FORMAT_R8_UNORM;
282+
case TintTexelFormat::kR8Snorm: return TEX_FORMAT_R8_SNORM;
283+
case TintTexelFormat::kR8Uint: return TEX_FORMAT_R8_UINT;
284+
case TintTexelFormat::kR8Sint: return TEX_FORMAT_R8_SINT;
285+
case TintTexelFormat::kRg8Unorm: return TEX_FORMAT_RG8_UNORM;
286+
case TintTexelFormat::kRg8Snorm: return TEX_FORMAT_RG8_SNORM;
287+
case TintTexelFormat::kRg8Uint: return TEX_FORMAT_RG8_UINT;
288+
case TintTexelFormat::kRg8Sint: return TEX_FORMAT_RG8_SINT;
289+
case TintTexelFormat::kR16Uint: return TEX_FORMAT_R16_UINT;
290+
case TintTexelFormat::kR16Sint: return TEX_FORMAT_R16_SINT;
291+
case TintTexelFormat::kR16Float: return TEX_FORMAT_R16_FLOAT;
292+
case TintTexelFormat::kR16Unorm: return TEX_FORMAT_R16_UNORM;
293+
case TintTexelFormat::kR16Snorm: return TEX_FORMAT_R16_SNORM;
294+
case TintTexelFormat::kRg16Uint: return TEX_FORMAT_RG16_UINT;
295+
case TintTexelFormat::kRg16Sint: return TEX_FORMAT_RG16_SINT;
296+
case TintTexelFormat::kRg16Float: return TEX_FORMAT_RG16_FLOAT;
297+
case TintTexelFormat::kRg16Unorm: return TEX_FORMAT_RG16_UNORM;
298+
case TintTexelFormat::kRg16Snorm: return TEX_FORMAT_RG16_SNORM;
299+
case TintTexelFormat::kRg11B10Ufloat: return TEX_FORMAT_R11G11B10_FLOAT;
300+
case TintTexelFormat::kRgb10A2Uint: return TEX_FORMAT_RGB10A2_UINT;
301+
case TintTexelFormat::kRgb10A2Unorm: return TEX_FORMAT_RGB10A2_UNORM;
302+
case TintTexelFormat::kNone: return TEX_FORMAT_UNKNOWN;
300303
// clang-format on
301304
default:
302305
UNEXPECTED("Unexpected texel format");

Graphics/ShaderTools/src/WGSLUtils.cpp

Lines changed: 51 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,51 @@ std::string DecodeSpirvLiteralString(const std::vector<uint32_t>& SPIRV,
117117
return Result;
118118
}
119119

120+
void AddStorageImageExtendedFormats(std::vector<uint32_t>& SPIRV)
121+
{
122+
if (SPIRV.size() <= 5)
123+
return;
124+
125+
constexpr uint16_t OpCapability = 17;
126+
constexpr uint32_t StorageImageExtendedFormats = 49;
127+
128+
bool HasCapability = false;
129+
size_t InsertAfterCapability = 5;
130+
131+
size_t InstructionPointer = 5; // Skip SPIR-V header
132+
while (InstructionPointer < SPIRV.size())
133+
{
134+
uint32_t Instruction = SPIRV[InstructionPointer];
135+
uint16_t WordCount = Instruction >> 16;
136+
uint16_t OpCode = Instruction & 0xFFFF;
137+
138+
if (WordCount == 0 || InstructionPointer + WordCount > SPIRV.size())
139+
break;
140+
141+
if (OpCode == OpCapability)
142+
{
143+
InsertAfterCapability = InstructionPointer + WordCount;
144+
145+
if (WordCount >= 2 && SPIRV[InstructionPointer + 1] == StorageImageExtendedFormats)
146+
{
147+
HasCapability = true;
148+
break;
149+
}
150+
151+
InstructionPointer += WordCount;
152+
continue;
153+
}
154+
break;
155+
}
156+
157+
if (HasCapability)
158+
return;
159+
160+
161+
const uint32_t FirstWord = (2u << 16) | uint32_t(OpCapability);
162+
SPIRV.insert(SPIRV.begin() + InsertAfterCapability, {FirstWord, StorageImageExtendedFormats});
163+
}
164+
120165
void StripGoogleHlslFunctionality(std::vector<uint32_t>& SPIRV)
121166
{
122167
if (SPIRV.size() <= 5)
@@ -127,6 +172,12 @@ void StripGoogleHlslFunctionality(std::vector<uint32_t>& SPIRV)
127172
constexpr uint16_t OpMemberDecorateStringGOOGLE = 5633;
128173

129174
size_t InstructionPointer = 5; // Skip SPIR-V header
175+
176+
auto EraseCurrent = [&](size_t Count) {
177+
SPIRV.erase(SPIRV.begin() + InstructionPointer,
178+
SPIRV.begin() + InstructionPointer + Count);
179+
};
180+
130181
while (InstructionPointer < SPIRV.size())
131182
{
132183
uint32_t Instruction = SPIRV[InstructionPointer];
@@ -136,10 +187,6 @@ void StripGoogleHlslFunctionality(std::vector<uint32_t>& SPIRV)
136187
if (WordCount == 0 || InstructionPointer + WordCount > SPIRV.size())
137188
break;
138189

139-
auto EraseCurrent = [&](size_t count) {
140-
SPIRV.erase(SPIRV.begin() + InstructionPointer,
141-
SPIRV.begin() + InstructionPointer + count);
142-
};
143190

144191
if (OpCode == OpExtension)
145192
{

ThirdParty/dawn/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ set(DAWN_SUBMODULES
1212
FetchContent_DeclareShallowGit(
1313
dawn
1414
GIT_REPOSITORY https://dawn.googlesource.com/dawn
15-
GIT_TAG d9daee7f75b60657aa3bc54b406882d10b693f89
15+
GIT_TAG 958dff171579e885fcfd02ec86fd6e0f5081a35f
1616
GIT_SUBMODULES "${DAWN_SUBMODULES}"
1717
)
1818

0 commit comments

Comments
 (0)