/* * Copyright © 2012 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . * */ #include "cl_context.h" #include "cl_program.h" #include "cl_device_id.h" #include cl_int clGetProgramInfo(cl_program program, cl_program_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret) { const void *src_ptr = NULL; size_t src_size = 0; const char *ret_str = ""; cl_int ref; cl_uint num_dev, kernels_num; if (!CL_OBJECT_IS_PROGRAM(program)) { return CL_INVALID_PROGRAM; } if (param_name == CL_PROGRAM_REFERENCE_COUNT) { ref = CL_OBJECT_GET_REF(program); src_ptr = &ref; src_size = sizeof(cl_int); } else if (param_name == CL_PROGRAM_CONTEXT) { src_ptr = &program->ctx; src_size = sizeof(cl_context); } else if (param_name == CL_PROGRAM_NUM_DEVICES) { num_dev = program->ctx->device_num; // Just 1 dev now. src_ptr = &num_dev; src_size = sizeof(cl_uint); } else if (param_name == CL_PROGRAM_DEVICES) { src_ptr = program->ctx->devices; src_size = program->ctx->device_num * sizeof(cl_device_id); } else if (param_name == CL_PROGRAM_NUM_KERNELS) { kernels_num = program->ker_n; src_ptr = &kernels_num; src_size = sizeof(cl_uint); } else if (param_name == CL_PROGRAM_SOURCE) { if (!program->source) { src_ptr = ret_str; src_size = 1; } else { src_ptr = program->source; src_size = strlen(program->source) + 1; } } else if (param_name == CL_PROGRAM_KERNEL_NAMES) { // TODO: need to refine this. cl_program_get_kernel_names(program, param_value_size, (char *)param_value, param_value_size_ret); return CL_SUCCESS; } else if (param_name == CL_PROGRAM_BINARY_SIZES) { if (program->binary == NULL) { if (program->binary_type == CL_PROGRAM_BINARY_TYPE_EXECUTABLE) { program->binary_sz = compiler_program_serialize_to_binary(program->opaque, &program->binary, 0); } else if (program->binary_type == CL_PROGRAM_BINARY_TYPE_COMPILED_OBJECT) { program->binary_sz = compiler_program_serialize_to_binary(program->opaque, &program->binary, 1); } else if (program->binary_type == CL_PROGRAM_BINARY_TYPE_LIBRARY) { program->binary_sz = compiler_program_serialize_to_binary(program->opaque, &program->binary, 2); } else { return CL_INVALID_BINARY; } } if (program->binary == NULL || program->binary_sz == 0) { return CL_OUT_OF_RESOURCES; } src_ptr = &program->binary_sz; src_size = sizeof(size_t); } else if (param_name == CL_PROGRAM_BINARIES) { if (param_value_size_ret) *param_value_size_ret = sizeof(void *); if (!param_value) return CL_SUCCESS; /* param_value points to an array of n pointers allocated by the caller */ if (program->binary == NULL) { if (program->binary_type == CL_PROGRAM_BINARY_TYPE_EXECUTABLE) { program->binary_sz = compiler_program_serialize_to_binary(program->opaque, &program->binary, 0); } else if (program->binary_type == CL_PROGRAM_BINARY_TYPE_COMPILED_OBJECT) { program->binary_sz = compiler_program_serialize_to_binary(program->opaque, &program->binary, 1); } else if (program->binary_type == CL_PROGRAM_BINARY_TYPE_LIBRARY) { program->binary_sz = compiler_program_serialize_to_binary(program->opaque, &program->binary, 2); } else { return CL_INVALID_BINARY; } } if (program->binary == NULL || program->binary_sz == 0) { return CL_OUT_OF_RESOURCES; } memcpy(*((void **)param_value), program->binary, program->binary_sz); return CL_SUCCESS; } else { return CL_INVALID_VALUE; } return cl_get_info_helper(src_ptr, src_size, param_value, param_value_size, param_value_size_ret); } cl_int clGetProgramBuildInfo(cl_program program, cl_device_id device, cl_program_build_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret) { const void *src_ptr = NULL; size_t src_size = 0; const char *ret_str = ""; size_t global_size; if (!CL_OBJECT_IS_PROGRAM(program)) { return CL_INVALID_PROGRAM; } cl_int err = cl_devices_list_include_check(program->ctx->device_num, program->ctx->devices, 1, &device); if (err != CL_SUCCESS) return err; if (param_name == CL_PROGRAM_BUILD_STATUS) { src_ptr = &program->build_status; src_size = sizeof(cl_build_status); } else if (param_name == CL_PROGRAM_BUILD_OPTIONS) { if (program->is_built && program->build_opts) { ret_str = program->build_opts; } src_ptr = ret_str; src_size = strlen(ret_str) + 1; } else if (param_name == CL_PROGRAM_BUILD_LOG) { src_ptr = program->build_log; src_size = program->build_log_sz + 1; } else if (param_name == CL_PROGRAM_BINARY_TYPE) { src_ptr = &program->binary_type; src_size = sizeof(cl_uint); } else if (param_name == CL_PROGRAM_BUILD_GLOBAL_VARIABLE_TOTAL_SIZE) { global_size = 0; if (program->is_built) global_size = cl_program_get_global_variable_size(program); src_ptr = &global_size; src_size = sizeof(global_size); } else { return CL_INVALID_VALUE; } return cl_get_info_helper(src_ptr, src_size, param_value, param_value_size, param_value_size_ret); }