clover/spirv: rework handling of spirv extensions
authorKarol Herbst <kherbst@redhat.com>
Sat, 15 Aug 2020 11:19:52 +0000 (13:19 +0200)
committerMarge Bot <eric+marge@anholt.net>
Thu, 20 Aug 2020 19:48:12 +0000 (19:48 +0000)
What extensions we support depends on spirv_to_nir but it doesn't give us a
list. So hardcode one and add extensions we know we support and hit in the
wild.

v2: move into spirv lib

Signed-off-by: Karol Herbst <kherbst@redhat.com>
Reviewed-by: Pierre Moreau <dev@pmoreau.org>
Reviewed-by: Francisco Jerez <currojerez@riseup.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5038>

src/gallium/frontends/clover/spirv/invocation.cpp
src/gallium/frontends/clover/spirv/invocation.hpp

index 01ced45c13bc5da4c08646ecc8de91d6cab64257..9353b56d326d2fcf5a34a76fddbd00c836455e9d 100644 (file)
@@ -433,6 +433,7 @@ namespace {
                     std::string &r_log) {
       const size_t length = source.size() / sizeof(uint32_t);
       size_t i = SPIRV_HEADER_WORD_SIZE; // Skip header
                     std::string &r_log) {
       const size_t length = source.size() / sizeof(uint32_t);
       size_t i = SPIRV_HEADER_WORD_SIZE; // Skip header
+      const auto spirv_extensions = spirv::supported_extensions();
 
       while (i < length) {
          const auto desc_word = get<uint32_t>(source.data(), i);
 
       while (i < length) {
          const auto desc_word = get<uint32_t>(source.data(), i);
@@ -446,14 +447,9 @@ namespace {
          if (opcode != SpvOpExtension)
             break;
 
          if (opcode != SpvOpExtension)
             break;
 
-         const char *extension = source.data() + (i + 1u) * sizeof(uint32_t);
-         const std::string device_extensions = dev.supported_extensions();
-         const std::string platform_extensions =
-            dev.platform.supported_extensions();
-         if (device_extensions.find(extension) == std::string::npos &&
-             platform_extensions.find(extension) == std::string::npos) {
-            r_log += "Extension '" + std::string(extension) +
-                     "' is not supported.\n";
+         const std::string extension = source.data() + (i + 1u) * sizeof(uint32_t);
+         if (spirv_extensions.count(extension) == 0) {
+            r_log += "Extension '" + extension + "' is not supported.\n";
             return false;
          }
 
             return false;
          }
 
@@ -709,6 +705,14 @@ clover::spirv::print_module(const std::vector<char> &binary,
    return disassemblyStr;
 }
 
    return disassemblyStr;
 }
 
+std::unordered_set<std::string>
+clover::spirv::supported_extensions() {
+   return {
+      /* this is only a hint so all devices support that */
+      "SPV_KHR_no_integer_wrap_decoration"
+   };
+}
+
 #else
 bool
 clover::spirv::is_valid_spirv(const std::vector<char> &/*binary*/,
 #else
 bool
 clover::spirv::is_valid_spirv(const std::vector<char> &/*binary*/,
@@ -737,4 +741,9 @@ clover::spirv::print_module(const std::vector<char> &binary,
                             const std::string &opencl_version) {
    return std::string();
 }
                             const std::string &opencl_version) {
    return std::string();
 }
+
+std::unordered_set<std::string>
+clover::spirv::supported_extensions() {
+   return {};
+}
 #endif
 #endif
index 472d8c0de71ba9c59ce26fd217edbaa692fd68af..49a183ffc04bc759071efd4ac3184b4324e600a8 100644 (file)
@@ -23,6 +23,8 @@
 #ifndef CLOVER_SPIRV_INVOCATION_HPP
 #define CLOVER_SPIRV_INVOCATION_HPP
 
 #ifndef CLOVER_SPIRV_INVOCATION_HPP
 #define CLOVER_SPIRV_INVOCATION_HPP
 
+#include <unordered_set>
+
 #include "core/context.hpp"
 #include "core/module.hpp"
 #include "core/program.hpp"
 #include "core/context.hpp"
 #include "core/module.hpp"
 #include "core/program.hpp"
@@ -50,6 +52,9 @@ namespace clover {
       // Returns a textual representation of the given binary.
       std::string print_module(const std::vector<char> &binary,
                                const std::string &opencl_version);
       // Returns a textual representation of the given binary.
       std::string print_module(const std::vector<char> &binary,
                                const std::string &opencl_version);
+
+      // Returns a set of supported SPIR-V extensions.
+      std::unordered_set<std::string> supported_extensions();
    }
 }
 
    }
 }