Pierre Moreau <pierre.mor...@free.fr> writes:

> Signed-off-by: Pierre Moreau <pierre.mor...@free.fr>
> ---
>  .../state_trackers/clover/llvm/invocation.cpp      | 26 
> ++++++++++++++++++++++
>  .../state_trackers/clover/llvm/invocation.hpp      |  4 ++++
>  src/gallium/state_trackers/clover/meson.build      |  2 +-
>  3 files changed, 31 insertions(+), 1 deletion(-)
>
> diff --git a/src/gallium/state_trackers/clover/llvm/invocation.cpp 
> b/src/gallium/state_trackers/clover/llvm/invocation.cpp
> index e4ca5fa444..8fcf93eefd 100644
> --- a/src/gallium/state_trackers/clover/llvm/invocation.cpp
> +++ b/src/gallium/state_trackers/clover/llvm/invocation.cpp
> @@ -24,12 +24,15 @@
>  // OTHER DEALINGS IN THE SOFTWARE.
>  //
>  
> +#include <sstream>
> +
>  #include <llvm/IR/DiagnosticPrinter.h>
>  #include <llvm/IR/DiagnosticInfo.h>
>  #include <llvm/IR/LLVMContext.h>
>  #include <llvm/Support/raw_ostream.h>
>  #include <llvm/Transforms/IPO/PassManagerBuilder.h>
>  #include <llvm-c/Target.h>
> +#include <llvm-spirv/SPIRV.h>
>  
>  #include <clang/CodeGen/CodeGenAction.h>
>  #include <clang/Lex/PreprocessorOptions.h>
> @@ -301,3 +304,26 @@ clover::llvm::link_program(const std::vector<module> 
> &modules,
>        unreachable("Unsupported IR.");
>     }
>  }
> +
> +module
> +clover::llvm::compile_from_spirv(const std::vector<char> &binary,
> +                                 const device &dev,
> +                                 std::string &r_log) {
> +   auto ctx = create_context(r_log);
> +
> +   ::llvm::Module *unsafe_mod;
> +   std::string error_msg;
> +   std::stringstream input(std::ios_base::binary);
> +   std::copy(binary.begin(), binary.end(), 
> std::ostream_iterator<char>(input, ""));

Why do you need to std::copy the bytecode into a bidirectional
stringstream?  Can't you use an std::istringstream initialized to the
binary contents instead?

> +   if (!::llvm::ReadSPIRV(*ctx, input, unsafe_mod, error_msg)) {
> +      r_log += "Failed to convert SPIR-V to LLVM IR: " + error_msg + ".\n";
> +      throw error(CL_INVALID_VALUE);
> +   }
> +
> +   std::unique_ptr<::llvm::Module> mod(unsafe_mod);
> +
> +   if (has_flag(debug::llvm))
> +      debug::log(".ll", print_module_bitcode(*mod));
> +
> +   return build_module_library(*mod, module::section::text_intermediate);
> +}
> diff --git a/src/gallium/state_trackers/clover/llvm/invocation.hpp 
> b/src/gallium/state_trackers/clover/llvm/invocation.hpp
> index 5b3530c382..17fa416136 100644
> --- a/src/gallium/state_trackers/clover/llvm/invocation.hpp
> +++ b/src/gallium/state_trackers/clover/llvm/invocation.hpp
> @@ -41,6 +41,10 @@ namespace clover {
>                            const std::string &target,
>                            const std::string &opts,
>                            std::string &r_log);
> +
> +      module compile_from_spirv(const std::vector<char> &binary,
> +                                const device &dev,
> +                                std::string &r_log);
>     }
>  }
>  
> diff --git a/src/gallium/state_trackers/clover/meson.build 
> b/src/gallium/state_trackers/clover/meson.build
> index c52f0faa40..bffd0df11d 100644
> --- a/src/gallium/state_trackers/clover/meson.build
> +++ b/src/gallium/state_trackers/clover/meson.build
> @@ -48,7 +48,7 @@ libclllvm = static_library(
>        dep_llvm.get_configtool_variable('version'), 'include',
>      )),
>    ],
> -  dependencies : [dep_llvm, dep_elf],
> +  dependencies : [dep_llvm, dep_elf, dep_llvm_spirv],
>  )
>  
>  clover_files = files(
> -- 
> 2.16.2

Attachment: signature.asc
Description: PGP signature

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to