From 353e6323936b812884fa677c25bdba91554881b7 Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Thu, 5 Aug 2021 20:32:31 +1000 Subject: [PATCH] clover: add kernel attributes support for SPIR-V Fixes CTS api kernel_attributes Reviewed-by: Karol Herbst Part-of: --- .../frontends/clover/nir/invocation.cpp | 2 +- .../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 type_strs = { + "uchar", "ushort", "uint", "ulong", "half", "float", "double" + }; + template T get(const char *source, size_t index) { const uint32_t *word_ptr = reinterpret_cast(source); @@ -140,6 +146,7 @@ namespace { module m; + std::vector attributes; std::unordered_map > req_local_sizes; std::unordered_map kernels; std::unordered_map types; @@ -190,13 +197,47 @@ namespace { case SpvOpExecutionMode: switch (get(inst, 2)) { - case SpvExecutionModeLocalSize: + case SpvExecutionModeLocalSize: { req_local_sizes[get(inst, 1)] = { get(inst, 3), get(inst, 4), get(inst, 5) }; + std::string s = "reqd_work_group_size("; + s += std::to_string(get(inst, 3)); + s += ","; + s += std::to_string(get(inst, 4)); + s += ","; + s += std::to_string(get(inst, 5)); + s += ")"; + attributes.emplace_back(s); break; + } + case SpvExecutionModeLocalSizeHint: { + std::string s = "work_group_size_hint("; + s += std::to_string(get(inst, 3)); + s += ","; + s += std::to_string(get(inst, 4)); + s += ","; + s += std::to_string(get(inst, 5)); + s += ")"; + attributes.emplace_back(s); + break; + } + case SpvExecutionModeVecTypeHint: { + uint32_t val = get(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: