//
#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 });
},
}
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);
_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;
}
}
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;
return _binaries.begin()->second.syms;
}
+
+unsigned
+program::kernel_ref_count() const {
+ return _kernel_ref_counter.ref_count();
+}