From 010918f5aa78f51dda6c98a639f6f4422e9be2e5 Mon Sep 17 00:00:00 2001 From: Francisco Jerez Date: Tue, 17 May 2016 16:03:14 +0200 Subject: [PATCH] clover: Provide separate program methods for compilation and linking. [ Serge Martin: Fix inverted opts and log build ctor args. Keep the log related to the build. Fix indentation ] Reviewed-by: Serge Martin Tested-by: Jan Vesely --- .../state_trackers/clover/api/program.cpp | 8 +++-- .../state_trackers/clover/core/program.cpp | 34 ++++++++++++++++--- .../state_trackers/clover/core/program.hpp | 12 ++++--- 3 files changed, 42 insertions(+), 12 deletions(-) diff --git a/src/gallium/state_trackers/clover/api/program.cpp b/src/gallium/state_trackers/clover/api/program.cpp index 91a81dfcc85..2dc9ee74f87 100644 --- a/src/gallium/state_trackers/clover/api/program.cpp +++ b/src/gallium/state_trackers/clover/api/program.cpp @@ -181,7 +181,11 @@ clBuildProgram(cl_program d_prog, cl_uint num_devs, validate_build_program_common(prog, num_devs, d_devs, pfn_notify, user_data); - prog.build(devs, opts); + if (prog.has_source) { + prog.compile(devs, opts); + prog.link(devs, opts, { prog }); + } + return CL_SUCCESS; } catch (error &e) { @@ -221,7 +225,7 @@ clCompileProgram(cl_program d_prog, cl_uint num_devs, range(header_names, num_headers), objs(d_header_progs, num_headers)); - prog.build(devs, opts, headers); + prog.compile(devs, opts, headers); return CL_SUCCESS; } catch (invalid_build_options_error &e) { diff --git a/src/gallium/state_trackers/clover/core/program.cpp b/src/gallium/state_trackers/clover/core/program.cpp index 87a97cb1bff..79ac85117e3 100644 --- a/src/gallium/state_trackers/clover/core/program.cpp +++ b/src/gallium/state_trackers/clover/core/program.cpp @@ -21,6 +21,7 @@ // #include "core/program.hpp" +#include "llvm/invocation.hpp" #include "tgsi/invocation.hpp" using namespace clover; @@ -41,8 +42,8 @@ program::program(clover::context &ctx, } void -program::build(const ref_vector &devs, const std::string &opts, - const header_map &headers) { +program::compile(const ref_vector &devs, const std::string &opts, + const header_map &headers) { if (has_source) { _devices = devs; @@ -52,9 +53,8 @@ program::build(const ref_vector &devs, const std::string &opts, try { const module m = (dev.ir_format() == PIPE_SHADER_IR_TGSI ? tgsi::compile_program(_source, log) : - compile_program_llvm(_source, headers, - dev.ir_format(), - dev.ir_target(), opts, log)); + llvm::compile_program(_source, headers, + dev.ir_target(), opts, log)); _builds[&dev] = { m, opts, log }; } catch (...) { _builds[&dev] = { module(), opts, log }; @@ -64,6 +64,30 @@ program::build(const ref_vector &devs, const std::string &opts, } } +void +program::link(const ref_vector &devs, const std::string &opts, + const ref_vector &progs) { + _devices = devs; + + for (auto &dev : devs) { + const std::vector ms = map([&](const program &prog) { + return prog.build(dev).binary; + }, progs); + std::string log = _builds[&dev].log; + + try { + const module m = (dev.ir_format() == PIPE_SHADER_IR_TGSI ? + tgsi::link_program(ms) : + llvm::link_program(ms, dev.ir_format(), + dev.ir_target(), opts, log)); + _builds[&dev] = { m, opts, log }; + } catch (...) { + _builds[&dev] = { module(), opts, log }; + throw; + } + } +} + const std::string & program::source() const { return _source; diff --git a/src/gallium/state_trackers/clover/core/program.hpp b/src/gallium/state_trackers/clover/core/program.hpp index ade225d29ae..95dfd8edca7 100644 --- a/src/gallium/state_trackers/clover/core/program.hpp +++ b/src/gallium/state_trackers/clover/core/program.hpp @@ -40,15 +40,17 @@ namespace clover { program(clover::context &ctx, const std::string &source); program(clover::context &ctx, - const ref_vector &devs, - const std::vector &binaries); + const ref_vector &devs = {}, + const std::vector &binaries = {}); program(const program &prog) = delete; program & operator=(const program &prog) = delete; - void build(const ref_vector &devs, const std::string &opts, - const header_map &headers = {}); + void compile(const ref_vector &devs, const std::string &opts, + const header_map &headers = {}); + void link(const ref_vector &devs, const std::string &opts, + const ref_vector &progs); const bool has_source; const std::string &source() const; @@ -66,7 +68,7 @@ namespace clover { std::string log; }; - const struct build &build(const device &dev) const; + const build &build(const device &dev) const; const std::vector &symbols() const; -- 2.30.2