diff options
| author | Yong He <yonghe@outlook.com> | 2024-02-12 14:23:53 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-02-12 14:23:53 -0800 |
| commit | 2e35b08d279b4eb37a359941a06970cdea973502 (patch) | |
| tree | 1e26e49c9422855363c36be141cbf235bc2f294c /source | |
| parent | 0c15582efcec6c7b163ae3a20c04e1aee958d24a (diff) | |
Fix #3566. (#3574)
Diffstat (limited to 'source')
| -rw-r--r-- | source/slang/slang-stdlib-textures.cpp | 30 | ||||
| -rw-r--r-- | source/slang/slang-stdlib-textures.h | 3 |
2 files changed, 27 insertions, 6 deletions
diff --git a/source/slang/slang-stdlib-textures.cpp b/source/slang/slang-stdlib-textures.cpp index e6545f852..85282da92 100644 --- a/source/slang/slang-stdlib-textures.cpp +++ b/source/slang/slang-stdlib-textures.cpp @@ -67,6 +67,7 @@ void TextureTypeInfo::writeFuncBody( const String& glsl, const String& cuda, const String& spirvDefault, + const String& spirvRWDefault, const String& spirvCombined) { BraceScope funcScope{i, sb}; @@ -92,7 +93,13 @@ void TextureTypeInfo::writeFuncBody( if(spirvDefault.getLength() && spirvCombined.getLength()) { sb << i << "case spirv:\n"; - sb << i << "if (isCombined != 0)\n"; + sb << i << "if (access == " << kStdlibResourceAccessReadWrite << ")\n"; + sb << i << "return spirv_asm\n"; + { + BraceScope spirvRWScope{ i, sb, ";\n" }; + sb << spirvRWDefault << "\n"; + } + sb << i << "else if (isCombined != 0)\n"; sb << i << "{\n"; { sb << i << "return spirv_asm\n"; @@ -117,6 +124,7 @@ void TextureTypeInfo::writeFuncWithSig( const String& sig, const String& glsl, const String& spirvDefault, + const String& spirvRWDefault, const String& spirvCombined, const String& cuda, const ReadNoneMode readNoneMode) @@ -126,7 +134,7 @@ void TextureTypeInfo::writeFuncWithSig( sb << i << "[__readNone]\n"; sb << i << "[ForceInline]\n"; sb << i << sig << "\n"; - writeFuncBody(funcName, glsl, cuda, spirvDefault, spirvCombined); + writeFuncBody(funcName, glsl, cuda, spirvDefault, spirvRWDefault, spirvCombined); sb << "\n"; } @@ -136,6 +144,7 @@ void TextureTypeInfo::writeFunc( const String& params, const String& glsl, const String& spirvDefault, + const String& spirvRWDefault, const String& spirvCombined, const String& cuda, const ReadNoneMode readNoneMode) @@ -145,6 +154,7 @@ void TextureTypeInfo::writeFunc( cat(returnType, " ", funcName, "(", params, ")"), glsl, spirvDefault, + spirvRWDefault, spirvCombined, cuda, readNoneMode @@ -294,12 +304,12 @@ void TextureTypeInfo::writeGetDimensionFunctions() } // SPIRV ASM generation - auto generateSpirvAsm = [&](StringBuilder& spirv, UnownedStringSlice imageVar) + auto generateSpirvAsm = [&](StringBuilder& spirv, bool isRW, UnownedStringSlice imageVar) { spirv << "%vecSize:$$uint"; if (sizeDimCount > 1) spirv << sizeDimCount; spirv << " = "; - if (isMultisample) + if (isMultisample || isRW) spirv << "OpImageQuerySize " << imageVar << ";"; else spirv << "OpImageQuerySizeLod " << imageVar <<" $0;"; @@ -380,14 +390,21 @@ void TextureTypeInfo::writeGetDimensionFunctions() { spirvCombined << "OpCapability ImageQuery; "; spirvCombined << "%image:__imageType(this) = OpImage $this; "; - generateSpirvAsm(spirvCombined, toSlice("%image")); + generateSpirvAsm(spirvCombined, false, toSlice("%image")); } StringBuilder spirvDefault; { spirvDefault << "OpCapability ImageQuery; "; - generateSpirvAsm(spirvDefault, toSlice("$this")); + generateSpirvAsm(spirvDefault, false, toSlice("$this")); } + + StringBuilder spirvRWDefault; + { + spirvRWDefault << "OpCapability ImageQuery; "; + generateSpirvAsm(spirvRWDefault, true, toSlice("$this")); + } + sb << " __glsl_version(450)\n"; sb << " __glsl_extension(GL_EXT_samplerless_texture_functions)\n"; writeFunc( @@ -396,6 +413,7 @@ void TextureTypeInfo::writeGetDimensionFunctions() params, glsl, spirvDefault, + spirvRWDefault, spirvCombined, "", ReadNoneMode::Always); diff --git a/source/slang/slang-stdlib-textures.h b/source/slang/slang-stdlib-textures.h index 38ca41862..6c07b1a46 100644 --- a/source/slang/slang-stdlib-textures.h +++ b/source/slang/slang-stdlib-textures.h @@ -67,6 +67,7 @@ public: const String& glsl, const String& cuda, const String& spirvDefault, + const String& spirvRWDefault, const String& spirvCombined ); void writeFuncWithSig( @@ -74,6 +75,7 @@ public: const String& sig, const String& glsl = String{}, const String& spirvDefault = String{}, + const String& spirvRWDefault = String{}, const String& spirvCombined = String{}, const String& cuda = String{}, const ReadNoneMode readNoneMode = ReadNoneMode::Never @@ -84,6 +86,7 @@ public: const String& params, const String& glsl = String{}, const String& spirvDefault = String{}, + const String& spirvRWDefault = String{}, const String& spirvCombined = String{}, const String& cuda = String{}, const ReadNoneMode readNoneMode = ReadNoneMode::Never |
