1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// Copyright 2012 Francisco Jerez 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// Permission is hereby granted, free of charge, to any person obtaining a 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// copy of this software and associated documentation files (the "Software"), 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// to deal in the Software without restriction, including without limitation 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// the rights to use, copy, modify, merge, publish, distribute, sublicense, 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// and/or sell copies of the Software, and to permit persons to whom the 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// Software is furnished to do so, subject to the following conditions: 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// The above copyright notice and this permission notice shall be included in 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// all copies or substantial portions of the Software. 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// SOFTWARE. 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "api/util.hpp" 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "core/program.hpp" 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgusing namespace clover; 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPUBLIC cl_program 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclCreateProgramWithSource(cl_context ctx, cl_uint count, 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char **strings, const size_t *lengths, 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cl_int *errcode_ret) try { 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org std::string source; 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx) 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org throw error(CL_INVALID_CONTEXT); 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!count || !strings || 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org any_of(is_zero<const char *>(), strings, strings + count)) 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org throw error(CL_INVALID_VALUE); 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // Concatenate all the provided fragments together 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (unsigned i = 0; i < count; ++i) 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org source += (lengths && lengths[i] ? 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org std::string(strings[i], strings[i] + lengths[i]) : 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org std::string(strings[i])); 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // ...and create a program object for them. 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ret_error(errcode_ret, CL_SUCCESS); 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return new program(*ctx, source); 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} catch (error &e) { 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ret_error(errcode_ret, e); 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPUBLIC cl_program 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclCreateProgramWithBinary(cl_context ctx, cl_uint count, 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const cl_device_id *devs, const size_t *lengths, 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned char **binaries, cl_int *status_ret, 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cl_int *errcode_ret) try { 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx) 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org throw error(CL_INVALID_CONTEXT); 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!count || !devs || !lengths || !binaries) 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org throw error(CL_INVALID_VALUE); 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (any_of([&](const cl_device_id dev) { 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return !ctx->has_device(dev); 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org }, devs, devs + count)) 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org throw error(CL_INVALID_DEVICE); 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // Deserialize the provided binaries, 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org auto modules = map( 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org [](const unsigned char *p, size_t l) -> std::pair<cl_int, module> { 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!p || !l) 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return { CL_INVALID_VALUE, {} }; 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org try { 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org compat::istream::buffer_t bin(p, l); 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org compat::istream s(bin); 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return { CL_SUCCESS, module::deserialize(s) }; 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } catch (compat::istream::error &e) { 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return { CL_INVALID_BINARY, {} }; 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org }, 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org binaries, binaries + count, lengths); 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // update the status array, 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (status_ret) 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org std::transform(modules.begin(), modules.end(), status_ret, 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org keys<cl_int, module>); 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (any_of(key_equals<cl_int, module>(CL_INVALID_VALUE), 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org modules.begin(), modules.end())) 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org throw error(CL_INVALID_VALUE); 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (any_of(key_equals<cl_int, module>(CL_INVALID_BINARY), 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org modules.begin(), modules.end())) 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org throw error(CL_INVALID_BINARY); 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // initialize a program object with them. 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ret_error(errcode_ret, CL_SUCCESS); 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return new program(*ctx, { devs, devs + count }, 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org map(values<cl_int, module>, 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org modules.begin(), modules.end())); 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} catch (error &e) { 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ret_error(errcode_ret, e); 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPUBLIC cl_int 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclRetainProgram(cl_program prog) { 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!prog) 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return CL_INVALID_PROGRAM; 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prog->retain(); 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return CL_SUCCESS; 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPUBLIC cl_int 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclReleaseProgram(cl_program prog) { 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!prog) 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return CL_INVALID_PROGRAM; 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (prog->release()) 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org delete prog; 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return CL_SUCCESS; 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPUBLIC cl_int 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclBuildProgram(cl_program prog, cl_uint count, const cl_device_id *devs, 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *opts, void (*pfn_notify)(cl_program, void *), 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *user_data) try { 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!prog) 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org throw error(CL_INVALID_PROGRAM); 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (bool(count) != bool(devs) || 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (!pfn_notify && user_data)) 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org throw error(CL_INVALID_VALUE); 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (devs) { 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (any_of([&](const cl_device_id dev) { 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return !prog->ctx.has_device(dev); 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org }, devs, devs + count)) 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org throw error(CL_INVALID_DEVICE); 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prog->build({ devs, devs + count }); 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prog->build(prog->ctx.devs); 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return CL_SUCCESS; 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} catch (error &e) { 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return e.get(); 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPUBLIC cl_int 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclUnloadCompiler() { 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return CL_SUCCESS; 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPUBLIC cl_int 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclGetProgramInfo(cl_program prog, cl_program_info param, 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size_t size, void *buf, size_t *size_ret) { 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!prog) 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return CL_INVALID_PROGRAM; 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (param) { 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case CL_PROGRAM_REFERENCE_COUNT: 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return scalar_property<cl_uint>(buf, size, size_ret, 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prog->ref_count()); 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case CL_PROGRAM_CONTEXT: 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return scalar_property<cl_context>(buf, size, size_ret, 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &prog->ctx); 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case CL_PROGRAM_NUM_DEVICES: 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return scalar_property<cl_uint>(buf, size, size_ret, 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prog->binaries().size()); 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case CL_PROGRAM_DEVICES: 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return vector_property<cl_device_id>( 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buf, size, size_ret, 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org map(keys<device *, module>, 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prog->binaries().begin(), prog->binaries().end())); 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case CL_PROGRAM_SOURCE: 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return string_property(buf, size, size_ret, prog->source()); 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case CL_PROGRAM_BINARY_SIZES: 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return vector_property<size_t>( 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buf, size, size_ret, 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org map([](const std::pair<device *, module> &ent) { 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org compat::ostream::buffer_t bin; 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org compat::ostream s(bin); 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ent.second.serialize(s); 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return bin.size(); 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org }, 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prog->binaries().begin(), prog->binaries().end())); 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case CL_PROGRAM_BINARIES: 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return matrix_property<unsigned char>( 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buf, size, size_ret, 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org map([](const std::pair<device *, module> &ent) { 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org compat::ostream::buffer_t bin; 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org compat::ostream s(bin); 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ent.second.serialize(s); 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return bin; 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org }, 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prog->binaries().begin(), prog->binaries().end())); 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return CL_INVALID_VALUE; 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPUBLIC cl_int 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclGetProgramBuildInfo(cl_program prog, cl_device_id dev, 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cl_program_build_info param, 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size_t size, void *buf, size_t *size_ret) { 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!prog) 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return CL_INVALID_PROGRAM; 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!prog->ctx.has_device(dev)) 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return CL_INVALID_DEVICE; 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (param) { 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case CL_PROGRAM_BUILD_STATUS: 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return scalar_property<cl_build_status>(buf, size, size_ret, 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prog->build_status(dev)); 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case CL_PROGRAM_BUILD_OPTIONS: 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return string_property(buf, size, size_ret, prog->build_opts(dev)); 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case CL_PROGRAM_BUILD_LOG: 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return string_property(buf, size, size_ret, prog->build_log(dev)); 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return CL_INVALID_VALUE; 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 247