diff options
author | Gil Pitney <gil.pitney@linaro.org> | 2015-09-30 21:19:34 +0000 |
---|---|---|
committer | Gil Pitney <gil.pitney@linaro.org> | 2015-09-30 21:19:34 +0000 |
commit | 5037fc5b9a8aea560db9d287fa96a413609359b7 (patch) | |
tree | 8632d59fa34963c346ebcbd1842d73acd799ed47 | |
parent | e3cecdef8cc6ab0ee616f4e4f5380ce9277c0f4e (diff) |
ICD: Update Context objects to be ICD compatible.
This was validated by running the sanity tests, and the Khronos conformance
tests without an ICD loader; then installing the Khronos ICD loader, and
running that subset of conformance tests that would just invoke OpenCL
Context APIs.
Signed-off-by: Gil Pitney <gil.pitney@linaro.org>
-rw-r--r-- | src/api/api_command.cpp | 5 | ||||
-rw-r--r-- | src/api/api_context.cpp | 28 | ||||
-rw-r--r-- | src/api/api_event.cpp | 19 | ||||
-rw-r--r-- | src/api/api_memory.cpp | 16 | ||||
-rw-r--r-- | src/api/api_program.cpp | 9 | ||||
-rw-r--r-- | src/api/api_sampler.cpp | 13 | ||||
-rw-r--r-- | src/core/commandqueue.cpp | 6 | ||||
-rw-r--r-- | src/core/context.h | 16 | ||||
-rw-r--r-- | src/core/events.cpp | 13 | ||||
-rw-r--r-- | src/core/kernel.cpp | 3 | ||||
-rw-r--r-- | src/core/memobject.cpp | 2 | ||||
-rw-r--r-- | src/core/program.cpp | 50 | ||||
-rw-r--r-- | src/core/sampler.cpp | 2 |
13 files changed, 106 insertions, 76 deletions
diff --git a/src/api/api_command.cpp b/src/api/api_command.cpp index 5486ea4..2400738 100644 --- a/src/api/api_command.cpp +++ b/src/api/api_command.cpp @@ -38,13 +38,14 @@ // Command Queue APIs cl_command_queue -clCreateCommandQueue(cl_context context, +clCreateCommandQueue(cl_context d_context, cl_device_id d_device, cl_command_queue_properties properties, cl_int * errcode_ret) { cl_int default_errcode_ret; auto device = pobj(d_device); + auto context = pobj(d_context); // No errcode_ret ? if (!errcode_ret) @@ -64,7 +65,7 @@ clCreateCommandQueue(cl_context context, *errcode_ret = CL_SUCCESS; Coal::CommandQueue *queue = new Coal::CommandQueue( - (Coal::Context *)context, + context, device, properties, errcode_ret); diff --git a/src/api/api_context.cpp b/src/api/api_context.cpp index abe7be6..20b0d84 100644 --- a/src/api/api_context.cpp +++ b/src/api/api_context.cpp @@ -37,6 +37,8 @@ #include <core/platform.h> #include <stdlib.h> +using namespace Coal; + // Context APIs cl_context @@ -62,7 +64,7 @@ clCreateContext(const cl_context_properties *properties, } *errcode_ret = CL_SUCCESS; - Coal::Context *ctx = new Coal::Context(properties, num_devices, devices, + Context *ctx = new Context(properties, num_devices, devices, pfn_notify, user_data, errcode_ret); if (*errcode_ret != CL_SUCCESS) @@ -72,7 +74,7 @@ clCreateContext(const cl_context_properties *properties, return 0; } - return (_cl_context *)ctx; + return desc(ctx); } cl_context @@ -84,10 +86,10 @@ clCreateContextFromType(const cl_context_properties *properties, { cl_device_id* devices; cl_uint num_devices; - cl_int local_error; - cl_context result = NULL; + cl_int local_error; + cl_context result = 0; - local_error = clGetDeviceIDs(&the_platform, device_type, 0, NULL, + local_error = clGetDeviceIDs(&the_platform, device_type, 0, NULL, &num_devices); if (!num_devices) { local_error = CL_INVALID_DEVICE; goto bail; } @@ -105,15 +107,17 @@ clCreateContextFromType(const cl_context_properties *properties, free (devices); bail: - if (errcode_ret) - *errcode_ret = local_error; + if (errcode_ret) + *errcode_ret = local_error; return result; } cl_int -clRetainContext(cl_context context) +clRetainContext(cl_context d_context) { + auto context = pobj(d_context); + if (!context->isA(Coal::Object::T_Context)) return CL_INVALID_CONTEXT; @@ -123,8 +127,10 @@ clRetainContext(cl_context context) } cl_int -clReleaseContext(cl_context context) +clReleaseContext(cl_context d_context) { + auto context = pobj(d_context); + if (!context->isA(Coal::Object::T_Context)) return CL_INVALID_CONTEXT; @@ -135,12 +141,14 @@ clReleaseContext(cl_context context) } cl_int -clGetContextInfo(cl_context context, +clGetContextInfo(cl_context d_context, cl_context_info param_name, size_t param_value_size, void * param_value, size_t * param_value_size_ret) { + auto context = pobj(d_context); + if (!context->isA(Coal::Object::T_Context)) return CL_INVALID_CONTEXT; diff --git a/src/api/api_event.cpp b/src/api/api_event.cpp index d76f6bb..8f052e3 100644 --- a/src/api/api_event.cpp +++ b/src/api/api_event.cpp @@ -37,6 +37,8 @@ #include <core/context.h> #include <stdio.h> +using namespace Coal; + // Event Object APIs cl_int clWaitForEvents(cl_uint num_events, @@ -46,7 +48,7 @@ clWaitForEvents(cl_uint num_events, return CL_INVALID_VALUE; // Check the events in the list to ensure thay have same context - cl_context global_ctx = 0; + Context * global_ctx = NULL; for (cl_uint i=0; i<num_events; ++i) { @@ -56,12 +58,12 @@ clWaitForEvents(cl_uint num_events, if (event_list[i]->status() < 0) return CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST; - cl_context evt_ctx; + Context * evt_ctx; if (event_list[i]->type() == Coal::Event::User) { - evt_ctx = (cl_context)((Coal::UserEvent *)event_list[i])->context(); + evt_ctx = ((Coal::UserEvent *)event_list[i])->context(); } else { - evt_ctx = (cl_context)event_list[i]->parent()->parent(); + evt_ctx = (Context *)(event_list[i]->parent()->parent()); } #if 0 // YUAN: no need to wait for queue to be flushed @@ -70,7 +72,7 @@ clWaitForEvents(cl_uint num_events, evt_queue->flush(); #endif - if (global_ctx == 0) + if (global_ctx == NULL) global_ctx = evt_ctx; else if (global_ctx != evt_ctx) return CL_INVALID_CONTEXT; @@ -148,10 +150,11 @@ clReleaseEvent(cl_event event) } cl_event -clCreateUserEvent(cl_context context, +clCreateUserEvent(cl_context d_context, cl_int * errcode_ret) { cl_int dummy_errcode; + auto context = pobj(d_context); if (!errcode_ret) errcode_ret = &dummy_errcode; @@ -164,9 +167,7 @@ clCreateUserEvent(cl_context context, *errcode_ret = CL_SUCCESS; - Coal::UserEvent *command = new Coal::UserEvent( - (Coal::Context *)context, errcode_ret - ); + Coal::UserEvent *command = new Coal::UserEvent(context, errcode_ret); if (*errcode_ret != CL_SUCCESS) { diff --git a/src/api/api_memory.cpp b/src/api/api_memory.cpp index b9c7145..00eb4d4 100644 --- a/src/api/api_memory.cpp +++ b/src/api/api_memory.cpp @@ -38,13 +38,14 @@ // Memory Object APIs cl_mem -clCreateBuffer(cl_context context, +clCreateBuffer(cl_context d_context, cl_mem_flags flags, size_t size, void * host_ptr, cl_int * errcode_ret) { cl_int dummy_errcode; + auto context = pobj(d_context); if (!errcode_ret) errcode_ret = &dummy_errcode; @@ -125,7 +126,7 @@ clCreateSubBuffer(cl_mem buffer, } cl_mem -clCreateImage(cl_context context, +clCreateImage(cl_context d_context, cl_mem_flags flags, const cl_image_format * image_format, const cl_image_desc * image_desc, @@ -134,6 +135,7 @@ clCreateImage(cl_context context, { cl_int dummy_errcode; cl_mem image; + auto context = pobj(d_context); if (!errcode_ret) errcode_ret = &dummy_errcode; @@ -163,7 +165,7 @@ clCreateImage(cl_context context, cl_mem -clCreateImage2D(cl_context context, +clCreateImage2D(cl_context d_context, cl_mem_flags flags, const cl_image_format * image_format, size_t image_width, @@ -173,6 +175,7 @@ clCreateImage2D(cl_context context, cl_int * errcode_ret) { cl_int dummy_errcode; + auto context = pobj(d_context); if (!errcode_ret) errcode_ret = &dummy_errcode; @@ -199,7 +202,7 @@ clCreateImage2D(cl_context context, } cl_mem -clCreateImage3D(cl_context context, +clCreateImage3D(cl_context d_context, cl_mem_flags flags, const cl_image_format * image_format, size_t image_width, @@ -211,6 +214,7 @@ clCreateImage3D(cl_context context, cl_int * errcode_ret) { cl_int dummy_errcode; + auto context = pobj(d_context); if (!errcode_ret) errcode_ret = &dummy_errcode; @@ -379,13 +383,15 @@ static cl_image_format supported_formats[] = { #define MIN(a, b) ((a) < (b) ? (a) : (b)) cl_int -clGetSupportedImageFormats(cl_context context, +clGetSupportedImageFormats(cl_context d_context, cl_mem_flags flags, cl_mem_object_type image_type, cl_uint num_entries, cl_image_format * image_formats, cl_uint * num_image_formats) { + auto context = pobj(d_context); + if (!context->isA(Coal::Object::T_Context)) return CL_INVALID_CONTEXT; diff --git a/src/api/api_program.cpp b/src/api/api_program.cpp index 8adcde7..49df322 100644 --- a/src/api/api_program.cpp +++ b/src/api/api_program.cpp @@ -40,13 +40,14 @@ // Program Object APIs cl_program -clCreateProgramWithSource(cl_context context, +clCreateProgramWithSource(cl_context d_context, cl_uint count, const char ** strings, const size_t * lengths, cl_int * errcode_ret) { cl_int dummy_errcode; + auto context = pobj(d_context); if (!errcode_ret) errcode_ret = &dummy_errcode; @@ -78,7 +79,7 @@ clCreateProgramWithSource(cl_context context, } cl_program -clCreateProgramWithBinary(cl_context context, +clCreateProgramWithBinary(cl_context d_context, cl_uint num_devices, const cl_device_id * device_list, const size_t * lengths, @@ -87,6 +88,7 @@ clCreateProgramWithBinary(cl_context context, cl_int * errcode_ret) { cl_int dummy_errcode; + auto context = pobj(d_context); if (!errcode_ret) errcode_ret = &dummy_errcode; @@ -355,7 +357,7 @@ clCompileProgram(cl_program program, } cl_program -clLinkProgram(cl_context context, +clLinkProgram(cl_context d_context, cl_uint num_devices, const cl_device_id * device_list, const char * options, @@ -366,6 +368,7 @@ clLinkProgram(cl_context context, cl_int * errcode_ret) { cl_int retcode = CL_SUCCESS; + auto context = pobj(d_context); if (!num_input_programs || ((num_input_programs > 0) && !input_programs)) retcode = CL_INVALID_VALUE; diff --git a/src/api/api_sampler.cpp b/src/api/api_sampler.cpp index 9bd2dec..6bee50e 100644 --- a/src/api/api_sampler.cpp +++ b/src/api/api_sampler.cpp @@ -30,20 +30,23 @@ * \brief Samplers */ -#include "CL/cl.h" +#include <CL/cl.h> -#include "core/sampler.h" -#include "core/context.h" +#include <core/sampler.h> +#include <core/context.h> + +using namespace Coal; // Sampler APIs cl_sampler -clCreateSampler(cl_context context, +clCreateSampler(cl_context d_context, cl_bool normalized_coords, cl_addressing_mode addressing_mode, cl_filter_mode filter_mode, cl_int * errcode_ret) { cl_int dummy_errcode; + auto context = pobj(d_context); if (!errcode_ret) errcode_ret = &dummy_errcode; @@ -56,7 +59,7 @@ clCreateSampler(cl_context context, *errcode_ret = CL_SUCCESS; - Coal::Sampler *sampler = new Coal::Sampler((Coal::Context *)context, + Coal::Sampler *sampler = new Coal::Sampler(context, normalized_coords, addressing_mode, filter_mode, diff --git a/src/core/commandqueue.cpp b/src/core/commandqueue.cpp index ab1d677..504b61c 100644 --- a/src/core/commandqueue.cpp +++ b/src/core/commandqueue.cpp @@ -108,7 +108,7 @@ cl_int CommandQueue::info(cl_command_queue_info param_name, switch (param_name) { case CL_QUEUE_CONTEXT: - SIMPLE_ASSIGN(cl_context, parent()); + SIMPLE_ASSIGN(cl_context, desc((Context *)parent())); break; case CL_QUEUE_DEVICE: @@ -928,12 +928,12 @@ cl_int Event::info(cl_event_info param_name, case CL_EVENT_CONTEXT: if (parent()) { - SIMPLE_ASSIGN(cl_context, parent()->parent()); + SIMPLE_ASSIGN(cl_context, desc((Context *)(parent()->parent()))); } else { if (type() == User) - SIMPLE_ASSIGN(cl_context, ((UserEvent *)this)->context()) + SIMPLE_ASSIGN(cl_context, desc((Context *)(((UserEvent *)this)->context()))) else SIMPLE_ASSIGN(cl_context, 0); } diff --git a/src/core/context.h b/src/core/context.h index f4427a4..d0ccfb8 100644 --- a/src/core/context.h +++ b/src/core/context.h @@ -34,20 +34,29 @@ #define __CONTEXT_H__ #include "object.h" +#include "icd.h" #include <CL/cl.h> namespace Coal { + class Context; +} +struct _cl_context: public Coal::descriptor<Coal::Context, _cl_context> {}; + +namespace Coal +{ class DeviceInterface; /** * \brief OpenCL context * - * This class is the root of all OpenCL objects, except \c Coal::DeviceInterface. + * This class represents a context for managing objects such as command-queues, memory, + * program and kernel objects and for executing kernels on one or more devices specified + * in the context. */ -class Context : public Object +class Context : public _cl_context, public Object { public: /** @@ -99,7 +108,4 @@ class Context : public Object } -struct _cl_context : public Coal::Context -{}; - #endif diff --git a/src/core/events.cpp b/src/core/events.cpp index add60d6..a968124 100644 --- a/src/core/events.cpp +++ b/src/core/events.cpp @@ -36,6 +36,7 @@ #include "memobject.h" #include "kernel.h" #include "deviceinterface.h" +#include "context.h" #include <cstdlib> #include <cstring> @@ -67,12 +68,12 @@ BufferEvent::BufferEvent(CommandQueue *parent, } // Buffer's context must match the CommandQueue one - Context *ctx = 0; - *errcode_ret = parent->info(CL_QUEUE_CONTEXT, sizeof(Context *), &ctx, 0); + cl_context d_ctx = 0; + *errcode_ret = parent->info(CL_QUEUE_CONTEXT, sizeof(cl_context), &d_ctx, 0); if (*errcode_ret != CL_SUCCESS) return; - if ((Context *)buffer->parent() != ctx) + if ((Context *)buffer->parent() != pobj(d_ctx)) { *errcode_ret = CL_INVALID_CONTEXT; return; @@ -745,7 +746,7 @@ KernelEvent::KernelEvent(CommandQueue *parent, // Check that the kernel was built for parent's device. cl_device_id d_device = 0; - Context *k_ctx, *q_ctx; + cl_context k_ctx, q_ctx; size_t max_work_group_size; cl_uint max_dims = 0; @@ -755,8 +756,8 @@ KernelEvent::KernelEvent(CommandQueue *parent, return; auto device = pobj(d_device); - *errcode_ret = parent->info(CL_QUEUE_CONTEXT, sizeof(Context *), &q_ctx, 0); - *errcode_ret |= kernel->info(CL_KERNEL_CONTEXT, sizeof(Context *), &k_ctx, 0); + *errcode_ret = parent->info(CL_QUEUE_CONTEXT, sizeof(cl_context), &q_ctx, 0); + *errcode_ret |= kernel->info(CL_KERNEL_CONTEXT, sizeof(cl_context), &k_ctx, 0); *errcode_ret |= device->info(CL_DEVICE_MAX_WORK_GROUP_SIZE, sizeof(size_t), &max_work_group_size, 0); *errcode_ret |= device->info(CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS, sizeof(size_t), diff --git a/src/core/kernel.cpp b/src/core/kernel.cpp index 05b276e..073d726 100644 --- a/src/core/kernel.cpp +++ b/src/core/kernel.cpp @@ -36,6 +36,7 @@ #include "program.h" #include "memobject.h" #include "sampler.h" +#include "context.h" #include "deviceinterface.h" #include <string> @@ -455,7 +456,7 @@ cl_int Kernel::info(cl_kernel_info param_name, break; case CL_KERNEL_CONTEXT: - SIMPLE_ASSIGN(cl_context, parent()->parent()); + SIMPLE_ASSIGN(cl_context, desc((Context *)(parent()->parent()))); break; case CL_KERNEL_PROGRAM: diff --git a/src/core/memobject.cpp b/src/core/memobject.cpp index 1d88fd0..c72c3c9 100644 --- a/src/core/memobject.cpp +++ b/src/core/memobject.cpp @@ -371,7 +371,7 @@ cl_int MemObject::info(cl_mem_info param_name, break; case CL_MEM_CONTEXT: - SIMPLE_ASSIGN(cl_context, parent()); + SIMPLE_ASSIGN(cl_context, desc((Context *)parent())); break; case CL_MEM_ASSOCIATED_MEMOBJECT: diff --git a/src/core/program.cpp b/src/core/program.cpp index ddece95..30f5637 100644 --- a/src/core/program.cpp +++ b/src/core/program.cpp @@ -945,37 +945,37 @@ cl_int Program::info(cl_program_info param_name, break; case CL_PROGRAM_NUM_DEVICES: - // Use devices associated with any built kernels, otherwise use + // Use devices associated with any built kernels, otherwise use // the devices associated with the program context - if (p_device_dependent.size() != 0) - { SIMPLE_ASSIGN(cl_uint, p_device_dependent.size()); } - else - return ((Context *)parent())->info(CL_CONTEXT_NUM_DEVICES, - param_value_size, param_value, param_value_size_ret); - break; + if (p_device_dependent.size() != 0) + { SIMPLE_ASSIGN(cl_uint, p_device_dependent.size()); } + else + return ((Context *)parent())->info(CL_CONTEXT_NUM_DEVICES, + param_value_size, param_value, param_value_size_ret); + break; case CL_PROGRAM_DEVICES: - // Use devices associated with any built kernels, otherwise use + // Use devices associated with any built kernels, otherwise use // the devices associated with the program context - if (p_device_dependent.size() != 0) - { - for (size_t i=0; i<p_device_dependent.size(); ++i) - { - const DeviceDependent &dep = p_device_dependent[i]; - - devices.push_back(desc(dep.device)); - } - - value = devices.data(); - value_length = devices.size() * sizeof(cl_device_id); - } - else - return ((Context *)parent())->info(CL_CONTEXT_DEVICES, - param_value_size, param_value, param_value_size_ret); - break; + if (p_device_dependent.size() != 0) + { + for (size_t i=0; i<p_device_dependent.size(); ++i) + { + const DeviceDependent &dep = p_device_dependent[i]; + + devices.push_back(desc(dep.device)); + } + + value = devices.data(); + value_length = devices.size() * sizeof(cl_device_id); + } + else + return ((Context *)parent())->info(CL_CONTEXT_DEVICES, + param_value_size, param_value, param_value_size_ret); + break; case CL_PROGRAM_CONTEXT: - SIMPLE_ASSIGN(cl_context, parent()); + SIMPLE_ASSIGN(cl_context, desc((Context *)parent())); break; case CL_PROGRAM_SOURCE: diff --git a/src/core/sampler.cpp b/src/core/sampler.cpp index 1201327..fa19f0c 100644 --- a/src/core/sampler.cpp +++ b/src/core/sampler.cpp @@ -187,7 +187,7 @@ cl_int Sampler::info(cl_sampler_info param_name, break; case CL_SAMPLER_CONTEXT: - SIMPLE_ASSIGN(cl_context, parent()); + SIMPLE_ASSIGN(cl_context, desc((Context *)parent())); break; case CL_SAMPLER_NORMALIZED_COORDS: |