Fix #1924: Promote SPV_EXT_physical_storage_buffer to KHR when required.
authorJohn Kessenich <cepheus@frii.com>
Fri, 11 Oct 2019 02:54:21 +0000 (20:54 -0600)
committerJohn Kessenich <cepheus@frii.com>
Fri, 11 Oct 2019 02:54:21 +0000 (20:54 -0600)
If the semantics that require the KHR form over the EXT form are seen
(OpBitcast between a vector and a pointer) promote the requested extension
from the EXT to the KHR.

SPIRV/GlslangToSpv.cpp
SPIRV/SpvBuilder.h
Test/baseResults/spv.bufferhandleUvec2.frag.out

index 8760f4a..2d50074 100644 (file)
@@ -6275,6 +6275,9 @@ spv::Id TGlslangToSpvTraverser::createConversion(glslang::TOperator op, OpDecora
         break;
     case glslang::EOpConvPtrToUvec2:
     case glslang::EOpConvUvec2ToPtr:
+        if (builder.isVector(operand))
+            builder.promoteIncorporatedExtension(spv::E_SPV_EXT_physical_storage_buffer,
+                                                 spv::E_SPV_KHR_physical_storage_buffer, spv::Spv_1_5);
         convOp = spv::OpBitcast;
         break;
 #endif
index bef7d3d..55754f6 100644 (file)
@@ -106,11 +106,20 @@ public:
     void addModuleProcessed(const std::string& p) { moduleProcesses.push_back(p.c_str()); }
     void setEmitOpLines() { emitOpLines = true; }
     void addExtension(const char* ext) { extensions.insert(ext); }
+    void removeExtension(const char* ext)
+    {
+        extensions.erase(ext);
+    }
     void addIncorporatedExtension(const char* ext, SpvVersion incorporatedVersion)
     {
         if (getSpvVersion() < static_cast<unsigned>(incorporatedVersion))
             addExtension(ext);
     }
+    void promoteIncorporatedExtension(const char* baseExt, const char* promoExt, SpvVersion incorporatedVersion)
+    {
+        removeExtension(baseExt);
+        addIncorporatedExtension(promoExt, incorporatedVersion);
+    }
     void addInclude(const std::string& name, const std::string& text)
     {
         spv::Id incId = getStringId(name);
index 9ac455b..1e0cbcd 100755 (executable)
@@ -1,12 +1,11 @@
 spv.bufferhandleUvec2.frag
-Validation failed
 // Module Version 10000
 // Generated by (magic number): 80007
 // Id's are bound by 71
 
                               Capability Shader
                               Capability PhysicalStorageBufferAddressesEXT
-                              Extension  "SPV_EXT_physical_storage_buffer"
+                              Extension  "SPV_KHR_physical_storage_buffer"
                               Extension  "SPV_KHR_storage_buffer_storage_class"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel PhysicalStorageBuffer64EXT GLSL450