clover: Provide separate program methods for compilation and linking.
authorFrancisco Jerez <currojerez@riseup.net>
Tue, 17 May 2016 14:03:14 +0000 (16:03 +0200)
committerFrancisco Jerez <currojerez@riseup.net>
Tue, 12 Jul 2016 03:34:35 +0000 (20:34 -0700)
[ 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>
Tested-by: Jan Vesely <jan.vesely@rutgers.edu>
src/gallium/state_trackers/clover/api/program.cpp
src/gallium/state_trackers/clover/core/program.cpp
src/gallium/state_trackers/clover/core/program.hpp

index 91a81dfcc855173960f5376b92315ad13cc996d7..2dc9ee74f875ac1e75d73c0f16ac43c4963272b6 100644 (file)
@@ -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) {
index 87a97cb1bffb477e164abfd00dd7d001cc270432..79ac85117e33cba71e12d4e5c8cb89b55b2e70a2 100644 (file)
@@ -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;
index ade225d29ae585cf86601306c3237a865c3f0005..95dfd8edca7eb993abe365c735fc23374a0a5c26 100644 (file)
@@ -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;