| /**************************************************************************** |
| * |
| * Mesa 3-D graphics library |
| * Direct3D Driver Interface |
| * |
| * ======================================================================== |
| * |
| * Copyright (C) 1991-2004 SciTech Software, Inc. 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 |
| * SCITECH SOFTWARE INC 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. |
| * |
| * ====================================================================== |
| * |
| * Language: ANSI C |
| * Environment: Windows 9x/2000/XP/XBox (Win32) |
| * |
| * Description: Driver functions and interfaces |
| * |
| ****************************************************************************/ |
| |
| #define STRICT |
| #define WIN32_LEAN_AND_MEAN |
| #include <windows.h> |
| |
| #include "gld_driver.h" |
| #include "ddlog.h" |
| #include "glheader.h" |
| |
| // For glGetString(). |
| #include "common_x86_asm.h" |
| |
| //--------------------------------------------------------------------------- |
| |
| static char *szDriverError = "Driver used before initialisation!"; |
| |
| // This holds our dynamically created OpenGL renderer string. |
| // 256 chars should be plenty - remember that some apps display this. |
| static char _gldRendererString[256]; |
| |
| static char *szVendor = "SciTech Software, Inc."; |
| |
| //--------------------------------------------------------------------------- |
| |
| extern BOOL gldGetDXErrorString_DX(HRESULT hr, char *buf, int nBufSize); |
| |
| extern BOOL gldCreateDrawable_MesaSW(DGL_ctx *ctx, BOOL bPersistantInterface, BOOL bPersistantBuffers); |
| extern BOOL gldResizeDrawable_MesaSW(DGL_ctx *ctx, BOOL bDefaultDriver, BOOL bPersistantInterface, BOOL bPersistantBuffers); |
| extern BOOL gldDestroyDrawable_MesaSW(DGL_ctx *ctx); |
| extern BOOL gldCreatePrivateGlobals_MesaSW(void); |
| extern BOOL gldDestroyPrivateGlobals_MesaSW(void); |
| extern BOOL gldBuildPixelformatList_MesaSW(void); |
| extern BOOL gldInitialiseMesa_MesaSW(DGL_ctx *ctx); |
| extern BOOL gldSwapBuffers_MesaSW(DGL_ctx *ctx, HDC hDC, HWND hWnd); |
| extern PROC gldGetProcAddress_MesaSW(LPCSTR a); |
| extern BOOL gldGetDisplayMode_MesaSW(DGL_ctx *ctx, GLD_displayMode *glddm); |
| |
| extern BOOL gldCreateDrawable_DX(DGL_ctx *ctx, BOOL bPersistantInterface, BOOL bPersistantBuffers); |
| extern BOOL gldResizeDrawable_DX(DGL_ctx *ctx, BOOL bDefaultDriver, BOOL bPersistantInterface, BOOL bPersistantBuffers); |
| extern BOOL gldDestroyDrawable_DX(DGL_ctx *ctx); |
| extern BOOL gldCreatePrivateGlobals_DX(void); |
| extern BOOL gldDestroyPrivateGlobals_DX(void); |
| extern BOOL gldBuildPixelformatList_DX(void); |
| extern BOOL gldInitialiseMesa_DX(DGL_ctx *ctx); |
| extern BOOL gldSwapBuffers_DX(DGL_ctx *ctx, HDC hDC, HWND hWnd); |
| extern PROC gldGetProcAddress_DX(LPCSTR a); |
| extern BOOL gldGetDisplayMode_DX(DGL_ctx *ctx, GLD_displayMode *glddm); |
| |
| //--------------------------------------------------------------------------- |
| // NOP functions. Called if proper driver functions are not set. |
| //--------------------------------------------------------------------------- |
| |
| static BOOL _gldDriverError(void) |
| { |
| ddlogMessage(DDLOG_CRITICAL, szDriverError); |
| return FALSE; |
| } |
| |
| //--------------------------------------------------------------------------- |
| |
| static BOOL _GetDXErrorString_ERROR( |
| HRESULT hr, |
| char *buf, |
| int nBufSize) |
| { |
| return _gldDriverError(); |
| } |
| |
| //--------------------------------------------------------------------------- |
| |
| static BOOL _CreateDrawable_ERROR( |
| DGL_ctx *ctx, |
| BOOL bPersistantInterface, |
| BOOL bPersistantBuffers) |
| { |
| return _gldDriverError(); |
| } |
| |
| //--------------------------------------------------------------------------- |
| |
| static BOOL _ResizeDrawable_ERROR( |
| DGL_ctx *ctx, |
| BOOL bDefaultDriver, |
| BOOL bPersistantInterface, |
| BOOL bPersistantBuffers) |
| { |
| return _gldDriverError(); |
| } |
| |
| //--------------------------------------------------------------------------- |
| |
| static BOOL _DestroyDrawable_ERROR( |
| DGL_ctx *ctx) |
| { |
| return _gldDriverError(); |
| } |
| |
| //--------------------------------------------------------------------------- |
| |
| static BOOL _CreatePrivateGlobals_ERROR(void) |
| { |
| return _gldDriverError(); |
| } |
| |
| //--------------------------------------------------------------------------- |
| |
| static BOOL _DestroyPrivateGlobals_ERROR(void) |
| { |
| return _gldDriverError(); |
| } |
| |
| //--------------------------------------------------------------------------- |
| |
| static BOOL _BuildPixelformatList_ERROR(void) |
| { |
| return _gldDriverError(); |
| } |
| |
| //--------------------------------------------------------------------------- |
| |
| |
| static BOOL _InitialiseMesa_ERROR( |
| DGL_ctx *ctx) |
| { |
| return _gldDriverError(); |
| } |
| |
| //--------------------------------------------------------------------------- |
| |
| static BOOL _SwapBuffers_ERROR( |
| DGL_ctx *ctx, |
| HDC hDC, |
| HWND hWnd) |
| { |
| return _gldDriverError(); |
| } |
| |
| //--------------------------------------------------------------------------- |
| |
| static PROC _GetProcAddress_ERROR( |
| LPCSTR a) |
| { |
| _gldDriverError(); |
| return NULL; |
| } |
| |
| //--------------------------------------------------------------------------- |
| |
| static BOOL _GetDisplayMode_ERROR( |
| DGL_ctx *ctx, |
| GLD_displayMode *glddm) |
| { |
| return _gldDriverError(); |
| } |
| |
| //--------------------------------------------------------------------------- |
| // Functions useful to all drivers |
| //--------------------------------------------------------------------------- |
| |
| const GLubyte* _gldGetStringGeneric( |
| GLcontext *ctx, |
| GLenum name) |
| { |
| if (!ctx) |
| return NULL; |
| |
| switch (name) { |
| case GL_RENDERER: |
| sprintf(_gldRendererString, "GLDirect 4.0 %s%s%s%s (%s %s)", |
| _mesa_x86_cpu_features ? "/x86" : "", |
| cpu_has_mmx ? "/MMX" : "", |
| cpu_has_3dnow ? "/3DNow!" : "", |
| cpu_has_xmm ? "/SSE" : "", |
| __DATE__, __TIME__); |
| return (const GLubyte *) _gldRendererString; |
| case GL_VENDOR: |
| return (const GLubyte *) szVendor; |
| default: |
| return NULL; |
| } |
| } |
| |
| //--------------------------------------------------------------------------- |
| // Global driver function pointers, initially set to functions that |
| // will report an error when called. |
| //--------------------------------------------------------------------------- |
| |
| GLD_driver _gldDriver = { |
| _GetDXErrorString_ERROR, |
| _CreateDrawable_ERROR, |
| _ResizeDrawable_ERROR, |
| _DestroyDrawable_ERROR, |
| _CreatePrivateGlobals_ERROR, |
| _DestroyPrivateGlobals_ERROR, |
| _BuildPixelformatList_ERROR, |
| _InitialiseMesa_ERROR, |
| _SwapBuffers_ERROR, |
| _GetProcAddress_ERROR, |
| _GetDisplayMode_ERROR |
| }; |
| |
| //--------------------------------------------------------------------------- |
| // Init function. Should be called as soon as regkeys/ini-settings are read. |
| //--------------------------------------------------------------------------- |
| |
| BOOL gldInitDriverPointers( |
| DWORD dwDriver) |
| { |
| _gldDriver.GetDXErrorString = gldGetDXErrorString_DX; |
| |
| if (dwDriver == GLDS_DRIVER_MESA_SW) { |
| // Mesa Software driver |
| _gldDriver.CreateDrawable = gldCreateDrawable_MesaSW; |
| _gldDriver.ResizeDrawable = gldResizeDrawable_MesaSW; |
| _gldDriver.DestroyDrawable = gldDestroyDrawable_MesaSW; |
| _gldDriver.CreatePrivateGlobals = gldCreatePrivateGlobals_MesaSW; |
| _gldDriver.DestroyPrivateGlobals = gldDestroyPrivateGlobals_MesaSW; |
| _gldDriver.BuildPixelformatList = gldBuildPixelformatList_MesaSW; |
| _gldDriver.InitialiseMesa = gldInitialiseMesa_MesaSW; |
| _gldDriver.SwapBuffers = gldSwapBuffers_MesaSW; |
| _gldDriver.wglGetProcAddress = gldGetProcAddress_MesaSW; |
| _gldDriver.GetDisplayMode = gldGetDisplayMode_MesaSW; |
| return TRUE; |
| } |
| |
| if ((dwDriver == GLDS_DRIVER_REF) || (dwDriver == GLDS_DRIVER_HAL)) { |
| // Direct3D driver, either HW or SW |
| _gldDriver.CreateDrawable = gldCreateDrawable_DX; |
| _gldDriver.ResizeDrawable = gldResizeDrawable_DX; |
| _gldDriver.DestroyDrawable = gldDestroyDrawable_DX; |
| _gldDriver.CreatePrivateGlobals = gldCreatePrivateGlobals_DX; |
| _gldDriver.DestroyPrivateGlobals = gldDestroyPrivateGlobals_DX; |
| _gldDriver.BuildPixelformatList = gldBuildPixelformatList_DX; |
| _gldDriver.InitialiseMesa = gldInitialiseMesa_DX; |
| _gldDriver.SwapBuffers = gldSwapBuffers_DX; |
| _gldDriver.wglGetProcAddress = gldGetProcAddress_DX; |
| _gldDriver.GetDisplayMode = gldGetDisplayMode_DX; |
| return TRUE; |
| }; |
| |
| return FALSE; |
| } |
| |
| //--------------------------------------------------------------------------- |