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 <core/commandqueue.h> 00034 #include <core/deviceinterface.h> 00035 #include <core/context.h> 00036 00037 #include <CL/cl.h> 00038 00039 // Command Queue APIs 00040 cl_command_queue 00041 clCreateCommandQueue(cl_context context, 00042 cl_device_id device, 00043 cl_command_queue_properties properties, 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 (!device->isA(Coal::Object::T_Device)) 00053 { 00054 *errcode_ret = CL_INVALID_DEVICE; 00055 return 0; 00056 } 00057 00058 if (!context->isA(Coal::Object::T_Context)) 00059 { 00060 *errcode_ret = CL_INVALID_CONTEXT; 00061 return 0; 00062 } 00063 00064 *errcode_ret = CL_SUCCESS; 00065 Coal::CommandQueue *queue = new Coal::CommandQueue( 00066 (Coal::Context *)context, 00067 (Coal::DeviceInterface *)device, 00068 properties, 00069 errcode_ret); 00070 00071 if (*errcode_ret != CL_SUCCESS) 00072 { 00073 // Initialization failed, destroy context 00074 delete queue; 00075 return 0; 00076 } 00077 00078 return (_cl_command_queue *)queue; 00079 } 00080 00081 cl_int 00082 clRetainCommandQueue(cl_command_queue command_queue) 00083 { 00084 if (!command_queue->isA(Coal::Object::T_CommandQueue)) 00085 return CL_INVALID_COMMAND_QUEUE; 00086 00087 command_queue->reference(); 00088 00089 return CL_SUCCESS; 00090 } 00091 00092 cl_int 00093 clReleaseCommandQueue(cl_command_queue command_queue) 00094 { 00095 if (!command_queue->isA(Coal::Object::T_CommandQueue)) 00096 return CL_INVALID_COMMAND_QUEUE; 00097 00098 command_queue->flush(); 00099 00100 if (command_queue->dereference()) 00101 delete command_queue; 00102 00103 return CL_SUCCESS; 00104 } 00105 00106 cl_int 00107 clGetCommandQueueInfo(cl_command_queue command_queue, 00108 cl_command_queue_info param_name, 00109 size_t param_value_size, 00110 void * param_value, 00111 size_t * param_value_size_ret) 00112 { 00113 if (!command_queue->isA(Coal::Object::T_CommandQueue)) 00114 return CL_INVALID_COMMAND_QUEUE; 00115 00116 return command_queue->info(param_name, param_value_size, param_value, 00117 param_value_size_ret); 00118 } 00119 00120 cl_int 00121 clSetCommandQueueProperty(cl_command_queue command_queue, 00122 cl_command_queue_properties properties, 00123 cl_bool enable, 00124 cl_command_queue_properties * old_properties) 00125 { 00126 if (!command_queue->isA(Coal::Object::T_CommandQueue)) 00127 return CL_INVALID_COMMAND_QUEUE; 00128 00129 return command_queue->setProperty(properties, enable, old_properties); 00130 }