blob: 387dd46bcf7744360b476dd3f16b16a528a35b5a [file]
//
// 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.
//
// CLCommandQueue.cpp: Implements the cl::CommandQueue class.
#include "libANGLE/CLCommandQueue.h"
#include "libANGLE/CLContext.h"
#include "libANGLE/CLDevice.h"
#include "libANGLE/CLPlatform.h"
#include <cstring>
namespace cl
{
CommandQueue::~CommandQueue()
{
if (mDevice->mDefaultCommandQueue == this)
{
mDevice->mDefaultCommandQueue = nullptr;
}
}
bool CommandQueue::release()
{
const bool released = removeRef();
if (released)
{
mContext->destroyCommandQueue(this);
}
return released;
}
cl_int CommandQueue::getInfo(CommandQueueInfo name,
size_t valueSize,
void *value,
size_t *valueSizeRet)
{
void *valPointer = nullptr;
const void *copyValue = nullptr;
size_t copySize = 0u;
switch (name)
{
case CommandQueueInfo::Context:
valPointer = static_cast<cl_context>(mContext.get());
copyValue = &valPointer;
copySize = sizeof(valPointer);
break;
case CommandQueueInfo::Device:
valPointer = static_cast<cl_device_id>(mDevice.get());
copyValue = &valPointer;
copySize = sizeof(valPointer);
break;
case CommandQueueInfo::ReferenceCount:
copyValue = getRefCountPtr();
copySize = sizeof(*getRefCountPtr());
break;
case CommandQueueInfo::Properties:
copyValue = &mProperties;
copySize = sizeof(mProperties);
break;
case CommandQueueInfo::PropertiesArray:
copyValue = mPropArray.data();
copySize = mPropArray.size() * sizeof(decltype(mPropArray)::value_type);
break;
case CommandQueueInfo::Size:
copyValue = &mSize;
copySize = sizeof(mSize);
break;
case CommandQueueInfo::DeviceDefault:
valPointer = static_cast<cl_command_queue>(mDevice->mDefaultCommandQueue);
copyValue = &valPointer;
copySize = sizeof(valPointer);
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;
}
cl_int CommandQueue::setProperty(cl_command_queue_properties properties,
cl_bool enable,
cl_command_queue_properties *oldProperties)
{
if (oldProperties != nullptr)
{
*oldProperties = mProperties;
}
const cl_int result = mImpl->setProperty(properties, enable);
if (result == CL_SUCCESS)
{
if (enable == CL_FALSE)
{
mProperties &= ~properties;
}
else
{
mProperties |= properties;
}
}
return result;
}
bool CommandQueue::IsValid(const _cl_command_queue *commandQueue)
{
const Platform::PtrList &platforms = Platform::GetPlatforms();
return std::find_if(platforms.cbegin(), platforms.cend(), [=](const PlatformPtr &platform) {
return platform->hasCommandQueue(commandQueue);
}) != platforms.cend();
}
CommandQueue::CommandQueue(ContextRefPtr &&context,
DeviceRefPtr &&device,
cl_command_queue_properties properties,
cl_int *errcodeRet)
: _cl_command_queue(context->getDispatch()),
mContext(std::move(context)),
mDevice(std::move(device)),
mProperties(properties),
mImpl(mContext->mImpl->createCommandQueue(*this, errcodeRet))
{}
CommandQueue::CommandQueue(ContextRefPtr &&context,
DeviceRefPtr &&device,
PropArray &&propArray,
cl_command_queue_properties properties,
cl_uint size,
cl_int *errcodeRet)
: _cl_command_queue(context->getDispatch()),
mContext(std::move(context)),
mDevice(std::move(device)),
mPropArray(std::move(propArray)),
mProperties(properties),
mSize(size),
mImpl(mContext->mImpl->createCommandQueue(*this, errcodeRet))
{
if ((mProperties & CL_QUEUE_ON_DEVICE_DEFAULT) != 0u)
{
mDevice->mDefaultCommandQueue = this;
}
}
} // namespace cl