xref: /aosp_15_r20/external/angle/src/libANGLE/Device.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2015 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker 
7*8975f5c5SAndroid Build Coastguard Worker // Device.cpp: Implements the egl::Device class, representing the abstract
8*8975f5c5SAndroid Build Coastguard Worker // device. Implements EGLDevice.
9*8975f5c5SAndroid Build Coastguard Worker 
10*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Device.h"
11*8975f5c5SAndroid Build Coastguard Worker 
12*8975f5c5SAndroid Build Coastguard Worker #include <iterator>
13*8975f5c5SAndroid Build Coastguard Worker 
14*8975f5c5SAndroid Build Coastguard Worker #include <EGL/eglext.h>
15*8975f5c5SAndroid Build Coastguard Worker #include <platform/PlatformMethods.h>
16*8975f5c5SAndroid Build Coastguard Worker 
17*8975f5c5SAndroid Build Coastguard Worker #include "anglebase/no_destructor.h"
18*8975f5c5SAndroid Build Coastguard Worker #include "common/debug.h"
19*8975f5c5SAndroid Build Coastguard Worker #include "common/platform.h"
20*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/DeviceImpl.h"
21*8975f5c5SAndroid Build Coastguard Worker 
22*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_ENABLE_D3D11)
23*8975f5c5SAndroid Build Coastguard Worker #    include "libANGLE/renderer/d3d/d3d11/Device11.h"
24*8975f5c5SAndroid Build Coastguard Worker #endif
25*8975f5c5SAndroid Build Coastguard Worker 
26*8975f5c5SAndroid Build Coastguard Worker namespace egl
27*8975f5c5SAndroid Build Coastguard Worker {
28*8975f5c5SAndroid Build Coastguard Worker 
29*8975f5c5SAndroid Build Coastguard Worker template <typename T>
GenerateExtensionsString(const T & extensions)30*8975f5c5SAndroid Build Coastguard Worker static std::string GenerateExtensionsString(const T &extensions)
31*8975f5c5SAndroid Build Coastguard Worker {
32*8975f5c5SAndroid Build Coastguard Worker     std::vector<std::string> extensionsVector = extensions.getStrings();
33*8975f5c5SAndroid Build Coastguard Worker 
34*8975f5c5SAndroid Build Coastguard Worker     std::ostringstream stream;
35*8975f5c5SAndroid Build Coastguard Worker     std::copy(extensionsVector.begin(), extensionsVector.end(),
36*8975f5c5SAndroid Build Coastguard Worker               std::ostream_iterator<std::string>(stream, " "));
37*8975f5c5SAndroid Build Coastguard Worker     return stream.str();
38*8975f5c5SAndroid Build Coastguard Worker }
39*8975f5c5SAndroid Build Coastguard Worker 
40*8975f5c5SAndroid Build Coastguard Worker typedef std::set<egl::Device *> DeviceSet;
GetDeviceSet()41*8975f5c5SAndroid Build Coastguard Worker static DeviceSet *GetDeviceSet()
42*8975f5c5SAndroid Build Coastguard Worker {
43*8975f5c5SAndroid Build Coastguard Worker     static angle::base::NoDestructor<DeviceSet> devices;
44*8975f5c5SAndroid Build Coastguard Worker     return devices.get();
45*8975f5c5SAndroid Build Coastguard Worker }
46*8975f5c5SAndroid Build Coastguard Worker 
47*8975f5c5SAndroid Build Coastguard Worker // Static factory methods
CreateDevice(EGLint deviceType,void * nativeDevice,Device ** outDevice)48*8975f5c5SAndroid Build Coastguard Worker egl::Error Device::CreateDevice(EGLint deviceType, void *nativeDevice, Device **outDevice)
49*8975f5c5SAndroid Build Coastguard Worker {
50*8975f5c5SAndroid Build Coastguard Worker     *outDevice = nullptr;
51*8975f5c5SAndroid Build Coastguard Worker 
52*8975f5c5SAndroid Build Coastguard Worker     std::unique_ptr<rx::DeviceImpl> newDeviceImpl;
53*8975f5c5SAndroid Build Coastguard Worker 
54*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_ENABLE_D3D11)
55*8975f5c5SAndroid Build Coastguard Worker     if (deviceType == EGL_D3D11_DEVICE_ANGLE)
56*8975f5c5SAndroid Build Coastguard Worker     {
57*8975f5c5SAndroid Build Coastguard Worker         newDeviceImpl.reset(new rx::Device11(nativeDevice));
58*8975f5c5SAndroid Build Coastguard Worker     }
59*8975f5c5SAndroid Build Coastguard Worker #endif
60*8975f5c5SAndroid Build Coastguard Worker 
61*8975f5c5SAndroid Build Coastguard Worker     // Note that creating an EGL device from inputted D3D9 parameters isn't currently supported
62*8975f5c5SAndroid Build Coastguard Worker 
63*8975f5c5SAndroid Build Coastguard Worker     if (newDeviceImpl == nullptr)
64*8975f5c5SAndroid Build Coastguard Worker     {
65*8975f5c5SAndroid Build Coastguard Worker         return EglBadAttribute();
66*8975f5c5SAndroid Build Coastguard Worker     }
67*8975f5c5SAndroid Build Coastguard Worker 
68*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(newDeviceImpl->initialize());
69*8975f5c5SAndroid Build Coastguard Worker     *outDevice = new Device(nullptr, newDeviceImpl.release());
70*8975f5c5SAndroid Build Coastguard Worker 
71*8975f5c5SAndroid Build Coastguard Worker     return NoError();
72*8975f5c5SAndroid Build Coastguard Worker }
73*8975f5c5SAndroid Build Coastguard Worker 
IsValidDevice(const Device * device)74*8975f5c5SAndroid Build Coastguard Worker bool Device::IsValidDevice(const Device *device)
75*8975f5c5SAndroid Build Coastguard Worker {
76*8975f5c5SAndroid Build Coastguard Worker     const DeviceSet *deviceSet = GetDeviceSet();
77*8975f5c5SAndroid Build Coastguard Worker     return deviceSet->find(const_cast<Device *>(device)) != deviceSet->end();
78*8975f5c5SAndroid Build Coastguard Worker }
79*8975f5c5SAndroid Build Coastguard Worker 
Device(Display * owningDisplay,rx::DeviceImpl * impl)80*8975f5c5SAndroid Build Coastguard Worker Device::Device(Display *owningDisplay, rx::DeviceImpl *impl)
81*8975f5c5SAndroid Build Coastguard Worker     : mLabel(nullptr), mOwningDisplay(owningDisplay), mImplementation(impl)
82*8975f5c5SAndroid Build Coastguard Worker {
83*8975f5c5SAndroid Build Coastguard Worker     ASSERT(GetDeviceSet()->find(this) == GetDeviceSet()->end());
84*8975f5c5SAndroid Build Coastguard Worker     GetDeviceSet()->insert(this);
85*8975f5c5SAndroid Build Coastguard Worker     initDeviceExtensions();
86*8975f5c5SAndroid Build Coastguard Worker }
87*8975f5c5SAndroid Build Coastguard Worker 
~Device()88*8975f5c5SAndroid Build Coastguard Worker Device::~Device()
89*8975f5c5SAndroid Build Coastguard Worker {
90*8975f5c5SAndroid Build Coastguard Worker     ASSERT(GetDeviceSet()->find(this) != GetDeviceSet()->end());
91*8975f5c5SAndroid Build Coastguard Worker     GetDeviceSet()->erase(this);
92*8975f5c5SAndroid Build Coastguard Worker }
93*8975f5c5SAndroid Build Coastguard Worker 
setLabel(EGLLabelKHR label)94*8975f5c5SAndroid Build Coastguard Worker void Device::setLabel(EGLLabelKHR label)
95*8975f5c5SAndroid Build Coastguard Worker {
96*8975f5c5SAndroid Build Coastguard Worker     mLabel = label;
97*8975f5c5SAndroid Build Coastguard Worker }
98*8975f5c5SAndroid Build Coastguard Worker 
getLabel() const99*8975f5c5SAndroid Build Coastguard Worker EGLLabelKHR Device::getLabel() const
100*8975f5c5SAndroid Build Coastguard Worker {
101*8975f5c5SAndroid Build Coastguard Worker     return mLabel;
102*8975f5c5SAndroid Build Coastguard Worker }
103*8975f5c5SAndroid Build Coastguard Worker 
getAttribute(EGLint attribute,EGLAttrib * value)104*8975f5c5SAndroid Build Coastguard Worker Error Device::getAttribute(EGLint attribute, EGLAttrib *value)
105*8975f5c5SAndroid Build Coastguard Worker {
106*8975f5c5SAndroid Build Coastguard Worker     void *nativeAttribute = nullptr;
107*8975f5c5SAndroid Build Coastguard Worker     egl::Error error =
108*8975f5c5SAndroid Build Coastguard Worker         getImplementation()->getAttribute(getOwningDisplay(), attribute, &nativeAttribute);
109*8975f5c5SAndroid Build Coastguard Worker     *value = reinterpret_cast<EGLAttrib>(nativeAttribute);
110*8975f5c5SAndroid Build Coastguard Worker     return error;
111*8975f5c5SAndroid Build Coastguard Worker }
112*8975f5c5SAndroid Build Coastguard Worker 
initDeviceExtensions()113*8975f5c5SAndroid Build Coastguard Worker void Device::initDeviceExtensions()
114*8975f5c5SAndroid Build Coastguard Worker {
115*8975f5c5SAndroid Build Coastguard Worker     mImplementation->generateExtensions(&mDeviceExtensions);
116*8975f5c5SAndroid Build Coastguard Worker     mDeviceExtensionString = GenerateExtensionsString(mDeviceExtensions);
117*8975f5c5SAndroid Build Coastguard Worker }
118*8975f5c5SAndroid Build Coastguard Worker 
getExtensions() const119*8975f5c5SAndroid Build Coastguard Worker const DeviceExtensions &Device::getExtensions() const
120*8975f5c5SAndroid Build Coastguard Worker {
121*8975f5c5SAndroid Build Coastguard Worker     return mDeviceExtensions;
122*8975f5c5SAndroid Build Coastguard Worker }
123*8975f5c5SAndroid Build Coastguard Worker 
getExtensionString() const124*8975f5c5SAndroid Build Coastguard Worker const std::string &Device::getExtensionString() const
125*8975f5c5SAndroid Build Coastguard Worker {
126*8975f5c5SAndroid Build Coastguard Worker     return mDeviceExtensionString;
127*8975f5c5SAndroid Build Coastguard Worker }
128*8975f5c5SAndroid Build Coastguard Worker 
getDeviceString(EGLint name)129*8975f5c5SAndroid Build Coastguard Worker const std::string &Device::getDeviceString(EGLint name)
130*8975f5c5SAndroid Build Coastguard Worker {
131*8975f5c5SAndroid Build Coastguard Worker     if (mDeviceStrings.find(name) == mDeviceStrings.end())
132*8975f5c5SAndroid Build Coastguard Worker     {
133*8975f5c5SAndroid Build Coastguard Worker         mDeviceStrings.emplace(name, mImplementation.get()->getDeviceString(name));
134*8975f5c5SAndroid Build Coastguard Worker     }
135*8975f5c5SAndroid Build Coastguard Worker 
136*8975f5c5SAndroid Build Coastguard Worker     return mDeviceStrings.find(name)->second;
137*8975f5c5SAndroid Build Coastguard Worker }
138*8975f5c5SAndroid Build Coastguard Worker }  // namespace egl
139