Clover Git
OpenCL 1.1 software implementation

api_command.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 <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 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Defines