Mesa (master): clover/llvm: Add options for dumping SPIR-V binaries

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Sat Sep 21 08:51:20 UTC 2019


Module: Mesa
Branch: master
Commit: 975a3c6ad398dff2f7c8e1d66dc46bdf2200a04b
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=975a3c6ad398dff2f7c8e1d66dc46bdf2200a04b

Author: Pierre Moreau <pierre.morrow at free.fr>
Date:   Sat Feb 10 21:41:19 2018 +0100

clover/llvm: Add options for dumping SPIR-V binaries

Reviewed-by: Karol Herbst <kherbst at redhat.com>
Acked-by: Francisco Jerez <currojerez at riseup.net>

---

 src/gallium/state_trackers/clover/llvm/util.hpp    |  4 ++-
 .../state_trackers/clover/spirv/invocation.cpp     | 30 ++++++++++++++++++++++
 .../state_trackers/clover/spirv/invocation.hpp     |  4 +++
 3 files changed, 37 insertions(+), 1 deletion(-)

diff --git a/src/gallium/state_trackers/clover/llvm/util.hpp b/src/gallium/state_trackers/clover/llvm/util.hpp
index 222becd614e..02e73e65071 100644
--- a/src/gallium/state_trackers/clover/llvm/util.hpp
+++ b/src/gallium/state_trackers/clover/llvm/util.hpp
@@ -101,7 +101,8 @@ namespace clover {
          enum flag {
             clc = 1 << 0,
             llvm = 1 << 1,
-            native = 1 << 2
+            native = 1 << 2,
+            spirv = 1 << 3,
          };
 
          inline bool
@@ -111,6 +112,7 @@ namespace clover {
                { "llvm", llvm, "Dump the generated LLVM IR for all kernels." },
                { "native", native, "Dump kernel assembly code for targets "
                  "specifying PIPE_SHADER_IR_NATIVE" },
+               { "spirv", spirv, "Dump the generated SPIR-V for all kernels." },
                DEBUG_NAMED_VALUE_END
             };
             static const unsigned flags =
diff --git a/src/gallium/state_trackers/clover/spirv/invocation.cpp b/src/gallium/state_trackers/clover/spirv/invocation.cpp
index fbcbbe8cd19..fa5b4dba606 100644
--- a/src/gallium/state_trackers/clover/spirv/invocation.cpp
+++ b/src/gallium/state_trackers/clover/spirv/invocation.cpp
@@ -680,6 +680,30 @@ clover::spirv::is_valid_spirv(const std::vector<char> &binary,
    return spvTool.Validate(reinterpret_cast<const uint32_t *>(binary.data()),
                            binary.size() / 4u);
 }
+
+std::string
+clover::spirv::print_module(const std::vector<char> &binary,
+                            const std::string &opencl_version) {
+   const spv_target_env target_env =
+      convert_opencl_str_to_target_env(opencl_version);
+   spvtools::SpirvTools spvTool(target_env);
+   spv_context spvContext = spvContextCreate(target_env);
+   if (!spvContext)
+      return "Failed to create an spv_context for disassembling the module.";
+
+   spv_text disassembly;
+   spvBinaryToText(spvContext,
+                   reinterpret_cast<const uint32_t *>(binary.data()),
+                   binary.size() / 4u, SPV_BINARY_TO_TEXT_OPTION_NONE,
+                   &disassembly, nullptr);
+   spvContextDestroy(spvContext);
+
+   const std::string disassemblyStr = disassembly->str;
+   spvTextDestroy(disassembly);
+
+   return disassemblyStr;
+}
+
 #else
 bool
 clover::spirv::is_valid_spirv(const std::vector<char> &/*binary*/,
@@ -702,4 +726,10 @@ clover::spirv::link_program(const std::vector<module> &/*modules*/,
    r_log += "SPIR-V support in clover is not enabled.\n";
    throw error(CL_LINKER_NOT_AVAILABLE);
 }
+
+std::string
+clover::spirv::print_module(const std::vector<char> &binary,
+                            const std::string &opencl_version) {
+   return std::string();
+}
 #endif
diff --git a/src/gallium/state_trackers/clover/spirv/invocation.hpp b/src/gallium/state_trackers/clover/spirv/invocation.hpp
index 715a125c5ff..472d8c0de71 100644
--- a/src/gallium/state_trackers/clover/spirv/invocation.hpp
+++ b/src/gallium/state_trackers/clover/spirv/invocation.hpp
@@ -46,6 +46,10 @@ namespace clover {
       // link dependencies between them.
       module link_program(const std::vector<module> &modules, const device &dev,
                           const std::string &opts, std::string &r_log);
+
+      // Returns a textual representation of the given binary.
+      std::string print_module(const std::vector<char> &binary,
+                               const std::string &opencl_version);
    }
 }
 




More information about the mesa-commit mailing list