2 Copyright (C) 2003 Rice1964
4 This program is free software; you can redistribute it and/or
5 modify it under the terms of the GNU General Public License
6 as published by the Free Software Foundation; either version 2
7 of the License, or (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
25 #define M64P_PLUGIN_PROTOTYPES 1
26 #include "osal_preproc.h"
27 #include "m64p_types.h"
28 #include "m64p_plugin.h"
29 #include "m64p_config.h"
33 #include "DeviceBuilder.h"
34 #include "RenderBase.h"
35 #include "TextureManager.h"
38 #define INI_FILE "RiceVideoLinux.ini"
40 static m64p_handle l_ConfigVideoRice = NULL;
41 static m64p_handle l_ConfigVideoGeneral = NULL;
43 static int FindIniEntry(uint32 dwCRC1, uint32 dwCRC2, uint8 nCountryID, char* szName, int PrintInfo);
45 const char *frameBufferSettings[] =
48 "Hide Framebuffer Effects",
51 "Write Back & Reload",
52 "Write Back Every Frame",
54 "Basic Framebuffer & With Emulator",
55 "With Emulator Read Only",
56 "With Emulator Write Only",
59 const int resolutions[][2] =
75 const int numberOfResolutions = sizeof(resolutions)/sizeof(int)/2;
77 const char* resolutionsS[] =
94 const char *frameBufferWriteBackControlSettings[] =
96 "Every Frame (default)",
106 const char *renderToTextureSettings[] =
109 "Hide Render-to-texture Effects",
110 "Basic Render-to-texture",
111 "Basic & Write Back",
112 "Write Back & Reload",
115 const char *screenUpdateSettings[] =
117 "At VI origin update",
118 "At VI origin change",
120 "At the 1st CI change",
121 "At the 1st drawing",
122 "Before clear the screen",
123 "At VI origin update after screen is drawn (default)",
126 WindowSettingStruct windowSetting;
127 GlobalOptions options;
128 RomOptions defaultRomOptions;
129 RomOptions currentRomOptions;
130 FrameBufferOptions frameBufferOptions;
131 std::vector<IniSection> IniSections;
132 bool bIniIsChanged = false;
133 char szIniFileName[300];
135 SettingInfo TextureQualitySettings[] =
137 {"Default", FORCE_DEFAULT_FILTER},
138 {"32-bit Texture", FORCE_POINT_FILTER},
139 {"16-bit Texture", FORCE_LINEAR_FILTER},
142 SettingInfo ForceTextureFilterSettings[] =
144 {"N64 Default Texture Filter", FORCE_DEFAULT_FILTER},
145 {"Force Nearest Filter (faster, low quality)", FORCE_POINT_FILTER},
146 {"Force Linear Filter (slower, better quality)", FORCE_LINEAR_FILTER},
149 SettingInfo TextureEnhancementSettings[] =
151 {"N64 original texture (No enhancement)", TEXTURE_NO_ENHANCEMENT},
152 {"2x (Double the texture size)", TEXTURE_2X_ENHANCEMENT},
153 {"2xSaI", TEXTURE_2XSAI_ENHANCEMENT},
154 {"hq2x", TEXTURE_HQ2X_ENHANCEMENT},
155 {"lq2x", TEXTURE_LQ2X_ENHANCEMENT},
156 {"hq4x", TEXTURE_HQ4X_ENHANCEMENT},
157 {"Sharpen", TEXTURE_SHARPEN_ENHANCEMENT},
158 {"Sharpen More", TEXTURE_SHARPEN_MORE_ENHANCEMENT},
161 SettingInfo TextureEnhancementControlSettings[] =
163 {"Normal", TEXTURE_ENHANCEMENT_NORMAL},
164 {"Smooth", TEXTURE_ENHANCEMENT_WITH_SMOOTH_FILTER_1},
165 {"Less smooth", TEXTURE_ENHANCEMENT_WITH_SMOOTH_FILTER_2},
166 {"2xSaI smooth", TEXTURE_ENHANCEMENT_WITH_SMOOTH_FILTER_3},
167 {"Less 2xSaI smooth", TEXTURE_ENHANCEMENT_WITH_SMOOTH_FILTER_4},
170 SettingInfo colorQualitySettings[] =
172 {"16-bit", TEXTURE_FMT_A4R4G4B4},
173 {"32-bit (def)", TEXTURE_FMT_A8R8G8B8},
176 const char* strDXDeviceDescs[] = { "HAL", "REF" };
178 SettingInfo openGLDepthBufferSettings[] =
180 {"16-bit (def)", 16},
184 RenderEngineSetting OpenGLRenderSettings[] =
186 {"To Fit Your Video Card", OGL_DEVICE},
187 {"OpenGL 1.1 (Lowest)", OGL_1_1_DEVICE},
188 {"OpenGL 1.2/1.3", OGL_1_2_DEVICE},
189 {"OpenGL 1.4", OGL_1_4_DEVICE},
190 //{"OpenGL 1.4, the 2nd combiner", OGL_1_4_V2_DEVICE},
191 {"OpenGL for Nvidia TNT or better", OGL_TNT2_DEVICE},
192 {"OpenGL for Nvidia GeForce or better ", NVIDIA_OGL_DEVICE},
193 {"OpenGL Fragment Program Extension", OGL_FRAGMENT_PROGRAM},
196 SettingInfo OnScreenDisplaySettings[] =
198 {"Display Nothing", ONSCREEN_DISPLAY_NOTHING},
199 {"Display DList Per Second", ONSCREEN_DISPLAY_DLIST_PER_SECOND},
200 {"Display Frame Per Second", ONSCREEN_DISPLAY_FRAME_PER_SECOND},
201 {"Display Debug Information Only", ONSCREEN_DISPLAY_DEBUG_INFORMATION_ONLY},
202 {"Display Messages From CPU Core Only", ONSCREEN_DISPLAY_TEXT_FROM_CORE_ONLY},
203 {"Display DList Per Second With Core Msgs", ONSCREEN_DISPLAY_DLIST_PER_SECOND_WITH_CORE_MSG},
204 {"Display Frame Per Second With Core Msgs", ONSCREEN_DISPLAY_FRAME_PER_SECOND_WITH_CORE_MSG},
205 {"Display Debug Information With Core Msgs", ONSCREEN_DISPLAY_DEBUG_INFORMATION_WITH_CORE_MSG},
208 const int numberOfOpenGLRenderEngineSettings = sizeof(OpenGLRenderSettings)/sizeof(RenderEngineSetting);
210 void GenerateFrameBufferOptions(void)
212 if( CDeviceBuilder::GetGeneralDeviceType() == OGL_DEVICE )
214 // OpenGL does not support much yet
215 if( currentRomOptions.N64FrameBufferEmuType != FRM_BUF_NONE )
216 currentRomOptions.N64FrameBufferEmuType = FRM_BUF_IGNORE;
217 if( currentRomOptions.N64RenderToTextureEmuType != TXT_BUF_NONE )
218 currentRomOptions.N64RenderToTextureEmuType = TXT_BUF_IGNORE;
221 frameBufferOptions.bUpdateCIInfo = false;
223 frameBufferOptions.bCheckBackBufs = false;
224 frameBufferOptions.bWriteBackBufToRDRAM = false;
225 frameBufferOptions.bLoadBackBufFromRDRAM = false;
227 frameBufferOptions.bIgnore = true;
229 frameBufferOptions.bSupportRenderTextures = false;
230 frameBufferOptions.bCheckRenderTextures = false;
231 frameBufferOptions.bRenderTextureWriteBack = false;
232 frameBufferOptions.bLoadRDRAMIntoRenderTexture = false;
234 frameBufferOptions.bProcessCPUWrite = false;
235 frameBufferOptions.bProcessCPURead = false;
236 frameBufferOptions.bAtEachFrameUpdate = false;
237 frameBufferOptions.bIgnoreRenderTextureIfHeightUnknown = false;
239 switch( currentRomOptions.N64FrameBufferEmuType )
243 case FRM_BUF_COMPLETE:
244 frameBufferOptions.bAtEachFrameUpdate = true;
245 frameBufferOptions.bProcessCPUWrite = true;
246 frameBufferOptions.bProcessCPURead = true;
247 frameBufferOptions.bUpdateCIInfo = true;
249 case FRM_BUF_WRITEBACK_AND_RELOAD:
250 frameBufferOptions.bLoadBackBufFromRDRAM = true;
251 case FRM_BUF_BASIC_AND_WRITEBACK:
252 frameBufferOptions.bWriteBackBufToRDRAM = true;
254 frameBufferOptions.bCheckBackBufs = true;
256 frameBufferOptions.bUpdateCIInfo = true;
258 case FRM_BUF_BASIC_AND_WITH_EMULATOR:
260 frameBufferOptions.bCheckBackBufs = true;
261 case FRM_BUF_WITH_EMULATOR:
262 frameBufferOptions.bUpdateCIInfo = true;
263 frameBufferOptions.bProcessCPUWrite = true;
264 frameBufferOptions.bProcessCPURead = true;
266 case FRM_BUF_WITH_EMULATOR_READ_ONLY:
267 frameBufferOptions.bUpdateCIInfo = true;
268 frameBufferOptions.bProcessCPURead = true;
270 case FRM_BUF_WITH_EMULATOR_WRITE_ONLY:
271 frameBufferOptions.bUpdateCIInfo = true;
272 frameBufferOptions.bProcessCPUWrite = true;
276 switch( currentRomOptions.N64RenderToTextureEmuType )
279 frameBufferOptions.bSupportRenderTextures = false;
281 case TXT_BUF_WRITE_BACK_AND_RELOAD:
282 frameBufferOptions.bLoadRDRAMIntoRenderTexture = true;
283 case TXT_BUF_WRITE_BACK:
284 frameBufferOptions.bRenderTextureWriteBack = true;
286 frameBufferOptions.bCheckRenderTextures = true;
287 frameBufferOptions.bIgnore = false;
289 frameBufferOptions.bUpdateCIInfo = true;
290 frameBufferOptions.bSupportRenderTextures = true;
294 if( currentRomOptions.screenUpdateSetting >= SCREEN_UPDATE_AT_CI_CHANGE )
296 frameBufferOptions.bUpdateCIInfo = true;
300 BOOL InitConfiguration(void)
302 if (ConfigOpenSection("Video-General", &l_ConfigVideoGeneral) != M64ERR_SUCCESS)
304 DebugMessage(M64MSG_ERROR, "Unable to open Video-General configuration section");
307 if (ConfigOpenSection("Video-Rice", &l_ConfigVideoRice) != M64ERR_SUCCESS)
309 DebugMessage(M64MSG_ERROR, "Unable to open Video-Rice configuration section");
313 ConfigSetDefaultBool(l_ConfigVideoGeneral, "Fullscreen", 0, "Use fullscreen mode if True, or windowed mode if False ");
314 ConfigSetDefaultInt(l_ConfigVideoGeneral, "ScreenWidth", 640, "Width of output window or fullscreen width");
315 ConfigSetDefaultInt(l_ConfigVideoGeneral, "ScreenHeight", 480, "Height of output window or fullscreen height");
317 ConfigSetDefaultBool(l_ConfigVideoGeneral, "AspectRatio", 1, "If true, use correct aspect ratio, if false, stretch to fullscreen");
319 ConfigSetDefaultBool(l_ConfigVideoGeneral, "VerticalSync", 0, "If true, activate the SDL_GL_SWAP_CONTROL attribute");
321 ConfigSetDefaultInt(l_ConfigVideoRice, "FrameBufferSetting", FRM_BUF_NONE, "Frame Buffer Emulation (0=ROM default, 1=disable)");
322 ConfigSetDefaultInt(l_ConfigVideoRice, "FrameBufferWriteBackControl", FRM_BUF_WRITEBACK_NORMAL, "Frequency to write back the frame buffer (0=every frame, 1=every other frame, etc)");
323 ConfigSetDefaultInt(l_ConfigVideoRice, "RenderToTexture", TXT_BUF_NONE, "Render-to-texture emulation (0=none, 1=ignore, 2=normal, 3=write back, 4=write back and reload)");
325 ConfigSetDefaultInt(l_ConfigVideoRice, "ScreenUpdateSetting", SCREEN_UPDATE_AT_1ST_CI_CHANGE, "Control when the screen will be updated (0=ROM default, 1=VI origin update, 2=VI origin change, 3=CI change, 4=first CI change, 5=first primitive draw, 6=before screen clear, 7=after screen drawn)"); // SCREEN_UPDATE_AT_VI_UPDATE_AND_DRAWN
327 ConfigSetDefaultInt(l_ConfigVideoRice, "ScreenUpdateSetting", SCREEN_UPDATE_AT_VI_UPDATE, "Control when the screen will be updated (0=ROM default, 1=VI origin update, 2=VI origin change, 3=CI change, 4=first CI change, 5=first primitive draw, 6=before screen clear, 7=after screen drawn)"); // SCREEN_UPDATE_AT_VI_UPDATE_AND_DRAWN
329 ConfigSetDefaultBool(l_ConfigVideoRice, "NormalAlphaBlender", FALSE, "Force to use normal alpha blender");
330 ConfigSetDefaultBool(l_ConfigVideoRice, "FastTextureLoading", FALSE, "Use a faster algorithm to speed up texture loading and CRC computation");
331 ConfigSetDefaultBool(l_ConfigVideoRice, "AccurateTextureMapping", TRUE, "Use different texture coordinate clamping code");
332 ConfigSetDefaultBool(l_ConfigVideoRice, "InN64Resolution", FALSE, "Force emulated frame buffers to be in N64 native resolution");
333 ConfigSetDefaultBool(l_ConfigVideoRice, "SaveVRAM", FALSE, "Try to reduce Video RAM usage (should never be used)");
334 ConfigSetDefaultBool(l_ConfigVideoRice, "DoubleSizeForSmallTxtrBuf", FALSE, "Enable this option to have better render-to-texture quality");
335 ConfigSetDefaultBool(l_ConfigVideoRice, "DefaultCombinerDisable", FALSE, "Force to use normal color combiner");
337 ConfigSetDefaultBool(l_ConfigVideoRice, "EnableHacks", TRUE, "Enable game-specific settings from INI file");
338 ConfigSetDefaultBool(l_ConfigVideoRice, "WinFrameMode", FALSE, "If enabled, graphics will be drawn in WinFrame mode instead of solid and texture mode");
339 ConfigSetDefaultBool(l_ConfigVideoRice, "FullTMEMEmulation", FALSE, "N64 Texture Memory Full Emulation (may fix some games, may break others)");
340 ConfigSetDefaultBool(l_ConfigVideoRice, "OpenGLVertexClipper", FALSE, "Enable vertex clipper for fog operations");
341 ConfigSetDefaultBool(l_ConfigVideoRice, "EnableSSE", TRUE, "Enable/Disable SSE optimizations for capable CPUs");
342 ConfigSetDefaultBool(l_ConfigVideoRice, "EnableVertexShader", FALSE, "Use GPU vertex shader");
343 ConfigSetDefaultBool(l_ConfigVideoRice, "SkipFrame", FALSE, "If this option is enabled, the plugin will skip every other frame");
344 ConfigSetDefaultBool(l_ConfigVideoRice, "TexRectOnly", FALSE, "If enabled, texture enhancement will be done only for TxtRect ucode");
345 ConfigSetDefaultBool(l_ConfigVideoRice, "SmallTextureOnly", FALSE, "If enabled, texture enhancement will be done only for textures width+height<=128");
346 ConfigSetDefaultBool(l_ConfigVideoRice, "LoadHiResCRCOnly", TRUE, "Select hi-resolution textures based only on the CRC and ignore format+size information (Glide64 compatibility)");
347 ConfigSetDefaultBool(l_ConfigVideoRice, "LoadHiResTextures", FALSE, "Enable hi-resolution texture file loading");
348 ConfigSetDefaultBool(l_ConfigVideoRice, "DumpTexturesToFiles", FALSE, "Enable texture dumping");
349 ConfigSetDefaultBool(l_ConfigVideoRice, "ShowFPS", FALSE, "Display On-screen FPS");
351 ConfigSetDefaultInt(l_ConfigVideoRice, "Mipmapping", 2, "Use Mipmapping? 0=no, 1=nearest, 2=bilinear, 3=trilinear");
352 ConfigSetDefaultInt(l_ConfigVideoRice, "FogMethod", 0, "Enable, Disable or Force fog generation (0=Disable, 1=Enable n64 choose, 2=Force Fog)");
353 ConfigSetDefaultInt(l_ConfigVideoRice, "ForceTextureFilter", 0, "Force to use texture filtering or not (0=auto: n64 choose, 1=force no filtering, 2=force filtering)");
354 ConfigSetDefaultInt(l_ConfigVideoRice, "TextureEnhancement", 0, "Primary texture enhancement filter (0=None, 1=2X, 2=2XSAI, 3=HQ2X, 4=LQ2X, 5=HQ4X, 6=Sharpen, 7=Sharpen More, 8=External, 9=Mirrored)");
355 ConfigSetDefaultInt(l_ConfigVideoRice, "TextureEnhancementControl", 0, "Secondary texture enhancement filter (0 = none, 1-4 = filtered)");
356 ConfigSetDefaultInt(l_ConfigVideoRice, "TextureQuality", TXT_QUALITY_DEFAULT, "Color bit depth to use for textures (0=default, 1=32 bits, 2=16 bits)");
357 ConfigSetDefaultInt(l_ConfigVideoRice, "OpenGLDepthBufferSetting", 16, "Z-buffer depth (only 16 or 32)");
358 ConfigSetDefaultInt(l_ConfigVideoRice, "MultiSampling", 0, "Enable/Disable MultiSampling (0=off, 2,4,8,16=quality)");
359 ConfigSetDefaultInt(l_ConfigVideoRice, "ColorQuality", TEXTURE_FMT_A8R8G8B8, "Color bit depth for rendering window (0=32 bits, 1=16 bits)");
360 ConfigSetDefaultInt(l_ConfigVideoRice, "OpenGLRenderSetting", OGL_DEVICE, "OpenGL level to support (0=auto, 1=OGL_1.1, 2=OGL_1.2, 3=OGL_1.3, 4=OGL_1.4, 5=OGL_1.4_V2, 6=OGL_TNT2, 7=NVIDIA_OGL, 8=OGL_FRAGMENT_PROGRAM)");
361 ConfigSetDefaultInt(l_ConfigVideoRice, "AnisotropicFiltering", 0, "Enable/Disable Anisotropic Filtering for Mipmapping (0=no filtering, 2-16=quality). This is uneffective if Mipmapping is 0. If the given value is to high to be supported by your graphic card, the value will be the highest value your graphic card can support. Better result with Trilinear filtering");
365 bool isMMXSupported()
367 int IsMMXSupported = 0;
369 #if !defined(__GNUC__) && !defined(NO_ASM)
372 mov eax,1 // CPUID level 1
373 cpuid // EDX = feature flag
374 and edx,0x800000 // test bit 23 of feature flag
375 mov IsMMXSupported,edx // != 0 if MMX is supported
377 #elif defined(__GNUC__) && defined(__x86_64__) && !defined(NO_ASM)
379 #elif !defined(NO_ASM) // GCC assumed
382 "mov $1, %%eax \n" // CPUID level 1
383 "cpuid \n" // EDX = feature flag
384 "and $0x800000, %%edx \n" // test bit 23 of feature flag
386 : "=d"(IsMMXSupported)
388 : "memory", "cc", "eax", "ecx"
391 if (IsMMXSupported != 0)
397 bool isSSESupported()
401 // And finally, check the CPUID for Streaming SIMD Extensions support.
402 #if !defined(__GNUC__) && !defined(NO_ASM)
405 mov eax, 1 // Put a "1" in eax to tell CPUID to get the feature bits
406 cpuid // Perform CPUID (puts processor feature info into EDX)
407 and edx, 02000000h // Test bit 25, for Streaming SIMD Extensions existence.
408 mov SSESupport, edx // SIMD Extensions). Set return value to 1 to indicate,
410 #elif defined(__GNUC__) && defined(__x86_64__) && !defined(NO_ASM)
412 #elif !defined(NO_ASM) // GCC assumed
415 "mov $1, %%eax \n" // Put a "1" in eax to tell CPUID to get the feature bits
416 "cpuid \n" // Perform CPUID (puts processor feature info into EDX)
417 "and $0x02000000, %%edx \n" // Test bit 25, for Streaming SIMD Extensions existence.
421 : "memory", "cc", "eax", "ecx"
431 static void ReadConfiguration(void)
433 windowSetting.bDisplayFullscreen = ConfigGetParamBool(l_ConfigVideoGeneral, "Fullscreen");
434 windowSetting.uDisplayWidth = ConfigGetParamInt(l_ConfigVideoGeneral, "ScreenWidth");
436 windowSetting.bDisplayRatio = true;
437 windowSetting.uDisplayX = 0;
438 windowSetting.uDisplayY = 0;
439 windowSetting.bDisplayRatio = ConfigGetParamBool(l_ConfigVideoGeneral, "AspectRatio");
440 if (windowSetting.bDisplayRatio) {
441 if (windowSetting.uDisplayWidth==800) {
442 windowSetting.uDisplayWidth = 640; // no strech
443 windowSetting.uDisplayX = 80;
447 windowSetting.uDisplayHeight = ConfigGetParamInt(l_ConfigVideoGeneral, "ScreenHeight");
448 windowSetting.bVerticalSync = ConfigGetParamBool(l_ConfigVideoGeneral, "VerticalSync");
450 defaultRomOptions.N64FrameBufferEmuType = ConfigGetParamInt(l_ConfigVideoRice, "FrameBufferSetting");
451 defaultRomOptions.N64FrameBufferWriteBackControl = ConfigGetParamInt(l_ConfigVideoRice, "FrameBufferWriteBackControl");
452 defaultRomOptions.N64RenderToTextureEmuType = ConfigGetParamInt(l_ConfigVideoRice, "RenderToTexture");
453 defaultRomOptions.screenUpdateSetting = ConfigGetParamInt(l_ConfigVideoRice, "screenUpdateSetting");
455 defaultRomOptions.bNormalBlender = ConfigGetParamBool(l_ConfigVideoRice, "NormalAlphaBlender");
456 defaultRomOptions.bFastTexCRC = ConfigGetParamBool(l_ConfigVideoRice, "FastTextureLoading");
457 defaultRomOptions.bAccurateTextureMapping = ConfigGetParamBool(l_ConfigVideoRice, "AccurateTextureMapping");
458 defaultRomOptions.bInN64Resolution = ConfigGetParamBool(l_ConfigVideoRice, "InN64Resolution");
459 defaultRomOptions.bSaveVRAM = ConfigGetParamBool(l_ConfigVideoRice, "SaveVRAM");
460 defaultRomOptions.bDoubleSizeForSmallTxtrBuf = ConfigGetParamBool(l_ConfigVideoRice, "DoubleSizeForSmallTxtrBuf");
461 defaultRomOptions.bNormalCombiner = ConfigGetParamBool(l_ConfigVideoRice, "DefaultCombinerDisable");
463 options.bEnableHacks = ConfigGetParamBool(l_ConfigVideoRice, "EnableHacks");
464 options.bWinFrameMode = ConfigGetParamBool(l_ConfigVideoRice, "WinFrameMode");
465 options.bFullTMEM = ConfigGetParamBool(l_ConfigVideoRice, "FullTMEMEmulation");
466 options.bOGLVertexClipper = ConfigGetParamBool(l_ConfigVideoRice, "OpenGLVertexClipper");
467 options.bEnableSSE = ConfigGetParamBool(l_ConfigVideoRice, "EnableSSE");
468 options.bEnableVertexShader = ConfigGetParamBool(l_ConfigVideoRice, "EnableVertexShader");
469 options.bSkipFrame = ConfigGetParamBool(l_ConfigVideoRice, "SkipFrame");
470 options.bTexRectOnly = ConfigGetParamBool(l_ConfigVideoRice, "TexRectOnly");
471 options.bSmallTextureOnly = ConfigGetParamBool(l_ConfigVideoRice, "SmallTextureOnly");
472 options.bLoadHiResTextures = ConfigGetParamBool(l_ConfigVideoRice, "LoadHiResTextures");
473 options.bLoadHiResCRCOnly = ConfigGetParamBool(l_ConfigVideoRice, "LoadHiResCRCOnly");
474 options.bDumpTexturesToFiles = ConfigGetParamBool(l_ConfigVideoRice, "DumpTexturesToFiles");
475 options.bShowFPS = ConfigGetParamBool(l_ConfigVideoRice, "ShowFPS");
477 options.mipmapping = ConfigGetParamInt(l_ConfigVideoRice, "Mipmapping");
478 //*SEB* Force to 0 has other setting crash on the Pandora
479 options.mipmapping = TEXTURE_NO_MIPMAP;
480 options.fogMethod = ConfigGetParamInt(l_ConfigVideoRice, "FogMethod");
481 options.forceTextureFilter = ConfigGetParamInt(l_ConfigVideoRice, "ForceTextureFilter");
482 options.textureEnhancement = ConfigGetParamInt(l_ConfigVideoRice, "TextureEnhancement");
483 options.textureEnhancementControl = ConfigGetParamInt(l_ConfigVideoRice, "TextureEnhancementControl");
484 options.textureQuality = ConfigGetParamInt(l_ConfigVideoRice, "TextureQuality");
485 options.OpenglDepthBufferSetting = ConfigGetParamInt(l_ConfigVideoRice, "OpenGLDepthBufferSetting");
486 options.multiSampling = ConfigGetParamInt(l_ConfigVideoRice, "MultiSampling");
487 options.colorQuality = ConfigGetParamInt(l_ConfigVideoRice, "ColorQuality");
488 options.OpenglRenderSetting = ConfigGetParamInt(l_ConfigVideoRice, "OpenGLRenderSetting");
489 options.anisotropicFiltering = ConfigGetParamInt(l_ConfigVideoRice, "AnisotropicFiltering");
490 //*SEB* Force to 0 has mipmapping is already forced to 0
491 options.anisotropicFiltering = 0;
493 CDeviceBuilder::SelectDeviceType((SupportedDeviceType)options.OpenglRenderSetting);
495 status.isMMXSupported = isMMXSupported();
496 status.isSSESupported = isSSESupported();
497 status.isVertexShaderSupported = false;
499 status.isSSEEnabled = status.isSSESupported && options.bEnableSSE;
501 if( status.isSSEEnabled )
503 ProcessVertexData = ProcessVertexDataSSE;
504 DebugMessage(M64MSG_INFO, "SSE processing enabled.");
509 ProcessVertexData = ProcessVertexDataNoSSE;
510 DebugMessage(M64MSG_INFO, "Disabled SSE processing.");
513 status.isVertexShaderEnabled = status.isVertexShaderSupported && options.bEnableVertexShader;
514 status.bUseHW_T_L = false;
517 BOOL LoadConfiguration(void)
520 bIniIsChanged = false;
521 strcpy(szIniFileName, INI_FILE);
525 DebugMessage(M64MSG_ERROR, "Unable to read ini file from disk");
529 if (l_ConfigVideoGeneral == NULL || l_ConfigVideoRice == NULL)
531 DebugMessage(M64MSG_ERROR, "Rice Video configuration sections are not open!");
535 // Read config parameters from core config API and set up internal variables
541 void GenerateCurrentRomOptions()
543 currentRomOptions.N64FrameBufferEmuType =g_curRomInfo.dwFrameBufferOption;
544 currentRomOptions.N64FrameBufferWriteBackControl =defaultRomOptions.N64FrameBufferWriteBackControl;
545 currentRomOptions.N64RenderToTextureEmuType =g_curRomInfo.dwRenderToTextureOption;
546 currentRomOptions.screenUpdateSetting =g_curRomInfo.dwScreenUpdateSetting;
547 currentRomOptions.bNormalCombiner =g_curRomInfo.dwNormalCombiner;
548 currentRomOptions.bNormalBlender =g_curRomInfo.dwNormalBlender;
549 currentRomOptions.bFastTexCRC =g_curRomInfo.dwFastTextureCRC;
550 currentRomOptions.bAccurateTextureMapping =g_curRomInfo.dwAccurateTextureMapping;
552 options.enableHackForGames = NO_HACK_FOR_GAME;
553 if ((strncmp((char*)g_curRomInfo.szGameName, "BANJO TOOIE", 11) == 0))
555 options.enableHackForGames = HACK_FOR_BANJO_TOOIE;
557 else if ((strncmp((char*)g_curRomInfo.szGameName, "DR.MARIO", 8) == 0))
559 options.enableHackForGames = HACK_FOR_DR_MARIO;
561 else if ((strncasecmp((char*)g_curRomInfo.szGameName, "Pilot", 5) == 0))
563 options.enableHackForGames = HACK_FOR_PILOT_WINGS;
565 else if ((strncasecmp((char*)g_curRomInfo.szGameName, "YOSHI", 5) == 0))
567 options.enableHackForGames = HACK_FOR_YOSHI;
569 else if ((strncasecmp((char*)g_curRomInfo.szGameName, "NITRO", 5) == 0))
571 options.enableHackForGames = HACK_FOR_NITRO;
573 else if ((strncasecmp((char*)g_curRomInfo.szGameName, "TONY HAWK", 9) == 0))
575 options.enableHackForGames = HACK_FOR_TONYHAWK;
577 else if ((strncasecmp((char*)g_curRomInfo.szGameName, "THPS", 4) == 0))
579 options.enableHackForGames = HACK_FOR_TONYHAWK;
581 else if ((strncasecmp((char*)g_curRomInfo.szGameName, "SPIDERMAN", 9) == 0))
583 options.enableHackForGames = HACK_FOR_TONYHAWK;
585 else if ((strncasecmp((char*)g_curRomInfo.szGameName, "NASCAR", 6) == 0))
587 options.enableHackForGames = HACK_FOR_NASCAR;
589 else if ((strstr((char*)g_curRomInfo.szGameName, "ZELDA") != 0) && (strstr((char*)g_curRomInfo.szGameName, "MASK") != 0))
591 options.enableHackForGames = HACK_FOR_ZELDA_MM;
593 else if ((strstr((char*)g_curRomInfo.szGameName, "ZELDA") != 0))
595 options.enableHackForGames = HACK_FOR_ZELDA;
597 else if ((strstr((char*)g_curRomInfo.szGameName, "Ogre") != 0))
599 options.enableHackForGames = HACK_FOR_OGRE_BATTLE;
601 else if ((strstr((char*)g_curRomInfo.szGameName, "TWINE") != 0))
603 options.enableHackForGames = HACK_FOR_TWINE;
605 else if ((strstr((char*)g_curRomInfo.szGameName, "Squadron") != 0))
607 options.enableHackForGames = HACK_FOR_ROGUE_SQUADRON;
609 else if ((strstr((char*)g_curRomInfo.szGameName, "Baseball") != 0) && (strstr((char*)g_curRomInfo.szGameName, "Star") != 0))
611 options.enableHackForGames = HACK_FOR_ALL_STAR_BASEBALL;
613 else if ((strstr((char*)g_curRomInfo.szGameName, "Tigger") != 0) && (strstr((char*)g_curRomInfo.szGameName, "Honey") != 0))
615 options.enableHackForGames = HACK_FOR_TIGER_HONEY_HUNT;
617 else if ((strstr((char*)g_curRomInfo.szGameName, "Bust") != 0) && (strstr((char*)g_curRomInfo.szGameName, "Move") != 0))
619 options.enableHackForGames = HACK_FOR_BUST_A_MOVE;
621 else if ((strncasecmp((char*)g_curRomInfo.szGameName, "MarioTennis",11) == 0))
623 options.enableHackForGames = HACK_FOR_MARIO_TENNIS;
625 else if ((strncasecmp((char*)g_curRomInfo.szGameName, "SUPER BOWLING",13) == 0))
627 options.enableHackForGames = HACK_FOR_SUPER_BOWLING;
629 else if ((strncasecmp((char*)g_curRomInfo.szGameName, "CONKER",6) == 0))
631 options.enableHackForGames = HACK_FOR_CONKER;
633 else if ((strncasecmp((char*)g_curRomInfo.szGameName, "MK_MYTHOLOGIES",14) == 0))
635 options.enableHackForGames = HACK_REVERSE_Y_COOR;
637 else if ((strncasecmp((char*)g_curRomInfo.szGameName, "Fighting Force",14) == 0))
639 options.enableHackForGames = HACK_REVERSE_XY_COOR;
641 else if ((strncasecmp((char*)g_curRomInfo.szGameName, "GOLDENEYE",9) == 0))
643 options.enableHackForGames = HACK_FOR_GOLDEN_EYE;
645 else if ((strncasecmp((char*)g_curRomInfo.szGameName, "F-ZERO",6) == 0))
647 options.enableHackForGames = HACK_FOR_FZERO;
649 else if ((strncasecmp((char*)g_curRomInfo.szGameName, "Command&Conquer",15) == 0))
651 options.enableHackForGames = HACK_FOR_COMMANDCONQUER;
653 else if ((strncasecmp((char*)g_curRomInfo.szGameName, "READY 2 RUMBLE",14) == 0))
655 options.enableHackForGames = HACK_FOR_RUMBLE;
657 else if ((strncasecmp((char*)g_curRomInfo.szGameName, "READY to RUMBLE",15) == 0))
659 options.enableHackForGames = HACK_FOR_RUMBLE;
661 else if ((strncasecmp((char*)g_curRomInfo.szGameName, "South Park Rally",16) == 0))
663 options.enableHackForGames = HACK_FOR_SOUTH_PARK_RALLY;
665 else if ((strncasecmp((char*)g_curRomInfo.szGameName, "Extreme G 2",11) == 0))
667 options.enableHackForGames = HACK_FOR_EXTREME_G2;
669 else if ((strncasecmp((char*)g_curRomInfo.szGameName, "MarioGolf64",11) == 0))
671 options.enableHackForGames = HACK_FOR_MARIO_GOLF;
673 else if ((strncasecmp((char*)g_curRomInfo.szGameName, "MLB FEATURING",13) == 0))
675 options.enableHackForGames = HACK_FOR_MLB;
677 else if ((strncasecmp((char*)g_curRomInfo.szGameName, "POLARISSNOCROSS",15) == 0))
679 options.enableHackForGames = HACK_FOR_POLARISSNOCROSS;
681 else if ((strncasecmp((char*)g_curRomInfo.szGameName, "TOP GEAR RALLY",14) == 0))
683 options.enableHackForGames = HACK_FOR_TOPGEARRALLY;
685 else if ((strncasecmp((char*)g_curRomInfo.szGameName, "DUKE NUKEM",10) == 0))
687 options.enableHackForGames = HACK_FOR_DUKE_NUKEM;
689 else if ((strncasecmp((char*)g_curRomInfo.szGameName, "MARIOKART64",11) == 0))
691 options.enableHackForGames = HACK_FOR_MARIO_KART;
694 if (options.enableHackForGames != NO_HACK_FOR_GAME)
695 DebugMessage(M64MSG_INFO, "Enabled hacks for game: '%s'", g_curRomInfo.szGameName);
697 if( currentRomOptions.N64FrameBufferEmuType == 0 ) currentRomOptions.N64FrameBufferEmuType = defaultRomOptions.N64FrameBufferEmuType;
698 else currentRomOptions.N64FrameBufferEmuType--;
699 if( currentRomOptions.N64RenderToTextureEmuType == 0 ) currentRomOptions.N64RenderToTextureEmuType = defaultRomOptions.N64RenderToTextureEmuType;
700 else currentRomOptions.N64RenderToTextureEmuType--;
701 if( currentRomOptions.screenUpdateSetting == 0 ) currentRomOptions.screenUpdateSetting = defaultRomOptions.screenUpdateSetting;
702 if( currentRomOptions.bNormalCombiner == 0 ) currentRomOptions.bNormalCombiner = defaultRomOptions.bNormalCombiner;
703 else currentRomOptions.bNormalCombiner--;
704 if( currentRomOptions.bNormalBlender == 0 ) currentRomOptions.bNormalBlender = defaultRomOptions.bNormalBlender;
705 else currentRomOptions.bNormalBlender--;
706 if( currentRomOptions.bFastTexCRC == 0 ) currentRomOptions.bFastTexCRC = defaultRomOptions.bFastTexCRC;
707 else currentRomOptions.bFastTexCRC--;
708 if( currentRomOptions.bAccurateTextureMapping == 0 ) currentRomOptions.bAccurateTextureMapping = defaultRomOptions.bAccurateTextureMapping;
709 else currentRomOptions.bAccurateTextureMapping--;
711 options.bUseFullTMEM = ((options.bFullTMEM && (g_curRomInfo.dwFullTMEM == 0)) || g_curRomInfo.dwFullTMEM == 2);
713 GenerateFrameBufferOptions();
715 if( options.enableHackForGames == HACK_FOR_MARIO_GOLF || options.enableHackForGames == HACK_FOR_MARIO_TENNIS )
717 frameBufferOptions.bIgnoreRenderTextureIfHeightUnknown = true;
721 void Ini_GetRomOptions(LPGAMESETTING pGameSetting)
725 i = FindIniEntry(pGameSetting->romheader.dwCRC1,
726 pGameSetting->romheader.dwCRC2,
727 pGameSetting->romheader.nCountryID,
728 (char*)pGameSetting->szGameName, 1);
730 pGameSetting->bDisableTextureCRC = IniSections[i].bDisableTextureCRC;
731 pGameSetting->bDisableCulling = IniSections[i].bDisableCulling;
732 pGameSetting->bIncTexRectEdge = IniSections[i].bIncTexRectEdge;
733 pGameSetting->bZHack = IniSections[i].bZHack;
734 pGameSetting->bTextureScaleHack = IniSections[i].bTextureScaleHack;
735 pGameSetting->bPrimaryDepthHack = IniSections[i].bPrimaryDepthHack;
736 pGameSetting->bTexture1Hack = IniSections[i].bTexture1Hack;
737 pGameSetting->bFastLoadTile = IniSections[i].bFastLoadTile;
738 pGameSetting->bUseSmallerTexture = IniSections[i].bUseSmallerTexture;
740 pGameSetting->VIWidth = IniSections[i].VIWidth;
741 pGameSetting->VIHeight = IniSections[i].VIHeight;
742 pGameSetting->UseCIWidthAndRatio = IniSections[i].UseCIWidthAndRatio;
743 pGameSetting->dwFullTMEM = IniSections[i].dwFullTMEM;
744 pGameSetting->bTxtSizeMethod2 = IniSections[i].bTxtSizeMethod2;
745 pGameSetting->bEnableTxtLOD = IniSections[i].bEnableTxtLOD;
747 pGameSetting->dwFastTextureCRC = IniSections[i].dwFastTextureCRC;
748 pGameSetting->bEmulateClear = IniSections[i].bEmulateClear;
749 pGameSetting->bForceScreenClear = IniSections[i].bForceScreenClear;
750 pGameSetting->dwAccurateTextureMapping = IniSections[i].dwAccurateTextureMapping;
751 pGameSetting->dwNormalBlender = IniSections[i].dwNormalBlender;
752 pGameSetting->bDisableBlender = IniSections[i].bDisableBlender;
753 pGameSetting->dwNormalCombiner = IniSections[i].dwNormalCombiner;
754 pGameSetting->bForceDepthBuffer = IniSections[i].bForceDepthBuffer;
755 pGameSetting->bDisableObjBG = IniSections[i].bDisableObjBG;
756 pGameSetting->dwFrameBufferOption = IniSections[i].dwFrameBufferOption;
757 pGameSetting->dwRenderToTextureOption = IniSections[i].dwRenderToTextureOption;
758 pGameSetting->dwScreenUpdateSetting = IniSections[i].dwScreenUpdateSetting;
761 void Ini_StoreRomOptions(LPGAMESETTING pGameSetting)
765 i = FindIniEntry(pGameSetting->romheader.dwCRC1,
766 pGameSetting->romheader.dwCRC2,
767 pGameSetting->romheader.nCountryID,
768 (char*)pGameSetting->szGameName, 0);
770 if( IniSections[i].bDisableTextureCRC !=pGameSetting->bDisableTextureCRC )
772 IniSections[i].bDisableTextureCRC =pGameSetting->bDisableTextureCRC ;
776 if( IniSections[i].bDisableCulling !=pGameSetting->bDisableCulling )
778 IniSections[i].bDisableCulling =pGameSetting->bDisableCulling ;
782 if( IniSections[i].dwFastTextureCRC !=pGameSetting->dwFastTextureCRC )
784 IniSections[i].dwFastTextureCRC =pGameSetting->dwFastTextureCRC ;
788 if( IniSections[i].bEmulateClear !=pGameSetting->bEmulateClear )
790 IniSections[i].bEmulateClear =pGameSetting->bEmulateClear ;
794 if( IniSections[i].dwNormalBlender !=pGameSetting->dwNormalBlender )
796 IniSections[i].dwNormalBlender =pGameSetting->dwNormalBlender ;
800 if( IniSections[i].bDisableBlender !=pGameSetting->bDisableBlender )
802 IniSections[i].bDisableBlender =pGameSetting->bDisableBlender ;
806 if( IniSections[i].bForceScreenClear !=pGameSetting->bForceScreenClear )
808 IniSections[i].bForceScreenClear =pGameSetting->bForceScreenClear ;
811 if( IniSections[i].dwAccurateTextureMapping !=pGameSetting->dwAccurateTextureMapping )
813 IniSections[i].dwAccurateTextureMapping =pGameSetting->dwAccurateTextureMapping ;
816 if( IniSections[i].dwNormalCombiner !=pGameSetting->dwNormalCombiner )
818 IniSections[i].dwNormalCombiner =pGameSetting->dwNormalCombiner ;
821 if( IniSections[i].bForceDepthBuffer !=pGameSetting->bForceDepthBuffer )
823 IniSections[i].bForceDepthBuffer =pGameSetting->bForceDepthBuffer ;
826 if( IniSections[i].bDisableObjBG !=pGameSetting->bDisableObjBG )
828 IniSections[i].bDisableObjBG =pGameSetting->bDisableObjBG ;
831 if( IniSections[i].dwFrameBufferOption !=pGameSetting->dwFrameBufferOption )
833 IniSections[i].dwFrameBufferOption =pGameSetting->dwFrameBufferOption ;
836 if( IniSections[i].dwRenderToTextureOption !=pGameSetting->dwRenderToTextureOption )
838 IniSections[i].dwRenderToTextureOption =pGameSetting->dwRenderToTextureOption ;
841 if( IniSections[i].dwScreenUpdateSetting !=pGameSetting->dwScreenUpdateSetting )
843 IniSections[i].dwScreenUpdateSetting =pGameSetting->dwScreenUpdateSetting ;
846 if( IniSections[i].bIncTexRectEdge != pGameSetting->bIncTexRectEdge )
848 IniSections[i].bIncTexRectEdge =pGameSetting->bIncTexRectEdge;
851 if( IniSections[i].bZHack != pGameSetting->bZHack )
853 IniSections[i].bZHack =pGameSetting->bZHack;
856 if( IniSections[i].bTextureScaleHack != pGameSetting->bTextureScaleHack )
858 IniSections[i].bTextureScaleHack =pGameSetting->bTextureScaleHack;
861 if( IniSections[i].bPrimaryDepthHack != pGameSetting->bPrimaryDepthHack )
863 IniSections[i].bPrimaryDepthHack =pGameSetting->bPrimaryDepthHack;
866 if( IniSections[i].bTexture1Hack != pGameSetting->bTexture1Hack )
868 IniSections[i].bTexture1Hack =pGameSetting->bTexture1Hack;
871 if( IniSections[i].bFastLoadTile != pGameSetting->bFastLoadTile )
873 IniSections[i].bFastLoadTile =pGameSetting->bFastLoadTile;
876 if( IniSections[i].bUseSmallerTexture != pGameSetting->bUseSmallerTexture )
878 IniSections[i].bUseSmallerTexture =pGameSetting->bUseSmallerTexture;
881 if( IniSections[i].VIWidth != pGameSetting->VIWidth )
883 IniSections[i].VIWidth =pGameSetting->VIWidth;
886 if( IniSections[i].VIHeight != pGameSetting->VIHeight )
888 IniSections[i].VIHeight =pGameSetting->VIHeight;
891 if( IniSections[i].UseCIWidthAndRatio != pGameSetting->UseCIWidthAndRatio )
893 IniSections[i].UseCIWidthAndRatio =pGameSetting->UseCIWidthAndRatio;
896 if( IniSections[i].dwFullTMEM != pGameSetting->dwFullTMEM )
898 IniSections[i].dwFullTMEM =pGameSetting->dwFullTMEM;
901 if( IniSections[i].bTxtSizeMethod2 != pGameSetting->bTxtSizeMethod2 )
903 IniSections[i].bTxtSizeMethod2 =pGameSetting->bTxtSizeMethod2;
906 if( IniSections[i].bEnableTxtLOD != pGameSetting->bEnableTxtLOD )
908 IniSections[i].bEnableTxtLOD =pGameSetting->bEnableTxtLOD;
915 TRACE0("Rom option is changed and saved");
919 std::ifstream& getline( std::ifstream &is, char *str );
921 char * left(const char * src, int nchars)
923 static char dst[300];
924 strncpy(dst,src,nchars);
929 char * right(const char *src, int nchars)
931 static char dst[300];
932 int srclen = strlen(src);
933 if (nchars >= srclen)
939 strncpy(dst, src + srclen - nchars, nchars);
945 char * tidy(char * s)
947 char * p = s + strlen(s);
950 while (p >= s && (*p == ' ' || *p == 0xa || *p == '\n') )
961 std::ifstream inifile;
963 const char *ini_filepath = ConfigGetSharedDataFilepath(szIniFileName);
965 DebugMessage(M64MSG_VERBOSE, "Reading .ini file: %s", ini_filepath);
966 inifile.open(ini_filepath);
973 while (getline(inifile,readinfo)/*&§ionno<999*/)
977 if (readinfo[0] == '/')
980 if (!strcasecmp(readinfo,"")==0)
982 if (readinfo[0] == '{') //if a section heading
986 readinfo[strlen(readinfo)-1]='\0';
987 strcpy(newsection.crccheck, readinfo+1);
989 newsection.bDisableTextureCRC = FALSE;
990 newsection.bDisableCulling = FALSE;
991 newsection.bIncTexRectEdge = FALSE;
992 newsection.bZHack = FALSE;
993 newsection.bTextureScaleHack = FALSE;
994 newsection.bFastLoadTile = FALSE;
995 newsection.bUseSmallerTexture = FALSE;
996 newsection.bPrimaryDepthHack = FALSE;
997 newsection.bTexture1Hack = FALSE;
998 newsection.bDisableObjBG = FALSE;
999 newsection.VIWidth = -1;
1000 newsection.VIHeight = -1;
1001 newsection.UseCIWidthAndRatio = NOT_USE_CI_WIDTH_AND_RATIO;
1002 newsection.dwFullTMEM = 0;
1003 newsection.bTxtSizeMethod2 = FALSE;
1004 newsection.bEnableTxtLOD = FALSE;
1006 newsection.bEmulateClear = FALSE;
1007 newsection.bForceScreenClear = FALSE;
1008 newsection.bDisableBlender = FALSE;
1009 newsection.bForceDepthBuffer = FALSE;
1010 newsection.dwFastTextureCRC = 0;
1011 newsection.dwAccurateTextureMapping = 0;
1012 newsection.dwNormalBlender = 0;
1013 newsection.dwNormalCombiner = 0;
1014 newsection.dwFrameBufferOption = 0;
1015 newsection.dwRenderToTextureOption = 0;
1016 newsection.dwScreenUpdateSetting = 0;
1018 IniSections.push_back(newsection);
1023 int sectionno = IniSections.size() - 1;
1025 if (strcasecmp(left(readinfo,4), "Name")==0)
1026 strcpy(IniSections[sectionno].name,right(readinfo,strlen(readinfo)-5));
1028 if (strcasecmp(left(readinfo,17), "DisableTextureCRC")==0)
1029 IniSections[sectionno].bDisableTextureCRC=true;
1031 if (strcasecmp(left(readinfo,14), "DisableCulling")==0)
1032 IniSections[sectionno].bDisableCulling=true;
1034 if (strcasecmp(left(readinfo,16), "PrimaryDepthHack")==0)
1035 IniSections[sectionno].bPrimaryDepthHack=true;
1037 if (strcasecmp(left(readinfo,12), "Texture1Hack")==0)
1038 IniSections[sectionno].bTexture1Hack=true;
1040 if (strcasecmp(left(readinfo,12), "FastLoadTile")==0)
1041 IniSections[sectionno].bFastLoadTile=true;
1043 if (strcasecmp(left(readinfo,17), "UseSmallerTexture")==0)
1044 IniSections[sectionno].bUseSmallerTexture=true;
1046 if (strcasecmp(left(readinfo,14), "IncTexRectEdge")==0)
1047 IniSections[sectionno].bIncTexRectEdge=true;
1049 if (strcasecmp(left(readinfo,5), "ZHack")==0)
1050 IniSections[sectionno].bZHack=true;
1052 if (strcasecmp(left(readinfo,16), "TexRectScaleHack")==0)
1053 IniSections[sectionno].bTextureScaleHack=true;
1055 if (strcasecmp(left(readinfo,7), "VIWidth")==0)
1056 IniSections[sectionno].VIWidth = strtol(right(readinfo,3),NULL,10);
1058 if (strcasecmp(left(readinfo,8), "VIHeight")==0)
1059 IniSections[sectionno].VIHeight = strtol(right(readinfo,3),NULL,10);
1061 if (strcasecmp(left(readinfo,18), "UseCIWidthAndRatio")==0)
1062 IniSections[sectionno].UseCIWidthAndRatio = strtol(right(readinfo,1),NULL,10);
1064 if (strcasecmp(left(readinfo,8), "FullTMEM")==0)
1065 IniSections[sectionno].dwFullTMEM = strtol(right(readinfo,1),NULL,10);
1067 if (strcasecmp(left(readinfo,24), "AlternativeTxtSizeMethod")==0)
1068 IniSections[sectionno].bTxtSizeMethod2 = strtol(right(readinfo,1),NULL,10);
1070 if (strcasecmp(left(readinfo,12), "EnableTxtLOD")==0)
1071 IniSections[sectionno].bEnableTxtLOD = strtol(right(readinfo,1),NULL,10);
1073 if (strcasecmp(left(readinfo,12), "DisableObjBG")==0)
1074 IniSections[sectionno].bDisableObjBG = strtol(right(readinfo,1),NULL,10);
1076 if (strcasecmp(left(readinfo,16), "ForceScreenClear")==0)
1077 IniSections[sectionno].bForceScreenClear = strtol(right(readinfo,1),NULL,10);
1079 if (strcasecmp(left(readinfo,22), "AccurateTextureMapping")==0)
1080 IniSections[sectionno].dwAccurateTextureMapping = strtol(right(readinfo,1),NULL,10);
1082 if (strcasecmp(left(readinfo,14), "FastTextureCRC")==0)
1083 IniSections[sectionno].dwFastTextureCRC = strtol(right(readinfo,1),NULL,10);
1085 if (strcasecmp(left(readinfo,12), "EmulateClear")==0)
1086 IniSections[sectionno].bEmulateClear = strtol(right(readinfo,1),NULL,10);
1088 if (strcasecmp(left(readinfo,18), "NormalAlphaBlender")==0)
1089 IniSections[sectionno].dwNormalBlender = strtol(right(readinfo,1),NULL,10);
1091 if (strcasecmp(left(readinfo,19), "DisableAlphaBlender")==0)
1092 IniSections[sectionno].bDisableBlender = strtol(right(readinfo,1),NULL,10);
1094 if (strcasecmp(left(readinfo,19), "NormalColorCombiner")==0)
1095 IniSections[sectionno].dwNormalCombiner = strtol(right(readinfo,1),NULL,10);
1097 if (strcasecmp(left(readinfo,16), "ForceDepthBuffer")==0)
1098 IniSections[sectionno].bForceDepthBuffer = strtol(right(readinfo,1),NULL,10);
1100 if (strcasecmp(left(readinfo,20), "FrameBufferEmulation")==0)
1101 IniSections[sectionno].dwFrameBufferOption = strtol(readinfo+21,NULL,10);
1103 if (strcasecmp(left(readinfo,15), "RenderToTexture")==0)
1104 IniSections[sectionno].dwRenderToTextureOption = strtol(right(readinfo,1),NULL,10);
1106 if (strcasecmp(left(readinfo,19), "ScreenUpdateSetting")==0)
1107 IniSections[sectionno].dwScreenUpdateSetting = strtol(right(readinfo,1),NULL,10);
1116 //read a line from the ini file
1117 std::ifstream & getline(std::ifstream & is, char *str)
1121 is.getline(buf,100);
1132 /* get path to game-hack INI file and read it */
1133 const char *ini_filepath = ConfigGetSharedDataFilepath(szIniFileName);
1134 if (ini_filepath == NULL)
1136 fhIn = fopen(ini_filepath, "r");
1139 fseek(fhIn, 0L, SEEK_END);
1140 long filelen = ftell(fhIn);
1141 fseek(fhIn, 0L, SEEK_SET);
1142 char *chIniData = (char *) malloc(filelen + 1);
1143 if (chIniData == NULL)
1148 long bytesread = fread(chIniData, 1, filelen, fhIn);
1150 if (bytesread != filelen)
1155 chIniData[filelen] = 0;
1157 /* now try to open the file for writing */
1158 fhOut = fopen(ini_filepath, "w");
1165 // Mark all sections and needing to be written
1166 for (i = 0; i < IniSections.size(); i++)
1168 IniSections[i].bOutput = false;
1171 char *thisline = chIniData;
1172 while ((thisline - chIniData) < filelen)
1174 char *nextline = strchr(thisline, '\n');
1175 if (nextline == NULL)
1176 nextline = thisline + strlen(thisline) + 1;
1179 if (thisline[0] == '{')
1181 BOOL bFound = FALSE;
1183 tidy((char*) thisline);
1184 thisline[strlen(thisline) - 1] = '\0';
1185 for (i = 0; i < IniSections.size(); i++)
1187 if (IniSections[i].bOutput)
1189 if (strcasecmp((char*) thisline + 1, IniSections[i].crccheck) == 0)
1192 OutputSectionDetails(i, fhOut);
1193 IniSections[i].bOutput = true;
1200 // Do what? This should never happen, unless the user
1201 // replaces the inifile while game is running!
1204 else if (thisline[0] == '/')
1207 fputs((char*) thisline, fhOut);
1209 thisline = nextline;
1212 // Input buffer done- process any new entries!
1213 for (i = 0; i < IniSections.size(); i++)
1215 // Skip any that have not been done.
1216 if (IniSections[i].bOutput)
1219 OutputSectionDetails(i, fhOut);
1220 IniSections[i].bOutput = true;
1226 bIniIsChanged = false;
1229 void OutputSectionDetails(uint32 i, FILE * fh)
1231 fprintf(fh, "{%s}\n", IniSections[i].crccheck);
1233 fprintf(fh, "Name=%s\n", IniSections[i].name);
1234 //fprintf(fh, "UCode=%d\n", IniSections[i].ucode);
1236 // Tri-state variables
1237 if (IniSections[i].dwAccurateTextureMapping != 0)
1238 fprintf(fh, "AccurateTextureMapping=%d\n", IniSections[i].dwAccurateTextureMapping);
1240 if (IniSections[i].dwFastTextureCRC != 0)
1241 fprintf(fh, "FastTextureCRC=%d\n", IniSections[i].dwFastTextureCRC);
1243 if (IniSections[i].dwNormalBlender != 0)
1244 fprintf(fh, "NormalAlphaBlender=%d\n", IniSections[i].dwNormalBlender);
1246 if (IniSections[i].dwNormalCombiner != 0)
1247 fprintf(fh, "NormalColorCombiner=%d\n", IniSections[i].dwNormalCombiner);
1250 // Normal bi-state variables
1251 if (IniSections[i].bDisableTextureCRC)
1252 fprintf(fh, "DisableTextureCRC\n");
1254 if (IniSections[i].bDisableCulling)
1255 fprintf(fh, "DisableCulling\n");
1257 if (IniSections[i].bPrimaryDepthHack)
1258 fprintf(fh, "PrimaryDepthHack\n");
1260 if (IniSections[i].bTexture1Hack)
1261 fprintf(fh, "Texture1Hack\n");
1263 if (IniSections[i].bFastLoadTile)
1264 fprintf(fh, "FastLoadTile\n");
1266 if (IniSections[i].bUseSmallerTexture)
1267 fprintf(fh, "UseSmallerTexture\n");
1269 if (IniSections[i].bIncTexRectEdge)
1270 fprintf(fh, "IncTexRectEdge\n");
1272 if (IniSections[i].bZHack)
1273 fprintf(fh, "ZHack\n");
1275 if (IniSections[i].bTextureScaleHack)
1276 fprintf(fh, "TexRectScaleHack\n");
1278 if (IniSections[i].VIWidth > 0)
1279 fprintf(fh, "VIWidth=%d\n", IniSections[i].VIWidth);
1281 if (IniSections[i].VIHeight > 0)
1282 fprintf(fh, "VIHeight=%d\n", IniSections[i].VIHeight);
1284 if (IniSections[i].UseCIWidthAndRatio > 0)
1285 fprintf(fh, "UseCIWidthAndRatio=%d\n", IniSections[i].UseCIWidthAndRatio);
1287 if (IniSections[i].dwFullTMEM > 0)
1288 fprintf(fh, "FullTMEM=%d\n", IniSections[i].dwFullTMEM);
1290 if (IniSections[i].bTxtSizeMethod2 != FALSE )
1291 fprintf(fh, "AlternativeTxtSizeMethod=%d\n", IniSections[i].bTxtSizeMethod2);
1293 if (IniSections[i].bEnableTxtLOD != FALSE )
1294 fprintf(fh, "EnableTxtLOD=%d\n", IniSections[i].bEnableTxtLOD);
1296 if (IniSections[i].bDisableObjBG != 0 )
1297 fprintf(fh, "DisableObjBG=%d\n", IniSections[i].bDisableObjBG);
1299 if (IniSections[i].bForceScreenClear != 0)
1300 fprintf(fh, "ForceScreenClear=%d\n", IniSections[i].bForceScreenClear);
1302 if (IniSections[i].bEmulateClear != 0)
1303 fprintf(fh, "EmulateClear=%d\n", IniSections[i].bEmulateClear);
1305 if (IniSections[i].bDisableBlender != 0)
1306 fprintf(fh, "DisableAlphaBlender=%d\n", IniSections[i].bDisableBlender);
1308 if (IniSections[i].bForceDepthBuffer != 0)
1309 fprintf(fh, "ForceDepthBuffer=%d\n", IniSections[i].bForceDepthBuffer);
1311 if (IniSections[i].dwFrameBufferOption != 0)
1312 fprintf(fh, "FrameBufferEmulation=%d\n", IniSections[i].dwFrameBufferOption);
1314 if (IniSections[i].dwRenderToTextureOption != 0)
1315 fprintf(fh, "RenderToTexture=%d\n", IniSections[i].dwRenderToTextureOption);
1317 if (IniSections[i].dwScreenUpdateSetting != 0)
1318 fprintf(fh, "ScreenUpdateSetting=%d\n", IniSections[i].dwScreenUpdateSetting);
1320 fprintf(fh, "\n"); // Spacer
1323 // Find the entry corresponding to the specified rom.
1324 // If the rom is not found, a new entry is created
1325 // The resulting value is returned
1326 void __cdecl DebuggerAppendMsg (const char * Message, ...);
1328 static int FindIniEntry(uint32 dwCRC1, uint32 dwCRC2, uint8 nCountryID, char* szName, int PrintInfo)
1331 unsigned char szCRC[50+1];
1333 // Generate the CRC-ID for this rom:
1334 sprintf((char*)szCRC, "%08x%08x-%02x", (unsigned int)dwCRC1, (unsigned int)dwCRC2, nCountryID);
1336 for (i = 0; i < IniSections.size(); i++)
1338 if (strcasecmp((char*)szCRC, IniSections[i].crccheck) == 0)
1341 DebugMessage(M64MSG_INFO, "Found ROM '%s', CRC %s", IniSections[i].name, szCRC);
1350 DebugMessage(M64MSG_INFO, "ROM (CRC %s) not found in INI file", szCRC);
1352 strcpy(newsection.crccheck, (char*)szCRC);
1354 strncpy(newsection.name, szName, 50);
1355 newsection.bDisableTextureCRC = FALSE;
1356 newsection.bDisableCulling = FALSE;
1357 newsection.bIncTexRectEdge = FALSE;
1358 newsection.bZHack = FALSE;
1359 newsection.bTextureScaleHack = FALSE;
1360 newsection.bFastLoadTile = FALSE;
1361 newsection.bUseSmallerTexture = FALSE;
1362 newsection.bPrimaryDepthHack = FALSE;
1363 newsection.bTexture1Hack = FALSE;
1364 newsection.bDisableObjBG = FALSE;
1365 newsection.VIWidth = -1;
1366 newsection.VIHeight = -1;
1367 newsection.UseCIWidthAndRatio = NOT_USE_CI_WIDTH_AND_RATIO;
1368 newsection.dwFullTMEM = 0;
1369 newsection.bTxtSizeMethod2 = FALSE;
1370 newsection.bEnableTxtLOD = FALSE;
1372 newsection.bEmulateClear = FALSE;
1373 newsection.bForceScreenClear = FALSE;
1374 newsection.bDisableBlender = FALSE;
1375 newsection.bForceDepthBuffer = FALSE;
1376 newsection.dwFastTextureCRC = 0;
1377 newsection.dwAccurateTextureMapping = 0;
1378 newsection.dwNormalBlender = 0;
1379 newsection.dwNormalCombiner = 0;
1380 newsection.dwFrameBufferOption = 0;
1381 newsection.dwRenderToTextureOption = 0;
1382 newsection.dwScreenUpdateSetting = 0;
1384 IniSections.push_back(newsection);
1386 bIniIsChanged = true; // Flag to indicate we should be updated
1387 return IniSections.size()-1; // -1 takes into account increment
1390 GameSetting g_curRomInfo;
1392 void ROM_GetRomNameFromHeader(unsigned char * szName, ROMHeader * pHdr)
1396 memcpy(szName, pHdr->szName, 20);
1399 p = szName + (strlen((char*)szName) -1); // -1 to skip null
1400 while (p >= szName && *p == ' ')
1407 uint32 CountryCodeToTVSystem(uint32 countryCode)
1414 system = TV_SYSTEM_NTSC;
1418 system = TV_SYSTEM_NTSC;
1422 system = TV_SYSTEM_NTSC;
1427 system = TV_SYSTEM_PAL;
1432 system = TV_SYSTEM_NTSC;
1437 system = TV_SYSTEM_PAL;
1442 system = TV_SYSTEM_PAL;
1447 system = TV_SYSTEM_NTSC;
1452 system = TV_SYSTEM_PAL;
1455 case 'S': /* Spain */
1456 system = TV_SYSTEM_PAL;
1461 system = TV_SYSTEM_PAL;
1465 system = TV_SYSTEM_PAL;
1470 system = TV_SYSTEM_PAL;
1477 system = TV_SYSTEM_PAL;
1482 system = TV_SYSTEM_PAL;