1c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// 2c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// Copyright 2012 Francisco Jerez 3c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// 4c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// Permission is hereby granted, free of charge, to any person obtaining a 5c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// copy of this software and associated documentation files (the "Software"), 6c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// to deal in the Software without restriction, including without limitation 7c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// the rights to use, copy, modify, merge, publish, distribute, sublicense, 8c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// and/or sell copies of the Software, and to permit persons to whom the 9c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// Software is furnished to do so, subject to the following conditions: 10c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// 11c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// The above copyright notice and this permission notice shall be included in 12c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// all copies or substantial portions of the Software. 13c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// 14c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 18c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF 19c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// SOFTWARE. 21c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// 22c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 23c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez#include "core/program.hpp" 24c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez#include "core/compiler.hpp" 25c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 26c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezusing namespace clover; 27c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 28c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez_cl_program::_cl_program(clover::context &ctx, 29c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez const std::string &source) : 30c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez ctx(ctx), __source(source) { 31c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 32c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 33c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez_cl_program::_cl_program(clover::context &ctx, 34c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez const std::vector<clover::device *> &devs, 35c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez const std::vector<clover::module> &binaries) : 36c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez ctx(ctx) { 37c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez for_each([&](clover::device *dev, const clover::module &bin) { 38c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez __binaries.insert({ dev, bin }); 39c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez }, 40c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez devs.begin(), devs.end(), binaries.begin()); 41c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 42c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 43c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezvoid 44c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez_cl_program::build(const std::vector<clover::device *> &devs) { 45c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez __binaries.clear(); 46c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez __logs.clear(); 47c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 48c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez for (auto dev : devs) { 49c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez try { 5046a13b3b11d859e131399853c11ae2be0eb02f0aTom Stellard auto module = (dev->ir_format() == PIPE_SHADER_IR_TGSI ? 51741463e18d8235025de649210e7f88a1b6e7af5aTom Stellard compile_program_tgsi(__source) : 5246a13b3b11d859e131399853c11ae2be0eb02f0aTom Stellard compile_program_llvm(__source, dev->ir_format(), 5346a13b3b11d859e131399853c11ae2be0eb02f0aTom Stellard dev->ir_target())); 54c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez __binaries.insert({ dev, module }); 55c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 56c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez } catch (build_error &e) { 57c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez __logs.insert({ dev, e.what() }); 58c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez throw error(CL_BUILD_PROGRAM_FAILURE); 59c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez } 60c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez } 61c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 62c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 63c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezconst std::string & 64c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez_cl_program::source() const { 65c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return __source; 66c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 67c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 68c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezconst std::map<clover::device *, clover::module> & 69c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez_cl_program::binaries() const { 70c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return __binaries; 71c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 72c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 73c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezcl_build_status 74c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez_cl_program::build_status(clover::device *dev) const { 75c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return __binaries.count(dev) ? CL_BUILD_SUCCESS : CL_BUILD_NONE; 76c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 77c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 78c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezstd::string 79c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez_cl_program::build_opts(clover::device *dev) const { 80c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return {}; 81c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 82c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 83c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezstd::string 84c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez_cl_program::build_log(clover::device *dev) const { 85c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return __logs.count(dev) ? __logs.find(dev)->second : ""; 86c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 87