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