[Mesa-dev,42/47] clover: Provide separate program methods for compilation and linking.

Submitted by Francisco Jerez on July 4, 2016, 12:51 a.m.

Details

Message ID 20160704005156.5703-43-currojerez@riseup.net
State New
Headers show
Series "Series without cover letter" ( rev: 1 ) in Mesa

Not browsing as part of any series.

Commit Message

Francisco Jerez July 4, 2016, 12:51 a.m.
[ Serge Martin: Fix inverted opts and log build ctor args.
  Keep the log related to the build. Fix indentation ]

Reviewed-by: Serge Martin <edb+mesa@sigluy.net>
---
 src/gallium/state_trackers/clover/api/program.cpp  |  8 +++--
 src/gallium/state_trackers/clover/core/program.cpp | 34 ++++++++++++++++++----
 src/gallium/state_trackers/clover/core/program.hpp | 12 ++++----
 3 files changed, 42 insertions(+), 12 deletions(-)

Patch hide | download patch | download mbox

diff --git a/src/gallium/state_trackers/clover/api/program.cpp b/src/gallium/state_trackers/clover/api/program.cpp
index 91a81df..2dc9ee7 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<allow_empty_tag>(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 87a97cb..79ac851 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<device> &devs, const std::string &opts,
-               const header_map &headers) {
+program::compile(const ref_vector<device> &devs, const std::string &opts,
+                 const header_map &headers) {
    if (has_source) {
       _devices = devs;
 
@@ -52,9 +53,8 @@  program::build(const ref_vector<device> &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<device> &devs, const std::string &opts,
    }
 }
 
+void
+program::link(const ref_vector<device> &devs, const std::string &opts,
+              const ref_vector<program> &progs) {
+   _devices = devs;
+
+   for (auto &dev : devs) {
+      const std::vector<module> 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 ade225d..95dfd8e 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<device> &devs,
-              const std::vector<module> &binaries);
+              const ref_vector<device> &devs = {},
+              const std::vector<module> &binaries = {});
 
       program(const program &prog) = delete;
       program &
       operator=(const program &prog) = delete;
 
-      void build(const ref_vector<device> &devs, const std::string &opts,
-                 const header_map &headers = {});
+      void compile(const ref_vector<device> &devs, const std::string &opts,
+                   const header_map &headers = {});
+      void link(const ref_vector<device> &devs, const std::string &opts,
+                const ref_vector<program> &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<module::symbol> &symbols() const;