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