#ifndef _WIN32 #include "../winlnxdefs.h" #include #include #include #endif #include "glide.h" #include #include #ifdef _WIN32 #include #include #include #include #endif // _WIN32 #include "main.h" #ifdef _WIN32 #include "wglext.h" #endif // _WIN32 PFNGLACTIVETEXTUREARBPROC glActiveTextureARB; PFNGLBLENDFUNCSEPARATEEXTPROC glBlendFuncSeparateEXT; PFNGLMULTITEXCOORD2FARBPROC glMultiTexCoord2fARB; PFNGLFOGCOORDFPROC glFogCoordfEXT; #ifdef _WIN32 PFNWGLGETEXTENSIONSSTRINGARBPROC wglGetExtensionsStringARB; PFNWGLCREATEBUFFERREGIONARBPROC wglCreateBufferRegionARB; PFNWGLDELETEBUFFERREGIONARBPROC wglDeleteBufferRegionARB; PFNWGLSAVEBUFFERREGIONARBPROC wglSaveBufferRegionARB; PFNWGLRESTOREBUFFERREGIONARBPROC wglRestoreBufferRegionARB; #endif // _WIN32 PFNGLCREATESHADEROBJECTARBPROC glCreateShaderObjectARB; PFNGLSHADERSOURCEARBPROC glShaderSourceARB; PFNGLCOMPILESHADERARBPROC glCompileShaderARB; PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgramObjectARB; PFNGLATTACHOBJECTARBPROC glAttachObjectARB; PFNGLLINKPROGRAMARBPROC glLinkProgramARB; PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObjectARB; PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocationARB; PFNGLUNIFORM1IARBPROC glUniform1iARB; PFNGLUNIFORM4IARBPROC glUniform4iARB; PFNGLUNIFORM4FARBPROC glUniform4fARB; PFNGLUNIFORM1FARBPROC glUniform1fARB; PFNGLDELETEOBJECTARBPROC glDeleteObjectARB; PFNGLGETINFOLOGARBPROC glGetInfoLogARB; PFNGLGETOBJECTPARAMETERIVARBPROC glGetObjectParameterivARB; PFNGLSECONDARYCOLOR3FPROC glSecondaryColor3f; int nbTextureUnits; int width, widtho, heighto, height; int blend_func_separate_support; int fog_coord_support; int pbuffer_support; int render_to_texture = 0; int glsl_support = 0; int viewport_width, viewport_height, viewport_offset; int lfb_color_fmt; #ifdef _WIN32 static HDC hDC = NULL; static HGLRC hGLRC = NULL; static HWND hToolBar = NULL; static HWND hwnd_win = NULL; static unsigned long windowedExStyle, windowedStyle; #endif // _WIN32 static unsigned long fullscreen; #ifdef _WIN32 static RECT windowedRect; static HMENU windowedMenu; #endif // _WIN32 #ifdef _WIN32 static int savedWidtho, savedHeighto; #endif // _WIN32 static int savedWidth, savedHeight; #ifndef _WIN32 static SDL_Surface *m_pScreen; #endif // _WIN32 //#define VOODOO1 void display_warning(unsigned char *text, ...) { static int first_message = 20; if (first_message) { unsigned char buf[1000]; va_list ap; va_start(ap, text); vsprintf((char*)buf, (char*)text, ap); va_end(ap); #ifdef _WIN32 MessageBox(NULL, buf, "Glide3x warning : ", MB_OK); #else // _WIN32 printf("Glide3x warning : %s\n", buf); #endif // _WIN32 first_message--; } } #ifdef _WIN32 void display_error() { LPVOID lpMsgBuf; if (!FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language (LPTSTR) &lpMsgBuf, 0, NULL )) { // Handle the error. return; } // Process any inserts in lpMsgBuf. // ... // Display the string. MessageBox( NULL, (LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION ); // Free the buffer. LocalFree( lpMsgBuf ); } #endif // _WIN32 FX_ENTRY void FX_CALL grSstOrigin(GrOriginLocation_t origin) { if (origin != GR_ORIGIN_UPPER_LEFT) display_warning((unsigned char*)"grSstOrigin : %x", origin); } FX_ENTRY void FX_CALL grClipWindow( FxU32 minx, FxU32 miny, FxU32 maxx, FxU32 maxy ) { glScissor(minx, (fullscreen ? 0 : 20)+height-maxy, maxx - minx, maxy - miny); glEnable(GL_SCISSOR_TEST); } FX_ENTRY void FX_CALL grColorMask( FxBool rgb, FxBool a ) { glColorMask(rgb, rgb, rgb, a); } FX_ENTRY void FX_CALL grGlideInit( void ) { } FX_ENTRY void FX_CALL grSstSelect( int which_sst ) { } BOOL isExtensionSupported(const char *extension) { const GLubyte *extensions = NULL; const GLubyte *start; GLubyte *where, *terminator; where = (GLubyte *)strchr(extension, ' '); if (where || *extension == '\0') return 0; extensions = glGetString(GL_EXTENSIONS); start = extensions; for (;;) { where = (GLubyte *) strstr((const char *) start, extension); if (!where) break; terminator = where + strlen(extension); if (where == start || *(where - 1) == ' ') if (*terminator == ' ' || *terminator == '\0') return TRUE; start = terminator; } return FALSE; } #ifdef _WIN32 BOOL isWglExtensionSupported(const char *extension) { const GLubyte *extensions = NULL; const GLubyte *start; GLubyte *where, *terminator; where = (GLubyte *)strchr(extension, ' '); if (where || *extension == '\0') return 0; extensions = wglGetExtensionsStringARB(wglGetCurrentDC()); start = extensions; for (;;) { where = (GLubyte *) strstr((const char *) start, extension); if (!where) break; terminator = where + strlen(extension); if (where == start || *(where - 1) == ' ') if (*terminator == ' ' || *terminator == '\0') return TRUE; start = terminator; } return FALSE; } BOOL CALLBACK FindToolBarProc(HWND hWnd, LPARAM lParam) { if (GetWindowLong(hWnd, GWL_STYLE) & RBS_VARHEIGHT) { hToolBar = hWnd; return FALSE; } return TRUE; } #endif // _WIN32 #define GrPixelFormat_t int FX_ENTRY GrContext_t FX_CALL grSstWinOpenExt( FxU32 hWnd, GrScreenResolution_t screen_resolution, GrScreenRefresh_t refresh_rate, GrColorFormat_t color_format, GrOriginLocation_t origin_location, GrPixelFormat_t pixelformat, int nColBuffers, int nAuxBuffers) { return grSstWinOpen(hWnd, screen_resolution, refresh_rate, color_format, origin_location, nColBuffers, nAuxBuffers); } FX_ENTRY GrContext_t FX_CALL grSstWinOpen( FxU32 hWnd, GrScreenResolution_t screen_resolution, GrScreenRefresh_t refresh_rate, GrColorFormat_t color_format, GrOriginLocation_t origin_location, int nColBuffers, int nAuxBuffers) { #ifdef _WIN32 PIXELFORMATDESCRIPTOR pfd = { sizeof(PIXELFORMATDESCRIPTOR), // size of this pfd 1, // version number PFD_DRAW_TO_WINDOW | // support window PFD_SUPPORT_OPENGL | // support OpenGL PFD_GENERIC_ACCELERATED | //PFD_SWAP_COPY | PFD_SWAP_EXCHANGE | PFD_DOUBLEBUFFER, // double buffered PFD_TYPE_RGBA, // RGBA type 16, 0, 0, 0, 0, 0, 0, // color bits ignored 0, // no alpha buffer 0, // shift bit ignored 0, // no accumulation buffer 0, 0, 0, 0, // accum bits ignored 16, // z-buffer 0, // no stencil buffer 01, // no auxiliary buffer PFD_MAIN_PLANE, // main layer 0, // reserved 0, 0, 0}; // layer masks ignored int pfm; RECT windowRect, toolRect; int pc_width, pc_height; if ((HWND)hWnd == NULL) (HWND)hWnd = GetActiveWindow(); hwnd_win = (HWND)hWnd; #endif // _WIN32 switch (screen_resolution & ~0x80) { case GR_RESOLUTION_320x200: width = 320; height = 200; break; case GR_RESOLUTION_320x240: width = 320; height = 240; break; case GR_RESOLUTION_400x256: width = 400; height = 256; break; case GR_RESOLUTION_512x384: width = 512; height = 384; break; case GR_RESOLUTION_640x200: width = 640; height = 200; break; case GR_RESOLUTION_640x350: width = 640; height = 350; break; case GR_RESOLUTION_640x400: width = 640; height = 400; break; case GR_RESOLUTION_640x480: width = 640; height = 480; break; case GR_RESOLUTION_800x600: width = 800; height = 600; break; case GR_RESOLUTION_960x720: width = 960; height = 720; break; case GR_RESOLUTION_856x480: width = 856; height = 480; break; case GR_RESOLUTION_512x256: width = 512; height = 256; break; case GR_RESOLUTION_1024x768: width = 1024; height = 768; break; case GR_RESOLUTION_1280x1024: width = 1280; height = 1024; break; case GR_RESOLUTION_1600x1200: width = 1600; height = 1200; break; case GR_RESOLUTION_400x300: width = 400; height = 300; break; default: display_warning((unsigned char*)"unknown SstWinOpen resolution : %x", screen_resolution); } #ifdef _WIN32 if (screen_resolution & 0x80) { ChangeDisplaySettings(NULL, 0); GetClientRect(hwnd_win, &windowRect); EnumChildWindows(hwnd_win, FindToolBarProc, 0); if (hToolBar) GetWindowRect(hToolBar, &toolRect); else toolRect.bottom = toolRect.top = 0; windowRect.right = windowRect.left + width - 1; windowRect.bottom = windowRect.top + height - 1 + 40; AdjustWindowRect(&windowRect, GetWindowLong(hwnd_win, GWL_STYLE), GetMenu(hwnd_win) != NULL); SetWindowPos(hwnd_win, NULL, 0, 0, windowRect.right - windowRect.left + 1, windowRect.bottom - windowRect.top + 1 /*+ toolRect.bottom - toolRect.top + 1*/, SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOMOVE); } else { DEVMODE fullscreenMode; DEVMODE currentMode; pc_width = getFullScreenWidth(); pc_height = getFullScreenHeight(); if (pc_width == 0 || pc_height == 0) { pc_width = width; pc_height = height; } memset(&fullscreenMode, 0, sizeof(DEVMODE)); fullscreenMode.dmSize = sizeof(DEVMODE); fullscreenMode.dmPelsWidth= pc_width; fullscreenMode.dmPelsHeight= pc_height; fullscreenMode.dmBitsPerPel= 32; fullscreenMode.dmDisplayFrequency= 60; fullscreenMode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT | DM_DISPLAYFREQUENCY; EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, ¤tMode); fullscreenMode.dmDisplayFrequency = currentMode.dmDisplayFrequency; if (ChangeDisplaySettings( &fullscreenMode, CDS_FULLSCREEN ) != DISP_CHANGE_SUCCESSFUL) { display_warning("can't change to fullscreen mode"); } ShowCursor(FALSE); windowedExStyle = GetWindowLong(hwnd_win, GWL_EXSTYLE); windowedStyle = GetWindowLong(hwnd_win, GWL_STYLE); SetWindowLong(hwnd_win, GWL_EXSTYLE, WS_EX_APPWINDOW | WS_EX_TOPMOST); SetWindowLong(hwnd_win, GWL_STYLE, WS_POPUP); GetWindowRect(hwnd_win, &windowedRect); windowedMenu = GetMenu(hwnd_win); if (windowedMenu) SetMenu(hwnd_win, NULL); fullscreen = 1; SetWindowPos(hwnd_win, NULL, 0, 0, pc_width, pc_height, SWP_NOACTIVATE | SWP_NOZORDER | SWP_SHOWWINDOW); } if ((hDC = GetDC(hwnd_win)) == NULL) { display_warning("GetDC on main window failed"); return FXFALSE; } SetViewportExtEx(hDC, width, height, NULL); SetWindowExtEx(hDC, width, height, NULL); if ((pfm = ChoosePixelFormat(hDC, &pfd)) == 0) { display_warning("ChoosePixelFormat failed"); return FXFALSE; } if (SetPixelFormat(hDC, pfm, &pfd) == FALSE) { display_warning("SetPixelFormat failed"); return FXFALSE; } DescribePixelFormat(hDC, pfm, sizeof(pfd), &pfd); if ((hGLRC = wglCreateContext(hDC)) == 0) { display_warning("wglCreateContext failed!"); grSstWinClose(0); return FXFALSE; } if (!wglMakeCurrent(hDC, hGLRC)) { display_warning("wglMakeCurrent failed!"); grSstWinClose(0); return FXFALSE; } #else // _WIN32 // init sdl & gl const SDL_VideoInfo *videoInfo; Uint32 videoFlags = 0; fullscreen = 0; /* Initialize SDL */ printf("(II) Initializing SDL video subsystem...\n"); if(SDL_InitSubSystem(SDL_INIT_VIDEO) == -1) { printf("(EE) Error initializing SDL video subsystem: %s\n", SDL_GetError()); return false; } /* Video Info */ printf("(II) Getting video info...\n"); if(!(videoInfo = SDL_GetVideoInfo())) { printf("(EE) Video query failed: %s\n", SDL_GetError()); SDL_QuitSubSystem(SDL_INIT_VIDEO); return false; } /* Setting the video mode */ videoFlags |= SDL_OPENGL | SDL_GL_DOUBLEBUFFER | SDL_HWPALETTE; if(videoInfo->hw_available) videoFlags |= SDL_HWSURFACE; else videoFlags |= SDL_SWSURFACE; if(videoInfo->blit_hw) videoFlags |= SDL_HWACCEL; if(!(screen_resolution & 0x80)) videoFlags |= SDL_FULLSCREEN; SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE, 16); SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16); printf("(II) Setting video mode %dx%d...\n", width, height); if(!(m_pScreen = SDL_SetVideoMode(width, height, 0, videoFlags))) { printf("(EE) Error setting videomode %dx%d: %s\n", width, height, SDL_GetError()); SDL_QuitSubSystem(SDL_INIT_VIDEO); return false; } char caption[500]; # ifdef _DEBUG sprintf(caption, "Glide64 for OpenGL Debug 0.7 SP8 ported by Hacktarux"); # else // _DEBUG sprintf(caption, "Glide64 for OpenGL 0.7 SP8 ported by Hacktarux"); # endif // _DEBUG SDL_WM_SetCaption(caption, caption); glViewport(0, 0, width, height); #endif // _WIN32 //if (color_format != GR_COLORFORMAT_ARGB) display_warning("color format is not ARGB"); lfb_color_fmt = color_format; if (origin_location != GR_ORIGIN_UPPER_LEFT) display_warning((unsigned char*)"origin must be in upper left corner"); if (nColBuffers != 2) display_warning((unsigned char*)"number of color buffer is not 2"); if (nAuxBuffers != 1) display_warning((unsigned char*)"number of auxiliary buffer is not 1"); if (isExtensionSupported("GL_ARB_texture_env_combine") == FALSE && isExtensionSupported("GL_EXT_texture_env_combine") == FALSE) display_warning((unsigned char*)"Your video card doesn't support GL_ARB_texture_env_combine extension"); if (isExtensionSupported("GL_ARB_multitexture") == FALSE) display_warning((unsigned char*)"Your video card doesn't support GL_ARB_multitexture extension"); if (isExtensionSupported("GL_ARB_texture_mirrored_repeat") == FALSE) display_warning((unsigned char*)"Your video card doesn't support GL_ARB_texture_mirrored_repeat extension"); #ifdef _WIN32 glActiveTextureARB = (PFNGLACTIVETEXTUREARBPROC)wglGetProcAddress("glActiveTextureARB"); glMultiTexCoord2fARB = (PFNGLMULTITEXCOORD2FARBPROC)wglGetProcAddress("glMultiTexCoord2fARB"); #else // _WIN32 glActiveTextureARB = (PFNGLACTIVETEXTUREARBPROC)SDL_GL_GetProcAddress("glActiveTextureARB"); glMultiTexCoord2fARB = (PFNGLMULTITEXCOORD2FARBPROC)SDL_GL_GetProcAddress("glMultiTexCoord2fARB"); #endif // _WIN32 glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, &nbTextureUnits); if (nbTextureUnits == 1) display_warning((unsigned char*)"You need a video card that has at least 2 texture units"); #ifdef VOODOO1 nbTextureUnits = 2; #endif if (isExtensionSupported("GL_EXT_blend_func_separate") == FALSE) blend_func_separate_support = 0; else blend_func_separate_support = 1; #ifdef _WIN32 glBlendFuncSeparateEXT = (PFNGLBLENDFUNCSEPARATEEXTPROC)wglGetProcAddress("glBlendFuncSeparateEXT"); #else // _WIN32 glBlendFuncSeparateEXT = (PFNGLBLENDFUNCSEPARATEEXTPROC)SDL_GL_GetProcAddress("glBlendFuncSeparateEXT"); #endif // _WIN32 if (isExtensionSupported("GL_EXT_fog_coord") == FALSE) fog_coord_support = 0; else fog_coord_support = 1; #ifdef _WIN32 glFogCoordfEXT = (PFNGLFOGCOORDFPROC)wglGetProcAddress("glFogCoordfEXT"); #else // _WIN32 glFogCoordfEXT = (PFNGLFOGCOORDFPROC)SDL_GL_GetProcAddress("glFogCoordfEXT"); #endif // _WIN32 #ifdef _WIN32 wglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)wglGetProcAddress("wglGetExtensionsStringARB"); if (wglGetExtensionsStringARB == NULL || isWglExtensionSupported("WGL_ARB_buffer_region") == FALSE) pbuffer_support = 0; else pbuffer_support = 1; wglCreateBufferRegionARB = (PFNWGLCREATEBUFFERREGIONARBPROC)wglGetProcAddress("wglCreateBufferRegionARB"); wglDeleteBufferRegionARB = (PFNWGLDELETEBUFFERREGIONARBPROC)wglGetProcAddress("wglDeleteBufferRegionARB"); wglSaveBufferRegionARB = (PFNWGLSAVEBUFFERREGIONARBPROC)wglGetProcAddress("wglSaveBufferRegionARB"); wglRestoreBufferRegionARB = (PFNWGLRESTOREBUFFERREGIONARBPROC)wglGetProcAddress("wglRestoreBufferRegionARB"); #endif // _WIN32 if (isExtensionSupported("GL_ARB_shading_language_100") && isExtensionSupported("GL_ARB_shader_objects") && isExtensionSupported("GL_ARB_fragment_shader") && isExtensionSupported("GL_ARB_vertex_shader") && !getDisableGLSL()) { glsl_support = 1; #ifdef _WIN32 glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC)wglGetProcAddress("glCreateShaderObjectARB"); glShaderSourceARB = (PFNGLSHADERSOURCEARBPROC)wglGetProcAddress("glShaderSourceARB"); glCompileShaderARB = (PFNGLCOMPILESHADERARBPROC)wglGetProcAddress("glCompileShaderARB"); glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC)wglGetProcAddress("glCreateProgramObjectARB"); glAttachObjectARB = (PFNGLATTACHOBJECTARBPROC)wglGetProcAddress("glAttachObjectARB"); glLinkProgramARB = (PFNGLLINKPROGRAMARBPROC)wglGetProcAddress("glLinkProgramARB"); glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC)wglGetProcAddress("glUseProgramObjectARB"); glGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC)wglGetProcAddress("glGetUniformLocationARB"); glUniform1iARB = (PFNGLUNIFORM1IARBPROC)wglGetProcAddress("glUniform1iARB"); glUniform4iARB = (PFNGLUNIFORM4IARBPROC)wglGetProcAddress("glUniform4iARB"); glUniform4fARB = (PFNGLUNIFORM4FARBPROC)wglGetProcAddress("glUniform4fARB"); glUniform1fARB = (PFNGLUNIFORM1FARBPROC)wglGetProcAddress("glUniform1fARB"); glDeleteObjectARB = (PFNGLDELETEOBJECTARBPROC)wglGetProcAddress("glDeleteObjectARB"); glGetInfoLogARB = (PFNGLGETINFOLOGARBPROC)wglGetProcAddress("glGetInfoLogARB"); glGetObjectParameterivARB = (PFNGLGETOBJECTPARAMETERIVARBPROC)wglGetProcAddress("glGetObjectParameterivARB"); glSecondaryColor3f = (PFNGLSECONDARYCOLOR3FPROC)wglGetProcAddress("glSecondaryColor3f"); #else // _WIN32 glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC)SDL_GL_GetProcAddress("glCreateShaderObjectARB"); glShaderSourceARB = (PFNGLSHADERSOURCEARBPROC)SDL_GL_GetProcAddress("glShaderSourceARB"); glCompileShaderARB = (PFNGLCOMPILESHADERARBPROC)SDL_GL_GetProcAddress("glCompileShaderARB"); glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC)SDL_GL_GetProcAddress("glCreateProgramObjectARB"); glAttachObjectARB = (PFNGLATTACHOBJECTARBPROC)SDL_GL_GetProcAddress("glAttachObjectARB"); glLinkProgramARB = (PFNGLLINKPROGRAMARBPROC)SDL_GL_GetProcAddress("glLinkProgramARB"); glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC)SDL_GL_GetProcAddress("glUseProgramObjectARB"); glGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC)SDL_GL_GetProcAddress("glGetUniformLocationARB"); glUniform1iARB = (PFNGLUNIFORM1IARBPROC)SDL_GL_GetProcAddress("glUniform1iARB"); glUniform4iARB = (PFNGLUNIFORM4IARBPROC)SDL_GL_GetProcAddress("glUniform4iARB"); glUniform4fARB = (PFNGLUNIFORM4FARBPROC)SDL_GL_GetProcAddress("glUniform4fARB"); glUniform1fARB = (PFNGLUNIFORM1FARBPROC)SDL_GL_GetProcAddress("glUniform1fARB"); glDeleteObjectARB = (PFNGLDELETEOBJECTARBPROC)SDL_GL_GetProcAddress("glDeleteObjectARB"); glGetInfoLogARB = (PFNGLGETINFOLOGARBPROC)SDL_GL_GetProcAddress("glGetInfoLogARB"); glGetObjectParameterivARB = (PFNGLGETOBJECTPARAMETERIVARBPROC)SDL_GL_GetProcAddress("glGetObjectParameterivARB"); glSecondaryColor3f = (PFNGLSECONDARYCOLOR3FPROC)SDL_GL_GetProcAddress("glSecondaryColor3f"); #endif // _WIN32 } else glsl_support = 0; #ifdef _WIN32 if (screen_resolution & 0x80) { glViewport(0, 20, width, height); viewport_width = width; viewport_height = height; viewport_offset = 20; } else { glViewport(0, 0, pc_width, pc_height); viewport_width = pc_width; viewport_height = pc_height; viewport_offset = 0; } #endif // _WIN32 widtho = width/2; if (!fullscreen) { heighto = height/2; //height = (int)(height * 1.10f); } else heighto = height/2; init_geometry(); init_textures(); init_combiner(); return 1; } FX_ENTRY void FX_CALL grGlideShutdown( void ) { } unsigned int pBufferAddress; int pBufferWidth, pBufferHeight; FX_ENTRY FxBool FX_CALL grSstWinClose( GrContext_t context ) { free_combiners(); //free_textures(); #ifdef _WIN32 if (hGLRC) { wglMakeCurrent(NULL,NULL); wglDeleteContext(hGLRC); hGLRC = NULL; } //ReleaseDC(hwnd_win,hDC); if (fullscreen) { ShowCursor(TRUE); ChangeDisplaySettings(NULL, 0); SetWindowLong(hwnd_win, GWL_STYLE, windowedStyle); SetWindowLong(hwnd_win, GWL_EXSTYLE, windowedExStyle); SetWindowPos(hwnd_win, NULL, windowedRect.left, windowedRect.top, 0, 0, SWP_NOZORDER | SWP_NOSIZE); if (windowedMenu) SetMenu(hwnd_win, windowedMenu); fullscreen = 0; } return FXTRUE; #else // _WIN32 //SDL_QuitSubSystem(SDL_INIT_VIDEO); //sleep(2); m_pScreen = NULL; return FXTRUE; #endif // _WIN32 } FX_ENTRY void FX_CALL grTextureBufferExt( GrChipID_t tmu, FxU32 startAddress, GrLOD_t lodmin, GrLOD_t lodmax, GrAspectRatio_t aspect, GrTextureFormat_t fmt, FxU32 evenOdd) { if (lodmin != lodmax) display_warning((unsigned char*)"grTextureBufferExt : loading more than one LOD"); if (aspect < 0) { pBufferHeight = 1 << lodmin; pBufferWidth = pBufferHeight >> -aspect; } else { pBufferWidth = 1 << lodmin; pBufferHeight = pBufferWidth >> aspect; } pBufferAddress = startAddress+1; if (render_to_texture) { int realWidth = pBufferWidth, realHeight = pBufferHeight; while(realWidth > savedWidth) realWidth >>= 1; while(realHeight > savedHeight) realHeight >>= 1; width = savedWidth * pBufferWidth / realWidth; height = savedHeight * pBufferHeight / realHeight; widtho = pBufferWidth/2; heighto = pBufferHeight/2; } } FX_ENTRY GrProc FX_CALL grGetProcAddress( char *procName ) { if(!strcmp(procName, "grSstWinOpenExt")) return (GrProc)grSstWinOpenExt; if(!strcmp(procName, "grTextureBufferExt")) return (GrProc)grTextureBufferExt; if(!strcmp(procName, "grChromaRangeExt")) return (GrProc)grChromaRangeExt; if(!strcmp(procName, "grChromaRangeModeExt")) return (GrProc)grChromaRangeModeExt; if(!strcmp(procName, "grTexChromaRangeExt")) return (GrProc)grTexChromaRangeExt; if(!strcmp(procName, "grTexChromaModeExt")) return (GrProc)grTexChromaModeExt; if(!strcmp(procName, "grConfigWrapperExt")) return (GrProc)grConfigWrapperExt; if(!strcmp(procName, "grWrapperFullScreenResolutionExt")) return (GrProc)grWrapperFullScreenResolutionExt; display_warning((unsigned char*)"grGetProcAddress : %s", procName); return 0; } FX_ENTRY FxU32 FX_CALL grGet( FxU32 pname, FxU32 plength, FxI32 *params ) { switch(pname) { case GR_MAX_TEXTURE_SIZE: if (plength < 4 || params == NULL) return 0; params[0] = 2048; return 4; break; case GR_NUM_TMU: if (plength < 4 || params == NULL) return 0; if (!nbTextureUnits) { grSstWinOpen((unsigned long)NULL, GR_RESOLUTION_640x480 | 0x80, 0, GR_COLORFORMAT_ARGB, GR_ORIGIN_UPPER_LEFT, 2, 1); grSstWinClose(0); } #ifdef VOODOO1 params[0] = 1; #else if (nbTextureUnits > 2) params[0] = 2; else params[0] = 1; #endif return 4; break; case GR_NUM_BOARDS: case GR_NUM_FB: case GR_REVISION_FB: case GR_REVISION_TMU: if (plength < 4 || params == NULL) return 0; params[0] = 1; return 4; break; case GR_MEMORY_FB: if (plength < 4 || params == NULL) return 0; params[0] = 16*1024*1024; return 4; break; case GR_MEMORY_TMU: if (plength < 4 || params == NULL) return 0; params[0] = 16*1024*1024; return 4; break; case GR_MEMORY_UMA: if (plength < 4 || params == NULL) return 0; params[0] = 16*1024*1024*nbTextureUnits; return 4; break; case GR_BITS_RGBA: if (plength < 16 || params == NULL) return 0; params[0] = 8; params[1] = 8; params[2] = 8; params[3] = 8; return 16; break; case GR_BITS_DEPTH: if (plength < 4 || params == NULL) return 0; params[0] = 16; return 4; break; case GR_BITS_GAMMA: case GR_GAMMA_TABLE_ENTRIES: return 0; break; case GR_FOG_TABLE_ENTRIES: if (plength < 4 || params == NULL) return 0; params[0] = 64; return 4; break; case GR_WDEPTH_MIN_MAX: if (plength < 8 || params == NULL) return 0; params[0] = 0; params[1] = 65528; return 8; break; case GR_ZDEPTH_MIN_MAX: if (plength < 8 || params == NULL) return 0; params[0] = 0; params[1] = 65535; return 8; break; case GR_LFB_PIXEL_PIPE: if (plength < 4 || params == NULL) return 0; params[0] = FXFALSE; return 4; break; case GR_MAX_TEXTURE_ASPECT_RATIO: if (plength < 4 || params == NULL) return 0; params[0] = 3; return 4; break; case GR_NON_POWER_OF_TWO_TEXTURES: if (plength < 4 || params == NULL) return 0; params[0] = FXFALSE; return 4; break; case GR_TEXTURE_ALIGN: if (plength < 4 || params == NULL) return 0; params[0] = 0; return 4; break; default: display_warning((unsigned char*)"unknown pname in grGet : %x", pname); } return 0; } FX_ENTRY const char * FX_CALL grGetString( FxU32 pname ) { switch(pname) { case GR_EXTENSION: { #ifdef _WIN32 static char extension[] = "CHROMARANGE TEXCHROMA TEXMIRROR PALETTE6666 FOGCOORD EVOODOO TEXTUREBUFFER"; #else // _WIN32 static char extension[] = "CHROMARANGE TEXCHROMA TEXMIRROR PALETTE6666 FOGCOORD EVOODOO"; #endif // _WIN32 //static char extension[] = "CHROMARANGE TEXCHROMA PALETTE6666 FOGCOORD EVOODOO"; return extension; } break; case GR_HARDWARE: { static char hardware[] = "Voodoo5 (tm)"; return hardware; } break; case GR_VENDOR: { static char vendor[] = "3Dfx Interactive"; return vendor; } break; case GR_RENDERER: { static char renderer[] = "Glide"; return renderer; } break; case GR_VERSION: { static char version[] = "3.0"; return version; } break; default: display_warning((unsigned char*)"unknown grGetString selector : %x", pname); } return NULL; } void updateTexture() { int realWidth = pBufferWidth, realHeight = pBufferHeight; if (nbTextureUnits <= 2) glActiveTextureARB(GL_TEXTURE1_ARB); else glActiveTextureARB(GL_TEXTURE2_ARB); glBindTexture(GL_TEXTURE_2D, pBufferAddress); while(realWidth > savedWidth) realWidth >>= 1; while(realHeight > savedHeight) realHeight >>= 1; remove_tex(pBufferAddress, pBufferAddress+realWidth*realHeight*2); add_tex(pBufferAddress); glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, savedWidth/2 - realWidth/2, savedHeight/2 - realHeight/2, realWidth, realHeight, 0); glBindTexture(GL_TEXTURE_2D, 32*1024*1024); } FX_ENTRY void FX_CALL grRenderBuffer( GrBuffer_t buffer ) { #ifdef _WIN32 static HANDLE region = NULL; int realWidth = pBufferWidth, realHeight = pBufferHeight; #endif // _WIN32 switch(buffer) { case GR_BUFFER_BACKBUFFER: #ifdef _WIN32 if(render_to_texture) { glMatrixMode(GL_MODELVIEW); glLoadIdentity(); inverted_culling = 0; if (nbTextureUnits <= 2) glActiveTextureARB(GL_TEXTURE1_ARB); else glActiveTextureARB(GL_TEXTURE2_ARB); glBindTexture(GL_TEXTURE_2D, pBufferAddress); while(realWidth > savedWidth) realWidth >>= 1; while(realHeight > savedHeight) realHeight >>= 1; remove_tex(pBufferAddress, pBufferAddress+realWidth*realHeight*2); add_tex(pBufferAddress); glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, savedWidth/2 - realWidth/2, 20 + savedHeight/2 - realHeight/2, realWidth, realHeight, 0); glBindTexture(GL_TEXTURE_2D, 32*1024*1024); width = savedWidth; height = savedHeight; widtho = savedWidtho; heighto = savedHeighto; wglRestoreBufferRegionARB(region, 0, 0, width, height, 0, 0); wglDeleteBufferRegionARB(region); render_to_texture = 0; } #endif // _WIN32 glDrawBuffer(GL_BACK); break; case 6: // RENDER TO TEXTURE #ifdef _WIN32 { float m[4*4] = {1.0f, 0.0f, 0.0f, 0.0f, 0.0f,-1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}; glMatrixMode(GL_MODELVIEW); glLoadMatrixf(m); inverted_culling = 1; } if(!render_to_texture) { region = wglCreateBufferRegionARB(hDC, 0, WGL_BACK_COLOR_BUFFER_BIT_ARB); wglSaveBufferRegionARB(region, 0, 0, width, height); savedWidth = width; savedHeight = height; savedWidtho = widtho; savedHeighto = heighto; } else { int realWidth = pBufferWidth, realHeight = pBufferHeight; while(realWidth > savedWidth) realWidth >>= 1; while(realHeight > savedHeight) realHeight >>= 1; if (nbTextureUnits <= 2) glActiveTextureARB(GL_TEXTURE1_ARB); else glActiveTextureARB(GL_TEXTURE2_ARB); glBindTexture(GL_TEXTURE_2D, pBufferAddress); while(realWidth > savedWidth) realWidth >>= 1; while(realHeight > savedHeight) realHeight >>= 1; remove_tex(pBufferAddress, pBufferAddress+realWidth*realHeight*2); add_tex(pBufferAddress); glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, savedWidth/2 - realWidth/2, 20 + savedHeight/2 - realHeight/2, realWidth, realHeight, 0); glBindTexture(GL_TEXTURE_2D, 32*1024*1024); } while(realWidth > savedWidth) realWidth >>= 1; while(realHeight > savedHeight) realHeight >>= 1; width = savedWidth * pBufferWidth / realWidth; height = savedHeight * pBufferHeight / realHeight; widtho = pBufferWidth/2; heighto = pBufferHeight/2; render_to_texture = 1; #endif // _WIN32 break; default: display_warning((unsigned char*)"grRenderBuffer : unknown buffer : %x", buffer); } } FX_ENTRY void FX_CALL grBufferClear( GrColor_t color, GrAlpha_t alpha, FxU32 depth ) { switch(lfb_color_fmt) { case GR_COLORFORMAT_ARGB: glClearColor(((color >> 16) & 0xFF) / 255.0f, ((color >> 8) & 0xFF) / 255.0f, ( color & 0xFF) / 255.0f, alpha / 255.0f); break; case GR_COLORFORMAT_RGBA: glClearColor(((color >> 24) & 0xFF) / 255.0f, ((color >> 16) & 0xFF) / 255.0f, (color & 0xFF) / 255.0f, alpha / 255.0f); break; default: display_warning((unsigned char*)"grBufferClear: unknown color format : %x", lfb_color_fmt); } if (w_buffer_mode) glClearDepth(1.0f - ((1.0f + (depth >> 4) / 4096.0f) * (1 << (depth & 0xF))) / 65528.0); else glClearDepth(depth / 65535.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); } FX_ENTRY void FX_CALL grBufferSwap( FxU32 swap_interval ) { #ifdef _WIN32 SwapBuffers(wglGetCurrentDC()); #else // _WIN32 SDL_GL_SwapBuffers(); #endif // _WIN32 } // frame buffer unsigned short frameBuffer[2048*2048]; FX_ENTRY FxBool FX_CALL grLfbLock( GrLock_t type, GrBuffer_t buffer, GrLfbWriteMode_t writeMode, GrOriginLocation_t origin, FxBool pixelPipeline, GrLfbInfo_t *info ) { if (type == GR_LFB_WRITE_ONLY) { display_warning((unsigned char*)"grLfbLock : write only"); } else { unsigned char *buf; int i,j; switch(buffer) { case GR_BUFFER_BACKBUFFER: glReadBuffer(GL_BACK); break; default: display_warning((unsigned char*)"grLfbLock : unknown buffer : %x", buffer); } buf = (unsigned char*)malloc(width*height*4); info->lfbPtr = frameBuffer; info->strideInBytes = width*2; info->writeMode = GR_LFBWRITEMODE_565; info->origin = origin; glReadPixels(0, fullscreen ? 0 : 20, width, height, GL_RGBA, GL_UNSIGNED_BYTE, buf); for (j=0; j> 3) << 11) | ((buf[j*width*4+i*4+1] >> 2) << 5) | (buf[j*width*4+i*4+2] >> 3); } } free(buf); } return FXTRUE; } FX_ENTRY FxBool FX_CALL grLfbUnlock( GrLock_t type, GrBuffer_t buffer ) { if (type == GR_LFB_WRITE_ONLY) { display_warning((unsigned char*)"grLfbUnlock : write only"); } return FXTRUE; } FX_ENTRY FxBool FX_CALL grLfbReadRegion( GrBuffer_t src_buffer, FxU32 src_x, FxU32 src_y, FxU32 src_width, FxU32 src_height, FxU32 dst_stride, void *dst_data ) { unsigned char *buf; unsigned int i,j; unsigned short *frameBuffer = (unsigned short*)dst_data; switch(src_buffer) { case GR_BUFFER_BACKBUFFER: glReadBuffer(GL_BACK); break; default: display_warning((unsigned char*)"grLfbLock : unknown buffer : %x", src_buffer); } buf = (unsigned char*)malloc(src_width*src_height*4); glReadPixels(src_x, (fullscreen ? 0 : 20)+height-src_y-src_height, src_width, src_height, GL_RGBA, GL_UNSIGNED_BYTE, buf); for (j=0; j> 3) << 11) | ((buf[(src_height-j-1)*src_width*4+i*4+1] >> 2) << 5) | (buf[(src_height-j-1)*src_width*4+i*4+2] >> 3); } } free(buf); return FXTRUE; } FX_ENTRY FxBool FX_CALL grLfbWriteRegion( GrBuffer_t dst_buffer, FxU32 dst_x, FxU32 dst_y, GrLfbSrcFmt_t src_format, FxU32 src_width, FxU32 src_height, FxBool pixelPipeline, FxI32 src_stride, void *src_data ) { unsigned char *buf; unsigned int i,j; unsigned short *frameBuffer = (unsigned short*)src_data; int texture_number; unsigned int tex_width = 1, tex_height = 1; while (tex_width < src_width) tex_width <<= 1; while (tex_height < src_height) tex_height <<= 1; switch(dst_buffer) { case GR_BUFFER_BACKBUFFER: glDrawBuffer(GL_BACK); break; default: display_warning((unsigned char*)"grLfbLock : unknown buffer : %x", dst_buffer); } buf = (unsigned char*)malloc(tex_width*tex_height*4); if(!glsl_support) { switch(nbTextureUnits) { case 2: texture_number = GL_TEXTURE1_ARB; break; case 3: texture_number = GL_TEXTURE2_ARB; break; default: texture_number = GL_TEXTURE3_ARB; } } else texture_number = GL_TEXTURE0_ARB; glActiveTextureARB(texture_number); switch(src_format) { case GR_LFB_SRC_FMT_1555: for (j=0; j>10)&0x1F)<<3; buf[j*tex_width*4+i*4+1]=((frameBuffer[j*(src_stride/2)+i]>> 5)&0x1F)<<3; buf[j*tex_width*4+i*4+2]=((frameBuffer[j*(src_stride/2)+i]>> 0)&0x1F)<<3; buf[j*tex_width*4+i*4+3]=(frameBuffer[j*(src_stride/2)+i]>>15)?0xFF:0; } } break; case GR_LFBWRITEMODE_555: for (j=0; j>10)&0x1F)<<3; buf[j*tex_width*4+i*4+1]=((frameBuffer[j*(src_stride/2)+i]>> 5)&0x1F)<<3; buf[j*tex_width*4+i*4+2]=((frameBuffer[j*(src_stride/2)+i]>> 0)&0x1F)<<3; buf[j*tex_width*4+i*4+3]=0xFF; } } break; default: display_warning((unsigned char*)"grLfbWriteRegion : unknown format : %d", src_format); } glBindTexture(GL_TEXTURE_2D, 32*1024*1024); glTexImage2D(GL_TEXTURE_2D, 0, 4, tex_width, tex_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, buf); if(!glsl_support) { glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB); glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_REPLACE); glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_TEXTURE); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR); glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE); glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_TEXTURE); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA); } else { set_copy_shader(); } glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glBegin(GL_QUADS); glDisable(GL_DEPTH_TEST); glDisable(GL_BLEND); glMultiTexCoord2fARB(texture_number, 0.0f, 0.0f); glVertex2f(((int)dst_x - widtho) / (float)(width/2), -((int)dst_y - heighto) / (float)(height/2)); glMultiTexCoord2fARB(texture_number, 0.0f, (float)src_height / (float)tex_height); glVertex2f(((int)dst_x - widtho) / (float)(width/2), -((int)dst_y + (int)src_height - heighto) / (float)(height/2)); glMultiTexCoord2fARB(texture_number, (float)src_width / (float)tex_width, (float)src_height / (float)tex_height); glVertex2f(((int)dst_x + (int)src_width - widtho) / (float)(width/2), -((int)dst_y + (int)src_height - heighto) / (float)(height/2)); glMultiTexCoord2fARB(texture_number, (float)src_width / (float)tex_width, 0.0f); glVertex2f(((int)dst_x + (int)src_width - widtho) / (float)(width/2), -((int)dst_y - heighto) / (float)(height/2)); glMultiTexCoord2fARB(texture_number, 0.0f, 0.0f); glVertex2f(((int)dst_x - widtho) / (float)(width/2), -((int)dst_y - heighto) / (float)(height/2)); glEnd(); if(!glsl_support) { switch(nbTextureUnits) { case 2: updateCombiner(1); updateCombiner(1); break; case 3: updateCombiner(2); updateCombiner(2); break; default: updateCombiner(3); updateCombiner(3); } } else compile_shader(); free(buf); return FXTRUE; } // unused by glide64 FX_ENTRY FxI32 FX_CALL grQueryResolutions( const GrResolution *resTemplate, GrResolution *output ) { int res_inf = 0; int res_sup = 0xf; int i; int n=0; if ((unsigned int)resTemplate->resolution != GR_QUERY_ANY) { res_inf = res_sup = resTemplate->resolution; } if ((unsigned int)resTemplate->refresh == GR_QUERY_ANY) display_warning((unsigned char*)"querying any refresh rate"); if ((unsigned int)resTemplate->numAuxBuffers == GR_QUERY_ANY) display_warning((unsigned char*)"querying any numAuxBuffers"); if ((unsigned int)resTemplate->numColorBuffers == GR_QUERY_ANY) display_warning((unsigned char*)"querying any numColorBuffers"); if (output == NULL) return res_sup - res_inf + 1; for (i=res_inf; i<=res_sup; i++) { output[n].resolution = i; output[n].refresh = resTemplate->refresh; output[n].numAuxBuffers = resTemplate->numAuxBuffers; output[n].numColorBuffers = resTemplate->numColorBuffers; n++; } return res_sup - res_inf + 1; } FX_ENTRY FxBool FX_CALL grReset( FxU32 what ) { display_warning((unsigned char*)"grReset"); return 1; } FX_ENTRY void FX_CALL grEnable( GrEnableMode_t mode ) { display_warning((unsigned char*)"grEnable"); } FX_ENTRY void FX_CALL grDisable( GrEnableMode_t mode ) { display_warning((unsigned char*)"grDisable"); } FX_ENTRY void FX_CALL grDisableAllEffects( void ) { display_warning((unsigned char*)"grDisableAllEffects"); } FX_ENTRY void FX_CALL grErrorSetCallback( GrErrorCallbackFnc_t fnc ) { display_warning((unsigned char*)"grErrorSetCallback"); } FX_ENTRY void FX_CALL grFinish(void) { display_warning((unsigned char*)"grFinish"); } FX_ENTRY void FX_CALL grFlush(void) { display_warning((unsigned char*)"grFlush"); } FX_ENTRY void FX_CALL grTexMultibase( GrChipID_t tmu, FxBool enable ) { display_warning((unsigned char*)"grTexMultibase"); } FX_ENTRY void FX_CALL grTexMipMapMode( GrChipID_t tmu, GrMipMapMode_t mode, FxBool lodBlend ) { display_warning((unsigned char*)"grTexMipMapMode"); } FX_ENTRY void FX_CALL grTexDownloadTablePartial( GrTexTable_t type, void *data, int start, int end ) { display_warning((unsigned char*)"grTexDownloadTablePartial"); } FX_ENTRY void FX_CALL grTexDownloadTable( GrTexTable_t type, void *data ) { display_warning((unsigned char*)"grTexDownloadTable"); } FX_ENTRY FxBool FX_CALL grTexDownloadMipMapLevelPartial( GrChipID_t tmu, FxU32 startAddress, GrLOD_t thisLod, GrLOD_t largeLod, GrAspectRatio_t aspectRatio, GrTextureFormat_t format, FxU32 evenOdd, void *data, int start, int end ) { display_warning((unsigned char*)"grTexDownloadMipMapLevelPartial"); return 1; } FX_ENTRY void FX_CALL grTexDownloadMipMapLevel( GrChipID_t tmu, FxU32 startAddress, GrLOD_t thisLod, GrLOD_t largeLod, GrAspectRatio_t aspectRatio, GrTextureFormat_t format, FxU32 evenOdd, void *data ) { display_warning((unsigned char*)"grTexDownloadMipMapLevel"); } FX_ENTRY void FX_CALL grTexNCCTable( GrNCCTable_t table ) { display_warning((unsigned char*)"grTexNCCTable"); } FX_ENTRY void FX_CALL grViewport( FxI32 x, FxI32 y, FxI32 width, FxI32 height ) { display_warning((unsigned char*)"grViewport"); } FX_ENTRY void FX_CALL grDepthRange( FxFloat n, FxFloat f ) { display_warning((unsigned char*)"grDepthRange"); } FX_ENTRY void FX_CALL grSplash(float x, float y, float width, float height, FxU32 frame) { display_warning((unsigned char*)"grSplash"); } FX_ENTRY FxBool FX_CALL grSelectContext( GrContext_t context ) { display_warning((unsigned char*)"grSelectContext"); return 1; } FX_ENTRY void FX_CALL grAADrawTriangle( const void *a, const void *b, const void *c, FxBool ab_antialias, FxBool bc_antialias, FxBool ca_antialias ) { display_warning((unsigned char*)"grAADrawTriangle"); } FX_ENTRY void FX_CALL grDrawPoint( const void *pt ) { display_warning((unsigned char*)"grDrawPoint"); } FX_ENTRY void FX_CALL grAlphaControlsITRGBLighting( FxBool enable ) { display_warning((unsigned char*)"grAlphaControlsITRGBLighting"); } FX_ENTRY void FX_CALL grGlideSetVertexLayout( const void *layout ) { display_warning((unsigned char*)"grGlideSetVertexLayout"); } FX_ENTRY void FX_CALL grGlideGetVertexLayout( void *layout ) { display_warning((unsigned char*)"grGlideGetVertexLayout"); } FX_ENTRY void FX_CALL grGlideSetState( const void *state ) { display_warning((unsigned char*)"grGlideSetState"); } FX_ENTRY void FX_CALL grGlideGetState( void *state ) { display_warning((unsigned char*)"grGlideGetState"); } FX_ENTRY void FX_CALL grLfbWriteColorFormat(GrColorFormat_t colorFormat) { display_warning((unsigned char*)"grLfbWriteColorFormat"); } FX_ENTRY void FX_CALL grLfbWriteColorSwizzle(FxBool swizzleBytes, FxBool swapWords) { display_warning((unsigned char*)"grLfbWriteColorSwizzle"); } FX_ENTRY void FX_CALL grLfbConstantDepth( FxU32 depth ) { display_warning((unsigned char*)"grLfbConstantDepth"); } FX_ENTRY void FX_CALL grLfbConstantAlpha( GrAlpha_t alpha ) { display_warning((unsigned char*)"grLfbConstantAlpha"); } FX_ENTRY void FX_CALL grTexMultibaseAddress( GrChipID_t tmu, GrTexBaseRange_t range, FxU32 startAddress, FxU32 evenOdd, GrTexInfo *info ) { display_warning((unsigned char*)"grTexMultibaseAddress"); } FX_ENTRY void FX_CALL grLoadGammaTable( FxU32 nentries, FxU32 *red, FxU32 *green, FxU32 *blue) { display_warning((unsigned char*)"grLoadGammaTable"); } FX_ENTRY void FX_CALL grDitherMode( GrDitherMode_t mode ) { display_warning((unsigned char*)"grDitherMode"); } void grChromaRangeExt(GrColor_t color0, GrColor_t color1, FxU32 mode) { display_warning((unsigned char*)"grChromaRangeExt"); } void grChromaRangeModeExt(GrChromakeyMode_t mode) { display_warning((unsigned char*)"grChromaRangeModeExt"); } void grTexChromaRangeExt(GrChipID_t tmu, GrColor_t color0, GrColor_t color1, GrTexChromakeyMode_t mode) { display_warning((unsigned char*)"grTexChromaRangeExt"); } void grTexChromaModeExt(GrChipID_t tmu, GrChromakeyMode_t mode) { display_warning((unsigned char*)"grTexChromaRangeModeExt"); }