Mesa (main): clover: add kernel attributes support for SPIR-V

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon Aug 9 19:24:02 UTC 2021


Module: Mesa
Branch: main
Commit: 353e6323936b812884fa677c25bdba91554881b7
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=353e6323936b812884fa677c25bdba91554881b7

Author: Dave Airlie <airlied at redhat.com>
Date:   Thu Aug  5 20:32:31 2021 +1000

clover: add kernel attributes support for SPIR-V

Fixes CTS api kernel_attributes

Reviewed-by: Karol Herbst <kherbst at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12225>

---

 src/gallium/frontends/clover/nir/invocation.cpp   |  2 +-
 src/gallium/frontends/clover/spirv/invocation.cpp | 46 ++++++++++++++++++++++-
 2 files changed, 45 insertions(+), 3 deletions(-)

diff --git a/src/gallium/frontends/clover/nir/invocation.cpp b/src/gallium/frontends/clover/nir/invocation.cpp
index f491691abbb..70d47d964a8 100644
--- a/src/gallium/frontends/clover/nir/invocation.cpp
+++ b/src/gallium/frontends/clover/nir/invocation.cpp
@@ -581,7 +581,7 @@ module clover::nir::spirv_to_nir(const module &mod, const device &dev,
 
       ralloc_free(mem_ctx);
 
-      m.syms.emplace_back(sym.name, std::string(),
+      m.syms.emplace_back(sym.name, sym.attributes,
                           sym.reqd_work_group_size, section_id, 0, args);
       m.secs.push_back(text);
       section_id++;
diff --git a/src/gallium/frontends/clover/spirv/invocation.cpp b/src/gallium/frontends/clover/spirv/invocation.cpp
index e91126141e2..fc6cc4bfb4d 100644
--- a/src/gallium/frontends/clover/spirv/invocation.cpp
+++ b/src/gallium/frontends/clover/spirv/invocation.cpp
@@ -47,9 +47,15 @@
 
 using namespace clover;
 
+using clover::detokenize;
+
 #ifdef HAVE_CLOVER_SPIRV
 namespace {
 
+   static const std::array<std::string,7> type_strs = {
+      "uchar", "ushort", "uint", "ulong", "half", "float", "double"
+   };
+
    template<typename T>
    T get(const char *source, size_t index) {
       const uint32_t *word_ptr = reinterpret_cast<const uint32_t *>(source);
@@ -140,6 +146,7 @@ namespace {
 
       module m;
 
+      std::vector<std::string> attributes;
       std::unordered_map<SpvId, std::vector<size_t> > req_local_sizes;
       std::unordered_map<SpvId, std::string> kernels;
       std::unordered_map<SpvId, module::argument> types;
@@ -190,13 +197,47 @@ namespace {
 
          case SpvOpExecutionMode:
             switch (get<SpvExecutionMode>(inst, 2)) {
-            case SpvExecutionModeLocalSize:
+            case SpvExecutionModeLocalSize: {
                req_local_sizes[get<SpvId>(inst, 1)] = {
                   get<uint32_t>(inst, 3),
                   get<uint32_t>(inst, 4),
                   get<uint32_t>(inst, 5)
                };
+               std::string s = "reqd_work_group_size(";
+               s += std::to_string(get<uint32_t>(inst, 3));
+               s += ",";
+               s += std::to_string(get<uint32_t>(inst, 4));
+               s += ",";
+               s += std::to_string(get<uint32_t>(inst, 5));
+               s += ")";
+               attributes.emplace_back(s);
                break;
+            }
+            case SpvExecutionModeLocalSizeHint: {
+               std::string s = "work_group_size_hint(";
+               s += std::to_string(get<uint32_t>(inst, 3));
+               s += ",";
+               s += std::to_string(get<uint32_t>(inst, 4));
+               s += ",";
+               s += std::to_string(get<uint32_t>(inst, 5));
+               s += ")";
+               attributes.emplace_back(s);
+               break;
+            }
+	    case SpvExecutionModeVecTypeHint: {
+               uint32_t val = get<uint32_t>(inst, 3);
+               uint32_t size = val >> 16;
+
+               val &= 0xf;
+               if (val > 6)
+                  val = 0;
+               std::string s = "vec_type_hint(";
+               s += type_strs[val];
+               s += std::to_string(size);
+               s += ")";
+               attributes.emplace_back(s);
+	       break;
+            }
             default:
                break;
             }
@@ -457,11 +498,12 @@ namespace {
             for (size_t i = 0; i < param_type_names[kernel_name].size(); i++)
                args[i].info.type_name = param_type_names[kernel_name][i];
 
-            m.syms.emplace_back(kernel_name, std::string(),
+            m.syms.emplace_back(kernel_name, detokenize(attributes, " "),
                                 req_local_size, 0, kernel_nb, args);
             ++kernel_nb;
             kernel_name.clear();
             args.clear();
+            attributes.clear();
             break;
 
          default:



More information about the mesa-commit mailing list