blob: 87009e808c03212a7815f01955d0c0c8039ddefb [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.
//
// CLContextCL.cpp: Implements the class methods for CLContextCL.
#include "libANGLE/renderer/cl/CLContextCL.h"
#include "libANGLE/renderer/cl/CLCommandQueueCL.h"
#include "libANGLE/renderer/cl/CLDeviceCL.h"
#include "libANGLE/CLContext.h"
#include "libANGLE/CLDevice.h"
#include "libANGLE/CLPlatform.h"
#include "libANGLE/Debug.h"
namespace rx
{
CLContextCL::CLContextCL(const cl::Context &context, cl_context native)
: CLContextImpl(context), mNative(native)
{}
CLContextCL::~CLContextCL()
{
if (mNative->getDispatch().clReleaseContext(mNative) != CL_SUCCESS)
{
ERR() << "Error while releasing CL context";
}
}
cl::DeviceRefList CLContextCL::getDevices() const
{
size_t valueSize = 0u;
cl_int result = mNative->getDispatch().clGetContextInfo(mNative, CL_CONTEXT_DEVICES, 0u,
nullptr, &valueSize);
if (result == CL_SUCCESS && (valueSize % sizeof(cl_device_id)) == 0u)
{
std::vector<cl_device_id> nativeDevices(valueSize / sizeof(cl_device_id), nullptr);
result = mNative->getDispatch().clGetContextInfo(mNative, CL_CONTEXT_DEVICES, valueSize,
nativeDevices.data(), nullptr);
if (result == CL_SUCCESS)
{
const cl::DevicePtrList &platformDevices = mContext.getPlatform().getDevices();
cl::DeviceRefList devices;
for (cl_device_id nativeDevice : nativeDevices)
{
auto it = platformDevices.cbegin();
while (it != platformDevices.cend() &&
(*it)->getImpl<CLDeviceCL &>().getNative() != nativeDevice)
{
++it;
}
if (it != platformDevices.cend())
{
devices.emplace_back(it->get());
}
else
{
ERR() << "Device not found in platform list";
return cl::DeviceRefList{};
}
}
return devices;
}
}
ERR() << "Error fetching devices from CL context, code: " << result;
return cl::DeviceRefList{};
}
CLCommandQueueImpl::Ptr CLContextCL::createCommandQueue(const cl::CommandQueue &commandQueue,
cl_int *errcodeRet)
{
const cl::Device &device = commandQueue.getDevice();
const cl_device_id nativeDevice = device.getImpl<CLDeviceCL &>().getNative();
cl_command_queue nativeQueue = nullptr;
if (device.getInfo().mVersion < CL_MAKE_VERSION(2, 0, 0))
{
nativeQueue = mNative->getDispatch().clCreateCommandQueue(
mNative, nativeDevice, commandQueue.getProperties(), errcodeRet);
}
else
{
const cl_queue_properties propArray[] = {CL_QUEUE_PROPERTIES, commandQueue.getProperties(),
commandQueue.hasSize() ? CL_QUEUE_SIZE : 0u,
commandQueue.getSize(), 0u};
nativeQueue = mNative->getDispatch().clCreateCommandQueueWithProperties(
mNative, nativeDevice, propArray, errcodeRet);
}
return CLCommandQueueImpl::Ptr(
nativeQueue != nullptr ? new CLCommandQueueCL(commandQueue, nativeQueue) : nullptr);
}
} // namespace rx