// // 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 #include "common/string_utils.h" namespace rx { template static void GetWGLProcAddress(HMODULE glModule, PFNWGLGETPROCADDRESSPROC getProcAddressWGL, const std::string &procName, T *outProcAddress) { T proc = nullptr; if (getProcAddressWGL) { proc = reinterpret_cast(getProcAddressWGL(procName.c_str())); } if (!proc) { proc = reinterpret_cast(GetProcAddress(glModule, procName.c_str())); } *outProcAddress = proc; } template static void GetWGLExtensionProcAddress(HMODULE glModule, PFNWGLGETPROCADDRESSPROC getProcAddressWGL, const std::vector &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(); } }