summaryrefslogtreecommitdiffstats
path: root/gfx/gl/WGLLibrary.h
diff options
context:
space:
mode:
Diffstat (limited to 'gfx/gl/WGLLibrary.h')
-rw-r--r--gfx/gl/WGLLibrary.h114
1 files changed, 114 insertions, 0 deletions
diff --git a/gfx/gl/WGLLibrary.h b/gfx/gl/WGLLibrary.h
new file mode 100644
index 0000000000..82c764b3db
--- /dev/null
+++ b/gfx/gl/WGLLibrary.h
@@ -0,0 +1,114 @@
+/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "GLContextTypes.h"
+#include "GLLibraryLoader.h"
+#include "mozilla/UniquePtr.h"
+#include <windows.h>
+
+struct PRLibrary;
+
+namespace mozilla {
+namespace gl {
+/*
+struct ScopedDC
+{
+ const HDC mDC;
+
+ ScopedDC() = delete;
+ virtual ~ScopedDC() = 0;
+};
+
+struct WindowDC final : public ScopedDC
+{
+ const HWND mWindow;
+
+ WindowDC() = delete;
+ ~WindowDC();
+};
+
+struct PBufferDC final : public ScopedDC
+{
+ const HWND mWindow;
+
+ PBufferDC() = delete;
+ ~PBufferDC();
+};
+*/
+class WGLLibrary {
+ public:
+ ~WGLLibrary() { Reset(); }
+
+ private:
+ void Reset();
+
+ public:
+ struct {
+ HGLRC(GLAPIENTRY* fCreateContext)(HDC);
+ BOOL(GLAPIENTRY* fDeleteContext)(HGLRC);
+ BOOL(GLAPIENTRY* fMakeCurrent)(HDC, HGLRC);
+ PROC(GLAPIENTRY* fGetProcAddress)(LPCSTR);
+ HGLRC(GLAPIENTRY* fGetCurrentContext)(void);
+ HDC(GLAPIENTRY* fGetCurrentDC)(void);
+ // BOOL (GLAPIENTRY * fShareLists) (HGLRC oldContext, HGLRC newContext);
+ HANDLE(GLAPIENTRY* fCreatePbuffer)
+ (HDC hDC, int iPixelFormat, int iWidth, int iHeight,
+ const int* piAttribList);
+ BOOL(GLAPIENTRY* fDestroyPbuffer)(HANDLE hPbuffer);
+ HDC(GLAPIENTRY* fGetPbufferDC)(HANDLE hPbuffer);
+ int(GLAPIENTRY* fReleasePbufferDC)(HANDLE hPbuffer, HDC dc);
+ // BOOL (GLAPIENTRY * fBindTexImage) (HANDLE hPbuffer, int iBuffer);
+ // BOOL (GLAPIENTRY * fReleaseTexImage) (HANDLE hPbuffer, int iBuffer);
+ BOOL(GLAPIENTRY* fChoosePixelFormat)
+ (HDC hdc, const int* piAttribIList, const FLOAT* pfAttribFList,
+ UINT nMaxFormats, int* piFormats, UINT* nNumFormats);
+ // BOOL (GLAPIENTRY * fGetPixelFormatAttribiv) (HDC hdc,
+ // int iPixelFormat,
+ // int iLayerPlane,
+ // UINT nAttributes,
+ // int* piAttributes,
+ // int* piValues);
+ const char*(GLAPIENTRY* fGetExtensionsStringARB)(HDC hdc);
+ HGLRC(GLAPIENTRY* fCreateContextAttribsARB)
+ (HDC hdc, HGLRC hShareContext, const int* attribList);
+ // WGL_NV_DX_interop:
+ BOOL(GLAPIENTRY* fDXSetResourceShareHandleNV)
+ (void* dxObject, HANDLE shareHandle);
+ HANDLE(GLAPIENTRY* fDXOpenDeviceNV)(void* dxDevice);
+ BOOL(GLAPIENTRY* fDXCloseDeviceNV)(HANDLE hDevice);
+ HANDLE(GLAPIENTRY* fDXRegisterObjectNV)
+ (HANDLE hDevice, void* dxObject, GLuint name, GLenum type, GLenum access);
+ BOOL(GLAPIENTRY* fDXUnregisterObjectNV)(HANDLE hDevice, HANDLE hObject);
+ BOOL(GLAPIENTRY* fDXObjectAccessNV)(HANDLE hObject, GLenum access);
+ BOOL(GLAPIENTRY* fDXLockObjectsNV)
+ (HANDLE hDevice, GLint count, HANDLE* hObjects);
+ BOOL(GLAPIENTRY* fDXUnlockObjectsNV)
+ (HANDLE hDevice, GLint count, HANDLE* hObjects);
+ } mSymbols = {};
+
+ bool EnsureInitialized();
+ // UniquePtr<WindowDC> CreateDummyWindow();
+ HGLRC CreateContextWithFallback(HDC dc, bool tryRobustBuffers) const;
+
+ bool HasDXInterop2() const { return bool(mSymbols.fDXOpenDeviceNV); }
+ bool IsInitialized() const { return mInitialized; }
+ auto GetOGLLibrary() const { return mOGLLibrary; }
+ auto RootDc() const { return mRootDc; }
+ SymbolLoader GetSymbolLoader() const;
+
+ private:
+ bool mInitialized = false;
+ PRLibrary* mOGLLibrary;
+ bool mHasRobustness;
+ HWND mDummyWindow;
+ HDC mRootDc;
+ HGLRC mDummyGlrc;
+};
+
+// a global WGLLibrary instance
+extern WGLLibrary sWGLLib;
+
+} /* namespace gl */
+} /* namespace mozilla */