Path: blob/main_old/src/libANGLE/CLCommandQueue.cpp
1693 views
//1// Copyright 2021 The ANGLE Project Authors. All rights reserved.2// Use of this source code is governed by a BSD-style license that can be3// found in the LICENSE file.4//5// CLCommandQueue.cpp: Implements the cl::CommandQueue class.67#include "libANGLE/CLCommandQueue.h"89#include "libANGLE/CLBuffer.h"10#include "libANGLE/CLContext.h"11#include "libANGLE/CLDevice.h"12#include "libANGLE/CLEvent.h"13#include "libANGLE/CLImage.h"14#include "libANGLE/CLKernel.h"15#include "libANGLE/CLMemory.h"1617#include <cstring>1819namespace cl20{2122namespace23{2425void CheckCreateEvent(CommandQueue &queue,26cl_command_type commandType,27const rx::CLEventImpl::CreateFunc &createFunc,28cl_event *event,29cl_int &errorCode)30{31if (errorCode == CL_SUCCESS && event != nullptr)32{33ASSERT(createFunc);34*event = Object::Create<Event>(errorCode, queue, commandType, createFunc);35}36}3738} // namespace3940cl_int CommandQueue::getInfo(CommandQueueInfo name,41size_t valueSize,42void *value,43size_t *valueSizeRet) const44{45cl_command_queue_properties properties = 0u;46cl_uint valUInt = 0u;47void *valPointer = nullptr;48const void *copyValue = nullptr;49size_t copySize = 0u;5051switch (name)52{53case CommandQueueInfo::Context:54valPointer = mContext->getNative();55copyValue = &valPointer;56copySize = sizeof(valPointer);57break;58case CommandQueueInfo::Device:59valPointer = mDevice->getNative();60copyValue = &valPointer;61copySize = sizeof(valPointer);62break;63case CommandQueueInfo::ReferenceCount:64valUInt = getRefCount();65copyValue = &valUInt;66copySize = sizeof(valUInt);67break;68case CommandQueueInfo::Properties:69properties = mProperties->get();70copyValue = &properties;71copySize = sizeof(properties);72break;73case CommandQueueInfo::PropertiesArray:74copyValue = mPropArray.data();75copySize = mPropArray.size() * sizeof(decltype(mPropArray)::value_type);76break;77case CommandQueueInfo::Size:78copyValue = &mSize;79copySize = sizeof(mSize);80break;81case CommandQueueInfo::DeviceDefault:82valPointer = CommandQueue::CastNative(*mDevice->mDefaultCommandQueue);83copyValue = &valPointer;84copySize = sizeof(valPointer);85break;86default:87return CL_INVALID_VALUE;88}8990if (value != nullptr)91{92// CL_INVALID_VALUE if size in bytes specified by param_value_size is < size of return type93// as specified in the Command Queue Parameter table, and param_value is not a NULL value.94if (valueSize < copySize)95{96return CL_INVALID_VALUE;97}98if (copyValue != nullptr)99{100std::memcpy(value, copyValue, copySize);101}102}103if (valueSizeRet != nullptr)104{105*valueSizeRet = copySize;106}107return CL_SUCCESS;108}109110cl_int CommandQueue::setProperty(CommandQueueProperties properties,111cl_bool enable,112cl_command_queue_properties *oldProperties)113{114auto props = mProperties.synchronize();115if (oldProperties != nullptr)116{117*oldProperties = props->get();118}119120ANGLE_CL_TRY(mImpl->setProperty(properties, enable));121122if (enable == CL_FALSE)123{124props->clear(properties);125}126else127{128props->set(properties);129}130return CL_SUCCESS;131}132133cl_int CommandQueue::enqueueReadBuffer(cl_mem buffer,134cl_bool blockingRead,135size_t offset,136size_t size,137void *ptr,138cl_uint numEventsInWaitList,139const cl_event *eventWaitList,140cl_event *event)141{142const Buffer &buf = buffer->cast<Buffer>();143const bool blocking = blockingRead != CL_FALSE;144const EventPtrs waitEvents = Event::Cast(numEventsInWaitList, eventWaitList);145rx::CLEventImpl::CreateFunc eventCreateFunc;146rx::CLEventImpl::CreateFunc *const eventCreateFuncPtr =147event != nullptr ? &eventCreateFunc : nullptr;148149cl_int errorCode =150mImpl->enqueueReadBuffer(buf, blocking, offset, size, ptr, waitEvents, eventCreateFuncPtr);151152CheckCreateEvent(*this, CL_COMMAND_READ_BUFFER, eventCreateFunc, event, errorCode);153return errorCode;154}155156cl_int CommandQueue::enqueueWriteBuffer(cl_mem buffer,157cl_bool blockingWrite,158size_t offset,159size_t size,160const void *ptr,161cl_uint numEventsInWaitList,162const cl_event *eventWaitList,163cl_event *event)164{165const Buffer &buf = buffer->cast<Buffer>();166const bool blocking = blockingWrite != CL_FALSE;167const EventPtrs waitEvents = Event::Cast(numEventsInWaitList, eventWaitList);168rx::CLEventImpl::CreateFunc eventCreateFunc;169rx::CLEventImpl::CreateFunc *const eventCreateFuncPtr =170event != nullptr ? &eventCreateFunc : nullptr;171172cl_int errorCode =173mImpl->enqueueWriteBuffer(buf, blocking, offset, size, ptr, waitEvents, eventCreateFuncPtr);174175CheckCreateEvent(*this, CL_COMMAND_WRITE_BUFFER, eventCreateFunc, event, errorCode);176return errorCode;177}178179cl_int CommandQueue::enqueueReadBufferRect(cl_mem buffer,180cl_bool blockingRead,181const size_t *bufferOrigin,182const size_t *hostOrigin,183const size_t *region,184size_t bufferRowPitch,185size_t bufferSlicePitch,186size_t hostRowPitch,187size_t hostSlicePitch,188void *ptr,189cl_uint numEventsInWaitList,190const cl_event *eventWaitList,191cl_event *event)192{193const Buffer &buf = buffer->cast<Buffer>();194const bool blocking = blockingRead != CL_FALSE;195const EventPtrs waitEvents = Event::Cast(numEventsInWaitList, eventWaitList);196rx::CLEventImpl::CreateFunc eventCreateFunc;197rx::CLEventImpl::CreateFunc *const eventCreateFuncPtr =198event != nullptr ? &eventCreateFunc : nullptr;199200cl_int errorCode = mImpl->enqueueReadBufferRect(201buf, blocking, bufferOrigin, hostOrigin, region, bufferRowPitch, bufferSlicePitch,202hostRowPitch, hostSlicePitch, ptr, waitEvents, eventCreateFuncPtr);203204CheckCreateEvent(*this, CL_COMMAND_READ_BUFFER_RECT, eventCreateFunc, event, errorCode);205return errorCode;206}207208cl_int CommandQueue::enqueueWriteBufferRect(cl_mem buffer,209cl_bool blockingWrite,210const size_t *bufferOrigin,211const size_t *hostOrigin,212const size_t *region,213size_t bufferRowPitch,214size_t bufferSlicePitch,215size_t hostRowPitch,216size_t hostSlicePitch,217const void *ptr,218cl_uint numEventsInWaitList,219const cl_event *eventWaitList,220cl_event *event)221{222const Buffer &buf = buffer->cast<Buffer>();223const bool blocking = blockingWrite != CL_FALSE;224const EventPtrs waitEvents = Event::Cast(numEventsInWaitList, eventWaitList);225rx::CLEventImpl::CreateFunc eventCreateFunc;226rx::CLEventImpl::CreateFunc *const eventCreateFuncPtr =227event != nullptr ? &eventCreateFunc : nullptr;228229cl_int errorCode = mImpl->enqueueWriteBufferRect(230buf, blocking, bufferOrigin, hostOrigin, region, bufferRowPitch, bufferSlicePitch,231hostRowPitch, hostSlicePitch, ptr, waitEvents, eventCreateFuncPtr);232233CheckCreateEvent(*this, CL_COMMAND_WRITE_BUFFER_RECT, eventCreateFunc, event, errorCode);234return errorCode;235}236237cl_int CommandQueue::enqueueCopyBuffer(cl_mem srcBuffer,238cl_mem dstBuffer,239size_t srcOffset,240size_t dstOffset,241size_t size,242cl_uint numEventsInWaitList,243const cl_event *eventWaitList,244cl_event *event)245{246const Buffer &src = srcBuffer->cast<Buffer>();247const Buffer &dst = dstBuffer->cast<Buffer>();248const EventPtrs waitEvents = Event::Cast(numEventsInWaitList, eventWaitList);249rx::CLEventImpl::CreateFunc eventCreateFunc;250rx::CLEventImpl::CreateFunc *const eventCreateFuncPtr =251event != nullptr ? &eventCreateFunc : nullptr;252253cl_int errorCode = mImpl->enqueueCopyBuffer(src, dst, srcOffset, dstOffset, size, waitEvents,254eventCreateFuncPtr);255256CheckCreateEvent(*this, CL_COMMAND_COPY_BUFFER, eventCreateFunc, event, errorCode);257return errorCode;258}259260cl_int CommandQueue::enqueueCopyBufferRect(cl_mem srcBuffer,261cl_mem dstBuffer,262const size_t *srcOrigin,263const size_t *dstOrigin,264const size_t *region,265size_t srcRowPitch,266size_t srcSlicePitch,267size_t dstRowPitch,268size_t dstSlicePitch,269cl_uint numEventsInWaitList,270const cl_event *eventWaitList,271cl_event *event)272{273const Buffer &src = srcBuffer->cast<Buffer>();274const Buffer &dst = dstBuffer->cast<Buffer>();275const EventPtrs waitEvents = Event::Cast(numEventsInWaitList, eventWaitList);276rx::CLEventImpl::CreateFunc eventCreateFunc;277rx::CLEventImpl::CreateFunc *const eventCreateFuncPtr =278event != nullptr ? &eventCreateFunc : nullptr;279280cl_int errorCode = mImpl->enqueueCopyBufferRect(src, dst, srcOrigin, dstOrigin, region,281srcRowPitch, srcSlicePitch, dstRowPitch,282dstSlicePitch, waitEvents, eventCreateFuncPtr);283284CheckCreateEvent(*this, CL_COMMAND_COPY_BUFFER_RECT, eventCreateFunc, event, errorCode);285return errorCode;286}287288cl_int CommandQueue::enqueueFillBuffer(cl_mem buffer,289const void *pattern,290size_t patternSize,291size_t offset,292size_t size,293cl_uint numEventsInWaitList,294const cl_event *eventWaitList,295cl_event *event)296{297const Buffer &buf = buffer->cast<Buffer>();298const EventPtrs waitEvents = Event::Cast(numEventsInWaitList, eventWaitList);299rx::CLEventImpl::CreateFunc eventCreateFunc;300rx::CLEventImpl::CreateFunc *const eventCreateFuncPtr =301event != nullptr ? &eventCreateFunc : nullptr;302303cl_int errorCode = mImpl->enqueueFillBuffer(buf, pattern, patternSize, offset, size, waitEvents,304eventCreateFuncPtr);305306CheckCreateEvent(*this, CL_COMMAND_FILL_BUFFER, eventCreateFunc, event, errorCode);307return errorCode;308}309310void *CommandQueue::enqueueMapBuffer(cl_mem buffer,311cl_bool blockingMap,312MapFlags mapFlags,313size_t offset,314size_t size,315cl_uint numEventsInWaitList,316const cl_event *eventWaitList,317cl_event *event,318cl_int &errorCode)319{320const Buffer &buf = buffer->cast<Buffer>();321const bool blocking = blockingMap != CL_FALSE;322const EventPtrs waitEvents = Event::Cast(numEventsInWaitList, eventWaitList);323rx::CLEventImpl::CreateFunc eventCreateFunc;324rx::CLEventImpl::CreateFunc *const eventCreateFuncPtr =325event != nullptr ? &eventCreateFunc : nullptr;326327void *const map = mImpl->enqueueMapBuffer(buf, blocking, mapFlags, offset, size, waitEvents,328eventCreateFuncPtr, errorCode);329330CheckCreateEvent(*this, CL_COMMAND_MAP_BUFFER, eventCreateFunc, event, errorCode);331return map;332}333334cl_int CommandQueue::enqueueReadImage(cl_mem image,335cl_bool blockingRead,336const size_t *origin,337const size_t *region,338size_t rowPitch,339size_t slicePitch,340void *ptr,341cl_uint numEventsInWaitList,342const cl_event *eventWaitList,343cl_event *event)344{345const Image &img = image->cast<Image>();346const bool blocking = blockingRead != CL_FALSE;347const EventPtrs waitEvents = Event::Cast(numEventsInWaitList, eventWaitList);348rx::CLEventImpl::CreateFunc eventCreateFunc;349rx::CLEventImpl::CreateFunc *const eventCreateFuncPtr =350event != nullptr ? &eventCreateFunc : nullptr;351352cl_int errorCode = mImpl->enqueueReadImage(img, blocking, origin, region, rowPitch, slicePitch,353ptr, waitEvents, eventCreateFuncPtr);354355CheckCreateEvent(*this, CL_COMMAND_READ_IMAGE, eventCreateFunc, event, errorCode);356return errorCode;357}358359cl_int CommandQueue::enqueueWriteImage(cl_mem image,360cl_bool blockingWrite,361const size_t *origin,362const size_t *region,363size_t inputRowPitch,364size_t inputSlicePitch,365const void *ptr,366cl_uint numEventsInWaitList,367const cl_event *eventWaitList,368cl_event *event)369{370const Image &img = image->cast<Image>();371const bool blocking = blockingWrite != CL_FALSE;372const EventPtrs waitEvents = Event::Cast(numEventsInWaitList, eventWaitList);373rx::CLEventImpl::CreateFunc eventCreateFunc;374rx::CLEventImpl::CreateFunc *const eventCreateFuncPtr =375event != nullptr ? &eventCreateFunc : nullptr;376377cl_int errorCode =378mImpl->enqueueWriteImage(img, blocking, origin, region, inputRowPitch, inputSlicePitch, ptr,379waitEvents, eventCreateFuncPtr);380381CheckCreateEvent(*this, CL_COMMAND_WRITE_IMAGE, eventCreateFunc, event, errorCode);382return errorCode;383}384385cl_int CommandQueue::enqueueCopyImage(cl_mem srcImage,386cl_mem dstImage,387const size_t *srcOrigin,388const size_t *dstOrigin,389const size_t *region,390cl_uint numEventsInWaitList,391const cl_event *eventWaitList,392cl_event *event)393{394const Image &src = srcImage->cast<Image>();395const Image &dst = dstImage->cast<Image>();396const EventPtrs waitEvents = Event::Cast(numEventsInWaitList, eventWaitList);397rx::CLEventImpl::CreateFunc eventCreateFunc;398rx::CLEventImpl::CreateFunc *const eventCreateFuncPtr =399event != nullptr ? &eventCreateFunc : nullptr;400401cl_int errorCode = mImpl->enqueueCopyImage(src, dst, srcOrigin, dstOrigin, region, waitEvents,402eventCreateFuncPtr);403404CheckCreateEvent(*this, CL_COMMAND_COPY_IMAGE, eventCreateFunc, event, errorCode);405return errorCode;406}407408cl_int CommandQueue::enqueueFillImage(cl_mem image,409const void *fillColor,410const size_t *origin,411const size_t *region,412cl_uint numEventsInWaitList,413const cl_event *eventWaitList,414cl_event *event)415{416const Image &img = image->cast<Image>();417const EventPtrs waitEvents = Event::Cast(numEventsInWaitList, eventWaitList);418rx::CLEventImpl::CreateFunc eventCreateFunc;419rx::CLEventImpl::CreateFunc *const eventCreateFuncPtr =420event != nullptr ? &eventCreateFunc : nullptr;421422cl_int errorCode =423mImpl->enqueueFillImage(img, fillColor, origin, region, waitEvents, eventCreateFuncPtr);424425CheckCreateEvent(*this, CL_COMMAND_FILL_IMAGE, eventCreateFunc, event, errorCode);426return errorCode;427}428429cl_int CommandQueue::enqueueCopyImageToBuffer(cl_mem srcImage,430cl_mem dstBuffer,431const size_t *srcOrigin,432const size_t *region,433size_t dstOffset,434cl_uint numEventsInWaitList,435const cl_event *eventWaitList,436cl_event *event)437{438const Image &src = srcImage->cast<Image>();439const Buffer &dst = dstBuffer->cast<Buffer>();440const EventPtrs waitEvents = Event::Cast(numEventsInWaitList, eventWaitList);441rx::CLEventImpl::CreateFunc eventCreateFunc;442rx::CLEventImpl::CreateFunc *const eventCreateFuncPtr =443event != nullptr ? &eventCreateFunc : nullptr;444445cl_int errorCode = mImpl->enqueueCopyImageToBuffer(src, dst, srcOrigin, region, dstOffset,446waitEvents, eventCreateFuncPtr);447448CheckCreateEvent(*this, CL_COMMAND_COPY_IMAGE_TO_BUFFER, eventCreateFunc, event, errorCode);449return errorCode;450}451452cl_int CommandQueue::enqueueCopyBufferToImage(cl_mem srcBuffer,453cl_mem dstImage,454size_t srcOffset,455const size_t *dstOrigin,456const size_t *region,457cl_uint numEventsInWaitList,458const cl_event *eventWaitList,459cl_event *event)460{461const Buffer &src = srcBuffer->cast<Buffer>();462const Image &dst = dstImage->cast<Image>();463const EventPtrs waitEvents = Event::Cast(numEventsInWaitList, eventWaitList);464rx::CLEventImpl::CreateFunc eventCreateFunc;465rx::CLEventImpl::CreateFunc *const eventCreateFuncPtr =466event != nullptr ? &eventCreateFunc : nullptr;467468cl_int errorCode = mImpl->enqueueCopyBufferToImage(src, dst, srcOffset, dstOrigin, region,469waitEvents, eventCreateFuncPtr);470471CheckCreateEvent(*this, CL_COMMAND_COPY_BUFFER_TO_IMAGE, eventCreateFunc, event, errorCode);472return errorCode;473}474475void *CommandQueue::enqueueMapImage(cl_mem image,476cl_bool blockingMap,477MapFlags mapFlags,478const size_t *origin,479const size_t *region,480size_t *imageRowPitch,481size_t *imageSlicePitch,482cl_uint numEventsInWaitList,483const cl_event *eventWaitList,484cl_event *event,485cl_int &errorCode)486{487const Image &img = image->cast<Image>();488const bool blocking = blockingMap != CL_FALSE;489const EventPtrs waitEvents = Event::Cast(numEventsInWaitList, eventWaitList);490rx::CLEventImpl::CreateFunc eventCreateFunc;491rx::CLEventImpl::CreateFunc *const eventCreateFuncPtr =492event != nullptr ? &eventCreateFunc : nullptr;493494void *const map =495mImpl->enqueueMapImage(img, blocking, mapFlags, origin, region, imageRowPitch,496imageSlicePitch, waitEvents, eventCreateFuncPtr, errorCode);497498CheckCreateEvent(*this, CL_COMMAND_MAP_IMAGE, eventCreateFunc, event, errorCode);499return map;500}501502cl_int CommandQueue::enqueueUnmapMemObject(cl_mem memobj,503void *mappedPtr,504cl_uint numEventsInWaitList,505const cl_event *eventWaitList,506cl_event *event)507{508const Memory &memory = memobj->cast<Memory>();509const EventPtrs waitEvents = Event::Cast(numEventsInWaitList, eventWaitList);510rx::CLEventImpl::CreateFunc eventCreateFunc;511rx::CLEventImpl::CreateFunc *const eventCreateFuncPtr =512event != nullptr ? &eventCreateFunc : nullptr;513514cl_int errorCode =515mImpl->enqueueUnmapMemObject(memory, mappedPtr, waitEvents, eventCreateFuncPtr);516517CheckCreateEvent(*this, CL_COMMAND_UNMAP_MEM_OBJECT, eventCreateFunc, event, errorCode);518return errorCode;519}520521cl_int CommandQueue::enqueueMigrateMemObjects(cl_uint numMemObjects,522const cl_mem *memObjects,523MemMigrationFlags flags,524cl_uint numEventsInWaitList,525const cl_event *eventWaitList,526cl_event *event)527{528MemoryPtrs memories;529memories.reserve(numMemObjects);530while (numMemObjects-- != 0u)531{532memories.emplace_back(&(*memObjects++)->cast<Memory>());533}534const EventPtrs waitEvents = Event::Cast(numEventsInWaitList, eventWaitList);535rx::CLEventImpl::CreateFunc eventCreateFunc;536rx::CLEventImpl::CreateFunc *const eventCreateFuncPtr =537event != nullptr ? &eventCreateFunc : nullptr;538539cl_int errorCode =540mImpl->enqueueMigrateMemObjects(memories, flags, waitEvents, eventCreateFuncPtr);541542CheckCreateEvent(*this, CL_COMMAND_MIGRATE_MEM_OBJECTS, eventCreateFunc, event, errorCode);543return errorCode;544}545546cl_int CommandQueue::enqueueNDRangeKernel(cl_kernel kernel,547cl_uint workDim,548const size_t *globalWorkOffset,549const size_t *globalWorkSize,550const size_t *localWorkSize,551cl_uint numEventsInWaitList,552const cl_event *eventWaitList,553cl_event *event)554{555const Kernel &krnl = kernel->cast<Kernel>();556const EventPtrs waitEvents = Event::Cast(numEventsInWaitList, eventWaitList);557rx::CLEventImpl::CreateFunc eventCreateFunc;558rx::CLEventImpl::CreateFunc *const eventCreateFuncPtr =559event != nullptr ? &eventCreateFunc : nullptr;560561cl_int errorCode = mImpl->enqueueNDRangeKernel(krnl, workDim, globalWorkOffset, globalWorkSize,562localWorkSize, waitEvents, eventCreateFuncPtr);563564CheckCreateEvent(*this, CL_COMMAND_NDRANGE_KERNEL, eventCreateFunc, event, errorCode);565return errorCode;566}567568cl_int CommandQueue::enqueueTask(cl_kernel kernel,569cl_uint numEventsInWaitList,570const cl_event *eventWaitList,571cl_event *event)572{573const Kernel &krnl = kernel->cast<Kernel>();574const EventPtrs waitEvents = Event::Cast(numEventsInWaitList, eventWaitList);575rx::CLEventImpl::CreateFunc eventCreateFunc;576rx::CLEventImpl::CreateFunc *const eventCreateFuncPtr =577event != nullptr ? &eventCreateFunc : nullptr;578579cl_int errorCode = mImpl->enqueueTask(krnl, waitEvents, eventCreateFuncPtr);580581CheckCreateEvent(*this, CL_COMMAND_TASK, eventCreateFunc, event, errorCode);582return errorCode;583}584585cl_int CommandQueue::enqueueNativeKernel(UserFunc userFunc,586void *args,587size_t cbArgs,588cl_uint numMemObjects,589const cl_mem *memList,590const void **argsMemLoc,591cl_uint numEventsInWaitList,592const cl_event *eventWaitList,593cl_event *event)594{595std::vector<unsigned char> funcArgs;596BufferPtrs buffers;597std::vector<size_t> offsets;598if (numMemObjects != 0u)599{600// If argument memory block contains memory objects, make a copy.601funcArgs.resize(cbArgs);602std::memcpy(funcArgs.data(), args, cbArgs);603buffers.reserve(numMemObjects);604offsets.reserve(numMemObjects);605606while (numMemObjects-- != 0u)607{608buffers.emplace_back(&(*memList++)->cast<Buffer>());609610// Calc memory offset of cl_mem object in args.611offsets.emplace_back(static_cast<const char *>(*argsMemLoc++) -612static_cast<const char *>(args));613614// Fetch location of cl_mem object in copied function argument memory block.615void *loc = &funcArgs[offsets.back()];616617// Cast cl_mem object to cl::Buffer pointer in place.618*reinterpret_cast<Buffer **>(loc) = &(*reinterpret_cast<cl_mem *>(loc))->cast<Buffer>();619}620621// Use copied argument memory block.622args = funcArgs.data();623}624625const EventPtrs waitEvents = Event::Cast(numEventsInWaitList, eventWaitList);626rx::CLEventImpl::CreateFunc eventCreateFunc;627rx::CLEventImpl::CreateFunc *const eventCreateFuncPtr =628event != nullptr ? &eventCreateFunc : nullptr;629630cl_int errorCode = mImpl->enqueueNativeKernel(userFunc, args, cbArgs, buffers, offsets,631waitEvents, eventCreateFuncPtr);632633CheckCreateEvent(*this, CL_COMMAND_NATIVE_KERNEL, eventCreateFunc, event, errorCode);634return errorCode;635}636637cl_int CommandQueue::enqueueMarkerWithWaitList(cl_uint numEventsInWaitList,638const cl_event *eventWaitList,639cl_event *event)640{641const EventPtrs waitEvents = Event::Cast(numEventsInWaitList, eventWaitList);642rx::CLEventImpl::CreateFunc eventCreateFunc;643rx::CLEventImpl::CreateFunc *const eventCreateFuncPtr =644event != nullptr ? &eventCreateFunc : nullptr;645646cl_int errorCode = mImpl->enqueueMarkerWithWaitList(waitEvents, eventCreateFuncPtr);647648CheckCreateEvent(*this, CL_COMMAND_MARKER, eventCreateFunc, event, errorCode);649return errorCode;650}651652cl_int CommandQueue::enqueueMarker(cl_event *event)653{654rx::CLEventImpl::CreateFunc eventCreateFunc;655656cl_int errorCode = mImpl->enqueueMarker(eventCreateFunc);657658CheckCreateEvent(*this, CL_COMMAND_MARKER, eventCreateFunc, event, errorCode);659return errorCode;660}661662cl_int CommandQueue::enqueueWaitForEvents(cl_uint numEvents, const cl_event *eventList)663{664return mImpl->enqueueWaitForEvents(Event::Cast(numEvents, eventList));665}666667cl_int CommandQueue::enqueueBarrierWithWaitList(cl_uint numEventsInWaitList,668const cl_event *eventWaitList,669cl_event *event)670{671const EventPtrs waitEvents = Event::Cast(numEventsInWaitList, eventWaitList);672rx::CLEventImpl::CreateFunc eventCreateFunc;673rx::CLEventImpl::CreateFunc *const eventCreateFuncPtr =674event != nullptr ? &eventCreateFunc : nullptr;675676cl_int errorCode = mImpl->enqueueBarrierWithWaitList(waitEvents, eventCreateFuncPtr);677678CheckCreateEvent(*this, CL_COMMAND_BARRIER, eventCreateFunc, event, errorCode);679return errorCode;680}681682cl_int CommandQueue::enqueueBarrier()683{684return mImpl->enqueueBarrier();685}686687cl_int CommandQueue::flush()688{689return mImpl->flush();690}691692cl_int CommandQueue::finish()693{694return mImpl->finish();695}696697CommandQueue::~CommandQueue()698{699auto queue = mDevice->mDefaultCommandQueue.synchronize();700if (*queue == this)701{702*queue = nullptr;703}704}705706size_t CommandQueue::getDeviceIndex() const707{708return std::find(mContext->getDevices().cbegin(), mContext->getDevices().cend(), mDevice) -709mContext->getDevices().cbegin();710}711712CommandQueue::CommandQueue(Context &context,713Device &device,714PropArray &&propArray,715CommandQueueProperties properties,716cl_uint size,717cl_int &errorCode)718: mContext(&context),719mDevice(&device),720mPropArray(std::move(propArray)),721mProperties(properties),722mSize(size),723mImpl(context.getImpl().createCommandQueue(*this, errorCode))724{725if (mProperties->isSet(CL_QUEUE_ON_DEVICE_DEFAULT))726{727*mDevice->mDefaultCommandQueue = this;728}729}730731CommandQueue::CommandQueue(Context &context,732Device &device,733CommandQueueProperties properties,734cl_int &errorCode)735: mContext(&context),736mDevice(&device),737mProperties(properties),738mImpl(context.getImpl().createCommandQueue(*this, errorCode))739{}740741} // namespace cl742743744