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