diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-28 14:29:10 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-28 14:29:10 +0000 |
commit | 2aa4a82499d4becd2284cdb482213d541b8804dd (patch) | |
tree | b80bf8bf13c3766139fbacc530efd0dd9d54394c /gfx/angle/checkout/src/libANGLE/Device.cpp | |
parent | Initial commit. (diff) | |
download | firefox-2aa4a82499d4becd2284cdb482213d541b8804dd.tar.xz firefox-2aa4a82499d4becd2284cdb482213d541b8804dd.zip |
Adding upstream version 86.0.1.upstream/86.0.1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'gfx/angle/checkout/src/libANGLE/Device.cpp')
-rw-r--r-- | gfx/angle/checkout/src/libANGLE/Device.cpp | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/gfx/angle/checkout/src/libANGLE/Device.cpp b/gfx/angle/checkout/src/libANGLE/Device.cpp new file mode 100644 index 0000000000..13ae4e618e --- /dev/null +++ b/gfx/angle/checkout/src/libANGLE/Device.cpp @@ -0,0 +1,131 @@ +// +// Copyright (c) 2015 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. +// + +// Device.cpp: Implements the egl::Device class, representing the abstract +// device. Implements EGLDevice. + +#include "libANGLE/Device.h" + +#include <iterator> + +#include <EGL/eglext.h> +#include <platform/Platform.h> + +#include "common/debug.h" +#include "common/platform.h" +#include "libANGLE/renderer/DeviceImpl.h" + +#if defined(ANGLE_ENABLE_D3D11) +# include "libANGLE/renderer/d3d/DeviceD3D.h" +#endif + +namespace egl +{ + +template <typename T> +static std::string GenerateExtensionsString(const T &extensions) +{ + std::vector<std::string> extensionsVector = extensions.getStrings(); + + std::ostringstream stream; + std::copy(extensionsVector.begin(), extensionsVector.end(), + std::ostream_iterator<std::string>(stream, " ")); + return stream.str(); +} + +typedef std::set<egl::Device *> DeviceSet; +static DeviceSet *GetDeviceSet() +{ + static DeviceSet devices; + return &devices; +} + +// Static factory methods +egl::Error Device::CreateDevice(EGLint deviceType, void *nativeDevice, Device **outDevice) +{ + *outDevice = nullptr; + + std::unique_ptr<rx::DeviceImpl> newDeviceImpl; + +#if defined(ANGLE_ENABLE_D3D11) + if (deviceType == EGL_D3D11_DEVICE_ANGLE) + { + newDeviceImpl.reset(new rx::DeviceD3D(deviceType, nativeDevice)); + } +#endif + + // Note that creating an EGL device from inputted D3D9 parameters isn't currently supported + + if (newDeviceImpl == nullptr) + { + return EglBadAttribute(); + } + + ANGLE_TRY(newDeviceImpl->initialize()); + *outDevice = new Device(nullptr, newDeviceImpl.release()); + + return NoError(); +} + +bool Device::IsValidDevice(const Device *device) +{ + const DeviceSet *deviceSet = GetDeviceSet(); + return deviceSet->find(const_cast<Device *>(device)) != deviceSet->end(); +} + +Device::Device(Display *owningDisplay, rx::DeviceImpl *impl) + : mLabel(nullptr), mOwningDisplay(owningDisplay), mImplementation(impl) +{ + ASSERT(GetDeviceSet()->find(this) == GetDeviceSet()->end()); + GetDeviceSet()->insert(this); + initDeviceExtensions(); +} + +Device::~Device() +{ + ASSERT(GetDeviceSet()->find(this) != GetDeviceSet()->end()); + GetDeviceSet()->erase(this); +} + +void Device::setLabel(EGLLabelKHR label) +{ + mLabel = label; +} + +EGLLabelKHR Device::getLabel() const +{ + return mLabel; +} + +Error Device::getDevice(EGLAttrib *value) +{ + void *nativeDevice = nullptr; + egl::Error error = getImplementation()->getDevice(&nativeDevice); + *value = reinterpret_cast<EGLAttrib>(nativeDevice); + return error; +} + +EGLint Device::getType() +{ + return getImplementation()->getType(); +} + +void Device::initDeviceExtensions() +{ + mImplementation->generateExtensions(&mDeviceExtensions); + mDeviceExtensionString = GenerateExtensionsString(mDeviceExtensions); +} + +const DeviceExtensions &Device::getExtensions() const +{ + return mDeviceExtensions; +} + +const std::string &Device::getExtensionString() const +{ + return mDeviceExtensionString; +} +} // namespace egl |