clover: Add initial implementation of clCompileProgram for CL 1.2.
[mesa.git] / src / gallium / state_trackers / clover / core / program.cpp
index fb7e8d14a99a92c486a1a34ac27723f68538d76a..8553ca7ec96c37104597ce2c7372e1787e89f100 100644 (file)
 //
 
 #include "core/program.hpp"
-#include "core/compiler.hpp"
 
 using namespace clover;
 
-program::program(context &ctx, const std::string &source) :
-   has_source(true), ctx(ctx), _source(source) {
+program::program(clover::context &ctx, const std::string &source) :
+   has_source(true), context(ctx), _source(source), _kernel_ref_counter(0) {
 }
 
-program::program(context &ctx,
+program::program(clover::context &ctx,
                  const ref_vector<device> &devs,
                  const std::vector<module> &binaries) :
-   has_source(false), ctx(ctx) {
+   has_source(false), context(ctx),
+   _devices(devs), _kernel_ref_counter(0) {
    for_each([&](device &dev, const module &bin) {
          _binaries.insert({ &dev, bin });
       },
@@ -40,8 +40,11 @@ program::program(context &ctx,
 }
 
 void
-program::build(const ref_vector<device> &devs, const char *opts) {
+program::build(const ref_vector<device> &devs, const char *opts,
+               const header_map &headers) {
    if (has_source) {
+      _devices = devs;
+
       for (auto &dev : devs) {
          _binaries.erase(&dev);
          _logs.erase(&dev);
@@ -49,15 +52,19 @@ program::build(const ref_vector<device> &devs, const char *opts) {
 
          _opts.insert({ &dev, opts });
 
+         compat::string log;
+
          try {
             auto module = (dev.ir_format() == PIPE_SHADER_IR_TGSI ?
                            compile_program_tgsi(_source) :
-                           compile_program_llvm(_source, dev.ir_format(),
-                                                dev.ir_target(), build_opts(dev)));
+                           compile_program_llvm(_source, headers,
+                                                dev.ir_format(),
+                                                dev.ir_target(), build_opts(dev),
+                                                log));
             _binaries.insert({ &dev, module });
-
-         } catch (build_error &e) {
-            _logs.insert({ &dev, e.what() });
+            _logs.insert({ &dev, log });
+         } catch (const build_error &) {
+            _logs.insert({ &dev, log });
             throw;
          }
       }
@@ -71,17 +78,17 @@ program::source() const {
 
 program::device_range
 program::devices() const {
-   return map(derefs(), map(keys(), _binaries));
+   return map(evals(), _devices);
 }
 
 const module &
 program::binary(const device &dev) const {
-   return _binaries.find(const_cast<device *>(&dev))->second;
+   return _binaries.find(&dev)->second;
 }
 
 cl_build_status
 program::build_status(const device &dev) const {
-   if (_binaries.count(const_cast<device *>(&dev)))
+   if (_binaries.count(&dev))
       return CL_BUILD_SUCCESS;
    else
       return CL_BUILD_NONE;
@@ -104,3 +111,8 @@ program::symbols() const {
 
    return _binaries.begin()->second.syms;
 }
+
+unsigned
+program::kernel_ref_count() const {
+   return _kernel_ref_counter.ref_count();
+}