1/* 2 * Copyright © 2014 Jon Turney 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice (including the next 12 * paragraph) shall be included in all copies or substantial portions of the 13 * Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 21 * IN THE SOFTWARE. 22 */ 23 24/* 25 Wrapper functions for calling WGL extension functions 26 */ 27 28#include "wgl.h" 29 30#include <stdio.h> 31 32#define RESOLVE_DECL(type) \ 33 static type type##proc = NULL; 34 35#define PRERESOLVE(type, symbol) \ 36 type##proc = (type)wglGetProcAddress(symbol); \ 37 if (type##proc == NULL) \ 38 printf("Can't resolve \"%s\"\n", symbol); 39 40#define CHECK_RESOLVED(type, retval) \ 41 if (type##proc == NULL) { \ 42 return retval; \ 43 } 44 45#define RESOLVED_PROC(type) type##proc 46 47RESOLVE_DECL(PFNWGLGETEXTENSIONSSTRINGARBPROC); 48RESOLVE_DECL(PFNWGLCREATECONTEXTATTRIBSARBPROC); 49RESOLVE_DECL(PFNWGLMAKECONTEXTCURRENTARBPROC); 50RESOLVE_DECL(PFNWGLCREATEPBUFFERARBPROC); 51RESOLVE_DECL(PFNWGLGETPBUFFERDCARBPROC); 52RESOLVE_DECL(PFNWGLRELEASEPBUFFERDCARBPROC); 53RESOLVE_DECL(PFNWGLDESTROYPBUFFERARBPROC); 54 55void wglResolveExtensionProcs(void) 56{ 57 PRERESOLVE(PFNWGLGETEXTENSIONSSTRINGARBPROC, "wglGetExtensionsStringARB"); 58 PRERESOLVE(PFNWGLCREATECONTEXTATTRIBSARBPROC, "wglCreateContextAttribsARB"); 59 PRERESOLVE(PFNWGLMAKECONTEXTCURRENTARBPROC, "wglMakeContextCurrentARB"); 60 PRERESOLVE(PFNWGLCREATEPBUFFERARBPROC, "wglCreatePbufferARB"); 61 PRERESOLVE(PFNWGLGETPBUFFERDCARBPROC, "wglGetPbufferDCARB"); 62 PRERESOLVE(PFNWGLRELEASEPBUFFERDCARBPROC, "wglReleasePbufferDCARB"); 63 PRERESOLVE(PFNWGLDESTROYPBUFFERARBPROC, "wglDestroyPbufferARB"); 64} 65 66const char *wglGetExtensionsStringARB(HDC hdc_) 67{ 68 CHECK_RESOLVED(PFNWGLGETEXTENSIONSSTRINGARBPROC, ""); 69 return RESOLVED_PROC(PFNWGLGETEXTENSIONSSTRINGARBPROC)(hdc_); 70} 71 72HGLRC wglCreateContextAttribsARB(HDC hdc_, HGLRC hShareContext_, 73 const int *attribList_) 74{ 75 CHECK_RESOLVED(PFNWGLCREATECONTEXTATTRIBSARBPROC, NULL); 76 return RESOLVED_PROC(PFNWGLCREATECONTEXTATTRIBSARBPROC)(hdc_, hShareContext_, attribList_); 77} 78 79BOOL wglMakeContextCurrentARB(HDC hDrawDC_, HDC hReadDC_, HGLRC hglrc_) 80{ 81 CHECK_RESOLVED(PFNWGLMAKECONTEXTCURRENTARBPROC, FALSE); 82 return RESOLVED_PROC(PFNWGLMAKECONTEXTCURRENTARBPROC)(hDrawDC_, hReadDC_, hglrc_); 83} 84 85HPBUFFERARB wglCreatePbufferARB(HDC hDC_, int iPixelFormat_, int iWidth_, 86 int iHeight_, const int *piAttribList_) 87{ 88 CHECK_RESOLVED(PFNWGLCREATEPBUFFERARBPROC, NULL); 89 return RESOLVED_PROC(PFNWGLCREATEPBUFFERARBPROC)(hDC_, iPixelFormat_, iWidth_, iHeight_, piAttribList_); 90} 91 92HDC wglGetPbufferDCARB(HPBUFFERARB hPbuffer_) 93{ 94 CHECK_RESOLVED(PFNWGLGETPBUFFERDCARBPROC, NULL); 95 return RESOLVED_PROC(PFNWGLGETPBUFFERDCARBPROC)(hPbuffer_); 96} 97 98int wglReleasePbufferDCARB(HPBUFFERARB hPbuffer_, HDC hDC_) 99{ 100 CHECK_RESOLVED(PFNWGLRELEASEPBUFFERDCARBPROC, 0) 101 return RESOLVED_PROC(PFNWGLRELEASEPBUFFERDCARBPROC)(hPbuffer_, hDC_); 102} 103 104BOOL wglDestroyPbufferARB(HPBUFFERARB hPbuffer_) 105{ 106 CHECK_RESOLVED(PFNWGLDESTROYPBUFFERARBPROC, FALSE); 107 return RESOLVED_PROC(PFNWGLDESTROYPBUFFERARBPROC)(hPbuffer_); 108} 109