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