aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/icd.cpp11
-rw-r--r--src/core/icd.h82
2 files changed, 87 insertions, 6 deletions
diff --git a/src/core/icd.cpp b/src/core/icd.cpp
index 7378d41..75b3815 100644
--- a/src/core/icd.cpp
+++ b/src/core/icd.cpp
@@ -29,7 +29,10 @@
#include "platform.h"
#include "icd.h"
-// TODO: Ensure this matches OCL 1.2 disptach table:
+// Note: This must match the OCL 1.2 disptach table in the file icd/icd_dispatch.h
+// which is part of the ICD loader source from the Khronos website.
+// Most recently: https://www.khronos.org/registry/cl/specs/opencl-icd-1.2.11.0.tgz
+
void * dispatch_table[] =
{
(void*) clGetPlatformIDs,
@@ -107,12 +110,14 @@ void * dispatch_table[] =
(void*) 0, //clEnqueueAcquireGLObjects,
(void*) 0, //clEnqueueReleaseGLObjects,
(void*) 0, //clGetGLContextInfoKHR,
+
(void*) 0, //clGetDeviceIDsFromD3D10KHR,
(void*) 0, //clCreateFromD3D10BufferKHR,
(void*) 0, //clCreateFromD3D10Texture2DKHR,
(void*) 0, //clCreateFromD3D10Texture3DKHR,
(void*) 0, //clEnqueueAcquireD3D10ObjectsKHR,
(void*) 0, //clEnqueueReleaseD3D10ObjectsKHR,
+
(void*) clSetEventCallback,
(void*) clCreateSubBuffer,
(void*) clSetMemObjectDestructorCallback,
@@ -122,6 +127,10 @@ void * dispatch_table[] =
(void*) clEnqueueWriteBufferRect,
(void*) clEnqueueCopyBufferRect,
+ (void*) 0, //clCreateSubDevicesEXT;
+ (void*) 0, //clRetainDeviceEXT;
+ (void*) 0, //clReleaseDeviceEXT;
+
(void *) 0, //clCreateEventFromGLsyncKHR;
(void *) clCreateSubDevices,
diff --git a/src/core/icd.h b/src/core/icd.h
index 591aed6..b7d00c9 100644
--- a/src/core/icd.h
+++ b/src/core/icd.h
@@ -27,18 +27,90 @@
*****************************************************************************/
#ifndef _ICD_H
#define _ICD_H
+
+#include <iostream>
+#include <cassert>
+
#include "CL/cl.h"
typedef void *(KHRicdVendorDispatch)[];
extern KHRicdVendorDispatch dispatch_table;
-class Dispatch
+namespace Coal
{
- public:
- Dispatch() : dispatch(&dispatch_table) {}
- private:
- KHRicdVendorDispatch *dispatch;
+
+// Templates to define the transformations between internal clover objects
+// and external OpenCL C API objects expected by the ICD loader.
+// This is based on the template system used by the clover state tracker of
+// Mesa, at freedesktop.org
+// See: src/gallium/state_trackers/clover/core/object.hpp
+
+// Proxy template class that represents an OpenCL API object, and is the base
+// class of all clover objects.
+template<typename T, typename S>
+struct descriptor {
+ typedef T object_type;
+ typedef S descriptor_type;
+
+ descriptor() : dispatch(&dispatch_table) {
+ static_assert(std::is_standard_layout<descriptor_type>::value,
+ "ICD requires CL API objects to be standard layout.");
+ }
+
+ const void *dispatch;
};
+// Downcast an API object ptr to a Clover object ptr
+// Note: clover object validation is done by subsequent ->isA methods.
+template<typename D>
+typename D::object_type *
+pobj(D *d) {
+ return static_cast<typename D::object_type *>(d);
+}
+
+
+// Upcast a Clover object ptr to an API object ptr.
+template<typename O>
+typename O::descriptor_type *
+desc(O *o) {
+ return static_cast<typename O::descriptor_type *>(o);
+}
+
+// Convert a list of API objects into Clover objects,
+// copying into a previously allocated list of at least size n.
+template<typename O, typename D>
+void pobj_list(O **objs, D **descs, int n) {
+ for (int i=0;i<n;i++) {
+ objs[i] = pobj(descs[i]);
+ }
+}
+
+// Const overload of above
+template<typename O, typename D>
+void pobj_list(O **objs, D * const *descs, int n) {
+ for (int i=0;i<n;i++) {
+ objs[i] = pobj(descs[i]);
+ }
+}
+
+// Convert a list of Clover objects to a list of API objects,
+// copying into a previously allocated list of at least size n.
+template<typename O, typename D>
+void desc_list(D **descs, O **objs, int n) {
+ for (int i=0;i<n;i++) {
+ descs[i] = desc(objs[i]);
+ }
+}
+
+// Const overload of above
+template<typename O, typename D>
+void desc_list(D **descs, O * const*objs, int n) {
+ for (int i=0;i<n;i++) {
+ descs[i] = desc(objs[i]);
+ }
+}
+
+}
+
#endif // _ICD_H