blob: 140e0e3090595194c7729a36153159243fe536c4 [file] [log] [blame]
//
// 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.
//
// CLDevice.h: Defines the cl::Device class, which provides information about OpenCL device
// configurations.
#ifndef LIBANGLE_CLDEVICE_H_
#define LIBANGLE_CLDEVICE_H_
#include "libANGLE/CLObject.h"
#include "libANGLE/renderer/CLDeviceImpl.h"
#include "common/Spinlock.h"
#include "common/SynchronizedValue.h"
#include <functional>
namespace cl
{
class Device final : public _cl_device_id, public Object
{
public:
// Front end entry functions, only called from OpenCL entry points
cl_int getInfo(DeviceInfo name, size_t valueSize, void *value, size_t *valueSizeRet) const;
cl_int createSubDevices(const cl_device_partition_property *properties,
cl_uint numDevices,
cl_device_id *subDevices,
cl_uint *numDevicesRet);
public:
~Device() override;
Platform &getPlatform() noexcept;
const Platform &getPlatform() const noexcept;
bool isRoot() const noexcept;
const rx::CLDeviceImpl::Info &getInfo() const;
cl_version getVersion() const;
bool isVersionOrNewer(cl_uint major, cl_uint minor) const;
template <typename T = rx::CLDeviceImpl>
T &getImpl() const;
bool supportsBuiltInKernel(const std::string &name) const;
bool supportsNativeImageDimensions(const cl_image_desc &desc) const;
bool supportsImageDimensions(const ImageDescriptor &desc) const;
static bool IsValidType(DeviceType type);
private:
Device(Platform &platform,
Device *parent,
DeviceType type,
const rx::CLDeviceImpl::CreateFunc &createFunc);
Platform &mPlatform;
const DevicePtr mParent;
const rx::CLDeviceImpl::Ptr mImpl;
const rx::CLDeviceImpl::Info mInfo;
angle::SynchronizedValue<CommandQueue *, angle::Spinlock> mDefaultCommandQueue = nullptr;
friend class CommandQueue;
friend class Platform;
};
inline Platform &Device::getPlatform() noexcept
{
return mPlatform;
}
inline const Platform &Device::getPlatform() const noexcept
{
return mPlatform;
}
inline bool Device::isRoot() const noexcept
{
return mParent == nullptr;
}
inline const rx::CLDeviceImpl::Info &Device::getInfo() const
{
return mInfo;
}
inline cl_version Device::getVersion() const
{
return mInfo.version;
}
inline bool Device::isVersionOrNewer(cl_uint major, cl_uint minor) const
{
return mInfo.version >= CL_MAKE_VERSION(major, minor, 0u);
}
template <typename T>
inline T &Device::getImpl() const
{
return static_cast<T &>(*mImpl);
}
inline bool Device::IsValidType(DeviceType type)
{
return type.get() <= CL_DEVICE_TYPE_CUSTOM || type == CL_DEVICE_TYPE_ALL;
}
} // namespace cl
#endif // LIBANGLE_CLDEVICE_H_