mirror of
https://github.com/blawar/GLideN64.git
synced 2024-07-07 03:13:49 +00:00
Add config option frameBufferEmulation.bufferSwapMode
Remove hack_VIUpdateOnCIChange Default buffer swap mode is swap buffer on each VI_UpdateScreen() call. This mode need no hacks for correct buffer update, but it causes gfx overheads.
This commit is contained in:
parent
1466e162f3
commit
550999133f
|
@ -56,6 +56,7 @@ void Config::resetToDefaults()
|
||||||
frameBufferEmulation.detectCFB = 0;
|
frameBufferEmulation.detectCFB = 0;
|
||||||
frameBufferEmulation.N64DepthCompare = 0;
|
frameBufferEmulation.N64DepthCompare = 0;
|
||||||
frameBufferEmulation.aspect = 1;
|
frameBufferEmulation.aspect = 1;
|
||||||
|
frameBufferEmulation.bufferSwapMode = 0;
|
||||||
|
|
||||||
textureFilter.txCacheSize = 100 * gc_uMegabyte;
|
textureFilter.txCacheSize = 100 * gc_uMegabyte;
|
||||||
textureFilter.txDump = 0;
|
textureFilter.txDump = 0;
|
||||||
|
|
|
@ -71,6 +71,12 @@ struct Config
|
||||||
ctAsync
|
ctAsync
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum BufferSwapMode {
|
||||||
|
bsOnVIUpdate = 0,
|
||||||
|
bsOnVIOriginChange,
|
||||||
|
bsOnColorImageChange
|
||||||
|
};
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
u32 enable;
|
u32 enable;
|
||||||
u32 copyAuxToRDRAM;
|
u32 copyAuxToRDRAM;
|
||||||
|
@ -80,6 +86,7 @@ struct Config
|
||||||
u32 detectCFB;
|
u32 detectCFB;
|
||||||
u32 N64DepthCompare;
|
u32 N64DepthCompare;
|
||||||
u32 aspect; // 0: stretch ; 1: 4/3 ; 2: 16/9; 3: adjust
|
u32 aspect; // 0: stretch ; 1: 4/3 ; 2: 16/9; 3: adjust
|
||||||
|
u32 bufferSwapMode; // 0: on VI update call; 1: on VI origin change; 2: on main frame buffer update
|
||||||
} frameBufferEmulation;
|
} frameBufferEmulation;
|
||||||
|
|
||||||
struct
|
struct
|
||||||
|
@ -130,7 +137,6 @@ struct Config
|
||||||
#define hack_legoRacers (1<<7) //LEGO racers course map
|
#define hack_legoRacers (1<<7) //LEGO racers course map
|
||||||
#define hack_blastCorps (1<<8) //Blast Corps black polygons
|
#define hack_blastCorps (1<<8) //Blast Corps black polygons
|
||||||
#define hack_ignoreVIHeightChange (1<<9) //Do not reset FBO when VI height is changed. Space Invaders need it.
|
#define hack_ignoreVIHeightChange (1<<9) //Do not reset FBO when VI height is changed. Space Invaders need it.
|
||||||
#define hack_VIUpdateOnCIChange (1<<10) //Update frame if color buffer changed. Needed for Quake II underwater.
|
|
||||||
#define hack_skipVIChangeCheck (1<<11) //Don't reset FBO when VI parameters changed. Zelda MM
|
#define hack_skipVIChangeCheck (1<<11) //Don't reset FBO when VI parameters changed. Zelda MM
|
||||||
#define hack_ZeldaCamera (1<<12) //Special hack to detect and process Zelda MM camera.
|
#define hack_ZeldaCamera (1<<12) //Special hack to detect and process Zelda MM camera.
|
||||||
|
|
||||||
|
|
|
@ -332,13 +332,6 @@ void RSP_Init()
|
||||||
config.generalEmulation.hacks |= hack_blastCorps;
|
config.generalEmulation.hacks |= hack_blastCorps;
|
||||||
else if (strstr(RSP.romname, (const char *)"SPACE INVADERS") != NULL)
|
else if (strstr(RSP.romname, (const char *)"SPACE INVADERS") != NULL)
|
||||||
config.generalEmulation.hacks |= hack_ignoreVIHeightChange;
|
config.generalEmulation.hacks |= hack_ignoreVIHeightChange;
|
||||||
else if (strstr(RSP.romname, (const char *)"QUAKE II") != NULL ||
|
|
||||||
strstr(RSP.romname, (const char *)"Quake") != NULL ||
|
|
||||||
strstr(RSP.romname, (const char *)"Perfect Dark") ||
|
|
||||||
strstr(RSP.romname, (const char *)"PERFECT DARK") ||
|
|
||||||
strstr(RSP.romname, (const char *)"POKEMON SNAP")
|
|
||||||
)
|
|
||||||
config.generalEmulation.hacks |= hack_VIUpdateOnCIChange;
|
|
||||||
else if (strstr(RSP.romname, (const char *)"MASK") != NULL) // Zelda MM
|
else if (strstr(RSP.romname, (const char *)"MASK") != NULL) // Zelda MM
|
||||||
config.generalEmulation.hacks |= hack_skipVIChangeCheck | hack_ZeldaCamera;
|
config.generalEmulation.hacks |= hack_skipVIChangeCheck | hack_ZeldaCamera;
|
||||||
|
|
||||||
|
|
15
src/VI.cpp
15
src/VI.cpp
|
@ -117,9 +117,20 @@ void VI_UpdateScreen()
|
||||||
}
|
}
|
||||||
|
|
||||||
const bool bCFB = (gDP.changed&CHANGED_CPU_FB_WRITE) == CHANGED_CPU_FB_WRITE;
|
const bool bCFB = (gDP.changed&CHANGED_CPU_FB_WRITE) == CHANGED_CPU_FB_WRITE;
|
||||||
const bool bNeedUpdate = (bCFB ? true : (*REG.VI_ORIGIN != VI.lastOrigin)) || ((config.generalEmulation.hacks & hack_VIUpdateOnCIChange) != 0 && gDP.colorImage.changed != 0);
|
bool bNeedSwap = false;
|
||||||
|
switch (config.frameBufferEmulation.bufferSwapMode) {
|
||||||
|
case Config::bsOnVIUpdate:
|
||||||
|
bNeedSwap = true;
|
||||||
|
break;
|
||||||
|
case Config::bsOnVIOriginChange:
|
||||||
|
bNeedSwap = bCFB ? true : (*REG.VI_ORIGIN != VI.lastOrigin);
|
||||||
|
break;
|
||||||
|
case Config::bsOnColorImageChange:
|
||||||
|
bNeedSwap = gDP.colorImage.changed != 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (bNeedUpdate) {
|
if (bNeedSwap) {
|
||||||
if (bCFB) {
|
if (bCFB) {
|
||||||
if (pBuffer == NULL || pBuffer->m_width != VI.width) {
|
if (pBuffer == NULL || pBuffer->m_width != VI.width) {
|
||||||
if (!bVIUpdated) {
|
if (!bVIUpdated) {
|
||||||
|
|
|
@ -49,6 +49,8 @@ bool Config_SetDefault()
|
||||||
assert(res == M64ERR_SUCCESS);
|
assert(res == M64ERR_SUCCESS);
|
||||||
res = ConfigSetDefaultInt(g_configVideoGliden64, "AspectRatio", config.frameBufferEmulation.aspect, "Screen aspect ratio (0=stretch, 1=force 4:3, 2=force 16:9, 3=adjust)");
|
res = ConfigSetDefaultInt(g_configVideoGliden64, "AspectRatio", config.frameBufferEmulation.aspect, "Screen aspect ratio (0=stretch, 1=force 4:3, 2=force 16:9, 3=adjust)");
|
||||||
assert(res == M64ERR_SUCCESS);
|
assert(res == M64ERR_SUCCESS);
|
||||||
|
res = ConfigSetDefaultInt(g_configVideoGliden64, "BufferSwapMode", config.frameBufferEmulation.bufferSwapMode, "Swap frame buffers (0=On VI update call, 1=On VI origin change, 2=On buffer update)");
|
||||||
|
assert(res == M64ERR_SUCCESS);
|
||||||
|
|
||||||
//#Texture Settings
|
//#Texture Settings
|
||||||
res = ConfigSetDefaultBool(g_configVideoGliden64, "bilinearMode", config.texture.bilinearMode, "Bilinear filtering mode (0=N64 3point, 1=standard)");
|
res = ConfigSetDefaultBool(g_configVideoGliden64, "bilinearMode", config.texture.bilinearMode, "Bilinear filtering mode (0=N64 3point, 1=standard)");
|
||||||
|
@ -177,6 +179,7 @@ void Config_LoadConfig()
|
||||||
config.video.multisampling = 0;
|
config.video.multisampling = 0;
|
||||||
#endif
|
#endif
|
||||||
config.frameBufferEmulation.aspect = ConfigGetParamInt(g_configVideoGliden64, "AspectRatio");
|
config.frameBufferEmulation.aspect = ConfigGetParamInt(g_configVideoGliden64, "AspectRatio");
|
||||||
|
config.frameBufferEmulation.bufferSwapMode = ConfigGetParamInt(g_configVideoGliden64, "BufferSwapMode");
|
||||||
|
|
||||||
//#Texture Settings
|
//#Texture Settings
|
||||||
config.texture.bilinearMode = ConfigGetParamBool(g_configVideoGliden64, "bilinearMode");
|
config.texture.bilinearMode = ConfigGetParamBool(g_configVideoGliden64, "bilinearMode");
|
||||||
|
|
Loading…
Reference in New Issue
Block a user