aboutsummaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
Diffstat (limited to 'src/core')
-rw-r--r--src/core/cpu/worker.cpp16
-rw-r--r--src/core/events.cpp24
-rw-r--r--src/core/events.h8
-rw-r--r--src/core/kernel.cpp56
-rw-r--r--src/core/memobject.cpp10
-rw-r--r--src/core/memobject.h13
6 files changed, 73 insertions, 54 deletions
diff --git a/src/core/cpu/worker.cpp b/src/core/cpu/worker.cpp
index 635706b..409c4a6 100644
--- a/src/core/cpu/worker.cpp
+++ b/src/core/cpu/worker.cpp
@@ -248,11 +248,11 @@ void *worker(void *data)
break;
}
- case Event::MigrateMemObjects:
- {
+ case Event::MigrateMemObjects:
+ {
MigrateMemObjectsEvent *e = (MigrateMemObjectsEvent *)event;
- int num_mem_objects = e->num_mem_objects();
- Coal::MemObject ** mem_objects = (Coal::MemObject **)e->mem_objects();
+ int num_mem_objects = e->num_mem_objects();
+ const cl_mem * mem_objects = e->mem_objects();
cl_mem_migration_flags flags = e->flags();
std::cout << "Event::MigrateMemObjects " << std::endl;
@@ -262,10 +262,10 @@ void *worker(void *data)
// only migrate date from HOST to Device.
// Force pre-allocation (or copying) of the CPUBuffers for this device:
for (int i = 0; i < num_mem_objects; i++) {
- mem_objects[i]->allocate(device);
- }
- break;
- }
+ pobj(mem_objects[i])->allocate(device);
+ }
+ break;
+ }
default:
break;
diff --git a/src/core/events.cpp b/src/core/events.cpp
index 22676f1..f4b7c09 100644
--- a/src/core/events.cpp
+++ b/src/core/events.cpp
@@ -56,7 +56,7 @@ BufferEvent::BufferEvent(CommandQueue *parent,
: Event(parent, CL_QUEUED, num_events_in_wait_list, event_wait_list, errcode_ret),
p_buffer(buffer)
{
- clRetainMemObject((cl_mem) p_buffer);
+ clRetainMemObject(desc(p_buffer));
if (*errcode_ret != CL_SUCCESS) return;
@@ -103,7 +103,7 @@ BufferEvent::BufferEvent(CommandQueue *parent,
BufferEvent::~BufferEvent()
{
- clReleaseMemObject((cl_mem) p_buffer);
+ clReleaseMemObject(desc(p_buffer));
}
MemObject *BufferEvent::buffer() const
@@ -431,7 +431,7 @@ CopyBufferEvent::CopyBufferEvent(CommandQueue *parent,
errcode_ret), p_destination(destination), p_src_offset(src_offset),
p_dst_offset(dst_offset), p_cb(cb)
{
- clRetainMemObject((cl_mem) p_destination);
+ clRetainMemObject(desc(p_destination));
if (*errcode_ret != CL_SUCCESS) return;
@@ -483,7 +483,7 @@ CopyBufferEvent::CopyBufferEvent(CommandQueue *parent,
CopyBufferEvent::~CopyBufferEvent()
{
- clReleaseMemObject((cl_mem) p_destination);
+ clReleaseMemObject(desc(p_destination));
}
MemObject *CopyBufferEvent::source() const
@@ -587,7 +587,7 @@ NativeKernelEvent::NativeKernelEvent(CommandQueue *parent,
void *args,
size_t cb_args,
cl_uint num_mem_objects,
- const MemObject **mem_list,
+ const cl_mem *mem_list,
const void **args_mem_loc,
cl_uint num_events_in_wait_list,
const cl_event *event_wait_list,
@@ -665,7 +665,7 @@ NativeKernelEvent::NativeKernelEvent(CommandQueue *parent,
// Replace memory objects with global pointers
for (cl_uint i=0; i<num_mem_objects; ++i)
{
- const MemObject *buffer = mem_list[i];
+ const MemObject *buffer = pobj(mem_list[i]);
const char *loc = (const char *)args_mem_loc[i];
if (!buffer)
@@ -729,7 +729,7 @@ KernelEvent::KernelEvent(CommandQueue *parent,
if (a->kind() == Kernel::Arg::Buffer && a->file() != Kernel::Arg::Local)
{
MemObject *buffer = *(MemObject **)(a->value(0));
- clRetainMemObject((cl_mem)buffer);
+ clRetainMemObject(desc(buffer));
}
}
@@ -955,7 +955,7 @@ KernelEvent::~KernelEvent()
if (a->kind() == Kernel::Arg::Buffer && a->file() != Kernel::Arg::Local)
{
MemObject *buffer = *(MemObject **)(a->value(0));
- clReleaseMemObject((cl_mem)buffer);
+ clReleaseMemObject(desc(buffer));
}
}
clReleaseKernel(desc(p_kernel));
@@ -1619,7 +1619,7 @@ Event::Type MarkerEvent::type() const
MigrateMemObjectsEvent::MigrateMemObjectsEvent(CommandQueue *parent,
cl_uint num_mem_objects,
- const Coal::MemObject **mem_objects,
+ const cl_mem * mem_objects,
cl_mem_migration_flags flags,
cl_uint num_events_in_wait_list,
const cl_event *event_wait_list,
@@ -1642,9 +1642,9 @@ MigrateMemObjectsEvent::MigrateMemObjectsEvent(CommandQueue *parent,
Context *ctx = (Context *)parent->parent();
for (int i = 0; i < num_mem_objects; i++)
{
- if (!mem_objects[i]->isA(Coal::Object::T_MemObject))
+ if (!pobj(mem_objects[i])->isA(Coal::Object::T_MemObject))
{ *errcode_ret = CL_INVALID_MEM_OBJECT; break; }
- else if (ctx != (Context *)mem_objects[i]->parent())
+ else if (ctx != (Context *)pobj(mem_objects[i])->parent())
{ *errcode_ret = CL_INVALID_CONTEXT; break; }
}
}
@@ -1654,7 +1654,7 @@ cl_uint MigrateMemObjectsEvent::num_mem_objects() const
return p_num_mem_objects;
}
-const Coal::MemObject ** MigrateMemObjectsEvent::mem_objects() const
+const cl_mem * MigrateMemObjectsEvent::mem_objects() const
{
return p_mem_objects;
}
diff --git a/src/core/events.h b/src/core/events.h
index 00b6fb1..aad5792 100644
--- a/src/core/events.h
+++ b/src/core/events.h
@@ -598,7 +598,7 @@ class NativeKernelEvent : public Event
void *args,
size_t cb_args,
cl_uint num_mem_objects,
- const MemObject **mem_list,
+ const cl_mem *mem_list,
const void **args_mem_loc,
cl_uint num_events_in_wait_list,
const cl_event *event_wait_list,
@@ -748,7 +748,7 @@ class MigrateMemObjectsEvent: public Event
public:
MigrateMemObjectsEvent(CommandQueue *parent,
cl_uint num_mem_objects,
- const Coal::MemObject **mem_objects,
+ const cl_mem * mem_objects,
cl_mem_migration_flags flags,
cl_uint num_events_in_wait_list,
const cl_event *event_wait_list,
@@ -757,12 +757,12 @@ class MigrateMemObjectsEvent: public Event
Type type() const; /*!< \brief Say the event is a \c Coal::Event::MigrateMemObjects one */
cl_uint num_mem_objects() const; /*!< \brief Number of MemObjects to migrate */
- const Coal::MemObject **mem_objects() const;/*!< \brief List of MemObjects to migrate */
+ const cl_mem *mem_objects() const; /*!< \brief List of MemObjects to migrate */
cl_mem_migration_flags flags() const; /*!< \brief Migrate flags */
private:
cl_uint p_num_mem_objects;
- const Coal::MemObject **p_mem_objects;
+ const cl_mem *p_mem_objects;
cl_mem_migration_flags p_flags;
};
diff --git a/src/core/kernel.cpp b/src/core/kernel.cpp
index 4f1b7b1..dd8c116 100644
--- a/src/core/kernel.cpp
+++ b/src/core/kernel.cpp
@@ -317,6 +317,11 @@ llvm::Function *Kernel::function(DeviceInterface *device) const
/******************************************************************************
* cl_int Kernel::setArg
+*
+* Note: the argument void *value can either be a pointer to raw data, or a
+* derived type of MemObject, upcast to an ICD descriptor (see icd.h).
+* In this case, we must be careful to distinguish between the two and do the
+* downcast to a clover object if valule is a pointer to an ICD object.
******************************************************************************/
cl_int Kernel::setArg(cl_uint index, size_t size, const void *value)
{
@@ -345,18 +350,21 @@ cl_int Kernel::setArg(cl_uint index, size_t size, const void *value)
/*-------------------------------------------------------------------------
* Special case for samplers (pointers in C++, uint32 in OpenCL).
*------------------------------------------------------------------------*/
- if (size == sizeof(cl_sampler) && arg_size == 4 &&
- (*(Object **)value)->isA(T_Sampler))
+ if (arg->kind() == Arg::Sampler && size == sizeof(cl_sampler) && arg_size == 4)
{
- unsigned int bitfield = (*(Sampler **)value)->bitfield();
+ // Test if this is a sampler object:
+ MemObject * val = pobj(*(cl_mem *)value);
+ if (((Object *)val)->isA(T_Sampler))
+ {
+ unsigned int bitfield = ((Sampler *)val)->bitfield();
- arg->refineKind(Arg::Sampler);
- arg->alloc();
- arg->loadData(&bitfield, size);
+ arg->refineKind(Arg::Sampler);
+ arg->alloc();
+ arg->loadData(&bitfield, size);
- return CL_SUCCESS;
+ return CL_SUCCESS;
+ }
}
-
// LLVM IR redefines function parameter types to fit the smallest integer type width for the ABI
// eg: <2xi8> (2 bytes) may actually be pushed as an i32 (4 bytes!), but this knowledge is
// not known to shamrock. But, we do know the parameter type alignment in addFunction().
@@ -364,24 +372,30 @@ cl_int Kernel::setArg(cl_uint index, size_t size, const void *value)
if ((size != arg_size) && (size > arg->targetAlignment())) return CL_INVALID_ARG_SIZE;
/*-------------------------------------------------------------------------
- * Check for null values
+ * Downcast 'void *value' from a potential &cl_mem argument to a MemObject
+ * if arg type is one of Arg::Buffer, Arg::Image2D, or Arg::Image3D.
+ * Also, check for null values.
*------------------------------------------------------------------------*/
- cl_mem null_mem = 0;
+ MemObject *mem_value = NULL;
- if (!value)
+ switch (arg->kind())
{
- switch (arg->kind())
- {
- /*-------------------------------------------------------------
- * Special case buffers : value can be 0 (or point to 0)
- *------------------------------------------------------------*/
- case Arg::Buffer:
- case Arg::Image2D:
- case Arg::Image3D: value = &null_mem;
- default: return CL_INVALID_ARG_VALUE;
- }
+ /*-------------------------------------------------------------
+ * Special case buffers : value can be 0 (or point to 0)
+ *------------------------------------------------------------*/
+ case Arg::Buffer:
+ case Arg::Image2D:
+ case Arg::Image3D:
+ if (value) {
+ mem_value = pobj(*(cl_mem *)value);
+ }
+ value = &mem_value;
+ break;
+ default:
+ if (!value) return CL_INVALID_ARG_VALUE;
}
+
/*-------------------------------------------------------------------------
* Copy just the data actually passed. Expect LLVM to do the signext/zeroext.
*------------------------------------------------------------------------*/
diff --git a/src/core/memobject.cpp b/src/core/memobject.cpp
index c72c3c9..81e6fb3 100644
--- a/src/core/memobject.cpp
+++ b/src/core/memobject.cpp
@@ -115,7 +115,7 @@ MemObject::~MemObject()
{
dtor_callback_t callback;
if (p_dtor_callback_stack.pop(callback))
- callback.first((cl_mem)this, callback.second);
+ callback.first(desc(this), callback.second);
}
if (p_devicebuffers)
@@ -378,14 +378,14 @@ cl_int MemObject::info(cl_mem_info param_name,
if (type() != SubBuffer)
SIMPLE_ASSIGN(cl_mem, 0)
else
- SIMPLE_ASSIGN(cl_mem, subbuf->parent());
+ SIMPLE_ASSIGN(cl_mem, desc(subbuf->parent()));
break;
case CL_MEM_OFFSET:
if (type() != SubBuffer)
- SIMPLE_ASSIGN(cl_mem, 0)
+ SIMPLE_ASSIGN(size_t, 0)
else
- SIMPLE_ASSIGN(cl_mem, subbuf->offset());
+ SIMPLE_ASSIGN(size_t, subbuf->offset());
break;
default:
@@ -500,7 +500,7 @@ SubBuffer::SubBuffer(class Buffer *parent, size_t offset, size_t size,
: MemObject((Context *)parent->parent(), flags, 0, errcode_ret), p_offset(offset),
p_size(size), p_parent(parent)
{
- clRetainMemObject((cl_mem) p_parent);
+ clRetainMemObject(desc(p_parent));
if (size == 0)
{
diff --git a/src/core/memobject.h b/src/core/memobject.h
index ede6050..55f2fe3 100644
--- a/src/core/memobject.h
+++ b/src/core/memobject.h
@@ -35,12 +35,20 @@
#define __MEMOBJECT_H__
#include "object.h"
+#include "icd.h"
#include "dsp/u_concurrent_stack.h"
#include <CL/cl.h>
namespace Coal
{
+ class MemObject;
+}
+struct _cl_mem: public Coal::descriptor<Coal::MemObject, _cl_mem> {};
+
+
+namespace Coal
+{
class DeviceBuffer;
class Context;
@@ -50,7 +58,7 @@ class BufferEvent;
/**
* \brief Base class for all the memory objects
*/
-class MemObject : public Object
+class MemObject : public _cl_mem, public Object
{
public:
/**
@@ -298,7 +306,4 @@ class Image3D : public Image2D
}
-struct _cl_mem : public Coal::MemObject
-{};
-
#endif