Commit 2c8d9a9a by John Plate Committed by Angle LUCI CQ

CL: Remaining functions for OpenCL 1.2

Add support for the remaining functions for OpenCL 1.2 for the front end and pass-through back end. Also fix several bugs discovered by the conformance tests. Bug: angleproject:6015 Change-Id: I1dca1c3f4c1d9aea7f0501094c171116ea01381f Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2954259Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarCody Northrop <cnorthrop@google.com> Commit-Queue: John Plate <jplate@google.com>
parent 88631e50
...@@ -29,11 +29,10 @@ using ContextErrorCB = void(CL_CALLBACK *)(const char *errinfo, ...@@ -29,11 +29,10 @@ using ContextErrorCB = void(CL_CALLBACK *)(const char *errinfo,
size_t cb, size_t cb,
void *user_data); void *user_data);
using MemoryCB = void(CL_CALLBACK *)(cl_mem memobj, void *user_data);
using ProgramCB = void(CL_CALLBACK *)(cl_program program, void *user_data); using ProgramCB = void(CL_CALLBACK *)(cl_program program, void *user_data);
using EventCB = void(CL_CALLBACK *)(cl_event event, cl_int event_command_status, void *user_data);
using EventCB = void(CL_CALLBACK *)(cl_event event, cl_int event_command_status, void *user_data); using UserFunc = void(CL_CALLBACK *)(void *args);
using UserFunc = void(CL_CALLBACK *)(void *args);
template <typename T = void> template <typename T = void>
struct Dispatch struct Dispatch
...@@ -80,6 +79,11 @@ struct NativeObject : public Dispatch<> ...@@ -80,6 +79,11 @@ struct NativeObject : public Dispatch<>
NativeObjectType *getNative() { return static_cast<NativeObjectType *>(this); } NativeObjectType *getNative() { return static_cast<NativeObjectType *>(this); }
const NativeObjectType *getNative() const
{
return static_cast<const NativeObjectType *>(this);
}
static NativeObjectType *CastNative(NativeObjectType *p) { return p; } static NativeObjectType *CastNative(NativeObjectType *p) { return p; }
}; };
......
...@@ -31,7 +31,7 @@ class Buffer final : public Memory ...@@ -31,7 +31,7 @@ class Buffer final : public Memory
public: public:
~Buffer() override; ~Buffer() override;
cl_mem_object_type getType() const final; MemObjectType getType() const final;
bool isSubBuffer() const; bool isSubBuffer() const;
...@@ -60,12 +60,12 @@ inline bool Buffer::isRegionValid(const cl_buffer_region &region) const ...@@ -60,12 +60,12 @@ inline bool Buffer::isRegionValid(const cl_buffer_region &region) const
inline bool Buffer::IsValid(const _cl_mem *buffer) inline bool Buffer::IsValid(const _cl_mem *buffer)
{ {
return Memory::IsValid(buffer) && buffer->cast<Memory>().getType() == CL_MEM_OBJECT_BUFFER; return Memory::IsValid(buffer) && buffer->cast<Memory>().getType() == MemObjectType::Buffer;
} }
inline cl_mem_object_type Buffer::getType() const inline MemObjectType Buffer::getType() const
{ {
return CL_MEM_OBJECT_BUFFER; return MemObjectType::Buffer;
} }
inline bool Buffer::isSubBuffer() const inline bool Buffer::isSubBuffer() const
......
...@@ -131,12 +131,17 @@ cl_mem Context::createImage(const cl_mem_properties *properties, ...@@ -131,12 +131,17 @@ cl_mem Context::createImage(const cl_mem_properties *properties,
void *hostPtr, void *hostPtr,
cl_int &errorCode) cl_int &errorCode)
{ {
const ImageDescriptor imageDesc = { const ImageDescriptor imageDesc = {FromCLenum<MemObjectType>(desc->image_type),
desc->image_type, desc->image_width, desc->image_height, desc->image_width,
desc->image_depth, desc->image_array_size, desc->image_row_pitch, desc->image_height,
desc->image_slice_pitch, desc->num_mip_levels, desc->num_samples}; desc->image_depth,
desc->image_array_size,
desc->image_row_pitch,
desc->image_slice_pitch,
desc->num_mip_levels,
desc->num_samples};
return Object::Create<Image>(errorCode, *this, Memory::PropArray{}, flags, *format, imageDesc, return Object::Create<Image>(errorCode, *this, Memory::PropArray{}, flags, *format, imageDesc,
&desc->buffer->cast<Memory>(), hostPtr); Memory::Cast(desc->buffer), hostPtr);
} }
cl_mem Context::createImage2D(MemFlags flags, cl_mem Context::createImage2D(MemFlags flags,
...@@ -148,7 +153,7 @@ cl_mem Context::createImage2D(MemFlags flags, ...@@ -148,7 +153,7 @@ cl_mem Context::createImage2D(MemFlags flags,
cl_int &errorCode) cl_int &errorCode)
{ {
const ImageDescriptor imageDesc = { const ImageDescriptor imageDesc = {
CL_MEM_OBJECT_IMAGE2D, width, height, 0u, 0u, rowPitch, 0u, 0u, 0u}; MemObjectType::Image2D, width, height, 0u, 0u, rowPitch, 0u, 0u, 0u};
return Object::Create<Image>(errorCode, *this, Memory::PropArray{}, flags, *format, imageDesc, return Object::Create<Image>(errorCode, *this, Memory::PropArray{}, flags, *format, imageDesc,
nullptr, hostPtr); nullptr, hostPtr);
} }
...@@ -164,11 +169,21 @@ cl_mem Context::createImage3D(MemFlags flags, ...@@ -164,11 +169,21 @@ cl_mem Context::createImage3D(MemFlags flags,
cl_int &errorCode) cl_int &errorCode)
{ {
const ImageDescriptor imageDesc = { const ImageDescriptor imageDesc = {
CL_MEM_OBJECT_IMAGE3D, width, height, depth, 0u, rowPitch, slicePitch, 0u, 0u}; MemObjectType::Image3D, width, height, depth, 0u, rowPitch, slicePitch, 0u, 0u};
return Object::Create<Image>(errorCode, *this, Memory::PropArray{}, flags, *format, imageDesc, return Object::Create<Image>(errorCode, *this, Memory::PropArray{}, flags, *format, imageDesc,
nullptr, hostPtr); nullptr, hostPtr);
} }
cl_int Context::getSupportedImageFormats(MemFlags flags,
MemObjectType imageType,
cl_uint numEntries,
cl_image_format *imageFormats,
cl_uint *numImageFormats)
{
return mImpl->getSupportedImageFormats(flags, imageType, numEntries, imageFormats,
numImageFormats);
}
cl_sampler Context::createSamplerWithProperties(const cl_sampler_properties *properties, cl_sampler Context::createSamplerWithProperties(const cl_sampler_properties *properties,
cl_int &errorCode) cl_int &errorCode)
{ {
......
...@@ -62,6 +62,12 @@ class Context final : public _cl_context, public Object ...@@ -62,6 +62,12 @@ class Context final : public _cl_context, public Object
void *hostPtr, void *hostPtr,
cl_int &errorCode); cl_int &errorCode);
cl_int getSupportedImageFormats(MemFlags flags,
MemObjectType imageType,
cl_uint numEntries,
cl_image_format *imageFormats,
cl_uint *numImageFormats);
cl_sampler createSamplerWithProperties(const cl_sampler_properties *properties, cl_sampler createSamplerWithProperties(const cl_sampler_properties *properties,
cl_int &errorCode); cl_int &errorCode);
......
...@@ -285,7 +285,7 @@ cl_int Device::getInfo(DeviceInfo name, size_t valueSize, void *value, size_t *v ...@@ -285,7 +285,7 @@ cl_int Device::getInfo(DeviceInfo name, size_t valueSize, void *value, size_t *v
copySize = sizeof(valPointer); copySize = sizeof(valPointer);
break; break;
case DeviceInfo::ParentDevice: case DeviceInfo::ParentDevice:
valPointer = mParent->getNative(); valPointer = Device::CastNative(mParent.get());
copyValue = &valPointer; copyValue = &valPointer;
copySize = sizeof(valPointer); copySize = sizeof(valPointer);
break; break;
...@@ -388,25 +388,25 @@ bool Device::supportsBuiltInKernel(const std::string &name) const ...@@ -388,25 +388,25 @@ bool Device::supportsBuiltInKernel(const std::string &name) const
bool Device::supportsNativeImageDimensions(const cl_image_desc &desc) const bool Device::supportsNativeImageDimensions(const cl_image_desc &desc) const
{ {
switch (desc.image_type) switch (FromCLenum<MemObjectType>(desc.image_type))
{ {
case CL_MEM_OBJECT_IMAGE1D: case MemObjectType::Image1D:
return desc.image_width <= mInfo.mImage2D_MaxWidth; return desc.image_width <= mInfo.mImage2D_MaxWidth;
case CL_MEM_OBJECT_IMAGE2D: case MemObjectType::Image2D:
return desc.image_width <= mInfo.mImage2D_MaxWidth && return desc.image_width <= mInfo.mImage2D_MaxWidth &&
desc.image_height <= mInfo.mImage2D_MaxHeight; desc.image_height <= mInfo.mImage2D_MaxHeight;
case CL_MEM_OBJECT_IMAGE3D: case MemObjectType::Image3D:
return desc.image_width <= mInfo.mImage3D_MaxWidth && return desc.image_width <= mInfo.mImage3D_MaxWidth &&
desc.image_height <= mInfo.mImage3D_MaxHeight && desc.image_height <= mInfo.mImage3D_MaxHeight &&
desc.image_depth <= mInfo.mImage3D_MaxDepth; desc.image_depth <= mInfo.mImage3D_MaxDepth;
case CL_MEM_OBJECT_IMAGE1D_ARRAY: case MemObjectType::Image1D_Array:
return desc.image_width <= mInfo.mImage2D_MaxWidth && return desc.image_width <= mInfo.mImage2D_MaxWidth &&
desc.image_array_size <= mInfo.mImageMaxArraySize; desc.image_array_size <= mInfo.mImageMaxArraySize;
case CL_MEM_OBJECT_IMAGE2D_ARRAY: case MemObjectType::Image2D_Array:
return desc.image_width <= mInfo.mImage2D_MaxWidth && return desc.image_width <= mInfo.mImage2D_MaxWidth &&
desc.image_height <= mInfo.mImage2D_MaxHeight && desc.image_height <= mInfo.mImage2D_MaxHeight &&
desc.image_array_size <= mInfo.mImageMaxArraySize; desc.image_array_size <= mInfo.mImageMaxArraySize;
case CL_MEM_OBJECT_IMAGE1D_BUFFER: case MemObjectType::Image1D_Buffer:
return desc.image_width <= mInfo.mImageMaxBufferSize; return desc.image_width <= mInfo.mImageMaxBufferSize;
default: default:
ASSERT(false); ASSERT(false);
...@@ -419,21 +419,21 @@ bool Device::supportsImageDimensions(const ImageDescriptor &desc) const ...@@ -419,21 +419,21 @@ bool Device::supportsImageDimensions(const ImageDescriptor &desc) const
{ {
switch (desc.type) switch (desc.type)
{ {
case CL_MEM_OBJECT_IMAGE1D: case MemObjectType::Image1D:
return desc.width <= mInfo.mImage2D_MaxWidth; return desc.width <= mInfo.mImage2D_MaxWidth;
case CL_MEM_OBJECT_IMAGE2D: case MemObjectType::Image2D:
return desc.width <= mInfo.mImage2D_MaxWidth && desc.height <= mInfo.mImage2D_MaxHeight; return desc.width <= mInfo.mImage2D_MaxWidth && desc.height <= mInfo.mImage2D_MaxHeight;
case CL_MEM_OBJECT_IMAGE3D: case MemObjectType::Image3D:
return desc.width <= mInfo.mImage3D_MaxWidth && return desc.width <= mInfo.mImage3D_MaxWidth &&
desc.height <= mInfo.mImage3D_MaxHeight && desc.depth <= mInfo.mImage3D_MaxDepth; desc.height <= mInfo.mImage3D_MaxHeight && desc.depth <= mInfo.mImage3D_MaxDepth;
case CL_MEM_OBJECT_IMAGE1D_ARRAY: case MemObjectType::Image1D_Array:
return desc.width <= mInfo.mImage2D_MaxWidth && return desc.width <= mInfo.mImage2D_MaxWidth &&
desc.arraySize <= mInfo.mImageMaxArraySize; desc.arraySize <= mInfo.mImageMaxArraySize;
case CL_MEM_OBJECT_IMAGE2D_ARRAY: case MemObjectType::Image2D_Array:
return desc.width <= mInfo.mImage2D_MaxWidth && return desc.width <= mInfo.mImage2D_MaxWidth &&
desc.height <= mInfo.mImage2D_MaxHeight && desc.height <= mInfo.mImage2D_MaxHeight &&
desc.arraySize <= mInfo.mImageMaxArraySize; desc.arraySize <= mInfo.mImageMaxArraySize;
case CL_MEM_OBJECT_IMAGE1D_BUFFER: case MemObjectType::Image1D_Buffer:
return desc.width <= mInfo.mImageMaxBufferSize; return desc.width <= mInfo.mImageMaxBufferSize;
default: default:
ASSERT(false); ASSERT(false);
......
...@@ -106,6 +106,14 @@ cl_int Event::setCallback(cl_int commandExecCallbackType, EventCB pfnNotify, voi ...@@ -106,6 +106,14 @@ cl_int Event::setCallback(cl_int commandExecCallbackType, EventCB pfnNotify, voi
return CL_SUCCESS; return CL_SUCCESS;
} }
cl_int Event::getProfilingInfo(ProfilingInfo name,
size_t valueSize,
void *value,
size_t *valueSizeRet)
{
return mImpl->getProfilingInfo(name, valueSize, value, valueSizeRet);
}
Event::~Event() = default; Event::~Event() = default;
void Event::callback(cl_int commandStatus) void Event::callback(cl_int commandStatus)
......
...@@ -28,6 +28,11 @@ class Event final : public _cl_event, public Object ...@@ -28,6 +28,11 @@ class Event final : public _cl_event, public Object
cl_int setCallback(cl_int commandExecCallbackType, EventCB pfnNotify, void *userData); cl_int setCallback(cl_int commandExecCallbackType, EventCB pfnNotify, void *userData);
cl_int getProfilingInfo(ProfilingInfo name,
size_t valueSize,
void *value,
size_t *valueSizeRet);
public: public:
~Event() override; ~Event() override;
......
...@@ -93,20 +93,16 @@ cl_int Image::getInfo(ImageInfo name, size_t valueSize, void *value, size_t *val ...@@ -93,20 +93,16 @@ cl_int Image::getInfo(ImageInfo name, size_t valueSize, void *value, size_t *val
return CL_SUCCESS; return CL_SUCCESS;
} }
bool Image::IsValid(const _cl_mem *image) bool Image::IsTypeValid(MemObjectType imageType)
{ {
if (!Memory::IsValid(image)) switch (imageType)
{ {
return false; case MemObjectType::Image1D:
} case MemObjectType::Image2D:
switch (image->cast<Memory>().getType()) case MemObjectType::Image3D:
{ case MemObjectType::Image1D_Array:
case CL_MEM_OBJECT_IMAGE1D: case MemObjectType::Image2D_Array:
case CL_MEM_OBJECT_IMAGE2D: case MemObjectType::Image1D_Buffer:
case CL_MEM_OBJECT_IMAGE3D:
case CL_MEM_OBJECT_IMAGE1D_ARRAY:
case CL_MEM_OBJECT_IMAGE2D_ARRAY:
case CL_MEM_OBJECT_IMAGE1D_BUFFER:
break; break;
default: default:
return false; return false;
...@@ -120,17 +116,17 @@ bool Image::isRegionValid(const size_t origin[3], const size_t region[3]) const ...@@ -120,17 +116,17 @@ bool Image::isRegionValid(const size_t origin[3], const size_t region[3]) const
{ {
switch (getType()) switch (getType())
{ {
case CL_MEM_OBJECT_IMAGE1D: case MemObjectType::Image1D:
case CL_MEM_OBJECT_IMAGE1D_BUFFER: case MemObjectType::Image1D_Buffer:
return origin[0] + region[0] <= mDesc.width; return origin[0] + region[0] <= mDesc.width;
case CL_MEM_OBJECT_IMAGE2D: case MemObjectType::Image2D:
return origin[0] + region[0] <= mDesc.width && origin[1] + region[1] <= mDesc.height; return origin[0] + region[0] <= mDesc.width && origin[1] + region[1] <= mDesc.height;
case CL_MEM_OBJECT_IMAGE3D: case MemObjectType::Image3D:
return origin[0] + region[0] <= mDesc.width && origin[1] + region[1] <= mDesc.height && return origin[0] + region[0] <= mDesc.width && origin[1] + region[1] <= mDesc.height &&
origin[2] + region[2] <= mDesc.depth; origin[2] + region[2] <= mDesc.depth;
case CL_MEM_OBJECT_IMAGE1D_ARRAY: case MemObjectType::Image1D_Array:
return origin[0] + region[0] <= mDesc.width && origin[1] + region[1] <= mDesc.arraySize; return origin[0] + region[0] <= mDesc.width && origin[1] + region[1] <= mDesc.arraySize;
case CL_MEM_OBJECT_IMAGE2D_ARRAY: case MemObjectType::Image2D_Array:
return origin[0] + region[0] <= mDesc.width && origin[1] + region[1] <= mDesc.height && return origin[0] + region[0] <= mDesc.width && origin[1] + region[1] <= mDesc.height &&
origin[2] + region[2] <= mDesc.arraySize; origin[2] + region[2] <= mDesc.arraySize;
default: default:
......
...@@ -22,12 +22,13 @@ class Image final : public Memory ...@@ -22,12 +22,13 @@ class Image final : public Memory
cl_int getInfo(ImageInfo name, size_t valueSize, void *value, size_t *valueSizeRet) const; cl_int getInfo(ImageInfo name, size_t valueSize, void *value, size_t *valueSizeRet) const;
static bool IsTypeValid(MemObjectType imageType);
static bool IsValid(const _cl_mem *image); static bool IsValid(const _cl_mem *image);
public: public:
~Image() override; ~Image() override;
cl_mem_object_type getType() const final; MemObjectType getType() const final;
const cl_image_format &getFormat() const; const cl_image_format &getFormat() const;
const ImageDescriptor &getDescriptor() const; const ImageDescriptor &getDescriptor() const;
...@@ -54,7 +55,12 @@ class Image final : public Memory ...@@ -54,7 +55,12 @@ class Image final : public Memory
friend class Object; friend class Object;
}; };
inline cl_mem_object_type Image::getType() const inline bool Image::IsValid(const _cl_mem *image)
{
return Memory::IsValid(image) && IsTypeValid(image->cast<Memory>().getType());
}
inline MemObjectType Image::getType() const
{ {
return mDesc.type; return mDesc.type;
} }
......
...@@ -15,6 +15,11 @@ ...@@ -15,6 +15,11 @@
namespace cl namespace cl
{ {
cl_int Kernel::setArg(cl_uint argIndex, size_t argSize, const void *argValue)
{
return mImpl->setArg(argIndex, argSize, argValue);
}
cl_int Kernel::getInfo(KernelInfo name, size_t valueSize, void *value, size_t *valueSizeRet) const cl_int Kernel::getInfo(KernelInfo name, size_t valueSize, void *value, size_t *valueSizeRet) const
{ {
cl_uint valUInt = 0u; cl_uint valUInt = 0u;
......
...@@ -19,6 +19,8 @@ class Kernel final : public _cl_kernel, public Object ...@@ -19,6 +19,8 @@ class Kernel final : public _cl_kernel, public Object
public: public:
// Front end entry functions, only called from OpenCL entry points // Front end entry functions, only called from OpenCL entry points
cl_int setArg(cl_uint argIndex, size_t argSize, const void *argValue);
cl_int getInfo(KernelInfo name, size_t valueSize, void *value, size_t *valueSizeRet) const; cl_int getInfo(KernelInfo name, size_t valueSize, void *value, size_t *valueSizeRet) const;
cl_int getWorkGroupInfo(cl_device_id device, cl_int getWorkGroupInfo(cl_device_id device,
......
...@@ -15,6 +15,12 @@ ...@@ -15,6 +15,12 @@
namespace cl namespace cl
{ {
cl_int Memory::setDestructorCallback(MemoryCB pfnNotify, void *userData)
{
mDestructorCallbacks.emplace(pfnNotify, userData);
return CL_SUCCESS;
}
cl_int Memory::getInfo(MemInfo name, size_t valueSize, void *value, size_t *valueSizeRet) const cl_int Memory::getInfo(MemInfo name, size_t valueSize, void *value, size_t *valueSizeRet) const
{ {
static_assert( static_assert(
...@@ -29,7 +35,7 @@ cl_int Memory::getInfo(MemInfo name, size_t valueSize, void *value, size_t *valu ...@@ -29,7 +35,7 @@ cl_int Memory::getInfo(MemInfo name, size_t valueSize, void *value, size_t *valu
switch (name) switch (name)
{ {
case MemInfo::Type: case MemInfo::Type:
valUInt = getType(); valUInt = ToCLenum(getType());
copyValue = &valUInt; copyValue = &valUInt;
copySize = sizeof(valUInt); copySize = sizeof(valUInt);
break; break;
...@@ -101,7 +107,16 @@ cl_int Memory::getInfo(MemInfo name, size_t valueSize, void *value, size_t *valu ...@@ -101,7 +107,16 @@ cl_int Memory::getInfo(MemInfo name, size_t valueSize, void *value, size_t *valu
return CL_SUCCESS; return CL_SUCCESS;
} }
Memory::~Memory() = default; Memory::~Memory()
{
while (!mDestructorCallbacks.empty())
{
const MemoryCB callback = mDestructorCallbacks.top().first;
void *const userData = mDestructorCallbacks.top().second;
mDestructorCallbacks.pop();
callback(this, userData);
}
}
MemFlags Memory::getEffectiveFlags() const MemFlags Memory::getEffectiveFlags() const
{ {
......
...@@ -12,6 +12,8 @@ ...@@ -12,6 +12,8 @@
#include "libANGLE/CLObject.h" #include "libANGLE/CLObject.h"
#include "libANGLE/renderer/CLMemoryImpl.h" #include "libANGLE/renderer/CLMemoryImpl.h"
#include <stack>
namespace cl namespace cl
{ {
...@@ -20,6 +22,8 @@ class Memory : public _cl_mem, public Object ...@@ -20,6 +22,8 @@ class Memory : public _cl_mem, public Object
public: public:
// Front end entry functions, only called from OpenCL entry points // Front end entry functions, only called from OpenCL entry points
cl_int setDestructorCallback(MemoryCB pfnNotify, void *userData);
cl_int getInfo(MemInfo name, size_t valueSize, void *value, size_t *valueSizeRet) const; cl_int getInfo(MemInfo name, size_t valueSize, void *value, size_t *valueSizeRet) const;
public: public:
...@@ -27,7 +31,7 @@ class Memory : public _cl_mem, public Object ...@@ -27,7 +31,7 @@ class Memory : public _cl_mem, public Object
~Memory() override; ~Memory() override;
virtual cl_mem_object_type getType() const = 0; virtual MemObjectType getType() const = 0;
const Context &getContext() const; const Context &getContext() const;
const PropArray &getProperties() const; const PropArray &getProperties() const;
...@@ -42,7 +46,11 @@ class Memory : public _cl_mem, public Object ...@@ -42,7 +46,11 @@ class Memory : public _cl_mem, public Object
MemFlags getEffectiveFlags() const; MemFlags getEffectiveFlags() const;
static Memory *Cast(cl_mem memobj);
protected: protected:
using CallbackData = std::pair<MemoryCB, void *>;
Memory(const Buffer &buffer, Memory(const Buffer &buffer,
Context &context, Context &context,
PropArray &&properties, PropArray &&properties,
...@@ -77,6 +85,7 @@ class Memory : public _cl_mem, public Object ...@@ -77,6 +85,7 @@ class Memory : public _cl_mem, public Object
const rx::CLMemoryImpl::Ptr mImpl; const rx::CLMemoryImpl::Ptr mImpl;
const size_t mSize; const size_t mSize;
std::stack<CallbackData> mDestructorCallbacks;
cl_uint mMapCount = 0u; cl_uint mMapCount = 0u;
friend class Buffer; friend class Buffer;
...@@ -124,6 +133,11 @@ inline T &Memory::getImpl() const ...@@ -124,6 +133,11 @@ inline T &Memory::getImpl() const
return static_cast<T &>(*mImpl); return static_cast<T &>(*mImpl);
} }
inline Memory *Memory::Cast(cl_mem memobj)
{
return static_cast<Memory *>(memobj);
}
} // namespace cl } // namespace cl
#endif // LIBANGLE_CLMEMORY_H_ #endif // LIBANGLE_CLMEMORY_H_
...@@ -70,16 +70,7 @@ void Platform::Initialize(const cl_icd_dispatch &dispatch, ...@@ -70,16 +70,7 @@ void Platform::Initialize(const cl_icd_dispatch &dispatch,
ERR() << "Already initialized"; ERR() << "Already initialized";
return; return;
} }
Dispatch::sDispatch = &dispatch;
_cl_platform_id::sDispatch = &dispatch;
_cl_device_id::sDispatch = &dispatch;
_cl_context::sDispatch = &dispatch;
_cl_command_queue::sDispatch = &dispatch;
_cl_mem::sDispatch = &dispatch;
_cl_program::sDispatch = &dispatch;
_cl_kernel::sDispatch = &dispatch;
_cl_event::sDispatch = &dispatch;
_cl_sampler::sDispatch = &dispatch;
platforms.reserve(createFuncs.size()); platforms.reserve(createFuncs.size());
while (!createFuncs.empty()) while (!createFuncs.empty())
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
// Include frequently used standard headers // Include frequently used standard headers
#include <algorithm> #include <algorithm>
#include <array>
#include <functional> #include <functional>
#include <list> #include <list>
#include <memory> #include <memory>
...@@ -61,7 +62,7 @@ using ProgramPtrs = std::vector<ProgramPtr>; ...@@ -61,7 +62,7 @@ using ProgramPtrs = std::vector<ProgramPtr>;
struct ImageDescriptor struct ImageDescriptor
{ {
cl_mem_object_type type; MemObjectType type;
size_t width; size_t width;
size_t height; size_t height;
size_t depth; size_t depth;
......
...@@ -41,6 +41,12 @@ class CLContextImpl : angle::NonCopyable ...@@ -41,6 +41,12 @@ class CLContextImpl : angle::NonCopyable
void *hostPtr, void *hostPtr,
cl_int &errorCode) = 0; cl_int &errorCode) = 0;
virtual cl_int getSupportedImageFormats(cl::MemFlags flags,
cl::MemObjectType imageType,
cl_uint numEntries,
cl_image_format *imageFormats,
cl_uint *numImageFormats) = 0;
virtual CLSamplerImpl::Ptr createSampler(const cl::Sampler &sampler, cl_int &errorCode) = 0; virtual CLSamplerImpl::Ptr createSampler(const cl::Sampler &sampler, cl_int &errorCode) = 0;
virtual CLProgramImpl::Ptr createProgramWithSource(const cl::Program &program, virtual CLProgramImpl::Ptr createProgramWithSource(const cl::Program &program,
......
...@@ -28,6 +28,11 @@ class CLEventImpl : angle::NonCopyable ...@@ -28,6 +28,11 @@ class CLEventImpl : angle::NonCopyable
virtual cl_int setCallback(cl::Event &event, cl_int commandExecCallbackType) = 0; virtual cl_int setCallback(cl::Event &event, cl_int commandExecCallbackType) = 0;
virtual cl_int getProfilingInfo(cl::ProfilingInfo name,
size_t valueSize,
void *value,
size_t *valueSizeRet) = 0;
protected: protected:
const cl::Event &mEvent; const cl::Event &mEvent;
}; };
......
...@@ -31,12 +31,12 @@ class CLKernelImpl : angle::NonCopyable ...@@ -31,12 +31,12 @@ class CLKernelImpl : angle::NonCopyable
WorkGroupInfo(WorkGroupInfo &&); WorkGroupInfo(WorkGroupInfo &&);
WorkGroupInfo &operator=(WorkGroupInfo &&); WorkGroupInfo &operator=(WorkGroupInfo &&);
size_t mGlobalWorkSize[3] = {}; std::array<size_t, 3u> mGlobalWorkSize = {};
size_t mWorkGroupSize = 0u; size_t mWorkGroupSize = 0u;
size_t mCompileWorkGroupSize[3] = {}; std::array<size_t, 3u> mCompileWorkGroupSize = {};
cl_ulong mLocalMemSize = 0u; cl_ulong mLocalMemSize = 0u;
size_t mPrefWorkGroupSizeMultiple = 0u; size_t mPrefWorkGroupSizeMultiple = 0u;
cl_ulong mPrivateMemSize = 0u; cl_ulong mPrivateMemSize = 0u;
}; };
struct ArgInfo struct ArgInfo
...@@ -83,6 +83,8 @@ class CLKernelImpl : angle::NonCopyable ...@@ -83,6 +83,8 @@ class CLKernelImpl : angle::NonCopyable
CLKernelImpl(const cl::Kernel &kernel); CLKernelImpl(const cl::Kernel &kernel);
virtual ~CLKernelImpl(); virtual ~CLKernelImpl();
virtual cl_int setArg(cl_uint argIndex, size_t argSize, const void *argValue) = 0;
virtual Info createInfo(cl_int &errorCode) const = 0; virtual Info createInfo(cl_int &errorCode) const = 0;
protected: protected:
......
...@@ -7,11 +7,14 @@ ...@@ -7,11 +7,14 @@
#include "libANGLE/renderer/cl/CLCommandQueueCL.h" #include "libANGLE/renderer/cl/CLCommandQueueCL.h"
#include "libANGLE/renderer/cl/CLContextCL.h"
#include "libANGLE/renderer/cl/CLEventCL.h" #include "libANGLE/renderer/cl/CLEventCL.h"
#include "libANGLE/renderer/cl/CLKernelCL.h" #include "libANGLE/renderer/cl/CLKernelCL.h"
#include "libANGLE/renderer/cl/CLMemoryCL.h" #include "libANGLE/renderer/cl/CLMemoryCL.h"
#include "libANGLE/CLBuffer.h" #include "libANGLE/CLBuffer.h"
#include "libANGLE/CLCommandQueue.h"
#include "libANGLE/CLContext.h"
#include "libANGLE/CLImage.h" #include "libANGLE/CLImage.h"
#include "libANGLE/CLKernel.h" #include "libANGLE/CLKernel.h"
#include "libANGLE/CLMemory.h" #include "libANGLE/CLMemory.h"
...@@ -36,10 +39,24 @@ void CheckCreateEvent(cl_int errorCode, cl_event nativeEvent, CLEventImpl::Creat ...@@ -36,10 +39,24 @@ void CheckCreateEvent(cl_int errorCode, cl_event nativeEvent, CLEventImpl::Creat
CLCommandQueueCL::CLCommandQueueCL(const cl::CommandQueue &commandQueue, cl_command_queue native) CLCommandQueueCL::CLCommandQueueCL(const cl::CommandQueue &commandQueue, cl_command_queue native)
: CLCommandQueueImpl(commandQueue), mNative(native) : CLCommandQueueImpl(commandQueue), mNative(native)
{} {
if (commandQueue.getProperties().isSet(CL_QUEUE_ON_DEVICE))
{
commandQueue.getContext().getImpl<CLContextCL>().mDeviceQueues.emplace(
commandQueue.getNative());
}
}
CLCommandQueueCL::~CLCommandQueueCL() CLCommandQueueCL::~CLCommandQueueCL()
{ {
if (mCommandQueue.getProperties().isSet(CL_QUEUE_ON_DEVICE))
{
const size_t numRemoved =
mCommandQueue.getContext().getImpl<CLContextCL>().mDeviceQueues.erase(
mCommandQueue.getNative());
ASSERT(numRemoved == 1u);
}
if (mNative->getDispatch().clReleaseCommandQueue(mNative) != CL_SUCCESS) if (mNative->getDispatch().clReleaseCommandQueue(mNative) != CL_SUCCESS)
{ {
ERR() << "Error while releasing CL command-queue"; ERR() << "Error while releasing CL command-queue";
......
...@@ -20,6 +20,8 @@ class CLCommandQueueCL : public CLCommandQueueImpl ...@@ -20,6 +20,8 @@ class CLCommandQueueCL : public CLCommandQueueImpl
CLCommandQueueCL(const cl::CommandQueue &commandQueue, cl_command_queue native); CLCommandQueueCL(const cl::CommandQueue &commandQueue, cl_command_queue native);
~CLCommandQueueCL() override; ~CLCommandQueueCL() override;
cl_command_queue getNative() const;
cl_int setProperty(cl::CommandQueueProperties properties, cl_bool enable) override; cl_int setProperty(cl::CommandQueueProperties properties, cl_bool enable) override;
cl_int enqueueReadBuffer(const cl::Buffer &buffer, cl_int enqueueReadBuffer(const cl::Buffer &buffer,
...@@ -212,6 +214,11 @@ class CLCommandQueueCL : public CLCommandQueueImpl ...@@ -212,6 +214,11 @@ class CLCommandQueueCL : public CLCommandQueueImpl
const cl_command_queue mNative; const cl_command_queue mNative;
}; };
inline cl_command_queue CLCommandQueueCL::getNative() const
{
return mNative;
}
} // namespace rx } // namespace rx
#endif // LIBANGLE_RENDERER_CL_CLCOMMANDQUEUECL_H_ #endif // LIBANGLE_RENDERER_CL_CLCOMMANDQUEUECL_H_
...@@ -135,12 +135,12 @@ CLMemoryImpl::Ptr CLContextCL::createImage(const cl::Image &image, ...@@ -135,12 +135,12 @@ CLMemoryImpl::Ptr CLContextCL::createImage(const cl::Image &image,
if (mContext.getPlatform().isVersionOrNewer(1u, 2u)) if (mContext.getPlatform().isVersionOrNewer(1u, 2u))
{ {
const cl_mem_object_type nativeType = cl::ToCLenum(desc.type);
const cl_mem nativeParent =
image.getParent() ? image.getParent()->getImpl<CLMemoryCL>().getNative() : nullptr;
const cl_image_desc nativeDesc = { const cl_image_desc nativeDesc = {
desc.type, desc.width, nativeType, desc.width, desc.height, desc.depth, desc.arraySize,
desc.height, desc.depth, desc.rowPitch, desc.slicePitch, desc.numMipLevels, desc.numSamples, {nativeParent}};
desc.arraySize, desc.rowPitch,
desc.slicePitch, desc.numMipLevels,
desc.numSamples, {cl::Memory::CastNative(image.getParent().get())}};
if (image.getProperties().empty()) if (image.getProperties().empty())
{ {
...@@ -158,12 +158,12 @@ CLMemoryImpl::Ptr CLContextCL::createImage(const cl::Image &image, ...@@ -158,12 +158,12 @@ CLMemoryImpl::Ptr CLContextCL::createImage(const cl::Image &image,
{ {
switch (desc.type) switch (desc.type)
{ {
case CL_MEM_OBJECT_IMAGE2D: case cl::MemObjectType::Image2D:
nativeImage = mNative->getDispatch().clCreateImage2D( nativeImage = mNative->getDispatch().clCreateImage2D(
mNative, image.getFlags().get(), &format, desc.width, desc.height, mNative, image.getFlags().get(), &format, desc.width, desc.height,
desc.rowPitch, hostPtr, &errorCode); desc.rowPitch, hostPtr, &errorCode);
break; break;
case CL_MEM_OBJECT_IMAGE3D: case cl::MemObjectType::Image3D:
nativeImage = mNative->getDispatch().clCreateImage3D( nativeImage = mNative->getDispatch().clCreateImage3D(
mNative, image.getFlags().get(), &format, desc.width, desc.height, desc.depth, mNative, image.getFlags().get(), &format, desc.width, desc.height, desc.depth,
desc.rowPitch, desc.slicePitch, hostPtr, &errorCode); desc.rowPitch, desc.slicePitch, hostPtr, &errorCode);
...@@ -178,6 +178,16 @@ CLMemoryImpl::Ptr CLContextCL::createImage(const cl::Image &image, ...@@ -178,6 +178,16 @@ CLMemoryImpl::Ptr CLContextCL::createImage(const cl::Image &image,
return CLMemoryImpl::Ptr(nativeImage != nullptr ? new CLMemoryCL(image, nativeImage) : nullptr); return CLMemoryImpl::Ptr(nativeImage != nullptr ? new CLMemoryCL(image, nativeImage) : nullptr);
} }
cl_int CLContextCL::getSupportedImageFormats(cl::MemFlags flags,
cl::MemObjectType imageType,
cl_uint numEntries,
cl_image_format *imageFormats,
cl_uint *numImageFormats)
{
return mNative->getDispatch().clGetSupportedImageFormats(
mNative, flags.get(), cl::ToCLenum(imageType), numEntries, imageFormats, numImageFormats);
}
CLSamplerImpl::Ptr CLContextCL::createSampler(const cl::Sampler &sampler, cl_int &errorCode) CLSamplerImpl::Ptr CLContextCL::createSampler(const cl::Sampler &sampler, cl_int &errorCode)
{ {
cl_sampler nativeSampler = nullptr; cl_sampler nativeSampler = nullptr;
......
...@@ -8,8 +8,12 @@ ...@@ -8,8 +8,12 @@
#ifndef LIBANGLE_RENDERER_CL_CLCONTEXTCL_H_ #ifndef LIBANGLE_RENDERER_CL_CLCONTEXTCL_H_
#define LIBANGLE_RENDERER_CL_CLCONTEXTCL_H_ #define LIBANGLE_RENDERER_CL_CLCONTEXTCL_H_
#include "libANGLE/renderer/cl/cl_types.h"
#include "libANGLE/renderer/CLContextImpl.h" #include "libANGLE/renderer/CLContextImpl.h"
#include <unordered_set>
namespace rx namespace rx
{ {
...@@ -19,6 +23,10 @@ class CLContextCL : public CLContextImpl ...@@ -19,6 +23,10 @@ class CLContextCL : public CLContextImpl
CLContextCL(const cl::Context &context, cl_context native); CLContextCL(const cl::Context &context, cl_context native);
~CLContextCL() override; ~CLContextCL() override;
bool hasMemory(cl_mem memory) const;
bool hasSampler(cl_sampler sampler) const;
bool hasDeviceQueue(cl_command_queue queue) const;
cl::DevicePtrs getDevices(cl_int &errorCode) const override; cl::DevicePtrs getDevices(cl_int &errorCode) const override;
CLCommandQueueImpl::Ptr createCommandQueue(const cl::CommandQueue &commandQueue, CLCommandQueueImpl::Ptr createCommandQueue(const cl::CommandQueue &commandQueue,
...@@ -35,6 +43,12 @@ class CLContextCL : public CLContextImpl ...@@ -35,6 +43,12 @@ class CLContextCL : public CLContextImpl
void *hostPtr, void *hostPtr,
cl_int &errorCode) override; cl_int &errorCode) override;
cl_int getSupportedImageFormats(cl::MemFlags flags,
cl::MemObjectType imageType,
cl_uint numEntries,
cl_image_format *imageFormats,
cl_uint *numImageFormats) override;
CLSamplerImpl::Ptr createSampler(const cl::Sampler &sampler, cl_int &errorCode) override; CLSamplerImpl::Ptr createSampler(const cl::Sampler &sampler, cl_int &errorCode) override;
CLProgramImpl::Ptr createProgramWithSource(const cl::Program &program, CLProgramImpl::Ptr createProgramWithSource(const cl::Program &program,
...@@ -69,8 +83,31 @@ class CLContextCL : public CLContextImpl ...@@ -69,8 +83,31 @@ class CLContextCL : public CLContextImpl
private: private:
const cl_context mNative; const cl_context mNative;
std::unordered_set<const _cl_mem *> mMemories;
std::unordered_set<const _cl_sampler *> mSamplers;
std::unordered_set<const _cl_command_queue *> mDeviceQueues;
friend class CLCommandQueueCL;
friend class CLMemoryCL;
friend class CLSamplerCL;
}; };
inline bool CLContextCL::hasMemory(cl_mem memory) const
{
return mMemories.find(memory) != mMemories.cend();
}
inline bool CLContextCL::hasSampler(cl_sampler sampler) const
{
return mSamplers.find(sampler) != mSamplers.cend();
}
inline bool CLContextCL::hasDeviceQueue(cl_command_queue queue) const
{
return mDeviceQueues.find(queue) != mDeviceQueues.cend();
}
} // namespace rx } // namespace rx
#endif // LIBANGLE_RENDERER_CL_CLCONTEXTCL_H_ #endif // LIBANGLE_RENDERER_CL_CLCONTEXTCL_H_
...@@ -101,6 +101,14 @@ CLDeviceImpl::Info CLDeviceCL::createInfo(cl::DeviceType type) const ...@@ -101,6 +101,14 @@ CLDeviceImpl::Info CLDeviceCL::createInfo(cl::DeviceType type) const
return Info{}; return Info{};
} }
info.mVersionStr.assign(valString.data()); info.mVersionStr.assign(valString.data());
// Limit version number to supported version
if (info.mVersionStr[7] != '1')
{
info.mVersionStr[7] = '1';
info.mVersionStr[9] = '2';
}
info.mVersion = ExtractCLVersion(info.mVersionStr); info.mVersion = ExtractCLVersion(info.mVersionStr);
if (info.mVersion == 0u) if (info.mVersion == 0u)
{ {
......
...@@ -41,6 +41,15 @@ cl_int CLEventCL::setCallback(cl::Event &event, cl_int commandExecCallbackType) ...@@ -41,6 +41,15 @@ cl_int CLEventCL::setCallback(cl::Event &event, cl_int commandExecCallbackType)
&event); &event);
} }
cl_int CLEventCL::getProfilingInfo(cl::ProfilingInfo name,
size_t valueSize,
void *value,
size_t *valueSizeRet)
{
return mNative->getDispatch().clGetEventProfilingInfo(mNative, cl::ToCLenum(name), valueSize,
value, valueSizeRet);
}
std::vector<cl_event> CLEventCL::Cast(const cl::EventPtrs &events) std::vector<cl_event> CLEventCL::Cast(const cl::EventPtrs &events)
{ {
std::vector<cl_event> nativeEvents; std::vector<cl_event> nativeEvents;
......
...@@ -29,6 +29,11 @@ class CLEventCL : public CLEventImpl ...@@ -29,6 +29,11 @@ class CLEventCL : public CLEventImpl
cl_int setCallback(cl::Event &event, cl_int commandExecCallbackType) override; cl_int setCallback(cl::Event &event, cl_int commandExecCallbackType) override;
cl_int getProfilingInfo(cl::ProfilingInfo name,
size_t valueSize,
void *value,
size_t *valueSizeRet) override;
static std::vector<cl_event> Cast(const cl::EventPtrs &events); static std::vector<cl_event> Cast(const cl::EventPtrs &events);
private: private:
......
...@@ -7,13 +7,19 @@ ...@@ -7,13 +7,19 @@
#include "libANGLE/renderer/cl/CLKernelCL.h" #include "libANGLE/renderer/cl/CLKernelCL.h"
#include "libANGLE/renderer/cl/CLCommandQueueCL.h"
#include "libANGLE/renderer/cl/CLContextCL.h"
#include "libANGLE/renderer/cl/CLDeviceCL.h" #include "libANGLE/renderer/cl/CLDeviceCL.h"
#include "libANGLE/renderer/cl/CLMemoryCL.h"
#include "libANGLE/renderer/cl/CLSamplerCL.h"
#include "libANGLE/CLCommandQueue.h"
#include "libANGLE/CLContext.h" #include "libANGLE/CLContext.h"
#include "libANGLE/CLKernel.h" #include "libANGLE/CLKernel.h"
#include "libANGLE/CLMemory.h"
#include "libANGLE/CLPlatform.h" #include "libANGLE/CLPlatform.h"
#include "libANGLE/CLProgram.h" #include "libANGLE/CLProgram.h"
#include "libANGLE/Debug.h" #include "libANGLE/CLSampler.h"
namespace rx namespace rx
{ {
...@@ -42,7 +48,11 @@ bool GetArgInfo(cl_kernel kernel, ...@@ -42,7 +48,11 @@ bool GetArgInfo(cl_kernel kernel,
{ {
errorCode = kernel->getDispatch().clGetKernelArgInfo(kernel, index, cl::ToCLenum(name), errorCode = kernel->getDispatch().clGetKernelArgInfo(kernel, index, cl::ToCLenum(name),
sizeof(T), &value, nullptr); sizeof(T), &value, nullptr);
return errorCode == CL_SUCCESS || errorCode == CL_KERNEL_ARG_INFO_NOT_AVAILABLE; if (errorCode == CL_KERNEL_ARG_INFO_NOT_AVAILABLE)
{
errorCode = CL_SUCCESS;
}
return errorCode == CL_SUCCESS;
} }
template <typename T> template <typename T>
...@@ -64,6 +74,7 @@ bool GetArgString(cl_kernel kernel, ...@@ -64,6 +74,7 @@ bool GetArgString(cl_kernel kernel,
nullptr, &size); nullptr, &size);
if (errorCode == CL_KERNEL_ARG_INFO_NOT_AVAILABLE) if (errorCode == CL_KERNEL_ARG_INFO_NOT_AVAILABLE)
{ {
errorCode = CL_SUCCESS;
return true; return true;
} }
else if (errorCode != CL_SUCCESS) else if (errorCode != CL_SUCCESS)
...@@ -115,6 +126,47 @@ CLKernelCL::~CLKernelCL() ...@@ -115,6 +126,47 @@ CLKernelCL::~CLKernelCL()
} }
} }
cl_int CLKernelCL::setArg(cl_uint argIndex, size_t argSize, const void *argValue)
{
void *value = nullptr;
if (argValue != nullptr)
{
// If argument is a CL object, fetch the mapped value
const CLContextCL &ctx = mKernel.getProgram().getContext().getImpl<CLContextCL>();
if (argSize == sizeof(cl_mem))
{
cl_mem memory = *static_cast<const cl_mem *>(argValue);
if (ctx.hasMemory(memory))
{
value = memory->cast<cl::Memory>().getImpl<CLMemoryCL>().getNative();
}
}
if (value == nullptr && argSize == sizeof(cl_sampler))
{
cl_sampler sampler = *static_cast<const cl_sampler *>(argValue);
if (ctx.hasSampler(sampler))
{
value = sampler->cast<cl::Sampler>().getImpl<CLSamplerCL>().getNative();
}
}
if (value == nullptr && argSize == sizeof(cl_command_queue))
{
cl_command_queue queue = *static_cast<const cl_command_queue *>(argValue);
if (ctx.hasDeviceQueue(queue))
{
value = queue->cast<cl::CommandQueue>().getImpl<CLCommandQueueCL>().getNative();
}
}
}
// If mapped value was found, use it instead of original value
if (value != nullptr)
{
argValue = &value;
}
return mNative->getDispatch().clSetKernelArg(mNative, argIndex, argSize, argValue);
}
CLKernelImpl::Info CLKernelCL::createInfo(cl_int &errorCode) const CLKernelImpl::Info CLKernelCL::createInfo(cl_int &errorCode) const
{ {
const cl::Context &ctx = mKernel.getProgram().getContext(); const cl::Context &ctx = mKernel.getProgram().getContext();
...@@ -133,7 +185,9 @@ CLKernelImpl::Info CLKernelCL::createInfo(cl_int &errorCode) const ...@@ -133,7 +185,9 @@ CLKernelImpl::Info CLKernelCL::createInfo(cl_int &errorCode) const
{ {
const cl_device_id device = ctx.getDevices()[index]->getImpl<CLDeviceCL>().getNative(); const cl_device_id device = ctx.getDevices()[index]->getImpl<CLDeviceCL>().getNative();
WorkGroupInfo &workGroup = info.mWorkGroups[index]; WorkGroupInfo &workGroup = info.mWorkGroups[index];
if ((ctx.getPlatform().isVersionOrNewer(1u, 2u) && if ((ctx.getPlatform().isVersionOrNewer(1u, 2u) &&
ctx.getDevices()[index]->supportsBuiltInKernel(info.mFunctionName) &&
!GetWorkGroupInfo(mNative, device, cl::KernelWorkGroupInfo::GlobalWorkSize, !GetWorkGroupInfo(mNative, device, cl::KernelWorkGroupInfo::GlobalWorkSize,
workGroup.mGlobalWorkSize, errorCode)) || workGroup.mGlobalWorkSize, errorCode)) ||
!GetWorkGroupInfo(mNative, device, cl::KernelWorkGroupInfo::WorkGroupSize, !GetWorkGroupInfo(mNative, device, cl::KernelWorkGroupInfo::WorkGroupSize,
......
...@@ -23,6 +23,8 @@ class CLKernelCL : public CLKernelImpl ...@@ -23,6 +23,8 @@ class CLKernelCL : public CLKernelImpl
cl_kernel getNative() const; cl_kernel getNative() const;
cl_int setArg(cl_uint argIndex, size_t argSize, const void *argValue) override;
Info createInfo(cl_int &errorCode) const override; Info createInfo(cl_int &errorCode) const override;
private: private:
......
...@@ -7,17 +7,26 @@ ...@@ -7,17 +7,26 @@
#include "libANGLE/renderer/cl/CLMemoryCL.h" #include "libANGLE/renderer/cl/CLMemoryCL.h"
#include "libANGLE/renderer/cl/CLContextCL.h"
#include "libANGLE/CLBuffer.h" #include "libANGLE/CLBuffer.h"
#include "libANGLE/CLContext.h"
namespace rx namespace rx
{ {
CLMemoryCL::CLMemoryCL(const cl::Memory &memory, cl_mem native) CLMemoryCL::CLMemoryCL(const cl::Memory &memory, cl_mem native)
: CLMemoryImpl(memory), mNative(native) : CLMemoryImpl(memory), mNative(native)
{} {
memory.getContext().getImpl<CLContextCL>().mMemories.emplace(memory.getNative());
}
CLMemoryCL::~CLMemoryCL() CLMemoryCL::~CLMemoryCL()
{ {
const size_t numRemoved =
mMemory.getContext().getImpl<CLContextCL>().mMemories.erase(mMemory.getNative());
ASSERT(numRemoved == 1u);
if (mNative->getDispatch().clReleaseMemObject(mNative) != CL_SUCCESS) if (mNative->getDispatch().clReleaseMemObject(mNative) != CL_SUCCESS)
{ {
ERR() << "Error while releasing CL memory object"; ERR() << "Error while releasing CL memory object";
......
...@@ -129,6 +129,13 @@ CLPlatformImpl::Info CLPlatformCL::createInfo() const ...@@ -129,6 +129,13 @@ CLPlatformImpl::Info CLPlatformCL::createInfo() const
info.mName = GetPlatformString(mNative, cl::PlatformInfo::Name); info.mName = GetPlatformString(mNative, cl::PlatformInfo::Name);
info.mExtensions = GetPlatformString(mNative, cl::PlatformInfo::Extensions); info.mExtensions = GetPlatformString(mNative, cl::PlatformInfo::Extensions);
// Limit version number to supported version
if (info.mVersionStr[7] != '1')
{
info.mVersionStr[7] = '1';
info.mVersionStr[9] = '2';
}
if (vendor.empty() || info.mProfile.empty() || info.mVersionStr.empty() || info.mName.empty() || if (vendor.empty() || info.mProfile.empty() || info.mVersionStr.empty() || info.mName.empty() ||
info.mExtensions.empty()) info.mExtensions.empty())
{ {
......
...@@ -134,7 +134,7 @@ cl_int CLProgramCL::createKernels(cl_uint numKernels, ...@@ -134,7 +134,7 @@ cl_int CLProgramCL::createKernels(cl_uint numKernels,
std::vector<cl_kernel> nativeKernels(numKernels, nullptr); std::vector<cl_kernel> nativeKernels(numKernels, nullptr);
const cl_int errorCode = mNative->getDispatch().clCreateKernelsInProgram( const cl_int errorCode = mNative->getDispatch().clCreateKernelsInProgram(
mNative, numKernels, nativeKernels.data(), nullptr); mNative, numKernels, nativeKernels.data(), numKernelsRet);
if (errorCode == CL_SUCCESS) if (errorCode == CL_SUCCESS)
{ {
for (cl_kernel nativeKernel : nativeKernels) for (cl_kernel nativeKernel : nativeKernels)
......
...@@ -7,17 +7,26 @@ ...@@ -7,17 +7,26 @@
#include "libANGLE/renderer/cl/CLSamplerCL.h" #include "libANGLE/renderer/cl/CLSamplerCL.h"
#include "libANGLE/Debug.h" #include "libANGLE/renderer/cl/CLContextCL.h"
#include "libANGLE/CLContext.h"
#include "libANGLE/CLSampler.h"
namespace rx namespace rx
{ {
CLSamplerCL::CLSamplerCL(const cl::Sampler &sampler, cl_sampler native) CLSamplerCL::CLSamplerCL(const cl::Sampler &sampler, cl_sampler native)
: CLSamplerImpl(sampler), mNative(native) : CLSamplerImpl(sampler), mNative(native)
{} {
sampler.getContext().getImpl<CLContextCL>().mSamplers.emplace(sampler.getNative());
}
CLSamplerCL::~CLSamplerCL() CLSamplerCL::~CLSamplerCL()
{ {
const size_t numRemoved =
mSampler.getContext().getImpl<CLContextCL>().mSamplers.erase(mSampler.getNative());
ASSERT(numRemoved == 1u);
if (mNative->getDispatch().clReleaseSampler(mNative) != CL_SUCCESS) if (mNative->getDispatch().clReleaseSampler(mNative) != CL_SUCCESS)
{ {
ERR() << "Error while releasing CL sampler"; ERR() << "Error while releasing CL sampler";
......
...@@ -21,10 +21,17 @@ class CLSamplerCL : public CLSamplerImpl ...@@ -21,10 +21,17 @@ class CLSamplerCL : public CLSamplerImpl
CLSamplerCL(const cl::Sampler &sampler, cl_sampler native); CLSamplerCL(const cl::Sampler &sampler, cl_sampler native);
~CLSamplerCL() override; ~CLSamplerCL() override;
cl_sampler getNative() const;
private: private:
const cl_sampler mNative; const cl_sampler mNative;
}; };
inline cl_sampler CLSamplerCL::getNative() const
{
return mNative;
}
} // namespace rx } // namespace rx
#endif // LIBANGLE_RENDERER_CL_CLSAMPLERCL_H_ #endif // LIBANGLE_RENDERER_CL_CLSAMPLERCL_H_
...@@ -13,9 +13,15 @@ ...@@ -13,9 +13,15 @@
namespace rx namespace rx
{ {
class CLCommandQueueCL;
class CLContextCL; class CLContextCL;
class CLDeviceCL; class CLDeviceCL;
class CLEventCL;
class CLKernelCL;
class CLMemoryCL;
class CLPlatformCL; class CLPlatformCL;
class CLProgramCL;
class CLSamplerCL;
} // namespace rx } // namespace rx
......
...@@ -309,8 +309,8 @@ cl_int GetSupportedImageFormats(cl_context context, ...@@ -309,8 +309,8 @@ cl_int GetSupportedImageFormats(cl_context context,
cl_image_format *image_formats, cl_image_format *image_formats,
cl_uint *num_image_formats) cl_uint *num_image_formats)
{ {
WARN_NOT_SUPPORTED(GetSupportedImageFormats); return context->cast<Context>().getSupportedImageFormats(flags, image_type, num_entries,
return 0; image_formats, num_image_formats);
} }
cl_int GetMemObjectInfo(cl_mem memobj, cl_int GetMemObjectInfo(cl_mem memobj,
...@@ -347,8 +347,7 @@ cl_int SetMemObjectDestructorCallback(cl_mem memobj, ...@@ -347,8 +347,7 @@ cl_int SetMemObjectDestructorCallback(cl_mem memobj,
void(CL_CALLBACK *pfn_notify)(cl_mem memobj, void *user_data), void(CL_CALLBACK *pfn_notify)(cl_mem memobj, void *user_data),
void *user_data) void *user_data)
{ {
WARN_NOT_SUPPORTED(SetMemObjectDestructorCallback); return memobj->cast<Memory>().setDestructorCallback(pfn_notify, user_data);
return 0;
} }
void *SVMAlloc(cl_context context, SVM_MemFlags flags, size_t size, cl_uint alignment) void *SVMAlloc(cl_context context, SVM_MemFlags flags, size_t size, cl_uint alignment)
...@@ -567,8 +566,7 @@ cl_int ReleaseKernel(cl_kernel kernel) ...@@ -567,8 +566,7 @@ cl_int ReleaseKernel(cl_kernel kernel)
cl_int SetKernelArg(cl_kernel kernel, cl_uint arg_index, size_t arg_size, const void *arg_value) cl_int SetKernelArg(cl_kernel kernel, cl_uint arg_index, size_t arg_size, const void *arg_value)
{ {
WARN_NOT_SUPPORTED(SetKernelArg); return kernel->cast<Kernel>().setArg(arg_index, arg_size, arg_value);
return 0;
} }
cl_int SetKernelArgSVMPointer(cl_kernel kernel, cl_uint arg_index, const void *arg_value) cl_int SetKernelArgSVMPointer(cl_kernel kernel, cl_uint arg_index, const void *arg_value)
...@@ -688,8 +686,8 @@ cl_int GetEventProfilingInfo(cl_event event, ...@@ -688,8 +686,8 @@ cl_int GetEventProfilingInfo(cl_event event,
void *param_value, void *param_value,
size_t *param_value_size_ret) size_t *param_value_size_ret)
{ {
WARN_NOT_SUPPORTED(GetEventProfilingInfo); return event->cast<Event>().getProfilingInfo(param_name, param_value_size, param_value,
return 0; param_value_size_ret);
} }
cl_int Flush(cl_command_queue command_queue) cl_int Flush(cl_command_queue command_queue)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment