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 // DisplayWGL.h: WGL implementation of egl::Display 8 9 #ifndef LIBANGLE_RENDERER_GL_WGL_DISPLAYWGL_H_ 10 #define LIBANGLE_RENDERER_GL_WGL_DISPLAYWGL_H_ 11 12 #include <thread> 13 #include <unordered_map> 14 15 #include "libANGLE/renderer/gl/DisplayGL.h" 16 17 #include <GL/wglext.h> 18 19 namespace rx 20 { 21 22 class FunctionsWGL; 23 class RendererWGL; 24 class WorkerContext; 25 26 class DisplayWGL : public DisplayGL 27 { 28 public: 29 DisplayWGL(const egl::DisplayState &state); 30 ~DisplayWGL() override; 31 32 egl::Error initialize(egl::Display *display) override; 33 void terminate() override; 34 35 // Surface creation 36 SurfaceImpl *createWindowSurface(const egl::SurfaceState &state, 37 EGLNativeWindowType window, 38 const egl::AttributeMap &attribs) override; 39 SurfaceImpl *createPbufferSurface(const egl::SurfaceState &state, 40 const egl::AttributeMap &attribs) override; 41 SurfaceImpl *createPbufferFromClientBuffer(const egl::SurfaceState &state, 42 EGLenum buftype, 43 EGLClientBuffer clientBuffer, 44 const egl::AttributeMap &attribs) override; 45 SurfaceImpl *createPixmapSurface(const egl::SurfaceState &state, 46 NativePixmapType nativePixmap, 47 const egl::AttributeMap &attribs) override; 48 49 ContextImpl *createContext(const gl::State &state, 50 gl::ErrorSet *errorSet, 51 const egl::Config *configuration, 52 const gl::Context *shareContext, 53 const egl::AttributeMap &attribs) override; 54 55 egl::ConfigSet generateConfigs() override; 56 57 bool testDeviceLost() override; 58 egl::Error restoreLostDevice(const egl::Display *display) override; 59 60 bool isValidNativeWindow(EGLNativeWindowType window) const override; 61 egl::Error validateClientBuffer(const egl::Config *configuration, 62 EGLenum buftype, 63 EGLClientBuffer clientBuffer, 64 const egl::AttributeMap &attribs) const override; 65 66 DeviceImpl *createDevice() override; 67 68 std::string getVendorString() const override; 69 70 egl::Error waitClient(const gl::Context *context) override; 71 egl::Error waitNative(const gl::Context *context, EGLint engine) override; 72 73 egl::Error makeCurrent(egl::Display *display, 74 egl::Surface *drawSurface, 75 egl::Surface *readSurface, 76 gl::Context *context) override; 77 78 egl::Error registerD3DDevice(IUnknown *device, HANDLE *outHandle); 79 void releaseD3DDevice(HANDLE handle); 80 81 gl::Version getMaxSupportedESVersion() const override; 82 83 void destroyNativeContext(HGLRC context); 84 85 WorkerContext *createWorkerContext(std::string *infoLog, 86 HGLRC sharedContext, 87 const std::vector<int> &workerContextAttribs); 88 89 void initializeFrontendFeatures(angle::FrontendFeatures *features) const override; 90 91 void populateFeatureList(angle::FeatureList *features) override; 92 93 private: 94 egl::Error initializeImpl(egl::Display *display); 95 void destroy(); 96 97 egl::Error initializeD3DDevice(); 98 99 void generateExtensions(egl::DisplayExtensions *outExtensions) const override; 100 void generateCaps(egl::Caps *outCaps) const override; 101 102 egl::Error makeCurrentSurfaceless(gl::Context *context) override; 103 104 HGLRC initializeContextAttribs(const egl::AttributeMap &eglAttributes, 105 HGLRC &sharedContext, 106 bool &useARBShare, 107 std::vector<int> &workerContextAttribs) const; 108 HGLRC createContextAttribs(const gl::Version &version, 109 int profileMask, 110 HGLRC &sharedContext, 111 bool &useARBShare, 112 std::vector<int> &workerContextAttribs) const; 113 114 egl::Error createRenderer(std::shared_ptr<RendererWGL> *outRenderer); 115 116 std::shared_ptr<RendererWGL> mRenderer; 117 118 struct CurrentNativeContext 119 { 120 HDC dc = nullptr; 121 HGLRC glrc = nullptr; 122 }; 123 std::unordered_map<std::thread::id, CurrentNativeContext> mCurrentData; 124 125 HMODULE mOpenGLModule; 126 127 FunctionsWGL *mFunctionsWGL; 128 129 bool mHasWGLCreateContextRobustness; 130 bool mHasRobustness; 131 132 egl::AttributeMap mDisplayAttributes; 133 134 ATOM mWindowClass; 135 HWND mWindow; 136 HDC mDeviceContext; 137 int mPixelFormat; 138 139 bool mUseDXGISwapChains; 140 bool mHasDXInterop; 141 HMODULE mDxgiModule; 142 HMODULE mD3d11Module; 143 HANDLE mD3D11DeviceHandle; 144 ID3D11Device *mD3D11Device; 145 146 struct D3DObjectHandle 147 { 148 HANDLE handle; 149 size_t refCount; 150 }; 151 std::map<IUnknown *, D3DObjectHandle> mRegisteredD3DDevices; 152 153 bool mUseARBShare; 154 }; 155 156 } // namespace rx 157 158 #endif // LIBANGLE_RENDERER_GL_WGL_DISPLAYWGL_H_ 159