diff options
Diffstat (limited to 'gfx/angle/src/libANGLE/renderer/gl/wgl/FunctionsWGL.cpp')
-rwxr-xr-x | gfx/angle/src/libANGLE/renderer/gl/wgl/FunctionsWGL.cpp | 181 |
1 files changed, 181 insertions, 0 deletions
diff --git a/gfx/angle/src/libANGLE/renderer/gl/wgl/FunctionsWGL.cpp b/gfx/angle/src/libANGLE/renderer/gl/wgl/FunctionsWGL.cpp new file mode 100755 index 000000000..2cfe6e9eb --- /dev/null +++ b/gfx/angle/src/libANGLE/renderer/gl/wgl/FunctionsWGL.cpp @@ -0,0 +1,181 @@ +// +// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +// FunctionsWGL.h: Implements the FuntionsWGL class. + +#include "libANGLE/renderer/gl/wgl/FunctionsWGL.h" + +#include <algorithm> + +#include "common/string_utils.h" + +namespace rx +{ + +template <typename T> +static void GetWGLProcAddress(HMODULE glModule, PFNWGLGETPROCADDRESSPROC getProcAddressWGL, + const std::string &procName, T *outProcAddress) +{ + T proc = nullptr; + if (getProcAddressWGL) + { + proc = reinterpret_cast<T>(getProcAddressWGL(procName.c_str())); + } + + if (!proc) + { + proc = reinterpret_cast<T>(GetProcAddress(glModule, procName.c_str())); + } + + *outProcAddress = proc; +} + +template <typename T> +static void GetWGLExtensionProcAddress(HMODULE glModule, + PFNWGLGETPROCADDRESSPROC getProcAddressWGL, + const std::vector<std::string> &extensions, + const std::string &extensionName, + const std::string &procName, + T *outProcAddress) +{ + T proc = nullptr; + if (std::find(extensions.begin(), extensions.end(), extensionName) != extensions.end()) + { + GetWGLProcAddress(glModule, getProcAddressWGL, procName, &proc); + } + + *outProcAddress = proc; +} + +FunctionsWGL::FunctionsWGL() + : copyContext(nullptr), + createContext(nullptr), + createLayerContext(nullptr), + deleteContext(nullptr), + getCurrentContext(nullptr), + getCurrentDC(nullptr), + getProcAddress(nullptr), + makeCurrent(nullptr), + shareLists(nullptr), + useFontBitmapsA(nullptr), + useFontBitmapsW(nullptr), + swapBuffers(nullptr), + useFontOutlinesA(nullptr), + useFontOutlinesW(nullptr), + describeLayerPlane(nullptr), + setLayerPaletteEntries(nullptr), + getLayerPaletteEntries(nullptr), + realizeLayerPalette(nullptr), + swapLayerBuffers(nullptr), + swapMultipleBuffers(nullptr), + getExtensionStringEXT(nullptr), + getExtensionStringARB(nullptr), + createContextAttribsARB(nullptr), + getPixelFormatAttribivARB(nullptr), + getPixelFormatAttribfvARB(nullptr), + choosePixelFormatARB(nullptr), + swapIntervalEXT(nullptr), + createPbufferARB(nullptr), + getPbufferDCARB(nullptr), + releasePbufferDCARB(nullptr), + destroyPbufferARB(nullptr), + queryPbufferARB(nullptr), + bindTexImageARB(nullptr), + releaseTexImageARB(nullptr), + setPbufferAttribARB(nullptr), + dxSetResourceShareHandleNV(nullptr), + dxOpenDeviceNV(nullptr), + dxCloseDeviceNV(nullptr), + dxRegisterObjectNV(nullptr), + dxUnregisterObjectNV(nullptr), + dxObjectAccessNV(nullptr), + dxLockObjectsNV(nullptr), + dxUnlockObjectsNV(nullptr) +{ +} + +void FunctionsWGL::initialize(HMODULE glModule, HDC context) +{ + // First grab the wglGetProcAddress function from the gl module + GetWGLProcAddress(glModule, nullptr, "wglGetProcAddress", &getProcAddress); + + // Load the core wgl functions + GetWGLProcAddress(glModule, getProcAddress, "wglCopyContext", ©Context); + GetWGLProcAddress(glModule, getProcAddress, "wglCreateContext", &createContext); + GetWGLProcAddress(glModule, getProcAddress, "wglCreateLayerContext", &createLayerContext); + GetWGLProcAddress(glModule, getProcAddress, "wglDeleteContext", &deleteContext); + GetWGLProcAddress(glModule, getProcAddress, "wglGetCurrentContext", &getCurrentContext); + GetWGLProcAddress(glModule, getProcAddress, "wglGetCurrentDC", &getCurrentDC); + GetWGLProcAddress(glModule, getProcAddress, "wglMakeCurrent", &makeCurrent); + GetWGLProcAddress(glModule, getProcAddress, "wglShareLists", &shareLists); + GetWGLProcAddress(glModule, getProcAddress, "wglUseFontBitmapsA", &useFontBitmapsA); + GetWGLProcAddress(glModule, getProcAddress, "wglUseFontBitmapsW", &useFontBitmapsW); + swapBuffers = SwapBuffers; // SwapBuffers is statically linked from GDI + GetWGLProcAddress(glModule, getProcAddress, "wglUseFontOutlinesA", &useFontOutlinesA); + GetWGLProcAddress(glModule, getProcAddress, "wglUseFontOutlinesW", &useFontOutlinesW); + GetWGLProcAddress(glModule, getProcAddress, "wglDescribeLayerPlane", &describeLayerPlane); + GetWGLProcAddress(glModule, getProcAddress, "wglSetLayerPaletteEntries", &setLayerPaletteEntries); + GetWGLProcAddress(glModule, getProcAddress, "wglGetLayerPaletteEntries", &getLayerPaletteEntries); + GetWGLProcAddress(glModule, getProcAddress, "wglRealizeLayerPalette", &realizeLayerPalette); + GetWGLProcAddress(glModule, getProcAddress, "wglSwapLayerBuffers", &swapLayerBuffers); + GetWGLProcAddress(glModule, getProcAddress, "wglSwapMultipleBuffers", &swapMultipleBuffers); + + // Load extension string getter functions + GetWGLProcAddress(glModule, getProcAddress, "wglGetExtensionsStringEXT", &getExtensionStringEXT); + GetWGLProcAddress(glModule, getProcAddress, "wglGetExtensionsStringARB", &getExtensionStringARB); + + std::string extensionString = ""; + if (getExtensionStringEXT) + { + extensionString = getExtensionStringEXT(); + } + else if (getExtensionStringARB && context) + { + extensionString = getExtensionStringARB(context); + } + angle::SplitStringAlongWhitespace(extensionString, &extensions); + + // Load the wgl extension functions by checking if the context supports the extension first + + // WGL_ARB_create_context + GetWGLExtensionProcAddress(glModule, getProcAddress, extensions, "WGL_ARB_create_context", "wglCreateContextAttribsARB", &createContextAttribsARB); + + // WGL_ARB_pixel_format + GetWGLExtensionProcAddress(glModule, getProcAddress, extensions, "WGL_ARB_pixel_format", "wglGetPixelFormatAttribivARB", &getPixelFormatAttribivARB); + GetWGLExtensionProcAddress(glModule, getProcAddress, extensions, "WGL_ARB_pixel_format", "wglGetPixelFormatAttribfvARB", &getPixelFormatAttribfvARB); + GetWGLExtensionProcAddress(glModule, getProcAddress, extensions, "WGL_ARB_pixel_format", "wglChoosePixelFormatARB", &choosePixelFormatARB); + + // WGL_EXT_swap_control + GetWGLExtensionProcAddress(glModule, getProcAddress, extensions, "WGL_EXT_swap_control", "wglSwapIntervalEXT", &swapIntervalEXT); + + // WGL_ARB_pbuffer + GetWGLExtensionProcAddress(glModule, getProcAddress, extensions, "WGL_ARB_pbuffer", "wglCreatePbufferARB", &createPbufferARB); + GetWGLExtensionProcAddress(glModule, getProcAddress, extensions, "WGL_ARB_pbuffer", "wglGetPbufferDCARB", &getPbufferDCARB); + GetWGLExtensionProcAddress(glModule, getProcAddress, extensions, "WGL_ARB_pbuffer", "wglReleasePbufferDCARB", &releasePbufferDCARB); + GetWGLExtensionProcAddress(glModule, getProcAddress, extensions, "WGL_ARB_pbuffer", "wglDestroyPbufferARB", &destroyPbufferARB); + GetWGLExtensionProcAddress(glModule, getProcAddress, extensions, "WGL_ARB_pbuffer", "wglQueryPbufferARB", &queryPbufferARB); + + // WGL_ARB_render_texture + GetWGLExtensionProcAddress(glModule, getProcAddress, extensions, "WGL_ARB_render_texture", "wglBindTexImageARB", &bindTexImageARB); + GetWGLExtensionProcAddress(glModule, getProcAddress, extensions, "WGL_ARB_render_texture", "wglReleaseTexImageARB", &releaseTexImageARB); + GetWGLExtensionProcAddress(glModule, getProcAddress, extensions, "WGL_ARB_render_texture", "wglSetPbufferAttribARB", &setPbufferAttribARB); + + // WGL_NV_DX_interop + GetWGLExtensionProcAddress(glModule, getProcAddress, extensions, "WGL_NV_DX_interop", "wglDXSetResourceShareHandleNV", &dxSetResourceShareHandleNV); + GetWGLExtensionProcAddress(glModule, getProcAddress, extensions, "WGL_NV_DX_interop", "wglDXOpenDeviceNV", &dxOpenDeviceNV); + GetWGLExtensionProcAddress(glModule, getProcAddress, extensions, "WGL_NV_DX_interop", "wglDXCloseDeviceNV", &dxCloseDeviceNV); + GetWGLExtensionProcAddress(glModule, getProcAddress, extensions, "WGL_NV_DX_interop", "wglDXRegisterObjectNV", &dxRegisterObjectNV); + GetWGLExtensionProcAddress(glModule, getProcAddress, extensions, "WGL_NV_DX_interop", "wglDXUnregisterObjectNV", &dxUnregisterObjectNV); + GetWGLExtensionProcAddress(glModule, getProcAddress, extensions, "WGL_NV_DX_interop", "wglDXObjectAccessNV", &dxObjectAccessNV); + GetWGLExtensionProcAddress(glModule, getProcAddress, extensions, "WGL_NV_DX_interop", "wglDXLockObjectsNV", &dxLockObjectsNV); + GetWGLExtensionProcAddress(glModule, getProcAddress, extensions, "WGL_NV_DX_interop", "wglDXUnlockObjectsNV", &dxUnlockObjectsNV); +} + +bool FunctionsWGL::hasExtension(const std::string &ext) const +{ + return std::find(extensions.begin(), extensions.end(), ext) != extensions.end(); +} +} |