Clover Git
OpenCL 1.1 software implementation

api_context.cpp

Go to the documentation of this file.
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 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Defines