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 "api/util.hpp" 24c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez#include "core/program.hpp" 25c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 26c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezusing namespace clover; 27c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 28c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezPUBLIC cl_program 29c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezclCreateProgramWithSource(cl_context ctx, cl_uint count, 30c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez const char **strings, const size_t *lengths, 31c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez cl_int *errcode_ret) try { 32c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez std::string source; 33c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 34c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (!ctx) 35c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez throw error(CL_INVALID_CONTEXT); 36c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 37c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (!count || !strings || 38c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez any_of(is_zero<const char *>(), strings, strings + count)) 39c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez throw error(CL_INVALID_VALUE); 40c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 41c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez // Concatenate all the provided fragments together 42c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez for (unsigned i = 0; i < count; ++i) 43c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez source += (lengths && lengths[i] ? 44c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez std::string(strings[i], strings[i] + lengths[i]) : 45c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez std::string(strings[i])); 46c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 47c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez // ...and create a program object for them. 48c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez ret_error(errcode_ret, CL_SUCCESS); 49c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return new program(*ctx, source); 50c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 51c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} catch (error &e) { 52c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez ret_error(errcode_ret, e); 53c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return NULL; 54c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 55c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 56c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezPUBLIC cl_program 57c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezclCreateProgramWithBinary(cl_context ctx, cl_uint count, 58c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez const cl_device_id *devs, const size_t *lengths, 59c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez const unsigned char **binaries, cl_int *status_ret, 60c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez cl_int *errcode_ret) try { 61c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (!ctx) 62c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez throw error(CL_INVALID_CONTEXT); 63c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 64c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (!count || !devs || !lengths || !binaries) 65c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez throw error(CL_INVALID_VALUE); 66c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 67c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (any_of([&](const cl_device_id dev) { 68c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return !ctx->has_device(dev); 69c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez }, devs, devs + count)) 70c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez throw error(CL_INVALID_DEVICE); 71c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 72c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez // Deserialize the provided binaries, 73c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez auto modules = map( 74c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez [](const unsigned char *p, size_t l) -> std::pair<cl_int, module> { 75c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (!p || !l) 76c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return { CL_INVALID_VALUE, {} }; 77c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 78c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez try { 79c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez compat::istream::buffer_t bin(p, l); 80c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez compat::istream s(bin); 81c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 82c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return { CL_SUCCESS, module::deserialize(s) }; 83c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 84c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez } catch (compat::istream::error &e) { 85c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return { CL_INVALID_BINARY, {} }; 86c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez } 87c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez }, 88c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez binaries, binaries + count, lengths); 89c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 90c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez // update the status array, 91c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (status_ret) 92c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez std::transform(modules.begin(), modules.end(), status_ret, 93c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez keys<cl_int, module>); 94c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 95c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (any_of(key_equals<cl_int, module>(CL_INVALID_VALUE), 96c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez modules.begin(), modules.end())) 97c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez throw error(CL_INVALID_VALUE); 98c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 99c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (any_of(key_equals<cl_int, module>(CL_INVALID_BINARY), 100c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez modules.begin(), modules.end())) 101c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez throw error(CL_INVALID_BINARY); 102c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 103c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez // initialize a program object with them. 104c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez ret_error(errcode_ret, CL_SUCCESS); 105c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return new program(*ctx, { devs, devs + count }, 106c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez map(values<cl_int, module>, 107c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez modules.begin(), modules.end())); 108c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 109c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} catch (error &e) { 110c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez ret_error(errcode_ret, e); 111c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return NULL; 112c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 113c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 114c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezPUBLIC cl_int 115c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezclRetainProgram(cl_program prog) { 116c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (!prog) 117c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return CL_INVALID_PROGRAM; 118c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 119c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez prog->retain(); 120c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return CL_SUCCESS; 121c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 122c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 123c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezPUBLIC cl_int 124c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezclReleaseProgram(cl_program prog) { 125c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (!prog) 126c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return CL_INVALID_PROGRAM; 127c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 128c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (prog->release()) 129c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez delete prog; 130c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 131c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return CL_SUCCESS; 132c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 133c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 134c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezPUBLIC cl_int 135c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezclBuildProgram(cl_program prog, cl_uint count, const cl_device_id *devs, 136c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez const char *opts, void (*pfn_notify)(cl_program, void *), 137c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez void *user_data) try { 138c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (!prog) 139c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez throw error(CL_INVALID_PROGRAM); 140c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 141c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (bool(count) != bool(devs) || 142c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez (!pfn_notify && user_data)) 143c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez throw error(CL_INVALID_VALUE); 144c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 1451d21bd057a6b1701dd44a79e82259c0f3ded2b70Tom Stellard if (devs) { 1461d21bd057a6b1701dd44a79e82259c0f3ded2b70Tom Stellard if (any_of([&](const cl_device_id dev) { 1471d21bd057a6b1701dd44a79e82259c0f3ded2b70Tom Stellard return !prog->ctx.has_device(dev); 1481d21bd057a6b1701dd44a79e82259c0f3ded2b70Tom Stellard }, devs, devs + count)) 1491d21bd057a6b1701dd44a79e82259c0f3ded2b70Tom Stellard throw error(CL_INVALID_DEVICE); 1501d21bd057a6b1701dd44a79e82259c0f3ded2b70Tom Stellard 1511d21bd057a6b1701dd44a79e82259c0f3ded2b70Tom Stellard prog->build({ devs, devs + count }); 1521d21bd057a6b1701dd44a79e82259c0f3ded2b70Tom Stellard } else { 1531d21bd057a6b1701dd44a79e82259c0f3ded2b70Tom Stellard prog->build(prog->ctx.devs); 1541d21bd057a6b1701dd44a79e82259c0f3ded2b70Tom Stellard } 155c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 156c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return CL_SUCCESS; 157c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 158c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} catch (error &e) { 159c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return e.get(); 160c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 161c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 162c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezPUBLIC cl_int 163c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezclUnloadCompiler() { 164c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return CL_SUCCESS; 165c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 166c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 167c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezPUBLIC cl_int 168c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezclGetProgramInfo(cl_program prog, cl_program_info param, 169c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez size_t size, void *buf, size_t *size_ret) { 170c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (!prog) 171c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return CL_INVALID_PROGRAM; 172c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 173c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez switch (param) { 174c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez case CL_PROGRAM_REFERENCE_COUNT: 175c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return scalar_property<cl_uint>(buf, size, size_ret, 176c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez prog->ref_count()); 177c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 178c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez case CL_PROGRAM_CONTEXT: 179c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return scalar_property<cl_context>(buf, size, size_ret, 180c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez &prog->ctx); 181c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 182c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez case CL_PROGRAM_NUM_DEVICES: 183c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return scalar_property<cl_uint>(buf, size, size_ret, 184c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez prog->binaries().size()); 185c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 186c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez case CL_PROGRAM_DEVICES: 187c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return vector_property<cl_device_id>( 188c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez buf, size, size_ret, 189c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez map(keys<device *, module>, 190c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez prog->binaries().begin(), prog->binaries().end())); 191c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 192c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez case CL_PROGRAM_SOURCE: 193c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return string_property(buf, size, size_ret, prog->source()); 194c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 195c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez case CL_PROGRAM_BINARY_SIZES: 196c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return vector_property<size_t>( 197c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez buf, size, size_ret, 198c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez map([](const std::pair<device *, module> &ent) { 199c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez compat::ostream::buffer_t bin; 200c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez compat::ostream s(bin); 201c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez ent.second.serialize(s); 202c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return bin.size(); 203c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez }, 204c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez prog->binaries().begin(), prog->binaries().end())); 205c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 206c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez case CL_PROGRAM_BINARIES: 207c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return matrix_property<unsigned char>( 208c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez buf, size, size_ret, 209c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez map([](const std::pair<device *, module> &ent) { 210c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez compat::ostream::buffer_t bin; 211c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez compat::ostream s(bin); 212c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez ent.second.serialize(s); 213c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return bin; 214c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez }, 215c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez prog->binaries().begin(), prog->binaries().end())); 216c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 217c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez default: 218c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return CL_INVALID_VALUE; 219c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez } 220c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 221c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 222c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezPUBLIC cl_int 223c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezclGetProgramBuildInfo(cl_program prog, cl_device_id dev, 224c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez cl_program_build_info param, 225c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez size_t size, void *buf, size_t *size_ret) { 226c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (!prog) 227c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return CL_INVALID_PROGRAM; 228c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 229c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (!prog->ctx.has_device(dev)) 230c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return CL_INVALID_DEVICE; 231c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 232c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez switch (param) { 233c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez case CL_PROGRAM_BUILD_STATUS: 234c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return scalar_property<cl_build_status>(buf, size, size_ret, 235c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez prog->build_status(dev)); 236c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 237c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez case CL_PROGRAM_BUILD_OPTIONS: 238c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return string_property(buf, size, size_ret, prog->build_opts(dev)); 239c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 240c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez case CL_PROGRAM_BUILD_LOG: 241c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return string_property(buf, size, size_ret, prog->build_log(dev)); 242c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 243c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez default: 244c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return CL_INVALID_VALUE; 245c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez } 246c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 247