Clover Git
OpenCL 1.1 software implementation
|
00001 /* 00002 * Copyright (c) 2011, Denis Steckelmacher <steckdenis@yahoo.fr> 00003 * All rights reserved. 00004 * 00005 * Redistribution and use in source and binary forms, with or without 00006 * modification, are permitted provided that the following conditions are met: 00007 * * Redistributions of source code must retain the above copyright 00008 * notice, this list of conditions and the following disclaimer. 00009 * * Redistributions in binary form must reproduce the above copyright 00010 * notice, this list of conditions and the following disclaimer in the 00011 * documentation and/or other materials provided with the distribution. 00012 * * Neither the name of the copyright holder nor the 00013 * names of its contributors may be used to endorse or promote products 00014 * derived from this software without specific prior written permission. 00015 * 00016 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 00017 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 00018 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 00019 * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY 00020 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 00021 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 00022 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 00023 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 00024 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 00025 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00026 */ 00027 00033 #include <CL/cl.h> 00034 #include <core/context.h> 00035 00036 // Context APIs 00037 00038 cl_context 00039 clCreateContext(const cl_context_properties *properties, 00040 cl_uint num_devices, 00041 const cl_device_id * devices, 00042 void (CL_CALLBACK *pfn_notify)(const char *, const void *, size_t, void *), 00043 void * user_data, 00044 cl_int * errcode_ret) 00045 { 00046 cl_int default_errcode_ret; 00047 00048 // No errcode_ret ? 00049 if (!errcode_ret) 00050 errcode_ret = &default_errcode_ret; 00051 00052 if (!devices || 00053 !num_devices || 00054 (!pfn_notify && user_data)) 00055 { 00056 *errcode_ret = CL_INVALID_VALUE; 00057 return 0; 00058 } 00059 00060 *errcode_ret = CL_SUCCESS; 00061 Coal::Context *ctx = new Coal::Context(properties, num_devices, devices, 00062 pfn_notify, user_data, errcode_ret); 00063 00064 if (*errcode_ret != CL_SUCCESS) 00065 { 00066 // Initialization failed, destroy context 00067 delete ctx; 00068 return 0; 00069 } 00070 00071 return (_cl_context *)ctx; 00072 } 00073 00074 cl_context 00075 clCreateContextFromType(const cl_context_properties *properties, 00076 cl_device_type device_type, 00077 void (CL_CALLBACK *pfn_notify)(const char *, const void *, size_t, void *), 00078 void * user_data, 00079 cl_int * errcode_ret) 00080 { 00081 cl_device_id device; 00082 00083 *errcode_ret = clGetDeviceIDs(0, device_type, 1, &device, 0); 00084 00085 if (*errcode_ret != CL_SUCCESS) 00086 return 0; 00087 00088 return clCreateContext(properties, 1, &device, pfn_notify, user_data, 00089 errcode_ret); 00090 } 00091 00092 cl_int 00093 clRetainContext(cl_context context) 00094 { 00095 if (!context->isA(Coal::Object::T_Context)) 00096 return CL_INVALID_CONTEXT; 00097 00098 context->reference(); 00099 00100 return CL_SUCCESS; 00101 } 00102 00103 cl_int 00104 clReleaseContext(cl_context context) 00105 { 00106 if (!context->isA(Coal::Object::T_Context)) 00107 return CL_INVALID_CONTEXT; 00108 00109 if (context->dereference()) 00110 delete context; 00111 00112 return CL_SUCCESS; 00113 } 00114 00115 cl_int 00116 clGetContextInfo(cl_context context, 00117 cl_context_info param_name, 00118 size_t param_value_size, 00119 void * param_value, 00120 size_t * param_value_size_ret) 00121 { 00122 if (!context->isA(Coal::Object::T_Context)) 00123 return CL_INVALID_CONTEXT; 00124 00125 return context->info(param_name, param_value_size, param_value, 00126 param_value_size_ret); 00127 }