Commit a6210a8f by John Plate Committed by Angle LUCI CQ

CL: image object creation for front end and pass-through

Add image object to front end and implement creation and info query. Cache more Device info for Image validation. Bug: angleproject:5956 Change-Id: I38374f4c2c85287109c464ac90eb1bf49b07fa0a Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2912805 Commit-Queue: John Plate <jplate@google.com> Reviewed-by: 's avatarCody Northrop <cnorthrop@google.com> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org>
parent 4df2e8ce
...@@ -20,14 +20,8 @@ cl_mem Buffer::createSubBuffer(cl_mem_flags flags, ...@@ -20,14 +20,8 @@ cl_mem Buffer::createSubBuffer(cl_mem_flags flags,
cl_int *errcodeRet) cl_int *errcodeRet)
{ {
const cl_buffer_region &region = *static_cast<const cl_buffer_region *>(createInfo); const cl_buffer_region &region = *static_cast<const cl_buffer_region *>(createInfo);
mContext->mMemories.emplace_back( return mContext->createMemory(new Buffer(*this, flags, region.origin, region.size, errcodeRet),
new Buffer(*this, flags, region.origin, region.size, errcodeRet)); errcodeRet);
if (!mContext->mMemories.back()->mImpl)
{
mContext->mMemories.back()->release();
return nullptr;
}
return mContext->mMemories.back().get();
} }
Buffer::Buffer(Context &context, Buffer::Buffer(Context &context,
......
...@@ -37,7 +37,7 @@ bool CommandQueue::release() ...@@ -37,7 +37,7 @@ bool CommandQueue::release()
cl_int CommandQueue::getInfo(CommandQueueInfo name, cl_int CommandQueue::getInfo(CommandQueueInfo name,
size_t valueSize, size_t valueSize,
void *value, void *value,
size_t *valueSizeRet) size_t *valueSizeRet) const
{ {
void *valPointer = nullptr; void *valPointer = nullptr;
const void *copyValue = nullptr; const void *copyValue = nullptr;
......
...@@ -37,7 +37,11 @@ class CommandQueue final : public _cl_command_queue, public Object ...@@ -37,7 +37,11 @@ class CommandQueue final : public _cl_command_queue, public Object
void retain() noexcept; void retain() noexcept;
bool release(); bool release();
cl_int getInfo(CommandQueueInfo name, size_t valueSize, void *value, size_t *valueSizeRet); cl_int getInfo(CommandQueueInfo name,
size_t valueSize,
void *value,
size_t *valueSizeRet) const;
cl_int setProperty(cl_command_queue_properties properties, cl_int setProperty(cl_command_queue_properties properties,
cl_bool enable, cl_bool enable,
cl_command_queue_properties *oldProperties); cl_command_queue_properties *oldProperties);
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include "libANGLE/CLContext.h" #include "libANGLE/CLContext.h"
#include "libANGLE/CLBuffer.h" #include "libANGLE/CLBuffer.h"
#include "libANGLE/CLImage.h"
#include "libANGLE/CLPlatform.h" #include "libANGLE/CLPlatform.h"
#include <cstring> #include <cstring>
...@@ -27,7 +28,7 @@ bool Context::release() ...@@ -27,7 +28,7 @@ bool Context::release()
return released; return released;
} }
cl_int Context::getInfo(ContextInfo name, size_t valueSize, void *value, size_t *valueSizeRet) cl_int Context::getInfo(ContextInfo name, size_t valueSize, void *value, size_t *valueSizeRet) const
{ {
cl_uint numDevices = 0u; cl_uint numDevices = 0u;
const void *copyValue = nullptr; const void *copyValue = nullptr;
...@@ -80,14 +81,9 @@ cl_command_queue Context::createCommandQueue(cl_device_id device, ...@@ -80,14 +81,9 @@ cl_command_queue Context::createCommandQueue(cl_device_id device,
cl_command_queue_properties properties, cl_command_queue_properties properties,
cl_int *errcodeRet) cl_int *errcodeRet)
{ {
mCommandQueues.emplace_back( return createCommandQueue(
new CommandQueue(*this, *static_cast<Device *>(device), properties, errcodeRet)); new CommandQueue(*this, *static_cast<Device *>(device), properties, errcodeRet),
if (!mCommandQueues.back()->mImpl) errcodeRet);
{
mCommandQueues.back()->release();
return nullptr;
}
return mCommandQueues.back().get();
} }
cl_command_queue Context::createCommandQueueWithProperties(cl_device_id device, cl_command_queue Context::createCommandQueueWithProperties(cl_device_id device,
...@@ -117,15 +113,9 @@ cl_command_queue Context::createCommandQueueWithProperties(cl_device_id device, ...@@ -117,15 +113,9 @@ cl_command_queue Context::createCommandQueueWithProperties(cl_device_id device,
propArray.reserve(propIt - properties); propArray.reserve(propIt - properties);
propArray.insert(propArray.cend(), properties, propIt); propArray.insert(propArray.cend(), properties, propIt);
} }
return createCommandQueue(new CommandQueue(*this, *static_cast<Device *>(device),
mCommandQueues.emplace_back(new CommandQueue(*this, *static_cast<Device *>(device), std::move(propArray), props, size, errcodeRet),
std::move(propArray), props, size, errcodeRet)); errcodeRet);
if (!mCommandQueues.back()->mImpl)
{
mCommandQueues.back()->release();
return nullptr;
}
return mCommandQueues.back().get();
} }
cl_mem Context::createBuffer(const cl_mem_properties *properties, cl_mem Context::createBuffer(const cl_mem_properties *properties,
...@@ -134,13 +124,53 @@ cl_mem Context::createBuffer(const cl_mem_properties *properties, ...@@ -134,13 +124,53 @@ cl_mem Context::createBuffer(const cl_mem_properties *properties,
void *hostPtr, void *hostPtr,
cl_int *errcodeRet) cl_int *errcodeRet)
{ {
mMemories.emplace_back(new Buffer(*this, {}, flags, size, hostPtr, errcodeRet)); return createMemory(new Buffer(*this, {}, flags, size, hostPtr, errcodeRet), errcodeRet);
if (!mMemories.back()->mImpl) }
{
mMemories.back()->release(); cl_mem Context::createImage(const cl_mem_properties *properties,
return nullptr; cl_mem_flags flags,
} const cl_image_format *format,
return mMemories.back().get(); const cl_image_desc *desc,
void *hostPtr,
cl_int *errcodeRet)
{
const ImageDescriptor imageDesc = {
desc->image_type, desc->image_width, desc->image_height,
desc->image_depth, desc->image_array_size, desc->image_row_pitch,
desc->image_slice_pitch, desc->num_mip_levels, desc->num_samples};
return createMemory(new Image(*this, {}, flags, *format, imageDesc,
static_cast<Memory *>(desc->buffer), hostPtr, errcodeRet),
errcodeRet);
}
cl_mem Context::createImage2D(cl_mem_flags flags,
const cl_image_format *format,
size_t width,
size_t height,
size_t rowPitch,
void *hostPtr,
cl_int *errcodeRet)
{
const ImageDescriptor imageDesc = {
CL_MEM_OBJECT_IMAGE2D, width, height, 0u, 0u, rowPitch, 0u, 0u, 0u};
return createMemory(
new Image(*this, {}, flags, *format, imageDesc, nullptr, hostPtr, errcodeRet), errcodeRet);
}
cl_mem Context::createImage3D(cl_mem_flags flags,
const cl_image_format *format,
size_t width,
size_t height,
size_t depth,
size_t rowPitch,
size_t slicePitch,
void *hostPtr,
cl_int *errcodeRet)
{
const ImageDescriptor imageDesc = {
CL_MEM_OBJECT_IMAGE3D, width, height, depth, 0u, rowPitch, slicePitch, 0u, 0u};
return createMemory(
new Image(*this, {}, flags, *format, imageDesc, nullptr, hostPtr, errcodeRet), errcodeRet);
} }
bool Context::IsValid(const _cl_context *context) bool Context::IsValid(const _cl_context *context)
...@@ -189,6 +219,36 @@ Context::Context(Platform &platform, ...@@ -189,6 +219,36 @@ Context::Context(Platform &platform,
mUserData(userData) mUserData(userData)
{} {}
cl_command_queue Context::createCommandQueue(CommandQueue *commandQueue, cl_int *errcodeRet)
{
mCommandQueues.emplace_back(commandQueue);
if (!mCommandQueues.back()->mImpl)
{
mCommandQueues.back()->release();
return nullptr;
}
if (errcodeRet != nullptr)
{
*errcodeRet = CL_SUCCESS;
}
return mCommandQueues.back().get();
}
cl_mem Context::createMemory(Memory *memory, cl_int *errcodeRet)
{
mMemories.emplace_back(memory);
if (!mMemories.back()->mImpl || mMemories.back()->mSize == 0u)
{
mMemories.back()->release();
return nullptr;
}
if (errcodeRet != nullptr)
{
*errcodeRet = CL_SUCCESS;
}
return mMemories.back().get();
}
void Context::destroyCommandQueue(CommandQueue *commandQueue) void Context::destroyCommandQueue(CommandQueue *commandQueue)
{ {
auto commandQueueIt = mCommandQueues.cbegin(); auto commandQueueIt = mCommandQueues.cbegin();
......
...@@ -35,7 +35,7 @@ class Context final : public _cl_context, public Object ...@@ -35,7 +35,7 @@ class Context final : public _cl_context, public Object
void retain() noexcept; void retain() noexcept;
bool release(); bool release();
cl_int getInfo(ContextInfo name, size_t valueSize, void *value, size_t *valueSizeRet); cl_int getInfo(ContextInfo name, size_t valueSize, void *value, size_t *valueSizeRet) const;
cl_command_queue createCommandQueue(cl_device_id device, cl_command_queue createCommandQueue(cl_device_id device,
cl_command_queue_properties properties, cl_command_queue_properties properties,
...@@ -51,6 +51,31 @@ class Context final : public _cl_context, public Object ...@@ -51,6 +51,31 @@ class Context final : public _cl_context, public Object
void *hostPtr, void *hostPtr,
cl_int *errcodeRet); cl_int *errcodeRet);
cl_mem createImage(const cl_mem_properties *properties,
cl_mem_flags flags,
const cl_image_format *format,
const cl_image_desc *desc,
void *hostPtr,
cl_int *errcodeRet);
cl_mem createImage2D(cl_mem_flags flags,
const cl_image_format *format,
size_t width,
size_t height,
size_t rowPitch,
void *hostPtr,
cl_int *errcodeRet);
cl_mem createImage3D(cl_mem_flags flags,
const cl_image_format *format,
size_t width,
size_t height,
size_t depth,
size_t rowPitch,
size_t slicePitch,
void *hostPtr,
cl_int *errcodeRet);
static bool IsValid(const _cl_context *context); static bool IsValid(const _cl_context *context);
private: private:
...@@ -70,6 +95,9 @@ class Context final : public _cl_context, public Object ...@@ -70,6 +95,9 @@ class Context final : public _cl_context, public Object
bool userSync, bool userSync,
cl_int *errcodeRet); cl_int *errcodeRet);
cl_command_queue createCommandQueue(CommandQueue *commandQueue, cl_int *errcodeRet);
cl_mem createMemory(Memory *memory, cl_int *errcodeRet);
void destroyCommandQueue(CommandQueue *commandQueue); void destroyCommandQueue(CommandQueue *commandQueue);
void destroyMemory(Memory *memory); void destroyMemory(Memory *memory);
......
...@@ -36,7 +36,7 @@ bool Device::release() ...@@ -36,7 +36,7 @@ bool Device::release()
return released; return released;
} }
cl_int Device::getInfo(DeviceInfo name, size_t valueSize, void *value, size_t *valueSizeRet) cl_int Device::getInfo(DeviceInfo name, size_t valueSize, void *value, size_t *valueSizeRet) const
{ {
static_assert(std::is_same<cl_uint, cl_bool>::value && static_assert(std::is_same<cl_uint, cl_bool>::value &&
std::is_same<cl_uint, cl_device_mem_cache_type>::value && std::is_same<cl_uint, cl_device_mem_cache_type>::value &&
......
...@@ -41,7 +41,7 @@ class Device final : public _cl_device_id, public Object ...@@ -41,7 +41,7 @@ class Device final : public _cl_device_id, public Object
cl_int getInfoUInt(DeviceInfo name, cl_uint *value) const; cl_int getInfoUInt(DeviceInfo name, cl_uint *value) const;
cl_int getInfoULong(DeviceInfo name, cl_ulong *value) const; cl_int getInfoULong(DeviceInfo name, cl_ulong *value) const;
cl_int getInfo(DeviceInfo name, size_t valueSize, void *value, size_t *valueSizeRet); cl_int getInfo(DeviceInfo name, size_t valueSize, void *value, size_t *valueSizeRet) const;
cl_int createSubDevices(const cl_device_partition_property *properties, cl_int createSubDevices(const cl_device_partition_property *properties,
cl_uint numDevices, cl_uint numDevices,
......
//
// Copyright 2021 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// CLImage.cpp: Implements the cl::Image class.
#include "libANGLE/CLImage.h"
#include "libANGLE/cl_utils.h"
#include <cstring>
namespace cl
{
Image::~Image() = default;
cl_int Image::getInfo(ImageInfo name, size_t valueSize, void *value, size_t *valueSizeRet) const
{
size_t valSizeT = 0u;
void *valPointer = nullptr;
const void *copyValue = nullptr;
size_t copySize = 0u;
switch (name)
{
case ImageInfo::Format:
copyValue = &mFormat;
copySize = sizeof(mFormat);
break;
case ImageInfo::ElementSize:
valSizeT = GetElementSize(mFormat);
copyValue = &valSizeT;
copySize = sizeof(valSizeT);
break;
case ImageInfo::RowPitch:
copyValue = &mDesc.rowPitch;
copySize = sizeof(mDesc.rowPitch);
break;
case ImageInfo::SlicePitch:
copyValue = &mDesc.slicePitch;
copySize = sizeof(mDesc.slicePitch);
break;
case ImageInfo::Width:
copyValue = &mDesc.width;
copySize = sizeof(mDesc.width);
break;
case ImageInfo::Height:
copyValue = &mDesc.height;
copySize = sizeof(mDesc.height);
break;
case ImageInfo::Depth:
copyValue = &mDesc.depth;
copySize = sizeof(mDesc.depth);
break;
case ImageInfo::ArraySize:
copyValue = &mDesc.arraySize;
copySize = sizeof(mDesc.arraySize);
break;
case ImageInfo::Buffer:
valPointer = static_cast<cl_mem>(mParent.get());
copyValue = &valPointer;
copySize = sizeof(valPointer);
break;
case ImageInfo::NumMipLevels:
copyValue = &mDesc.numMipLevels;
copySize = sizeof(mDesc.numMipLevels);
break;
case ImageInfo::NumSamples:
copyValue = &mDesc.numSamples;
copySize = sizeof(mDesc.numSamples);
break;
default:
return CL_INVALID_VALUE;
}
if (value != nullptr)
{
if (valueSize < copySize)
{
return CL_INVALID_VALUE;
}
if (copyValue != nullptr)
{
std::memcpy(value, copyValue, copySize);
}
}
if (valueSizeRet != nullptr)
{
*valueSizeRet = copySize;
}
return CL_SUCCESS;
}
bool Image::IsValid(const _cl_mem *image)
{
if (!Memory::IsValid(image))
{
return false;
}
switch (static_cast<const Memory *>(image)->getType())
{
case CL_MEM_OBJECT_IMAGE1D:
case CL_MEM_OBJECT_IMAGE2D:
case CL_MEM_OBJECT_IMAGE3D:
case CL_MEM_OBJECT_IMAGE1D_ARRAY:
case CL_MEM_OBJECT_IMAGE2D_ARRAY:
case CL_MEM_OBJECT_IMAGE1D_BUFFER:
break;
default:
return false;
}
return true;
}
Image::Image(Context &context,
PropArray &&properties,
cl_mem_flags flags,
const cl_image_format &format,
const ImageDescriptor &desc,
Memory *parent,
void *hostPtr,
cl_int *errcodeRet)
: Memory(*this,
context,
std::move(properties),
flags,
format,
desc,
parent,
hostPtr,
errcodeRet),
mFormat(format),
mDesc(desc)
{}
} // namespace cl
//
// Copyright 2021 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// CLImage.h: Defines the cl::Image class, which stores a texture, frame-buffer or image.
#ifndef LIBANGLE_CLIMAGE_H_
#define LIBANGLE_CLIMAGE_H_
#include "libANGLE/CLMemory.h"
namespace cl
{
class Image final : public Memory
{
public:
~Image() override;
cl_mem_object_type getType() const final;
const cl_image_format &getFormat() const;
const ImageDescriptor &getDescriptor() const;
cl_int getInfo(ImageInfo name, size_t valueSize, void *value, size_t *valueSizeRet) const;
static bool IsValid(const _cl_mem *image);
private:
Image(Context &context,
PropArray &&properties,
cl_mem_flags flags,
const cl_image_format &format,
const ImageDescriptor &desc,
Memory *parent,
void *hostPtr,
cl_int *errcodeRet);
const cl_image_format mFormat;
const ImageDescriptor mDesc;
friend class Context;
};
inline cl_mem_object_type Image::getType() const
{
return mDesc.type;
}
inline const cl_image_format &Image::getFormat() const
{
return mFormat;
}
inline const ImageDescriptor &Image::getDescriptor() const
{
return mDesc;
}
} // namespace cl
#endif // LIBANGLE_CLIMAGE_H_
...@@ -28,7 +28,7 @@ bool Memory::release() ...@@ -28,7 +28,7 @@ bool Memory::release()
return released; return released;
} }
cl_int Memory::getInfo(MemInfo name, size_t valueSize, void *value, size_t *valueSizeRet) cl_int Memory::getInfo(MemInfo name, size_t valueSize, void *value, size_t *valueSizeRet) const
{ {
static_assert( static_assert(
std::is_same<cl_uint, cl_bool>::value && std::is_same<cl_uint, cl_mem_object_type>::value, std::is_same<cl_uint, cl_bool>::value && std::is_same<cl_uint, cl_mem_object_type>::value,
...@@ -152,4 +152,23 @@ Memory::Memory(const Buffer &buffer, ...@@ -152,4 +152,23 @@ Memory::Memory(const Buffer &buffer,
mSize(size) mSize(size)
{} {}
Memory::Memory(const Image &image,
Context &context,
PropArray &&properties,
cl_mem_flags flags,
const cl_image_format &format,
const ImageDescriptor &desc,
Memory *parent,
void *hostPtr,
cl_int *errcodeRet)
: _cl_mem(context.getDispatch()),
mContext(&context),
mProperties(std::move(properties)),
mFlags(flags),
mHostPtr((flags & CL_MEM_USE_HOST_PTR) != 0u ? hostPtr : nullptr),
mParent(parent),
mImpl(context.mImpl->createImage(image, format, desc, hostPtr, errcodeRet)),
mSize(mImpl ? mImpl->getSize() : 0u)
{}
} // namespace cl } // namespace cl
...@@ -35,7 +35,7 @@ class Memory : public _cl_mem, public Object ...@@ -35,7 +35,7 @@ class Memory : public _cl_mem, public Object
void retain() noexcept; void retain() noexcept;
bool release(); bool release();
cl_int getInfo(MemInfo name, size_t valueSize, void *value, size_t *valueSizeRet); cl_int getInfo(MemInfo name, size_t valueSize, void *value, size_t *valueSizeRet) const;
static bool IsValid(const _cl_mem *memory); static bool IsValid(const _cl_mem *memory);
...@@ -55,6 +55,16 @@ class Memory : public _cl_mem, public Object ...@@ -55,6 +55,16 @@ class Memory : public _cl_mem, public Object
size_t size, size_t size,
cl_int *errcodeRet); cl_int *errcodeRet);
Memory(const Image &image,
Context &context,
PropArray &&properties,
cl_mem_flags flags,
const cl_image_format &format,
const ImageDescriptor &desc,
Memory *parent,
void *hostPtr,
cl_int *errcodeRet);
const ContextRefPtr mContext; const ContextRefPtr mContext;
const PropArray mProperties; const PropArray mProperties;
const cl_mem_flags mFlags; const cl_mem_flags mFlags;
......
...@@ -22,7 +22,7 @@ class Object ...@@ -22,7 +22,7 @@ class Object
virtual ~Object(); virtual ~Object();
cl_uint getRefCount() { return mRefCount; } cl_uint getRefCount() { return mRefCount; }
const cl_uint *getRefCountPtr() { return &mRefCount; } const cl_uint *getRefCountPtr() const { return &mRefCount; }
protected: protected:
void addRef() noexcept { ++mRefCount; } void addRef() noexcept { ++mRefCount; }
......
...@@ -64,7 +64,10 @@ Platform::~Platform() ...@@ -64,7 +64,10 @@ Platform::~Platform()
removeRef(); removeRef();
} }
cl_int Platform::getInfo(PlatformInfo name, size_t valueSize, void *value, size_t *valueSizeRet) cl_int Platform::getInfo(PlatformInfo name,
size_t valueSize,
void *value,
size_t *valueSizeRet) const
{ {
const void *copyValue = nullptr; const void *copyValue = nullptr;
size_t copySize = 0u; size_t copySize = 0u;
...@@ -200,16 +203,10 @@ cl_context Platform::CreateContext(const cl_context_properties *properties, ...@@ -200,16 +203,10 @@ cl_context Platform::CreateContext(const cl_context_properties *properties,
{ {
refDevices.emplace_back(static_cast<Device *>(*devices++)); refDevices.emplace_back(static_cast<Device *>(*devices++));
} }
return platform->createContext(
platform->mContexts.emplace_back(new Context(*platform, std::move(propArray), new Context(*platform, std::move(propArray), std::move(refDevices), notify, userData,
std::move(refDevices), notify, userData, userSync, userSync, errcodeRet),
errcodeRet)); errcodeRet);
if (!platform->mContexts.back()->mImpl)
{
platform->mContexts.back()->release();
return nullptr;
}
return platform->mContexts.back().get();
} }
cl_context Platform::CreateContextFromType(const cl_context_properties *properties, cl_context Platform::CreateContextFromType(const cl_context_properties *properties,
...@@ -222,15 +219,9 @@ cl_context Platform::CreateContextFromType(const cl_context_properties *properti ...@@ -222,15 +219,9 @@ cl_context Platform::CreateContextFromType(const cl_context_properties *properti
bool userSync = false; bool userSync = false;
Context::PropArray propArray = ParseContextProperties(properties, platform, userSync); Context::PropArray propArray = ParseContextProperties(properties, platform, userSync);
ASSERT(platform != nullptr); ASSERT(platform != nullptr);
return platform->createContext(new Context(*platform, std::move(propArray), deviceType, notify,
platform->mContexts.emplace_back(new Context(*platform, std::move(propArray), deviceType, userData, userSync, errcodeRet),
notify, userData, userSync, errcodeRet)); errcodeRet);
if (!platform->mContexts.back()->mImpl || platform->mContexts.back()->mDevices.empty())
{
platform->mContexts.back()->release();
return nullptr;
}
return platform->mContexts.back().get();
} }
Platform::Platform(const cl_icd_dispatch &dispatch, const CreateImplFunc &createImplFunc) Platform::Platform(const cl_icd_dispatch &dispatch, const CreateImplFunc &createImplFunc)
...@@ -240,6 +231,21 @@ Platform::Platform(const cl_icd_dispatch &dispatch, const CreateImplFunc &create ...@@ -240,6 +231,21 @@ Platform::Platform(const cl_icd_dispatch &dispatch, const CreateImplFunc &create
mDevices(mImpl->createDevices(*this)) mDevices(mImpl->createDevices(*this))
{} {}
cl_context Platform::createContext(Context *context, cl_int *errcodeRet)
{
mContexts.emplace_back(context);
if (!mContexts.back()->mImpl)
{
mContexts.back()->release();
return nullptr;
}
if (errcodeRet != nullptr)
{
*errcodeRet = CL_SUCCESS;
}
return mContexts.back().get();
}
void Platform::destroyContext(Context *context) void Platform::destroyContext(Context *context)
{ {
auto contextIt = mContexts.cbegin(); auto contextIt = mContexts.cbegin();
......
...@@ -37,7 +37,7 @@ class Platform final : public _cl_platform_id, public Object ...@@ -37,7 +37,7 @@ class Platform final : public _cl_platform_id, public Object
bool hasCommandQueue(const _cl_command_queue *commandQueue) const; bool hasCommandQueue(const _cl_command_queue *commandQueue) const;
bool hasMemory(const _cl_mem *memory) const; bool hasMemory(const _cl_mem *memory) const;
cl_int getInfo(PlatformInfo name, size_t valueSize, void *value, size_t *valueSizeRet); cl_int getInfo(PlatformInfo name, size_t valueSize, void *value, size_t *valueSizeRet) const;
cl_int getDeviceIDs(cl_device_type deviceType, cl_int getDeviceIDs(cl_device_type deviceType,
cl_uint numEntries, cl_uint numEntries,
...@@ -75,6 +75,7 @@ class Platform final : public _cl_platform_id, public Object ...@@ -75,6 +75,7 @@ class Platform final : public _cl_platform_id, public Object
private: private:
Platform(const cl_icd_dispatch &dispatch, const CreateImplFunc &createImplFunc); Platform(const cl_icd_dispatch &dispatch, const CreateImplFunc &createImplFunc);
cl_context createContext(Context *context, cl_int *errcodeRet);
void destroyContext(Context *context); void destroyContext(Context *context);
static PtrList &GetList(); static PtrList &GetList();
......
...@@ -28,6 +28,7 @@ class CommandQueue; ...@@ -28,6 +28,7 @@ class CommandQueue;
class Context; class Context;
class Device; class Device;
class Event; class Event;
class Image;
class Kernel; class Kernel;
class Memory; class Memory;
class Object; class Object;
...@@ -53,6 +54,19 @@ using MemoryRefPtr = RefPointer<Memory>; ...@@ -53,6 +54,19 @@ using MemoryRefPtr = RefPointer<Memory>;
using DevicePtrList = std::list<DevicePtr>; using DevicePtrList = std::list<DevicePtr>;
using DeviceRefList = std::vector<DeviceRefPtr>; using DeviceRefList = std::vector<DeviceRefPtr>;
struct ImageDescriptor
{
cl_mem_object_type type;
size_t width;
size_t height;
size_t depth;
size_t arraySize;
size_t rowPitch;
size_t slicePitch;
cl_uint numMipLevels;
cl_uint numSamples;
};
} // namespace cl } // namespace cl
#endif // LIBANGLE_CLTYPES_H_ #endif // LIBANGLE_CLTYPES_H_
//
// Copyright 2021 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// cl_utils.cpp: Helper functions for the CL front end
#include <libANGLE/cl_utils.h>
namespace cl
{
size_t GetChannelCount(cl_channel_order channelOrder)
{
size_t count = 0u;
switch (channelOrder)
{
case CL_R:
case CL_A:
case CL_LUMINANCE:
case CL_INTENSITY:
case CL_DEPTH:
count = 1u;
break;
case CL_RG:
case CL_RA:
case CL_Rx:
count = 2u;
break;
case CL_RGB:
case CL_RGx:
case CL_sRGB:
count = 3u;
break;
case CL_RGBA:
case CL_ARGB:
case CL_BGRA:
case CL_ABGR:
case CL_RGBx:
case CL_sRGBA:
case CL_sBGRA:
case CL_sRGBx:
count = 4u;
break;
default:
break;
}
return count;
}
size_t GetElementSize(const cl_image_format &image_format)
{
size_t size = 0u;
switch (image_format.image_channel_data_type)
{
case CL_SNORM_INT8:
case CL_UNORM_INT8:
case CL_SIGNED_INT8:
case CL_UNSIGNED_INT8:
size = GetChannelCount(image_format.image_channel_order);
break;
case CL_SNORM_INT16:
case CL_UNORM_INT16:
case CL_SIGNED_INT16:
case CL_UNSIGNED_INT16:
case CL_HALF_FLOAT:
size = 2u * GetChannelCount(image_format.image_channel_order);
break;
case CL_SIGNED_INT32:
case CL_UNSIGNED_INT32:
case CL_FLOAT:
size = 4u * GetChannelCount(image_format.image_channel_order);
break;
case CL_UNORM_SHORT_565:
case CL_UNORM_SHORT_555:
size = 2u;
break;
case CL_UNORM_INT_101010:
case CL_UNORM_INT_101010_2:
size = 4u;
break;
default:
break;
}
return size;
}
} // namespace cl
//
// Copyright 2021 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// cl_utils.h: Helper functions for the CL front end
#ifndef LIBANGLE_CL_UTILS_H_
#define LIBANGLE_CL_UTILS_H_
#include "libANGLE/CLtypes.h"
namespace cl
{
size_t GetChannelCount(cl_channel_order channelOrder);
size_t GetElementSize(const cl_image_format &image_format);
} // namespace cl
#endif // LIBANGLE_CL_UTILS_H_
...@@ -27,10 +27,17 @@ class CLContextImpl : angle::NonCopyable ...@@ -27,10 +27,17 @@ class CLContextImpl : angle::NonCopyable
virtual CLCommandQueueImpl::Ptr createCommandQueue(const cl::CommandQueue &commandQueue, virtual CLCommandQueueImpl::Ptr createCommandQueue(const cl::CommandQueue &commandQueue,
cl_int *errcodeRet) = 0; cl_int *errcodeRet) = 0;
virtual CLMemoryImpl::Ptr createBuffer(const cl::Buffer &buffer, virtual CLMemoryImpl::Ptr createBuffer(const cl::Buffer &buffer,
size_t size, size_t size,
void *hostPtr, void *hostPtr,
cl_int *errcodeRet) = 0; cl_int *errcodeRet) = 0;
virtual CLMemoryImpl::Ptr createImage(const cl::Image &image,
const cl_image_format &format,
const cl::ImageDescriptor &desc,
void *hostPtr,
cl_int *errcodeRet) = 0;
protected: protected:
const cl::Context &mContext; const cl::Context &mContext;
......
...@@ -36,7 +36,17 @@ class CLDeviceImpl : angle::NonCopyable ...@@ -36,7 +36,17 @@ class CLDeviceImpl : angle::NonCopyable
cl_device_type mType = 0u; cl_device_type mType = 0u;
std::vector<size_t> mMaxWorkItemSizes; std::vector<size_t> mMaxWorkItemSizes;
cl_ulong mMaxMemAllocSize = 0u; cl_ulong mMaxMemAllocSize = 0u;
cl_bool mImageSupport = CL_FALSE;
NameVersionVector mILsWithVersion; NameVersionVector mILsWithVersion;
size_t mImage2D_MaxWidth = 0u;
size_t mImage2D_MaxHeight = 0u;
size_t mImage3D_MaxWidth = 0u;
size_t mImage3D_MaxHeight = 0u;
size_t mImage3D_MaxDepth = 0u;
size_t mImageMaxBufferSize = 0u;
size_t mImageMaxArraySize = 0u;
cl_uint mImagePitchAlignment = 0u;
cl_uint mImageBaseAddressAlignment = 0u;
NameVersionVector mBuiltInKernelsWithVersion; NameVersionVector mBuiltInKernelsWithVersion;
std::string mVersionStr; std::string mVersionStr;
cl_version mVersion = 0u; cl_version mVersion = 0u;
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include "libANGLE/CLCommandQueue.h" #include "libANGLE/CLCommandQueue.h"
#include "libANGLE/CLContext.h" #include "libANGLE/CLContext.h"
#include "libANGLE/CLDevice.h" #include "libANGLE/CLDevice.h"
#include "libANGLE/CLImage.h"
#include "libANGLE/CLMemory.h" #include "libANGLE/CLMemory.h"
#include "libANGLE/CLPlatform.h" #include "libANGLE/CLPlatform.h"
#include "libANGLE/Debug.h" #include "libANGLE/Debug.h"
...@@ -117,4 +118,56 @@ CLMemoryImpl::Ptr CLContextCL::createBuffer(const cl::Buffer &buffer, ...@@ -117,4 +118,56 @@ CLMemoryImpl::Ptr CLContextCL::createBuffer(const cl::Buffer &buffer,
: nullptr); : nullptr);
} }
CLMemoryImpl::Ptr CLContextCL::createImage(const cl::Image &image,
const cl_image_format &format,
const cl::ImageDescriptor &desc,
void *hostPtr,
cl_int *errcodeRet)
{
cl_mem nativeImage = nullptr;
if (mContext.getPlatform().isVersionOrNewer(1u, 2u))
{
const cl_image_desc nativeDesc = {
desc.type, desc.width,
desc.height, desc.depth,
desc.arraySize, desc.rowPitch,
desc.slicePitch, desc.numMipLevels,
desc.numSamples, {static_cast<cl_mem>(image.getParent().get())}};
if (image.getProperties().empty())
{
nativeImage = mNative->getDispatch().clCreateImage(mNative, image.getFlags(), &format,
&nativeDesc, hostPtr, errcodeRet);
}
else
{
nativeImage = mNative->getDispatch().clCreateImageWithProperties(
mNative, image.getProperties().data(), image.getFlags(), &format, &nativeDesc,
hostPtr, errcodeRet);
}
}
else
{
switch (desc.type)
{
case CL_MEM_OBJECT_IMAGE2D:
nativeImage = mNative->getDispatch().clCreateImage2D(
mNative, image.getFlags(), &format, desc.width, desc.height, desc.rowPitch,
hostPtr, errcodeRet);
break;
case CL_MEM_OBJECT_IMAGE3D:
nativeImage = mNative->getDispatch().clCreateImage3D(
mNative, image.getFlags(), &format, desc.width, desc.height, desc.depth,
desc.rowPitch, desc.slicePitch, hostPtr, errcodeRet);
break;
default:
ERR() << "Failed to create unsupported image type";
break;
}
}
return CLMemoryImpl::Ptr(nativeImage != nullptr ? new CLMemoryCL(image, nativeImage) : nullptr);
}
} // namespace rx } // namespace rx
...@@ -25,11 +25,18 @@ class CLContextCL : public CLContextImpl ...@@ -25,11 +25,18 @@ class CLContextCL : public CLContextImpl
CLCommandQueueImpl::Ptr createCommandQueue(const cl::CommandQueue &commandQueue, CLCommandQueueImpl::Ptr createCommandQueue(const cl::CommandQueue &commandQueue,
cl_int *errcodeRet) override; cl_int *errcodeRet) override;
CLMemoryImpl::Ptr createBuffer(const cl::Buffer &buffer, CLMemoryImpl::Ptr createBuffer(const cl::Buffer &buffer,
size_t size, size_t size,
void *hostPtr, void *hostPtr,
cl_int *errcodeRet) override; cl_int *errcodeRet) override;
CLMemoryImpl::Ptr createImage(const cl::Image &image,
const cl_image_format &format,
const cl::ImageDescriptor &desc,
void *hostPtr,
cl_int *errcodeRet) override;
private: private:
const cl_context mNative; const cl_context mNative;
}; };
......
...@@ -85,7 +85,13 @@ CLDeviceImpl::Info CLDeviceCL::createInfo(cl_device_type type) const ...@@ -85,7 +85,13 @@ CLDeviceImpl::Info CLDeviceCL::createInfo(cl_device_type type) const
return Info{}; return Info{};
} }
if (!GetDeviceInfo(mNative, cl::DeviceInfo::MaxMemAllocSize, info.mMaxMemAllocSize)) if (!GetDeviceInfo(mNative, cl::DeviceInfo::MaxMemAllocSize, info.mMaxMemAllocSize) ||
!GetDeviceInfo(mNative, cl::DeviceInfo::ImageSupport, info.mImageSupport) ||
!GetDeviceInfo(mNative, cl::DeviceInfo::Image2D_MaxWidth, info.mImage2D_MaxWidth) ||
!GetDeviceInfo(mNative, cl::DeviceInfo::Image2D_MaxHeight, info.mImage2D_MaxHeight) ||
!GetDeviceInfo(mNative, cl::DeviceInfo::Image3D_MaxWidth, info.mImage3D_MaxWidth) ||
!GetDeviceInfo(mNative, cl::DeviceInfo::Image3D_MaxHeight, info.mImage3D_MaxHeight) ||
!GetDeviceInfo(mNative, cl::DeviceInfo::Image3D_MaxDepth, info.mImage3D_MaxDepth))
{ {
return Info{}; return Info{};
} }
...@@ -109,12 +115,22 @@ CLDeviceImpl::Info CLDeviceCL::createInfo(cl_device_type type) const ...@@ -109,12 +115,22 @@ CLDeviceImpl::Info CLDeviceCL::createInfo(cl_device_type type) const
RemoveUnsupportedCLExtensions(info.mExtensions); RemoveUnsupportedCLExtensions(info.mExtensions);
if (info.mVersion >= CL_MAKE_VERSION(1, 2, 0) && if (info.mVersion >= CL_MAKE_VERSION(1, 2, 0) &&
(!GetDeviceInfo(mNative, cl::DeviceInfo::PartitionProperties, info.mPartitionProperties) || (!GetDeviceInfo(mNative, cl::DeviceInfo::ImageMaxBufferSize, info.mImageMaxBufferSize) ||
!GetDeviceInfo(mNative, cl::DeviceInfo::ImageMaxArraySize, info.mImageMaxArraySize) ||
!GetDeviceInfo(mNative, cl::DeviceInfo::PartitionProperties, info.mPartitionProperties) ||
!GetDeviceInfo(mNative, cl::DeviceInfo::PartitionType, info.mPartitionType))) !GetDeviceInfo(mNative, cl::DeviceInfo::PartitionType, info.mPartitionType)))
{ {
return Info{}; return Info{};
} }
if (info.mVersion >= CL_MAKE_VERSION(2, 0, 0) &&
(!GetDeviceInfo(mNative, cl::DeviceInfo::ImagePitchAlignment, info.mImagePitchAlignment) ||
!GetDeviceInfo(mNative, cl::DeviceInfo::ImageBaseAddressAlignment,
info.mImageBaseAddressAlignment)))
{
return Info{};
}
if (info.mVersion >= CL_MAKE_VERSION(3, 0, 0) && if (info.mVersion >= CL_MAKE_VERSION(3, 0, 0) &&
(!GetDeviceInfo(mNative, cl::DeviceInfo::ILsWithVersion, info.mILsWithVersion) || (!GetDeviceInfo(mNative, cl::DeviceInfo::ILsWithVersion, info.mILsWithVersion) ||
!GetDeviceInfo(mNative, cl::DeviceInfo::BuiltInKernelsWithVersion, !GetDeviceInfo(mNative, cl::DeviceInfo::BuiltInKernelsWithVersion,
......
...@@ -222,7 +222,7 @@ CLPlatformImpl::Info CLPlatformCL::createInfo() const ...@@ -222,7 +222,7 @@ CLPlatformImpl::Info CLPlatformCL::createInfo() const
mNative->getDispatch().clEnqueueCopyBufferRect == nullptr)) mNative->getDispatch().clEnqueueCopyBufferRect == nullptr))
{ {
ERR() << "Missing entry points for OpenCL 1.1"; ERR() << "Missing entry points for OpenCL 1.1";
return info; return Info{};
} }
if (info.mVersion >= CL_MAKE_VERSION(1, 2, 0) && if (info.mVersion >= CL_MAKE_VERSION(1, 2, 0) &&
...@@ -243,7 +243,7 @@ CLPlatformImpl::Info CLPlatformCL::createInfo() const ...@@ -243,7 +243,7 @@ CLPlatformImpl::Info CLPlatformCL::createInfo() const
mNative->getDispatch().clGetExtensionFunctionAddressForPlatform == nullptr)) mNative->getDispatch().clGetExtensionFunctionAddressForPlatform == nullptr))
{ {
ERR() << "Missing entry points for OpenCL 1.2"; ERR() << "Missing entry points for OpenCL 1.2";
return info; return Info{};
} }
if (info.mVersion >= CL_MAKE_VERSION(2, 0, 0) && if (info.mVersion >= CL_MAKE_VERSION(2, 0, 0) &&
...@@ -262,7 +262,7 @@ CLPlatformImpl::Info CLPlatformCL::createInfo() const ...@@ -262,7 +262,7 @@ CLPlatformImpl::Info CLPlatformCL::createInfo() const
mNative->getDispatch().clSetKernelExecInfo == nullptr)) mNative->getDispatch().clSetKernelExecInfo == nullptr))
{ {
ERR() << "Missing entry points for OpenCL 2.0"; ERR() << "Missing entry points for OpenCL 2.0";
return info; return Info{};
} }
if (info.mVersion >= CL_MAKE_VERSION(2, 1, 0) && if (info.mVersion >= CL_MAKE_VERSION(2, 1, 0) &&
...@@ -275,7 +275,7 @@ CLPlatformImpl::Info CLPlatformCL::createInfo() const ...@@ -275,7 +275,7 @@ CLPlatformImpl::Info CLPlatformCL::createInfo() const
mNative->getDispatch().clSetDefaultDeviceCommandQueue == nullptr)) mNative->getDispatch().clSetDefaultDeviceCommandQueue == nullptr))
{ {
ERR() << "Missing entry points for OpenCL 2.1"; ERR() << "Missing entry points for OpenCL 2.1";
return info; return Info{};
} }
if (info.mVersion >= CL_MAKE_VERSION(2, 2, 0) && if (info.mVersion >= CL_MAKE_VERSION(2, 2, 0) &&
...@@ -283,7 +283,7 @@ CLPlatformImpl::Info CLPlatformCL::createInfo() const ...@@ -283,7 +283,7 @@ CLPlatformImpl::Info CLPlatformCL::createInfo() const
mNative->getDispatch().clSetProgramSpecializationConstant == nullptr)) mNative->getDispatch().clSetProgramSpecializationConstant == nullptr))
{ {
ERR() << "Missing entry points for OpenCL 2.2"; ERR() << "Missing entry points for OpenCL 2.2";
return info; return Info{};
} }
if (info.mVersion >= CL_MAKE_VERSION(3, 0, 0) && if (info.mVersion >= CL_MAKE_VERSION(3, 0, 0) &&
...@@ -292,7 +292,7 @@ CLPlatformImpl::Info CLPlatformCL::createInfo() const ...@@ -292,7 +292,7 @@ CLPlatformImpl::Info CLPlatformCL::createInfo() const
mNative->getDispatch().clSetContextDestructorCallback == nullptr)) mNative->getDispatch().clSetContextDestructorCallback == nullptr))
{ {
ERR() << "Missing entry points for OpenCL 3.0"; ERR() << "Missing entry points for OpenCL 3.0";
return info; return Info{};
} }
return info; return info;
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#include "libANGLE/CLContext.h" #include "libANGLE/CLContext.h"
#include "libANGLE/CLDevice.h" #include "libANGLE/CLDevice.h"
#include "libANGLE/CLEvent.h" #include "libANGLE/CLEvent.h"
#include "libANGLE/CLImage.h"
#include "libANGLE/CLKernel.h" #include "libANGLE/CLKernel.h"
#include "libANGLE/CLMemory.h" #include "libANGLE/CLMemory.h"
#include "libANGLE/CLPlatform.h" #include "libANGLE/CLPlatform.h"
......
...@@ -458,6 +458,7 @@ libangle_cl_headers = [ ...@@ -458,6 +458,7 @@ libangle_cl_headers = [
"src/libANGLE/CLContext.h", "src/libANGLE/CLContext.h",
"src/libANGLE/CLDevice.h", "src/libANGLE/CLDevice.h",
"src/libANGLE/CLEvent.h", "src/libANGLE/CLEvent.h",
"src/libANGLE/CLImage.h",
"src/libANGLE/CLKernel.h", "src/libANGLE/CLKernel.h",
"src/libANGLE/CLMemory.h", "src/libANGLE/CLMemory.h",
"src/libANGLE/CLObject.h", "src/libANGLE/CLObject.h",
...@@ -466,6 +467,7 @@ libangle_cl_headers = [ ...@@ -466,6 +467,7 @@ libangle_cl_headers = [
"src/libANGLE/CLRefPointer.h", "src/libANGLE/CLRefPointer.h",
"src/libANGLE/CLSampler.h", "src/libANGLE/CLSampler.h",
"src/libANGLE/CLtypes.h", "src/libANGLE/CLtypes.h",
"src/libANGLE/cl_utils.h",
"src/libANGLE/renderer/CLCommandQueueImpl.h", "src/libANGLE/renderer/CLCommandQueueImpl.h",
"src/libANGLE/renderer/CLContextImpl.h", "src/libANGLE/renderer/CLContextImpl.h",
"src/libANGLE/renderer/CLDeviceImpl.h", "src/libANGLE/renderer/CLDeviceImpl.h",
...@@ -482,12 +484,14 @@ libangle_cl_sources = [ ...@@ -482,12 +484,14 @@ libangle_cl_sources = [
"src/libANGLE/CLContext.cpp", "src/libANGLE/CLContext.cpp",
"src/libANGLE/CLDevice.cpp", "src/libANGLE/CLDevice.cpp",
"src/libANGLE/CLEvent.cpp", "src/libANGLE/CLEvent.cpp",
"src/libANGLE/CLImage.cpp",
"src/libANGLE/CLKernel.cpp", "src/libANGLE/CLKernel.cpp",
"src/libANGLE/CLMemory.cpp", "src/libANGLE/CLMemory.cpp",
"src/libANGLE/CLObject.cpp", "src/libANGLE/CLObject.cpp",
"src/libANGLE/CLPlatform.cpp", "src/libANGLE/CLPlatform.cpp",
"src/libANGLE/CLProgram.cpp", "src/libANGLE/CLProgram.cpp",
"src/libANGLE/CLSampler.cpp", "src/libANGLE/CLSampler.cpp",
"src/libANGLE/cl_utils.cpp",
"src/libANGLE/renderer/CLCommandQueueImpl.cpp", "src/libANGLE/renderer/CLCommandQueueImpl.cpp",
"src/libANGLE/renderer/CLContextImpl.cpp", "src/libANGLE/renderer/CLContextImpl.cpp",
"src/libANGLE/renderer/CLDeviceImpl.cpp", "src/libANGLE/renderer/CLDeviceImpl.cpp",
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include "libANGLE/CLCommandQueue.h" #include "libANGLE/CLCommandQueue.h"
#include "libANGLE/CLContext.h" #include "libANGLE/CLContext.h"
#include "libANGLE/CLDevice.h" #include "libANGLE/CLDevice.h"
#include "libANGLE/CLImage.h"
#include "libANGLE/CLMemory.h" #include "libANGLE/CLMemory.h"
#include "libANGLE/CLPlatform.h" #include "libANGLE/CLPlatform.h"
...@@ -241,8 +242,8 @@ cl_mem CreateImage(cl_context context, ...@@ -241,8 +242,8 @@ cl_mem CreateImage(cl_context context,
void *host_ptr, void *host_ptr,
cl_int *errcode_ret) cl_int *errcode_ret)
{ {
WARN_NOT_SUPPORTED(CreateImage); return static_cast<Context *>(context)->createImage(nullptr, flags, image_format, image_desc,
return 0; host_ptr, errcode_ret);
} }
cl_mem CreateImageWithProperties(cl_context context, cl_mem CreateImageWithProperties(cl_context context,
...@@ -253,8 +254,8 @@ cl_mem CreateImageWithProperties(cl_context context, ...@@ -253,8 +254,8 @@ cl_mem CreateImageWithProperties(cl_context context,
void *host_ptr, void *host_ptr,
cl_int *errcode_ret) cl_int *errcode_ret)
{ {
WARN_NOT_SUPPORTED(CreateImageWithProperties); return static_cast<Context *>(context)->createImage(properties, flags, image_format, image_desc,
return 0; host_ptr, errcode_ret);
} }
cl_mem CreatePipe(cl_context context, cl_mem CreatePipe(cl_context context,
...@@ -307,8 +308,8 @@ cl_int GetImageInfo(cl_mem image, ...@@ -307,8 +308,8 @@ cl_int GetImageInfo(cl_mem image,
void *param_value, void *param_value,
size_t *param_value_size_ret) size_t *param_value_size_ret)
{ {
WARN_NOT_SUPPORTED(GetImageInfo); return static_cast<Image *>(image)->getInfo(param_name, param_value_size, param_value,
return 0; param_value_size_ret);
} }
cl_int GetPipeInfo(cl_mem pipe, cl_int GetPipeInfo(cl_mem pipe,
...@@ -1080,8 +1081,8 @@ cl_mem CreateImage2D(cl_context context, ...@@ -1080,8 +1081,8 @@ cl_mem CreateImage2D(cl_context context,
void *host_ptr, void *host_ptr,
cl_int *errcode_ret) cl_int *errcode_ret)
{ {
WARN_NOT_SUPPORTED(CreateImage2D); return static_cast<Context *>(context)->createImage2D(
return 0; flags, image_format, image_width, image_height, image_row_pitch, host_ptr, errcode_ret);
} }
cl_mem CreateImage3D(cl_context context, cl_mem CreateImage3D(cl_context context,
...@@ -1095,8 +1096,9 @@ cl_mem CreateImage3D(cl_context context, ...@@ -1095,8 +1096,9 @@ cl_mem CreateImage3D(cl_context context,
void *host_ptr, void *host_ptr,
cl_int *errcode_ret) cl_int *errcode_ret)
{ {
WARN_NOT_SUPPORTED(CreateImage3D); return static_cast<Context *>(context)->createImage3D(
return 0; flags, image_format, image_width, image_height, image_depth, image_row_pitch,
image_slice_pitch, host_ptr, errcode_ret);
} }
cl_int EnqueueMarker(cl_command_queue command_queue, cl_event *event) cl_int EnqueueMarker(cl_command_queue command_queue, cl_event *event)
......
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