Mesa (main): clc: parse localSize and localSizeHint

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Sat May 21 12:59:27 UTC 2022


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

Author: Karol Herbst <kherbst at redhat.com>
Date:   Sun Apr 24 13:21:13 2022 +0200

clc: parse localSize and localSizeHint

Signed-off-by: Karol Herbst <kherbst at redhat.com>
Reviewed-by: Jesse Natalie <jenatali at microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16479>

---

 src/compiler/clc/clc.h           |  3 +++
 src/compiler/clc/clc_helpers.cpp | 31 ++++++++++++++++++++++++-------
 2 files changed, 27 insertions(+), 7 deletions(-)

diff --git a/src/compiler/clc/clc.h b/src/compiler/clc/clc.h
index 68366340ced..0431643c00d 100644
--- a/src/compiler/clc/clc.h
+++ b/src/compiler/clc/clc.h
@@ -128,6 +128,9 @@ struct clc_kernel_info {
 
    unsigned vec_hint_size;
    enum clc_vec_hint_type vec_hint_type;
+
+   unsigned local_size[3];
+   unsigned local_size_hint[3];
 };
 
 enum clc_spec_constant_type {
diff --git a/src/compiler/clc/clc_helpers.cpp b/src/compiler/clc/clc_helpers.cpp
index 01ef8a66e4a..383f236e7e4 100644
--- a/src/compiler/clc/clc_helpers.cpp
+++ b/src/compiler/clc/clc_helpers.cpp
@@ -102,13 +102,16 @@ public:
 
 class SPIRVKernelInfo {
 public:
-   SPIRVKernelInfo(uint32_t fid, const char *nm) : funcId(fid), name(nm), vecHint(0) { }
+   SPIRVKernelInfo(uint32_t fid, const char *nm)
+      : funcId(fid), name(nm), vecHint(0), localSize(), localSizeHint() { }
    ~SPIRVKernelInfo() { }
 
    uint32_t funcId;
    std::string name;
    std::vector<SPIRVKernelArg> args;
    unsigned vecHint;
+   unsigned localSize[3];
+   unsigned localSizeHint[3];
 };
 
 class SPIRVKernelParser {
@@ -447,14 +450,26 @@ public:
    void parseExecutionMode(const spv_parsed_instruction_t *ins)
    {
       uint32_t executionMode = ins->words[ins->operands[1].offset];
-      if (executionMode != SpvExecutionModeVecTypeHint)
-         return;
-
       uint32_t funcId = ins->words[ins->operands[0].offset];
-      uint32_t vecHint = ins->words[ins->operands[2].offset];
+
       for (auto& kernel : kernels) {
-         if (kernel.funcId == funcId)
-            kernel.vecHint = vecHint;
+         if (kernel.funcId == funcId) {
+            switch (executionMode) {
+            case SpvExecutionModeVecTypeHint:
+               kernel.vecHint = ins->words[ins->operands[2].offset];
+               break;
+            case SpvExecutionModeLocalSize:
+               kernel.localSize[0] = ins->words[ins->operands[2].offset];
+               kernel.localSize[1] = ins->words[ins->operands[3].offset];
+               kernel.localSize[2] = ins->words[ins->operands[4].offset];
+            case SpvExecutionModeLocalSizeHint:
+               kernel.localSizeHint[0] = ins->words[ins->operands[2].offset];
+               kernel.localSizeHint[1] = ins->words[ins->operands[3].offset];
+               kernel.localSizeHint[2] = ins->words[ins->operands[4].offset];
+            default:
+               return;
+            }
+         }
       }
    }
 
@@ -692,6 +707,8 @@ clc_spirv_get_kernels_info(const struct clc_binary *spvbin,
       kernels[i].num_args = parser.kernels[i].args.size();
       kernels[i].vec_hint_size = parser.kernels[i].vecHint >> 16;
       kernels[i].vec_hint_type = (enum clc_vec_hint_type)(parser.kernels[i].vecHint & 0xFFFF);
+      memcpy(kernels[i].local_size, parser.kernels[i].localSize, sizeof(kernels[i].local_size));
+      memcpy(kernels[i].local_size_hint, parser.kernels[i].localSizeHint, sizeof(kernels[i].local_size_hint));
       if (!kernels[i].num_args)
          continue;
 



More information about the mesa-commit mailing list