/* * Mesa 3-D graphics library * Version: 6.1 * * Copyright (C) 1999-2004 Brian Paul All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /* * File name: icd.c * Author: Gregor Anich * * ICD (Installable Client Driver) interface. * Based on the windows GDI/WGL driver. */ #ifdef WIN32 #ifdef __cplusplus extern "C" { #endif #include #define GL_GLEXT_PROTOTYPES #include "GL/gl.h" #include "GL/glext.h" #ifdef __cplusplus } #endif #include #include #include "../gdi/wmesadef.h" #include "GL/wmesa.h" #include "mtypes.h" #include "glapi.h" #define MAX_MESA_ATTRS 20 typedef struct _icdTable { DWORD size; PROC table[336]; } ICDTABLE, *PICDTABLE; static ICDTABLE icdTable = { 336, { #define ICD_ENTRY(func) (PROC)mgl##func, #include "icdlist.h" #undef ICD_ENTRY } }; struct __pixelformat__ { PIXELFORMATDESCRIPTOR pfd; GLboolean doubleBuffered; }; struct __pixelformat__ pix[] = { /* Double Buffer, alpha */ { { sizeof(PIXELFORMATDESCRIPTOR), 1, PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER|PFD_SWAP_COPY, PFD_TYPE_RGBA, 24, 8, 0, 8, 8, 8, 16, 8, 24, 0, 0, 0, 0, 0, 16, 8, 0, 0, 0, 0, 0, 0 }, GL_TRUE }, /* Single Buffer, alpha */ { { sizeof(PIXELFORMATDESCRIPTOR), 1, PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL, /* | PFD_SUPPORT_GDI ? */ PFD_TYPE_RGBA, 24, 8, 0, 8, 8, 8, 16, 8, 24, 0, 0, 0, 0, 0, 16, 8, 0, 0, 0, 0, 0, 0 }, GL_FALSE }, /* Double Buffer, no alpha */ { { sizeof(PIXELFORMATDESCRIPTOR), 1, PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER|PFD_SWAP_COPY, PFD_TYPE_RGBA, 24, 8, 0, 8, 8, 8, 16, 0, 0, 0, 0, 0, 0, 0, 16, 8, 0, 0, 0, 0, 0, 0 }, GL_TRUE }, /* Single Buffer, no alpha */ { { sizeof(PIXELFORMATDESCRIPTOR), 1, PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL, /* | PFD_SUPPORT_GDI ? */ PFD_TYPE_RGBA, 24, 8, 0, 8, 8, 8, 16, 0, 0, 0, 0, 0, 0, 0, 16, 8, 0, 0, 0, 0, 0, 0 }, GL_FALSE }, }; int qt_pix = sizeof(pix) / sizeof(pix[0]); typedef struct { WMesaContext ctx; HDC hdc; } MesaWglCtx; #define MESAWGL_CTX_MAX_COUNT 20 static MesaWglCtx wgl_ctx[MESAWGL_CTX_MAX_COUNT]; static unsigned ctx_count = 0; static int ctx_current = -1; static unsigned curPFD = 0; WGLAPI BOOL GLAPIENTRY DrvCopyContext(HGLRC hglrcSrc,HGLRC hglrcDst,UINT mask) { return(FALSE); } WGLAPI HGLRC GLAPIENTRY DrvCreateContext(HDC hdc) { HWND hWnd; int i = 0; if(!(hWnd = WindowFromDC(hdc))) { SetLastError(0); return(NULL); } if (!ctx_count) { for(i=0;i qt_valid_pix || nBytes != sizeof(PIXELFORMATDESCRIPTOR)) { SetLastError(0); return(0); } *ppfd = pix[iPixelFormat - 1].pfd; return(qt_valid_pix); } /* * GetProcAddress - return the address of an appropriate extension */ WGLAPI PROC GLAPIENTRY DrvGetProcAddress(LPCSTR lpszProc) { PROC p = (PROC) _glapi_get_proc_address((const char *) lpszProc); if (p) return p; SetLastError(0); return(NULL); } WGLAPI BOOL GLAPIENTRY DrvSetPixelFormat(HDC hdc,int iPixelFormat) { int qt_valid_pix; qt_valid_pix = qt_pix; if(iPixelFormat < 1 || iPixelFormat > qt_valid_pix) { SetLastError(0); return(FALSE); } curPFD = iPixelFormat; return(TRUE); } WGLAPI BOOL GLAPIENTRY DrvSwapBuffers(HDC hdc) { if (ctx_current < 0) return FALSE; if(wgl_ctx[ctx_current].ctx == NULL) { SetLastError(0); return(FALSE); } WMesaSwapBuffers(); return(TRUE); } WGLAPI BOOL GLAPIENTRY DrvValidateVersion(DWORD version) { return TRUE; } #endif /* WIN32 */