[Glide64] Change Frame buffer emulation options bit to an enum

This commit is contained in:
zilmar 2017-01-25 06:08:33 +11:00
parent bcd2a6f6b6
commit 50994936ba
13 changed files with 261 additions and 190 deletions

View File

@ -15713,7 +15713,7 @@ void Combine()
aTBuff[rdp.aTBuffTex[1]->tile] = rdp.aTBuffTex[1]; aTBuff[rdp.aTBuffTex[1]->tile] = rdp.aTBuffTex[1];
if (cmb.tex && (aTBuff[0] || aTBuff[1])) if (cmb.tex && (aTBuff[0] || aTBuff[1]))
{ {
if (aTBuff[0] && (g_settings->frame_buffer&fb_read_alpha)) if (aTBuff[0] && g_settings->fb_read_alpha_enabled())
{ {
if ((g_settings->hacks&hack_PMario) && aTBuff[0]->width == rdp.ci_width) if ((g_settings->hacks&hack_PMario) && aTBuff[0]->width == rdp.ci_width)
; ;

View File

@ -554,31 +554,31 @@ public:
m_cbxFBEnable.Attach(GetDlgItem(IDC_CHK_FRAME_BUFFER_EMULATION)); m_cbxFBEnable.Attach(GetDlgItem(IDC_CHK_FRAME_BUFFER_EMULATION));
TTSetTxt(IDC_CHK_FRAME_BUFFER_EMULATION, "Enable frame buffer emulation:\n\nIf on, plugin will try to detect frame buffer usage and apply appropriate frame buffer emulation.\n\n[Recommended: on for games which use frame buffer effects]"); TTSetTxt(IDC_CHK_FRAME_BUFFER_EMULATION, "Enable frame buffer emulation:\n\nIf on, plugin will try to detect frame buffer usage and apply appropriate frame buffer emulation.\n\n[Recommended: on for games which use frame buffer effects]");
m_cbxFBEnable.SetCheck((g_settings->frame_buffer&fb_emulation) > 0 ? BST_CHECKED : BST_UNCHECKED); m_cbxFBEnable.SetCheck(g_settings->fb_emulation_enabled() ? BST_CHECKED : BST_UNCHECKED);
m_cbxFBHWFBE.Attach(GetDlgItem(IDC_CHK_HARDWARE_FRAMEBUFFER)); m_cbxFBHWFBE.Attach(GetDlgItem(IDC_CHK_HARDWARE_FRAMEBUFFER));
TTSetTxt(IDC_CHK_HARDWARE_FRAMEBUFFER, "Enable hardware frame buffer emulation:\n\nIf this option is on, plugin will create auxiliary frame buffers in video memory instead of copying frame buffer content into main memory.\nThis allows plugin to run frame buffer effects without slowdown and without scaling image down to N64's native resolution.\nThis feature is fully supported by Voodoo 4/5 cards and partially by Voodoo3 and Banshee. Modern cards also fully support it.\n\n[Recommended: on, if supported by your hardware]"); TTSetTxt(IDC_CHK_HARDWARE_FRAMEBUFFER, "Enable hardware frame buffer emulation:\n\nIf this option is on, plugin will create auxiliary frame buffers in video memory instead of copying frame buffer content into main memory.\nThis allows plugin to run frame buffer effects without slowdown and without scaling image down to N64's native resolution.\nThis feature is fully supported by Voodoo 4/5 cards and partially by Voodoo3 and Banshee. Modern cards also fully support it.\n\n[Recommended: on, if supported by your hardware]");
m_cbxFBHWFBE.SetCheck((g_settings->frame_buffer&fb_hwfbe) > 0 ? BST_CHECKED : BST_UNCHECKED); m_cbxFBHWFBE.SetCheck(g_settings->fb_hwfbe_set() ? BST_CHECKED : BST_UNCHECKED);
m_cbxFBGetFBI.Attach(GetDlgItem(IDC_CHK_GET_FRAMEBUFFER)); m_cbxFBGetFBI.Attach(GetDlgItem(IDC_CHK_GET_FRAMEBUFFER));
TTSetTxt(IDC_CHK_GET_FRAMEBUFFER, "Get information about frame buffers:\n\nThis is compatibility option. It must be set on for Mupen64 and off for 1964"); TTSetTxt(IDC_CHK_GET_FRAMEBUFFER, "Get information about frame buffers:\n\nThis is compatibility option. It must be set on for Mupen64 and off for 1964");
m_cbxFBGetFBI.SetCheck((g_settings->frame_buffer&fb_get_info) > 0 ? BST_CHECKED : BST_UNCHECKED); m_cbxFBGetFBI.SetCheck(g_settings->fb_get_info_enabled() ? BST_CHECKED : BST_UNCHECKED);
m_cbxFBReadEveryFrame.Attach(GetDlgItem(IDC_CHK_READ_EVERY_FRAME)); m_cbxFBReadEveryFrame.Attach(GetDlgItem(IDC_CHK_READ_EVERY_FRAME));
TTSetTxt(IDC_CHK_READ_EVERY_FRAME, "Read every frame:\n\nIn some games plugin can't detect frame buffer usage.\nIn such cases you need to enable this option to see frame buffer effects.\nEvery drawn frame will be read from video card -> it works very slow.\n\n[Recommended: mostly off (needed only for a few games)]"); TTSetTxt(IDC_CHK_READ_EVERY_FRAME, "Read every frame:\n\nIn some games plugin can't detect frame buffer usage.\nIn such cases you need to enable this option to see frame buffer effects.\nEvery drawn frame will be read from video card -> it works very slow.\n\n[Recommended: mostly off (needed only for a few games)]");
m_cbxFBReadEveryFrame.SetCheck((g_settings->frame_buffer&fb_ref) > 0 ? BST_CHECKED : BST_UNCHECKED); m_cbxFBReadEveryFrame.SetCheck(g_settings->fb_ref_enabled() ? BST_CHECKED : BST_UNCHECKED);
m_cbxFBasTex.Attach(GetDlgItem(IDC_RENDER_FRAME_AS_TEXTURE)); m_cbxFBasTex.Attach(GetDlgItem(IDC_RENDER_FRAME_AS_TEXTURE));
TTSetTxt(IDC_RENDER_FRAME_AS_TEXTURE, "Render N64 frame buffer as texture:\n\nWhen this option is enabled, content of each N64 frame buffer is rendered as texture over the frame, rendered by the plugin.\nThis prevents graphics lost, but may cause slowdowns and various glitches in some games.\n\n[Recommended: mostly off]"); TTSetTxt(IDC_RENDER_FRAME_AS_TEXTURE, "Render N64 frame buffer as texture:\n\nWhen this option is enabled, content of each N64 frame buffer is rendered as texture over the frame, rendered by the plugin.\nThis prevents graphics lost, but may cause slowdowns and various glitches in some games.\n\n[Recommended: mostly off]");
m_cbxFBasTex.SetCheck((g_settings->frame_buffer&fb_read_back_to_screen) > 0 ? BST_CHECKED : BST_UNCHECKED); m_cbxFBasTex.SetCheck(g_settings->fb_read_back_to_screen_enabled() ? BST_CHECKED : BST_UNCHECKED);
m_cbxDetect.Attach(GetDlgItem(IDC_CHK_DETECT_CPU_WRITE)); m_cbxDetect.Attach(GetDlgItem(IDC_CHK_DETECT_CPU_WRITE));
TTSetTxt(IDC_CHK_DETECT_CPU_WRITE, "Detect CPU write to the N64 frame buffer:\n\nThis option works as the previous options, but the plugin is trying to detect, when game uses CPU writes to N64 frame buffer.\nThe N64 frame buffer is rendered only when CPU writes is detected.\nUse this option for those games, in which you see still image or no image at all for some time with no reason.\n\n[Recommended: mostly off]"); TTSetTxt(IDC_CHK_DETECT_CPU_WRITE, "Detect CPU write to the N64 frame buffer:\n\nThis option works as the previous options, but the plugin is trying to detect, when game uses CPU writes to N64 frame buffer.\nThe N64 frame buffer is rendered only when CPU writes is detected.\nUse this option for those games, in which you see still image or no image at all for some time with no reason.\n\n[Recommended: mostly off]");
m_cbxDetect.SetCheck((g_settings->frame_buffer&fb_cpu_write_hack) > 0 ? BST_CHECKED : BST_UNCHECKED); m_cbxDetect.SetCheck(g_settings->fb_cpu_write_hack_enabled() ? BST_CHECKED : BST_UNCHECKED);
m_cbxFBDepthBuffer.Attach(GetDlgItem(IDC_SOFTWARE_DEPTH_BUFFER)); m_cbxFBDepthBuffer.Attach(GetDlgItem(IDC_SOFTWARE_DEPTH_BUFFER));
TTSetTxt(IDC_SOFTWARE_DEPTH_BUFFER, "Enable depth buffer rendering:\n\nThis option is used to fully emulate N64 depth buffer.\nIt is required for correct emulation of depth buffer based effects.\nHowever, it requires fast (>1GHz) CPU to work full speed.\n\n[Recommended: on for fast PC]"); TTSetTxt(IDC_SOFTWARE_DEPTH_BUFFER, "Enable depth buffer rendering:\n\nThis option is used to fully emulate N64 depth buffer.\nIt is required for correct emulation of depth buffer based effects.\nHowever, it requires fast (>1GHz) CPU to work full speed.\n\n[Recommended: on for fast PC]");
m_cbxFBDepthBuffer.SetCheck((g_settings->frame_buffer&fb_depth_render) > 0 ? BST_CHECKED : BST_UNCHECKED); m_cbxFBDepthBuffer.SetCheck(g_settings->fb_depth_render_enabled() ? BST_CHECKED : BST_UNCHECKED);
return TRUE; return TRUE;
} }
@ -593,20 +593,34 @@ public:
g_settings->buff_clear = m_cbxBuffer.GetCheck() == BST_CHECKED; g_settings->buff_clear = m_cbxBuffer.GetCheck() == BST_CHECKED;
g_settings->lodmode = m_cmbLOD.GetItemData(m_cmbLOD.GetCurSel()); g_settings->lodmode = m_cmbLOD.GetItemData(m_cmbLOD.GetCurSel());
if (m_cbxFBEnable.GetCheck() == BST_CHECKED) g_settings->frame_buffer |= fb_emulation; CButton * fb_buttons[] =
else g_settings->frame_buffer &= ~fb_emulation; {
if (m_cbxFBHWFBE.GetCheck() == BST_CHECKED) g_settings->frame_buffer |= fb_hwfbe; &m_cbxFBEnable, &m_cbxFBHWFBE, &m_cbxFBReadEveryFrame,
else g_settings->frame_buffer &= ~fb_hwfbe; &m_cbxFBasTex, &m_cbxDetect,
if (m_cbxFBReadEveryFrame.GetCheck() == BST_CHECKED) g_settings->frame_buffer |= fb_ref; &m_cbxFBGetFBI, &m_cbxFBDepthBuffer
else g_settings->frame_buffer &= ~fb_ref; };
if (m_cbxFBasTex.GetCheck() == BST_CHECKED) g_settings->frame_buffer |= fb_read_back_to_screen;
else g_settings->frame_buffer &= ~fb_read_back_to_screen; CSettings::fb_bits_t bits[] =
if (m_cbxDetect.GetCheck() == BST_CHECKED) g_settings->frame_buffer |= fb_cpu_write_hack; {
else g_settings->frame_buffer &= ~fb_cpu_write_hack; CSettings::fb_emulation, CSettings::fb_hwfbe, CSettings::fb_ref,
if (m_cbxFBGetFBI.GetCheck() == BST_CHECKED) g_settings->frame_buffer |= fb_get_info; CSettings::fb_read_back_to_screen, CSettings::fb_cpu_write_hack,
else g_settings->frame_buffer &= ~fb_get_info; CSettings::fb_get_info, CSettings::fb_depth_render
if (m_cbxFBDepthBuffer.GetCheck() == BST_CHECKED) g_settings->frame_buffer |= fb_depth_render; };
else g_settings->frame_buffer &= ~fb_depth_render;
uint32_t fb_add_bits = 0, fb_remove_bits = 0;
for (int i = 0; i < (sizeof(fb_buttons) / sizeof(fb_buttons[0])); i++)
{
if (fb_buttons[i]->GetCheck() == BST_CHECKED)
{
fb_add_bits |= bits[i];
}
else
{
fb_remove_bits |= bits[i];
}
}
g_settings->UpdateFrameBufferBits(fb_add_bits, fb_remove_bits);
if (memcmp(&oldsettings, g_settings, sizeof(oldsettings))) //check that settings were changed if (memcmp(&oldsettings, g_settings, sizeof(oldsettings))) //check that settings were changed
{ {
WriteSettings(); WriteSettings();
@ -877,7 +891,7 @@ void CALL DllConfig(HWND hParent)
else else
{ {
char name[21] = "DEFAULT"; char name[21] = "DEFAULT";
ReadSpecialSettings(name); g_settings->ReadGameSettings(name);
ZLUT_init(); ZLUT_init();
} }
@ -890,8 +904,10 @@ void CloseConfig()
{ {
if (g_romopen) if (g_romopen)
{ {
if (fb_depth_render_enabled) if (g_settings->fb_depth_render_enabled())
{
ZLUT_init(); ZLUT_init();
}
// re-init evoodoo graphics to resize window // re-init evoodoo graphics to resize window
if (evoodoo)// && !ev_fullscreen) if (evoodoo)// && !ev_fullscreen)
InitGfx(); InitGfx();

View File

@ -578,7 +578,7 @@ void DrawDepthBufferToScreen(FB_TO_SCREEN_INFO & fb_info)
DrawDepthBufferToScreen256(fb_info); DrawDepthBufferToScreen256(fb_info);
return; return;
} }
if (fb_hwfbe_enabled && !evoodoo) if (g_settings->fb_hwfbe_enabled() && !evoodoo)
{ {
DrawHiresDepthBufferToScreen(fb_info); DrawHiresDepthBufferToScreen(fb_info);
return; return;

View File

@ -288,7 +288,6 @@ extern "C" {
#define GR_STIPPLE_ROTATE 0x2 #define GR_STIPPLE_ROTATE 0x2
#endif #endif
void ReadSpecialSettings(const char * name);
void WriteSettings(void); void WriteSettings(void);
/****************************************************************** /******************************************************************

View File

@ -446,7 +446,7 @@ int InitGfx()
// Is mirroring allowed? // Is mirroring allowed?
const char *extensions = grGetString(GR_EXTENSION); const char *extensions = grGetString(GR_EXTENSION);
// Check which SST we are using and initi alize stuff // Check which SST we are using and initialize stuff
// Hiroshi Morii <koolsmoky@users.sourceforge.net> // Hiroshi Morii <koolsmoky@users.sourceforge.net>
enum { enum {
GR_SSTTYPE_VOODOO = 0, GR_SSTTYPE_VOODOO = 0,
@ -736,7 +736,6 @@ extern "C" int WINAPI DllMain(HINSTANCE hinst, DWORD fdwReason, LPVOID /*lpReser
if (fdwReason == DLL_PROCESS_ATTACH) if (fdwReason == DLL_PROCESS_ATTACH)
{ {
hinstDLL = hinst; hinstDLL = hinst;
SetupTrace();
if (g_ProcessDListCS == NULL) if (g_ProcessDListCS == NULL)
{ {
g_ProcessDListCS = new CriticalSection(); g_ProcessDListCS = new CriticalSection();
@ -1011,7 +1010,7 @@ int CALL InitiateGFX(GFX_INFO Gfx_Info)
rdp.scale_y = 1.0f; rdp.scale_y = 1.0f;
char name[21] = "DEFAULT"; char name[21] = "DEFAULT";
ReadSpecialSettings(name); g_settings->ReadGameSettings(name);
ZLUT_init(); ZLUT_init();
ConfigWrapper(); ConfigWrapper();
#ifndef ANDROID #ifndef ANDROID
@ -1182,7 +1181,7 @@ void CALL RomOpen(void)
g_settings->ghq_use = 0; g_settings->ghq_use = 0;
} }
strcpy(rdp.RomName, name); strcpy(rdp.RomName, name);
ReadSpecialSettings(name); g_settings->ReadGameSettings(name);
ClearCache(); ClearCache();
CheckDRAMSize(); CheckDRAMSize();
@ -1291,7 +1290,7 @@ void CALL UpdateScreen(void)
update_screen_count++; update_screen_count++;
} }
uint32_t limit = (g_settings->hacks&hack_Lego) ? 15 : 30; uint32_t limit = (g_settings->hacks&hack_Lego) ? 15 : 30;
if ((g_settings->frame_buffer&fb_cpu_write_hack) && (update_screen_count > limit) && (rdp.last_bg == 0)) if (g_settings->fb_cpu_write_hack_enabled() && (update_screen_count > limit) && (rdp.last_bg == 0))
{ {
WriteTrace(TraceRDP, TraceDebug, "DirectCPUWrite hack!"); WriteTrace(TraceRDP, TraceDebug, "DirectCPUWrite hack!");
update_screen_count = 0; update_screen_count = 0;
@ -1338,8 +1337,10 @@ static void DrawWholeFrameBufferToScreen()
fb_info.lr_y = rdp.ci_height - 1; fb_info.lr_y = rdp.ci_height - 1;
fb_info.opaque = 0; fb_info.opaque = 0;
DrawFrameBufferToScreen(fb_info); DrawFrameBufferToScreen(fb_info);
if (!(g_settings->frame_buffer & fb_ref)) if (!g_settings->fb_ref_enabled())
{
memset(gfx.RDRAM + rdp.cimg, 0, (rdp.ci_width*rdp.ci_height) << rdp.ci_size >> 1); memset(gfx.RDRAM + rdp.cimg, 0, (rdp.ci_width*rdp.ci_height) << rdp.ci_size >> 1);
}
} }
static void GetGammaTable() static void GetGammaTable()
@ -1565,11 +1566,15 @@ void newSwapBuffers()
} }
} }
if (g_settings->frame_buffer & fb_read_back_to_screen) if (g_settings->fb_read_back_to_screen_enabled())
{
DrawWholeFrameBufferToScreen(); DrawWholeFrameBufferToScreen();
}
if (fb_hwfbe_enabled && !(g_settings->hacks&hack_RE2) && !evoodoo) if (g_settings->fb_hwfbe_enabled() && !(g_settings->hacks&hack_RE2) && !evoodoo)
{
grAuxBufferExt(GR_BUFFER_AUXBUFFER); grAuxBufferExt(GR_BUFFER_AUXBUFFER);
}
WriteTrace(TraceGlide64, TraceDebug, "BUFFER SWAPPED"); WriteTrace(TraceGlide64, TraceDebug, "BUFFER SWAPPED");
grBufferSwap(g_settings->vsync); grBufferSwap(g_settings->vsync);
if (*gfx.VI_STATUS_REG & 0x08) //gamma correction is used if (*gfx.VI_STATUS_REG & 0x08) //gamma correction is used
@ -1596,23 +1601,14 @@ void newSwapBuffers()
if (g_settings->wireframe || g_settings->buff_clear || (g_settings->hacks&hack_PPL && g_settings->ucode == 6)) if (g_settings->wireframe || g_settings->buff_clear || (g_settings->hacks&hack_PPL && g_settings->ucode == 6))
{ {
if (g_settings->hacks&hack_RE2 && fb_depth_render_enabled) if (g_settings->hacks&hack_RE2 && g_settings->fb_depth_render_enabled())
grDepthMask(FXFALSE); grDepthMask(FXFALSE);
else else
grDepthMask(FXTRUE); grDepthMask(FXTRUE);
grBufferClear(0, 0, 0xFFFF); grBufferClear(0, 0, 0xFFFF);
} }
/* //let the game to clear the buffers
else
{
grDepthMask (FXTRUE);
grColorMask (FXFALSE, FXFALSE);
grBufferClear (0, 0, 0xFFFF);
grColorMask (FXTRUE, FXTRUE);
}
*/
if (g_settings->frame_buffer & fb_read_back_to_screen2) if (g_settings->fb_read_back_to_screen2_enabled())
{ {
DrawWholeFrameBufferToScreen(); DrawWholeFrameBufferToScreen();
} }

View File

@ -8,6 +8,7 @@ int GetCurrentResIndex(void);
short Set_basic_mode = 0, Set_texture_dir = 0, Set_log_dir = 0, Set_log_flush = 0; short Set_basic_mode = 0, Set_texture_dir = 0, Set_log_dir = 0, Set_log_flush = 0;
CSettings::CSettings() : CSettings::CSettings() :
m_dirty(false),
res_x(640), res_x(640),
scr_res_x(640), scr_res_x(640),
res_y(480), res_y(480),
@ -31,6 +32,7 @@ buff_clear(0),
swapmode(0), swapmode(0),
lodmode(0), lodmode(0),
aspectmode(0), aspectmode(0),
m_frame_buffer(0),
use_hotkeys(0), use_hotkeys(0),
//Texture filtering options //Texture filtering options
texture_dir(""), texture_dir(""),
@ -224,6 +226,17 @@ void CSettings::RegisterSettings(void)
game_setting_default(Set_fb_render, "fb_render", Set_fb_render_default); game_setting_default(Set_fb_render, "fb_render", Set_fb_render_default);
} }
void CSettings::UpdateFrameBufferBits(uint32_t BitsToAdd, uint32_t BitsToRemove)
{
uint32_t frame_buffer_original = m_frame_buffer;
m_frame_buffer |= BitsToAdd;
m_frame_buffer &= ~BitsToRemove;
if (frame_buffer_original != m_frame_buffer)
{
m_dirty = true;
}
}
void CSettings::ReadSettings() void CSettings::ReadSettings()
{ {
#ifdef ANDROID #ifdef ANDROID
@ -305,9 +318,10 @@ void CSettings::ReadSettings()
GetSystemSettingSz(Set_log_dir, m_log_dir, sizeof(m_log_dir)); GetSystemSettingSz(Set_log_dir, m_log_dir, sizeof(m_log_dir));
} }
m_FlushLogs = Set_log_flush != 0 ? GetSystemSetting(Set_log_flush) != 0 : false; m_FlushLogs = Set_log_flush != 0 ? GetSystemSetting(Set_log_flush) != 0 : false;
m_dirty = false;
} }
void ReadSpecialSettings(const char * name) void CSettings::ReadGameSettings(const char * name)
{ {
g_settings->hacks = 0; g_settings->hacks = 0;
@ -399,64 +413,57 @@ void ReadSpecialSettings(const char * name)
g_settings->n64_z_scale = GetSetting(Set_n64_z_scale); g_settings->n64_z_scale = GetSetting(Set_n64_z_scale);
//frame buffer //frame buffer
int optimize_texrect = GetSetting(g_romopen ? Set_optimize_texrect : Set_optimize_texrect_default); short fb_Settings[] =
int ignore_aux_copy = GetSetting(Set_ignore_aux_copy); {
int hires_buf_clear = GetSetting(Set_hires_buf_clear); g_romopen ? Set_optimize_texrect : Set_optimize_texrect_default,
int read_alpha = GetSetting(Set_fb_read_alpha); Set_ignore_aux_copy,
int useless_is_useless = GetSetting(Set_useless_is_useless); Set_hires_buf_clear,
int fb_crc_mode = GetSetting(Set_fb_crc_mode); Set_fb_read_alpha,
Set_useless_is_useless,
g_romopen ? Set_fb_smart : Set_fb_smart_default,
g_romopen ? Set_fb_hires : Set_fb_hires_default,
g_romopen ? Set_fb_read_always : Set_fb_read_always_default,
g_romopen ? Set_detect_cpu_write : Set_detect_cpu_write_default,
g_romopen ? Set_fb_get_info : Set_fb_get_info_default,
g_romopen ? Set_fb_render : Set_fb_render_default
};
if (optimize_texrect > 0) g_settings->frame_buffer |= fb_optimize_texrect; fb_bits_t bits[] =
else if (optimize_texrect == 0) g_settings->frame_buffer &= ~fb_optimize_texrect; {
if (ignore_aux_copy > 0) g_settings->frame_buffer |= fb_ignore_aux_copy; fb_optimize_texrect,
else if (ignore_aux_copy == 0) g_settings->frame_buffer &= ~fb_ignore_aux_copy; fb_ignore_aux_copy,
if (hires_buf_clear > 0) g_settings->frame_buffer |= fb_hwfbe_buf_clear; fb_hwfbe_buf_clear,
else if (hires_buf_clear == 0) g_settings->frame_buffer &= ~fb_hwfbe_buf_clear; fb_read_alpha,
if (read_alpha > 0) g_settings->frame_buffer |= fb_read_alpha; fb_useless_is_useless,
else if (read_alpha == 0) g_settings->frame_buffer &= ~fb_read_alpha; fb_emulation,
if (useless_is_useless > 0) g_settings->frame_buffer |= fb_useless_is_useless; fb_hwfbe,
else g_settings->frame_buffer &= ~fb_useless_is_useless; fb_ref,
if (fb_crc_mode >= 0) g_settings->fb_crc_mode = (CSettings::FBCRCMODE)fb_crc_mode; fb_cpu_write_hack,
fb_get_info,
fb_depth_render
};
g_settings->filtering = GetSetting(g_romopen ? Set_filtering : Set_filtering_default); uint32_t fb_add_bits = 0, fb_remove_bits = 0;
g_settings->fog = GetSetting(g_romopen ? Set_fog : Set_fog_default); for (int i = 0; i < (sizeof(fb_Settings) / sizeof(fb_Settings[0])); i++)
g_settings->buff_clear = GetSetting(g_romopen ? Set_buff_clear : Set_buff_clear_default); {
g_settings->swapmode = GetSetting(g_romopen ? Set_swapmode : Set_swapmode_default); if (GetSetting(fb_Settings[i]) != 0)
g_settings->aspectmode = GetSetting(g_romopen ? Set_aspect : Set_aspect_default); {
g_settings->lodmode = GetSetting(g_romopen ? Set_lodmode : Set_lodmode_default); fb_add_bits |= bits[i];
#ifdef _WIN32 }
g_settings->res_data = GetSetting(Set_Resolution); else
if (g_settings->res_data < 0 || g_settings->res_data >= 0x18) g_settings->res_data = 12; {
g_settings->scr_res_x = g_settings->res_x = resolutions[g_settings->res_data][0]; fb_remove_bits |= bits[i];
g_settings->scr_res_y = g_settings->res_y = resolutions[g_settings->res_data][1]; }
#endif }
fb_add_bits |= fb_motionblur;
//frame buffer
int smart_read = GetSetting(g_romopen ? Set_fb_smart : Set_fb_smart_default);
int hires = GetSetting(g_romopen ? Set_fb_hires : Set_fb_hires_default);
int read_always = GetSetting(g_romopen ? Set_fb_read_always : Set_fb_read_always_default);
int read_back_to_screen = GetSetting(g_romopen ? Set_read_back_to_screen : Set_read_back_to_screen_default); int read_back_to_screen = GetSetting(g_romopen ? Set_read_back_to_screen : Set_read_back_to_screen_default);
int cpu_write_hack = GetSetting(g_romopen ? Set_detect_cpu_write : Set_detect_cpu_write_default); if (read_back_to_screen == 1) { fb_add_bits |= fb_read_back_to_screen; }
int get_fbinfo = GetSetting(g_romopen ? Set_fb_get_info : Set_fb_get_info_default); else if (read_back_to_screen == 2) { fb_add_bits |= fb_read_back_to_screen2; }
int depth_render = GetSetting(g_romopen ? Set_fb_render : Set_fb_render_default); else if (read_back_to_screen == 0) { fb_remove_bits |= fb_read_back_to_screen | fb_read_back_to_screen2; }
if (smart_read > 0) g_settings->frame_buffer |= fb_emulation; g_settings->UpdateFrameBufferBits(fb_add_bits, fb_remove_bits);
else if (smart_read == 0) g_settings->frame_buffer &= ~fb_emulation; g_settings->flame_corona = (g_settings->hacks & hack_Zelda) && !fb_depth_render_enabled();
if (hires > 0) g_settings->frame_buffer |= fb_hwfbe;
else if (hires == 0) g_settings->frame_buffer &= ~fb_hwfbe;
if (read_always > 0) g_settings->frame_buffer |= fb_ref;
else if (read_always == 0) g_settings->frame_buffer &= ~fb_ref;
if (read_back_to_screen == 1) g_settings->frame_buffer |= fb_read_back_to_screen;
else if (read_back_to_screen == 2) g_settings->frame_buffer |= fb_read_back_to_screen2;
else if (read_back_to_screen == 0) g_settings->frame_buffer &= ~(fb_read_back_to_screen | fb_read_back_to_screen2);
if (cpu_write_hack > 0) g_settings->frame_buffer |= fb_cpu_write_hack;
else if (cpu_write_hack == 0) g_settings->frame_buffer &= ~fb_cpu_write_hack;
if (get_fbinfo > 0) g_settings->frame_buffer |= fb_get_info;
else if (get_fbinfo == 0) g_settings->frame_buffer &= ~fb_get_info;
if (depth_render > 0) g_settings->frame_buffer |= fb_depth_render;
else if (depth_render == 0) g_settings->frame_buffer &= ~fb_depth_render;
g_settings->frame_buffer |= fb_motionblur;
g_settings->flame_corona = (g_settings->hacks & hack_Zelda) && !fb_depth_render_enabled;
} }
void WriteSettings(void) void WriteSettings(void)
@ -518,17 +525,17 @@ void WriteSettings(void)
SetSetting(g_romopen ? Set_lodmode : Set_lodmode_default, g_settings->lodmode); SetSetting(g_romopen ? Set_lodmode : Set_lodmode_default, g_settings->lodmode);
SetSetting(g_romopen ? Set_aspect : Set_aspect_default, g_settings->aspectmode); SetSetting(g_romopen ? Set_aspect : Set_aspect_default, g_settings->aspectmode);
SetSetting(g_romopen ? Set_fb_read_always : Set_fb_read_always_default, g_settings->frame_buffer&fb_ref ? 1 : 0); SetSetting(g_romopen ? Set_fb_read_always : Set_fb_read_always_default, g_settings->fb_ref_enabled() ? true : false);
SetSetting(g_romopen ? Set_fb_smart : Set_fb_smart_default, g_settings->frame_buffer & fb_emulation ? 1 : 0); SetSetting(g_romopen ? Set_fb_smart : Set_fb_smart_default, g_settings->fb_emulation_enabled() ? true : false);
SetSetting(g_romopen ? Set_fb_hires : Set_fb_hires_default, g_settings->frame_buffer & fb_hwfbe ? 1 : 0); SetSetting(g_romopen ? Set_fb_hires : Set_fb_hires_default, g_settings->fb_hwfbe_set() ? true : false);
SetSetting(g_romopen ? Set_fb_get_info : Set_fb_get_info_default, g_settings->frame_buffer & fb_get_info ? 1 : 0); SetSetting(g_romopen ? Set_fb_get_info : Set_fb_get_info_default, g_settings->fb_get_info_enabled() ? true : false);
SetSetting(g_romopen ? Set_fb_render : Set_fb_render_default, g_settings->frame_buffer & fb_depth_render ? 1 : 0); SetSetting(g_romopen ? Set_fb_render : Set_fb_render_default, g_settings->fb_depth_render_enabled() ? true : false);
SetSetting(g_romopen ? Set_detect_cpu_write : Set_detect_cpu_write_default, g_settings->frame_buffer & fb_cpu_write_hack ? 1 : 0); SetSetting(g_romopen ? Set_detect_cpu_write : Set_detect_cpu_write_default, g_settings->fb_cpu_write_hack_enabled() ? true : false);
if (g_settings->frame_buffer & fb_read_back_to_screen) if (g_settings->fb_read_back_to_screen_enabled())
{ {
SetSetting(g_romopen ? Set_read_back_to_screen : Set_read_back_to_screen_default, 1); SetSetting(g_romopen ? Set_read_back_to_screen : Set_read_back_to_screen_default, 1);
} }
else if (g_settings->frame_buffer & fb_read_back_to_screen2) else if (g_settings->fb_read_back_to_screen2_enabled())
{ {
SetSetting(g_romopen ? Set_read_back_to_screen : Set_read_back_to_screen_default, 2); SetSetting(g_romopen ? Set_read_back_to_screen : Set_read_back_to_screen_default, 2);
} }

View File

@ -5,6 +5,25 @@ class CSettings
public: public:
CSettings(); CSettings();
//Frame buffer emulation options
enum fb_bits_t
{
fb_emulation = (1 << 0), //frame buffer emulation
fb_hwfbe = (1 << 1), //hardware frame buffer emualtion
fb_motionblur = (1 << 2), //emulate motion blur
fb_ref = (1 << 3), //read every frame
fb_read_alpha = (1 << 4), //read alpha
fb_hwfbe_buf_clear = (1 << 5), //clear auxiliary texture frame buffers
fb_depth_render = (1 << 6), //enable software depth render
fb_optimize_texrect = (1 << 7), //fast texrect rendering with hwfbe
fb_ignore_aux_copy = (1 << 8), //do not copy auxiliary frame buffers
fb_useless_is_useless = (1 << 10), //
fb_get_info = (1 << 11), //get frame buffer info
fb_read_back_to_screen = (1 << 12), //render N64 frame buffer to screen
fb_read_back_to_screen2 = (1 << 13), //render N64 frame buffer to screen
fb_cpu_write_hack = (1 << 14), //show images writed directly by CPU
};
uint32_t res_x, scr_res_x; uint32_t res_x, scr_res_x;
uint32_t res_y, scr_res_y; uint32_t res_y, scr_res_y;
#ifndef ANDROID #ifndef ANDROID
@ -28,27 +47,7 @@ public:
int aspectmode; int aspectmode;
int use_hotkeys; int use_hotkeys;
//Frame buffer emulation options
#define fb_emulation (1<<0) //frame buffer emulation
#define fb_hwfbe (1<<1) //hardware frame buffer emualtion
#define fb_motionblur (1<<2) //emulate motion blur
#define fb_ref (1<<3) //read every frame
#define fb_read_alpha (1<<4) //read alpha
#define fb_hwfbe_buf_clear (1<<5) //clear auxiliary texture frame buffers
#define fb_depth_render (1<<6) //enable software depth render
#define fb_optimize_texrect (1<<7) //fast texrect rendering with hwfbe
#define fb_ignore_aux_copy (1<<8) //do not copy auxiliary frame buffers
#define fb_useless_is_useless (1<<10) //
#define fb_get_info (1<<11) //get frame buffer info
#define fb_read_back_to_screen (1<<12) //render N64 frame buffer to screen
#define fb_read_back_to_screen2 (1<<13) //render N64 frame buffer to screen
#define fb_cpu_write_hack (1<<14) //show images writed directly by CPU
#define fb_emulation_enabled ((g_settings->frame_buffer&fb_emulation)>0)
#define fb_hwfbe_enabled ((g_settings->frame_buffer&(fb_emulation|fb_hwfbe))==(fb_emulation|fb_hwfbe))
#define fb_depth_render_enabled ((g_settings->frame_buffer&fb_depth_render)>0)
uint32_t frame_buffer;
enum FBCRCMODE enum FBCRCMODE
{ {
fbcrcNone = 0, fbcrcNone = 0,
@ -56,6 +55,22 @@ public:
fbcrcSafe = 2 fbcrcSafe = 2
} fb_crc_mode; } fb_crc_mode;
inline bool fb_emulation_enabled(void) const { return ((m_frame_buffer&fb_emulation) != 0); }
inline bool fb_ref_enabled(void) const { return ((m_frame_buffer&fb_ref) != 0); }
inline bool fb_hwfbe_enabled(void) const { return ((m_frame_buffer&(fb_emulation |fb_hwfbe)) == (fb_emulation | fb_hwfbe)); }
inline bool fb_hwfbe_set(void) const { return ((m_frame_buffer&fb_hwfbe) != 0); }
inline bool fb_depth_render_enabled(void) const { return ((m_frame_buffer&fb_depth_render) != 0); }
inline bool fb_get_info_enabled(void) const { return ((m_frame_buffer&fb_get_info) != 0); }
inline bool fb_read_back_to_screen_enabled(void) const { return ((m_frame_buffer&fb_read_back_to_screen) != 0); }
inline bool fb_read_back_to_screen2_enabled(void) const { return ((m_frame_buffer&fb_read_back_to_screen2) != 0); }
inline bool fb_cpu_write_hack_enabled(void) const { return ((m_frame_buffer&fb_cpu_write_hack) != 0); }
inline bool fb_ignore_aux_copy_enabled(void) const { return ((m_frame_buffer&fb_ignore_aux_copy) != 0); }
inline bool fb_hwfbe_buf_clear_enabled(void) const { return ((m_frame_buffer&fb_hwfbe_buf_clear) != 0); }
inline bool fb_useless_is_useless_enabled(void) const { return ((m_frame_buffer&fb_useless_is_useless) != 0); }
inline bool fb_motionblur_enabled(void) const { return ((m_frame_buffer&fb_motionblur) != 0); }
inline bool fb_read_alpha_enabled(void) const { return ((m_frame_buffer&fb_read_alpha) != 0); }
inline bool fb_optimize_texrect_enabled(void) const { return ((m_frame_buffer&fb_optimize_texrect) != 0); }
inline const char * log_dir(void) const { return m_log_dir; } inline const char * log_dir(void) const { return m_log_dir; }
inline bool FlushLogs(void) const { return m_FlushLogs; } inline bool FlushLogs(void) const { return m_FlushLogs; }
@ -160,12 +175,18 @@ public:
int wrpVRAM; int wrpVRAM;
int wrpFBO; int wrpFBO;
int wrpAnisotropic; int wrpAnisotropic;
void UpdateFrameBufferBits(uint32_t BitsToAdd, uint32_t BitsToRemove);
void ReadGameSettings(const char * name);
private: private:
void ReadSettings(); void ReadSettings();
void RegisterSettings(void); void RegisterSettings(void);
bool m_dirty;
bool m_FlushLogs; bool m_FlushLogs;
char m_log_dir[260]; char m_log_dir[260];
uint32_t m_frame_buffer;
}; };
extern CSettings * g_settings; extern CSettings * g_settings;

View File

@ -326,8 +326,8 @@ int OpenTextureBuffer(COLOR_IMAGE & cimage)
grRenderBuffer(GR_BUFFER_TEXTUREBUFFER_EXT); grRenderBuffer(GR_BUFFER_TEXTUREBUFFER_EXT);
grTextureBufferExt(rdp.cur_image->tmu, rdp.cur_image->tex_addr, rdp.cur_image->info.smallLodLog2, rdp.cur_image->info.largeLodLog2, grTextureBufferExt(rdp.cur_image->tmu, rdp.cur_image->tex_addr, rdp.cur_image->info.smallLodLog2, rdp.cur_image->info.largeLodLog2,
rdp.cur_image->info.aspectRatioLog2, rdp.cur_image->info.format, GR_MIPMAPLEVELMASK_BOTH); rdp.cur_image->info.aspectRatioLog2, rdp.cur_image->info.format, GR_MIPMAPLEVELMASK_BOTH);
///*
if (rdp.cur_image->clear && (g_settings->frame_buffer&fb_hwfbe_buf_clear) && cimage.changed) if (rdp.cur_image->clear && g_settings->fb_hwfbe_buf_clear_enabled() && cimage.changed)
{ {
rdp.cur_image->clear = FALSE; rdp.cur_image->clear = FALSE;
grDepthMask(FXFALSE); grDepthMask(FXFALSE);
@ -665,10 +665,14 @@ int SwapTextureBuffer()
static uint32_t CalcCRC(TBUFF_COLOR_IMAGE * pTCI) static uint32_t CalcCRC(TBUFF_COLOR_IMAGE * pTCI)
{ {
uint32_t result = 0; uint32_t result = 0;
if ((g_settings->frame_buffer&fb_ref) > 0) if (g_settings->fb_ref_enabled())
{
pTCI->crc = 0; //Since fb content changes each frame, crc check is meaningless. pTCI->crc = 0; //Since fb content changes each frame, crc check is meaningless.
}
else if (g_settings->fb_crc_mode == CSettings::fbcrcFast) else if (g_settings->fb_crc_mode == CSettings::fbcrcFast)
{
result = *((uint32_t*)(gfx.RDRAM + pTCI->addr + (pTCI->end_addr - pTCI->addr) / 2)); result = *((uint32_t*)(gfx.RDRAM + pTCI->addr + (pTCI->end_addr - pTCI->addr) / 2));
}
else if (g_settings->fb_crc_mode == CSettings::fbcrcSafe) else if (g_settings->fb_crc_mode == CSettings::fbcrcSafe)
{ {
uint8_t * pSrc = gfx.RDRAM + pTCI->addr; uint8_t * pSrc = gfx.RDRAM + pTCI->addr;

View File

@ -289,7 +289,7 @@ VERTEX **org_vtx;
void draw_tri(VERTEX **vtx, uint16_t linew) void draw_tri(VERTEX **vtx, uint16_t linew)
{ {
deltaZ = dzdx = 0; deltaZ = dzdx = 0;
if (linew == 0 && (fb_depth_render_enabled || (rdp.rm & 0xC00) == 0xC00)) if (linew == 0 && (g_settings->fb_depth_render_enabled() || (rdp.rm & 0xC00) == 0xC00))
{ {
double X0 = vtx[0]->sx / rdp.scale_x; double X0 = vtx[0]->sx / rdp.scale_x;
double Y0 = vtx[0]->sy / rdp.scale_y; double Y0 = vtx[0]->sy / rdp.scale_y;
@ -308,12 +308,15 @@ void draw_tri(VERTEX **vtx, uint16_t linew)
double diffz_02 = vtx[0]->sz - vtx[2]->sz; double diffz_02 = vtx[0]->sz - vtx[2]->sz;
double diffz_12 = vtx[1]->sz - vtx[2]->sz; double diffz_12 = vtx[1]->sz - vtx[2]->sz;
double fdzdx = (diffz_02 * diffy_12 - diffz_12 * diffy_02) / denom; double fdzdx = (diffz_02 * diffy_12 - diffz_12 * diffy_02) / denom;
if ((rdp.rm & 0xC00) == 0xC00) { if ((rdp.rm & 0xC00) == 0xC00)
{
// Calculate deltaZ per polygon for Decal z-mode // Calculate deltaZ per polygon for Decal z-mode
double fdzdy = (diffz_02 * diffx_12 - diffz_12 * diffx_02) / denom; double fdzdy = (diffz_02 * diffx_12 - diffz_12 * diffx_02) / denom;
double fdz = fabs(fdzdx) + fabs(fdzdy); double fdz = fabs(fdzdx) + fabs(fdzdy);
if ((g_settings->hacks & hack_Zelda) && (rdp.rm & 0x800)) if ((g_settings->hacks & hack_Zelda) && (rdp.rm & 0x800))
{
fdz *= 4.0; // Decal mode in Zelda sometimes needs mutiplied deltaZ to work correct, e.g. roads fdz *= 4.0; // Decal mode in Zelda sometimes needs mutiplied deltaZ to work correct, e.g. roads
}
deltaZ = maxval(8, (int)fdz); deltaZ = maxval(8, (int)fdz);
} }
dzdx = (int)(fdzdx * 65536.0); dzdx = (int)(fdzdx * 65536.0);
@ -1033,7 +1036,7 @@ float ScaleZ(float z)
static void DepthBuffer(VERTEX * vtx, int n) static void DepthBuffer(VERTEX * vtx, int n)
{ {
if (fb_depth_render_enabled && !(g_settings->hacks&hack_RE2) && dzdx && (rdp.flags & ZBUF_UPDATE)) if (g_settings->fb_depth_render_enabled() && !(g_settings->hacks&hack_RE2) && dzdx && (rdp.flags & ZBUF_UPDATE))
{ {
vertexi v[12]; vertexi v[12];
if (u_cull_mode == 1) //cull front if (u_cull_mode == 1) //cull front

View File

@ -421,7 +421,7 @@ static void CopyFrameBuffer(GrBuffer_t buffer = GR_BUFFER_BACKBUFFER)
uint32_t width = rdp.ci_width;//*gfx.VI_WIDTH_REG; uint32_t width = rdp.ci_width;//*gfx.VI_WIDTH_REG;
uint32_t height; uint32_t height;
if (fb_emulation_enabled && !(g_settings->hacks&hack_PPL)) if (g_settings->fb_emulation_enabled() && !(g_settings->hacks&hack_PPL))
{ {
int ind = (rdp.ci_count > 0) ? rdp.ci_count - 1 : 0; int ind = (rdp.ci_count > 0) ? rdp.ci_count - 1 : 0;
height = rdp.frame_buffers[ind].height; height = rdp.frame_buffers[ind].height;
@ -454,7 +454,7 @@ static void CopyFrameBuffer(GrBuffer_t buffer = GR_BUFFER_BACKBUFFER)
for (uint32_t x = 0; x < width; x++) for (uint32_t x = 0; x < width; x++)
{ {
c = ptr_src[x + y * width]; c = ptr_src[x + y * width];
if (g_settings->frame_buffer&fb_read_alpha) if (g_settings->fb_read_alpha_enabled())
{ {
if (c > 0) if (c > 0)
c = (c & 0xFFC0) | ((c & 0x001F) << 1) | 1; c = (c & 0xFFC0) | ((c & 0x001F) << 1) | 1;
@ -479,7 +479,7 @@ static void CopyFrameBuffer(GrBuffer_t buffer = GR_BUFFER_BACKBUFFER)
} }
else else
{ {
if (rdp.motionblur && fb_hwfbe_enabled) if (rdp.motionblur && g_settings->fb_hwfbe_enabled())
{ {
return; return;
} }
@ -505,7 +505,7 @@ static void CopyFrameBuffer(GrBuffer_t buffer = GR_BUFFER_BACKBUFFER)
uint16_t c; uint16_t c;
uint32_t stride = info.strideInBytes >> 1; uint32_t stride = info.strideInBytes >> 1;
int read_alpha = g_settings->frame_buffer & fb_read_alpha; int read_alpha = g_settings->fb_read_alpha_enabled();
if ((g_settings->hacks&hack_PMario) && rdp.frame_buffers[rdp.ci_count - 1].status != ci_aux) if ((g_settings->hacks&hack_PMario) && rdp.frame_buffers[rdp.ci_count - 1].status != ci_aux)
read_alpha = FALSE; read_alpha = FALSE;
int x_start = 0, y_start = 0, x_end = width, y_end = height; int x_start = 0, y_start = 0, x_end = width, y_end = height;
@ -652,7 +652,7 @@ EXPORT void CALL ProcessDList(void)
depth_buffer_fog = TRUE; depth_buffer_fog = TRUE;
//analize possible frame buffer usage //analize possible frame buffer usage
if (fb_emulation_enabled) if (g_settings->fb_emulation_enabled())
DetectFrameBufferUsage(); DetectFrameBufferUsage();
if (!(g_settings->hacks&hack_Lego) || rdp.num_of_ci > 1) if (!(g_settings->hacks&hack_Lego) || rdp.num_of_ci > 1)
rdp.last_bg = 0; rdp.last_bg = 0;
@ -764,19 +764,25 @@ EXPORT void CALL ProcessDList(void)
} }
#endif #endif
if (fb_emulation_enabled) if (g_settings->fb_emulation_enabled())
{ {
rdp.scale_x = rdp.scale_x_bak; rdp.scale_x = rdp.scale_x_bak;
rdp.scale_y = rdp.scale_y_bak; rdp.scale_y = rdp.scale_y_bak;
} }
if (g_settings->hacks & hack_OoT) if (g_settings->hacks & hack_OoT)
{
copyWhiteToRDRAM(); //Subscreen delay fix copyWhiteToRDRAM(); //Subscreen delay fix
else if (g_settings->frame_buffer & fb_ref) }
else if (g_settings->fb_ref_enabled())
{
CopyFrameBuffer(); CopyFrameBuffer();
}
if (rdp.cur_image) if (rdp.cur_image)
{
CloseTextureBuffer(rdp.read_whole_frame && ((g_settings->hacks&hack_PMario) || rdp.swap_ci_index >= 0)); CloseTextureBuffer(rdp.read_whole_frame && ((g_settings->hacks&hack_PMario) || rdp.swap_ci_index >= 0));
}
if ((g_settings->hacks&hack_TGR2) && rdp.vi_org_reg != *gfx.VI_ORIGIN_REG && CI_SET) if ((g_settings->hacks&hack_TGR2) && rdp.vi_org_reg != *gfx.VI_ORIGIN_REG && CI_SET)
{ {
@ -932,7 +938,7 @@ static void rdp_texrect()
return; return;
} }
if (rdp.skip_drawing || (!fb_emulation_enabled && (rdp.cimg == rdp.zimg))) if (rdp.skip_drawing || (!g_settings->fb_emulation_enabled() && (rdp.cimg == rdp.zimg)))
{ {
if ((g_settings->hacks&hack_PMario) && rdp.ci_status == ci_useless) if ((g_settings->hacks&hack_PMario) && rdp.ci_status == ci_useless)
{ {
@ -1011,8 +1017,7 @@ static void rdp_texrect()
lr_y = ceil(lr_y); lr_y = ceil(lr_y);
} }
//* if (rdp.tbuff_tex && g_settings->fb_optimize_texrect_enabled())
if (rdp.tbuff_tex && (g_settings->frame_buffer & fb_optimize_texrect))
{ {
WriteTrace(TraceRDP, TraceDebug, "Attempt to optimize texrect"); WriteTrace(TraceRDP, TraceDebug, "Attempt to optimize texrect");
if (!rdp.tbuff_tex->drawn) if (!rdp.tbuff_tex->drawn)
@ -1050,7 +1055,7 @@ static void rdp_texrect()
} }
//* //*
//hack for Banjo2. it removes black texrects under Banjo //hack for Banjo2. it removes black texrects under Banjo
if (!fb_hwfbe_enabled && ((rdp.cycle1 << 16) | (rdp.cycle2 & 0xFFFF)) == 0xFFFFFFFF && (rdp.othermode_l & 0xFFFF0000) == 0x00500000) if (!g_settings->fb_hwfbe_enabled() && ((rdp.cycle1 << 16) | (rdp.cycle2 & 0xFFFF)) == 0xFFFFFFFF && (rdp.othermode_l & 0xFFFF0000) == 0x00500000)
{ {
rdp.tri_n += 2; rdp.tri_n += 2;
return; return;
@ -1060,7 +1065,7 @@ static void rdp_texrect()
//remove motion blur in night vision //remove motion blur in night vision
if ((g_settings->ucode == ucode_PerfectDark) && (rdp.maincimg[1].addr != rdp.maincimg[0].addr) && (rdp.timg.addr >= rdp.maincimg[1].addr) && (rdp.timg.addr < (rdp.maincimg[1].addr + rdp.ci_width*rdp.ci_height*rdp.ci_size))) if ((g_settings->ucode == ucode_PerfectDark) && (rdp.maincimg[1].addr != rdp.maincimg[0].addr) && (rdp.timg.addr >= rdp.maincimg[1].addr) && (rdp.timg.addr < (rdp.maincimg[1].addr + rdp.ci_width*rdp.ci_height*rdp.ci_size)))
{ {
if (fb_emulation_enabled) if (g_settings->fb_emulation_enabled())
if (rdp.ci_count > 0 && rdp.frame_buffers[rdp.ci_count - 1].status == ci_copy_self) if (rdp.ci_count > 0 && rdp.frame_buffers[rdp.ci_count - 1].status == ci_copy_self)
{ {
//WriteTrace(TraceRDP, TraceDebug, "Wrong Texrect. texaddr: %08lx, cimg: %08lx, cimg_end: %08lx", rdp.timg.addr, rdp.maincimg[1], rdp.maincimg[1]+rdp.ci_width*rdp.ci_height*rdp.ci_size); //WriteTrace(TraceRDP, TraceDebug, "Wrong Texrect. texaddr: %08lx, cimg: %08lx, cimg_end: %08lx", rdp.timg.addr, rdp.maincimg[1], rdp.maincimg[1]+rdp.ci_width*rdp.ci_height*rdp.ci_size);
@ -1916,8 +1921,10 @@ static void rdp_loadblock()
tile, ul_s, ul_t, lr_s, tile, ul_s, ul_t, lr_s,
dxt, _dxt); dxt, _dxt);
if (fb_hwfbe_enabled) if (g_settings->fb_hwfbe_enabled())
{
setTBufTex(rdp.tiles[tile].t_mem, cnt); setTBufTex(rdp.tiles[tile].t_mem, cnt);
}
} }
static inline void loadTile(uint32_t *src, uint32_t *dst, int width, int height, int line, int off, uint32_t *end) static inline void loadTile(uint32_t *src, uint32_t *dst, int width, int height, int line, int off, uint32_t *end)
@ -2101,11 +2108,16 @@ static void rdp_loadtile()
info.tile_ul_t = ul_t; info.tile_ul_t = ul_t;
info.tile_width = (rdp.tiles[tile].mask_s ? minval((uint16_t)width, 1 << rdp.tiles[tile].mask_s) : (uint16_t)width); info.tile_width = (rdp.tiles[tile].mask_s ? minval((uint16_t)width, 1 << rdp.tiles[tile].mask_s) : (uint16_t)width);
info.tile_height = (rdp.tiles[tile].mask_t ? minval((uint16_t)height, 1 << rdp.tiles[tile].mask_t) : (uint16_t)height); info.tile_height = (rdp.tiles[tile].mask_t ? minval((uint16_t)height, 1 << rdp.tiles[tile].mask_t) : (uint16_t)height);
if (g_settings->hacks&hack_MK64) { if (g_settings->hacks&hack_MK64)
{
if (info.tile_width % 2) if (info.tile_width % 2)
{
info.tile_width--; info.tile_width--;
}
if (info.tile_height % 2) if (info.tile_height % 2)
{
info.tile_height--; info.tile_height--;
}
} }
info.tex_width = rdp.timg.width; info.tex_width = rdp.timg.width;
info.tex_size = rdp.timg.size; info.tex_size = rdp.timg.size;
@ -2137,8 +2149,10 @@ static void rdp_loadtile()
WriteTrace(TraceRDP, TraceDebug, "loadtile: tile: %d, ul_s: %d, ul_t: %d, lr_s: %d, lr_t: %d", tile, WriteTrace(TraceRDP, TraceDebug, "loadtile: tile: %d, ul_s: %d, ul_t: %d, lr_s: %d, lr_t: %d", tile,
ul_s, ul_t, lr_s, lr_t); ul_s, ul_t, lr_s, lr_t);
if (fb_hwfbe_enabled) if (g_settings->fb_hwfbe_enabled())
{
setTBufTex(rdp.tiles[tile].t_mem, rdp.tiles[tile].line*height); setTBufTex(rdp.tiles[tile].t_mem, rdp.tiles[tile].line*height);
}
} }
static void rdp_settile() static void rdp_settile()
@ -2173,7 +2187,7 @@ static void rdp_settile()
tile->t_mem, tile->palette, str_cm[(tile->clamp_t << 1) | tile->mirror_t], tile->mask_t, tile->t_mem, tile->palette, str_cm[(tile->clamp_t << 1) | tile->mirror_t], tile->mask_t,
tile->shift_t, str_cm[(tile->clamp_s << 1) | tile->mirror_s], tile->mask_s, tile->shift_s); tile->shift_t, str_cm[(tile->clamp_s << 1) | tile->mirror_s], tile->mask_s, tile->shift_s);
if (fb_hwfbe_enabled && rdp.last_tile < rdp.cur_tile + 2) if (g_settings->fb_hwfbe_enabled() && rdp.last_tile < rdp.cur_tile + 2)
{ {
for (int i = 0; i < 2; i++) for (int i = 0; i < 2; i++)
{ {
@ -2214,7 +2228,7 @@ static void rdp_fillrect()
return; return;
} }
int pd_multiplayer = (g_settings->ucode == ucode_PerfectDark) && (rdp.cycle_mode == 3) && (rdp.fill_color == 0xFFFCFFFC); int pd_multiplayer = (g_settings->ucode == ucode_PerfectDark) && (rdp.cycle_mode == 3) && (rdp.fill_color == 0xFFFCFFFC);
if ((rdp.cimg == rdp.zimg) || (fb_emulation_enabled && rdp.ci_count > 0 && rdp.frame_buffers[rdp.ci_count - 1].status == ci_zimg) || pd_multiplayer) if ((rdp.cimg == rdp.zimg) || (g_settings->fb_emulation_enabled() && rdp.ci_count > 0 && rdp.frame_buffers[rdp.ci_count - 1].status == ci_zimg) || pd_multiplayer)
{ {
WriteTrace(TraceRDP, TraceDebug, "Fillrect - cleared the depth buffer"); WriteTrace(TraceRDP, TraceDebug, "Fillrect - cleared the depth buffer");
if (!(g_settings->hacks&hack_Hyperbike) || rdp.ci_width > 64) //do not clear main depth buffer for aux depth buffers if (!(g_settings->hacks&hack_Hyperbike) || rdp.ci_width > 64) //do not clear main depth buffer for aux depth buffers
@ -2524,7 +2538,7 @@ static void rdp_settextureimage()
} }
} }
if (fb_hwfbe_enabled) //search this texture among drawn texture buffers if (g_settings->fb_hwfbe_enabled()) //search this texture among drawn texture buffers
FindTextureBuffer(rdp.timg.addr, rdp.timg.width); FindTextureBuffer(rdp.timg.addr, rdp.timg.width);
WriteTrace(TraceRDP, TraceDebug, "settextureimage: format: %s, size: %s, width: %d, addr: %08lx", WriteTrace(TraceRDP, TraceDebug, "settextureimage: format: %s, size: %s, width: %d, addr: %08lx",
@ -2562,7 +2576,7 @@ static uint32_t swapped_addr = 0;
static void rdp_setcolorimage() static void rdp_setcolorimage()
{ {
if (fb_emulation_enabled && (rdp.num_of_ci < NUMTEXBUF)) if (g_settings->fb_emulation_enabled() && (rdp.num_of_ci < NUMTEXBUF))
{ {
COLOR_IMAGE & cur_fb = rdp.frame_buffers[rdp.ci_count]; COLOR_IMAGE & cur_fb = rdp.frame_buffers[rdp.ci_count];
COLOR_IMAGE & prev_fb = rdp.frame_buffers[rdp.ci_count ? rdp.ci_count - 1 : 0]; COLOR_IMAGE & prev_fb = rdp.frame_buffers[rdp.ci_count ? rdp.ci_count - 1 : 0];
@ -2583,7 +2597,7 @@ static void rdp_setcolorimage()
rdp.scale_x = sx; rdp.scale_x = sx;
rdp.scale_y = sy; rdp.scale_y = sy;
} }
if (!fb_hwfbe_enabled) if (!g_settings->fb_hwfbe_enabled())
{ {
if ((rdp.num_of_ci > 1) && if ((rdp.num_of_ci > 1) &&
(next_fb.status == ci_aux) && (next_fb.status == ci_aux) &&
@ -2596,14 +2610,14 @@ static void rdp_setcolorimage()
else if (rdp.copy_ci_index && (g_settings->hacks&hack_PMario)) //tidal wave else if (rdp.copy_ci_index && (g_settings->hacks&hack_PMario)) //tidal wave
OpenTextureBuffer(rdp.frame_buffers[rdp.main_ci_index]); OpenTextureBuffer(rdp.frame_buffers[rdp.main_ci_index]);
} }
else if (!rdp.motionblur && fb_hwfbe_enabled && !SwapOK && (rdp.ci_count <= rdp.copy_ci_index)) else if (!rdp.motionblur && g_settings->fb_hwfbe_enabled() && !SwapOK && (rdp.ci_count <= rdp.copy_ci_index))
{ {
if (next_fb.status == ci_aux_copy) if (next_fb.status == ci_aux_copy)
OpenTextureBuffer(rdp.frame_buffers[rdp.main_ci_index]); OpenTextureBuffer(rdp.frame_buffers[rdp.main_ci_index]);
else else
OpenTextureBuffer(rdp.frame_buffers[rdp.copy_ci_index]); OpenTextureBuffer(rdp.frame_buffers[rdp.copy_ci_index]);
} }
else if (fb_hwfbe_enabled && prev_fb.status == ci_aux) else if (g_settings->fb_hwfbe_enabled() && prev_fb.status == ci_aux)
{ {
if (rdp.motionblur) if (rdp.motionblur)
{ {
@ -2625,7 +2639,7 @@ static void rdp_setcolorimage()
break; break;
case ci_copy: case ci_copy:
{ {
if (!rdp.motionblur || (g_settings->frame_buffer&fb_motionblur)) if (!rdp.motionblur || g_settings->fb_motionblur_enabled())
{ {
if (cur_fb.width == rdp.ci_width) if (cur_fb.width == rdp.ci_width)
{ {
@ -2673,13 +2687,13 @@ static void rdp_setcolorimage()
CopyFrameBuffer(); CopyFrameBuffer();
rdp.fb_drawn = TRUE; rdp.fb_drawn = TRUE;
} }
if (fb_hwfbe_enabled) if (g_settings->fb_hwfbe_enabled())
OpenTextureBuffer(cur_fb); OpenTextureBuffer(cur_fb);
} }
break; break;
case ci_old_copy: case ci_old_copy:
{ {
if (!rdp.motionblur || (g_settings->frame_buffer&fb_motionblur)) if (!rdp.motionblur || g_settings->fb_motionblur_enabled())
{ {
if (cur_fb.width == rdp.ci_width) if (cur_fb.width == rdp.ci_width)
{ {
@ -2704,12 +2718,12 @@ static void rdp_setcolorimage()
*/ */
case ci_aux: case ci_aux:
{ {
if (!fb_hwfbe_enabled && cur_fb.format != 0) if (!g_settings->fb_hwfbe_enabled() && cur_fb.format != 0)
rdp.skip_drawing = TRUE; rdp.skip_drawing = TRUE;
else else
{ {
rdp.skip_drawing = FALSE; rdp.skip_drawing = FALSE;
if (fb_hwfbe_enabled && OpenTextureBuffer(cur_fb)) if (g_settings->fb_hwfbe_enabled() && OpenTextureBuffer(cur_fb))
; ;
else else
{ {
@ -2723,7 +2737,7 @@ static void rdp_setcolorimage()
rdp.scale_y = 1.0f; rdp.scale_y = 1.0f;
// } // }
} }
else if (!fb_hwfbe_enabled && (prev_fb.status == ci_main) && else if (!g_settings->fb_hwfbe_enabled() && (prev_fb.status == ci_main) &&
(prev_fb.width == cur_fb.width)) // for Pokemon Stadium (prev_fb.width == cur_fb.width)) // for Pokemon Stadium
CopyFrameBuffer(); CopyFrameBuffer();
} }
@ -2734,7 +2748,7 @@ static void rdp_setcolorimage()
case ci_zimg: case ci_zimg:
if (g_settings->ucode != ucode_PerfectDark) if (g_settings->ucode != ucode_PerfectDark)
{ {
if (fb_hwfbe_enabled && !rdp.copy_ci_index && (rdp.copy_zi_index || (g_settings->hacks&hack_BAR))) if (g_settings->fb_hwfbe_enabled() && !rdp.copy_ci_index && (rdp.copy_zi_index || (g_settings->hacks&hack_BAR)))
{ {
GrLOD_t LOD = GR_LOD_LOG2_1024; GrLOD_t LOD = GR_LOD_LOG2_1024;
if (g_settings->scr_res_x > 1024) if (g_settings->scr_res_x > 1024)
@ -2750,7 +2764,7 @@ static void rdp_setcolorimage()
case ci_zcopy: case ci_zcopy:
if (g_settings->ucode != ucode_PerfectDark) if (g_settings->ucode != ucode_PerfectDark)
{ {
if (fb_hwfbe_enabled && !rdp.copy_ci_index && rdp.copy_zi_index == rdp.ci_count) if (g_settings->fb_hwfbe_enabled() && !rdp.copy_ci_index && rdp.copy_zi_index == rdp.ci_count)
{ {
CopyDepthBuffer(); CopyDepthBuffer();
} }
@ -2761,8 +2775,10 @@ static void rdp_setcolorimage()
rdp.skip_drawing = TRUE; rdp.skip_drawing = TRUE;
break; break;
case ci_copy_self: case ci_copy_self:
if (fb_hwfbe_enabled && (rdp.ci_count <= rdp.copy_ci_index) && (!SwapOK || g_settings->swapmode == 2)) if (g_settings->fb_hwfbe_enabled() && (rdp.ci_count <= rdp.copy_ci_index) && (!SwapOK || g_settings->swapmode == 2))
{
OpenTextureBuffer(cur_fb); OpenTextureBuffer(cur_fb);
}
rdp.skip_drawing = FALSE; rdp.skip_drawing = FALSE;
break; break;
default: default:
@ -2771,19 +2787,19 @@ static void rdp_setcolorimage()
if ((rdp.ci_count > 0) && (prev_fb.status >= ci_aux)) //for Pokemon Stadium if ((rdp.ci_count > 0) && (prev_fb.status >= ci_aux)) //for Pokemon Stadium
{ {
if (!fb_hwfbe_enabled && prev_fb.format == 0) if (!g_settings->fb_hwfbe_enabled() && prev_fb.format == 0)
CopyFrameBuffer(); CopyFrameBuffer();
else if ((g_settings->hacks&hack_Knockout) && prev_fb.width < 100) else if ((g_settings->hacks&hack_Knockout) && prev_fb.width < 100)
CopyFrameBuffer(GR_BUFFER_TEXTUREBUFFER_EXT); CopyFrameBuffer(GR_BUFFER_TEXTUREBUFFER_EXT);
} }
if (!fb_hwfbe_enabled && cur_fb.status == ci_copy) if (!g_settings->fb_hwfbe_enabled() && cur_fb.status == ci_copy)
{ {
if (!rdp.motionblur && (rdp.num_of_ci > rdp.ci_count + 1) && (next_fb.status != ci_aux)) if (!rdp.motionblur && (rdp.num_of_ci > rdp.ci_count + 1) && (next_fb.status != ci_aux))
{ {
RestoreScale(); RestoreScale();
} }
} }
if (!fb_hwfbe_enabled && cur_fb.status == ci_aux) if (!g_settings->fb_hwfbe_enabled() && cur_fb.status == ci_aux)
{ {
if (cur_fb.format == 0) if (cur_fb.format == 0)
{ {
@ -2840,10 +2856,10 @@ static void rdp_setcolorimage()
WriteTrace(TraceRDP, TraceDebug, "return to original scale"); WriteTrace(TraceRDP, TraceDebug, "return to original scale");
rdp.scale_x = rdp.scale_x_bak; rdp.scale_x = rdp.scale_x_bak;
rdp.scale_y = rdp.scale_y_bak; rdp.scale_y = rdp.scale_y_bak;
if (fb_hwfbe_enabled && !rdp.read_whole_frame) if (g_settings->fb_hwfbe_enabled() && !rdp.read_whole_frame)
CloseTextureBuffer(); CloseTextureBuffer();
} }
if (fb_hwfbe_enabled && !rdp.read_whole_frame && (prev_fb.status >= ci_aux) && (rdp.ci_count > rdp.copy_ci_index)) if (g_settings->fb_hwfbe_enabled() && !rdp.read_whole_frame && (prev_fb.status >= ci_aux) && (rdp.ci_count > rdp.copy_ci_index))
CloseTextureBuffer(); CloseTextureBuffer();
} }
rdp.ci_status = cur_fb.status; rdp.ci_status = cur_fb.status;
@ -2853,7 +2869,7 @@ static void rdp_setcolorimage()
rdp.ocimg = rdp.cimg; rdp.ocimg = rdp.cimg;
rdp.cimg = segoffset(rdp.cmd1) & BMASK; rdp.cimg = segoffset(rdp.cmd1) & BMASK;
rdp.ci_width = (rdp.cmd0 & 0xFFF) + 1; rdp.ci_width = (rdp.cmd0 & 0xFFF) + 1;
if (fb_emulation_enabled && rdp.ci_count > 0) if (g_settings->fb_emulation_enabled() && rdp.ci_count > 0)
rdp.ci_height = rdp.frame_buffers[rdp.ci_count - 1].height; rdp.ci_height = rdp.frame_buffers[rdp.ci_count - 1].height;
else if (rdp.ci_width == 32) else if (rdp.ci_width == 32)
rdp.ci_height = 32; rdp.ci_height = 32;
@ -2875,7 +2891,7 @@ static void rdp_setcolorimage()
{ {
if (!rdp.cur_image) if (!rdp.cur_image)
{ {
if (fb_hwfbe_enabled && rdp.ci_width <= 64 && rdp.ci_count > 0) if (g_settings->fb_hwfbe_enabled() && rdp.ci_width <= 64 && rdp.ci_count > 0)
OpenTextureBuffer(rdp.frame_buffers[rdp.ci_count - 1]); OpenTextureBuffer(rdp.frame_buffers[rdp.ci_count - 1]);
else if (format > 2) else if (format > 2)
rdp.skip_drawing = TRUE; rdp.skip_drawing = TRUE;
@ -2884,7 +2900,7 @@ static void rdp_setcolorimage()
} }
else else
{ {
if (!fb_emulation_enabled) if (!g_settings->fb_emulation_enabled())
rdp.skip_drawing = FALSE; rdp.skip_drawing = FALSE;
} }
@ -2897,16 +2913,20 @@ static void rdp_setcolorimage()
int viSwapOK = ((g_settings->swapmode == 2) && (rdp.vi_org_reg == *gfx.VI_ORIGIN_REG)) ? FALSE : TRUE; int viSwapOK = ((g_settings->swapmode == 2) && (rdp.vi_org_reg == *gfx.VI_ORIGIN_REG)) ? FALSE : TRUE;
if ((rdp.zimg != rdp.cimg) && (rdp.ocimg != rdp.cimg) && SwapOK && viSwapOK && !rdp.cur_image) if ((rdp.zimg != rdp.cimg) && (rdp.ocimg != rdp.cimg) && SwapOK && viSwapOK && !rdp.cur_image)
{ {
if (fb_emulation_enabled) if (g_settings->fb_emulation_enabled())
{
rdp.maincimg[0] = rdp.frame_buffers[rdp.main_ci_index]; rdp.maincimg[0] = rdp.frame_buffers[rdp.main_ci_index];
}
else else
{
rdp.maincimg[0].addr = rdp.cimg; rdp.maincimg[0].addr = rdp.cimg;
}
rdp.last_drawn_ci_addr = (g_settings->swapmode == 2) ? swapped_addr : rdp.maincimg[0].addr; rdp.last_drawn_ci_addr = (g_settings->swapmode == 2) ? swapped_addr : rdp.maincimg[0].addr;
swapped_addr = rdp.cimg; swapped_addr = rdp.cimg;
newSwapBuffers(); newSwapBuffers();
rdp.vi_org_reg = *gfx.VI_ORIGIN_REG; rdp.vi_org_reg = *gfx.VI_ORIGIN_REG;
SwapOK = FALSE; SwapOK = FALSE;
if (fb_hwfbe_enabled) if (g_settings->fb_hwfbe_enabled())
{ {
if (rdp.copy_ci_index && (rdp.frame_buffers[rdp.ci_count - 1].status != ci_zimg)) if (rdp.copy_ci_index && (rdp.frame_buffers[rdp.ci_count - 1].status != ci_zimg))
{ {
@ -3070,7 +3090,7 @@ EXPORT void CALL FBRead(uint32_t addr)
{ {
uint32_t cimg = rdp.cimg; uint32_t cimg = rdp.cimg;
rdp.cimg = rdp.maincimg[1].addr; rdp.cimg = rdp.maincimg[1].addr;
if (fb_emulation_enabled) if (g_settings->fb_emulation_enabled())
{ {
rdp.ci_width = rdp.maincimg[1].width; rdp.ci_width = rdp.maincimg[1].width;
rdp.ci_count = 0; rdp.ci_count = 0;
@ -3171,11 +3191,13 @@ EXPORT void CALL FBGetFrameBufferInfo(void *p)
WriteTrace(TraceGlide64, TraceDebug, "-"); WriteTrace(TraceGlide64, TraceDebug, "-");
FrameBufferInfo * pinfo = (FrameBufferInfo *)p; FrameBufferInfo * pinfo = (FrameBufferInfo *)p;
memset(pinfo, 0, sizeof(FrameBufferInfo) * 6); memset(pinfo, 0, sizeof(FrameBufferInfo) * 6);
if (!(g_settings->frame_buffer&fb_get_info)) if (!g_settings->fb_get_info_enabled())
{
return; return;
}
WriteTrace(TraceRDP, TraceDebug, "FBGetFrameBufferInfo ()"); WriteTrace(TraceRDP, TraceDebug, "FBGetFrameBufferInfo ()");
//*
if (fb_emulation_enabled) if (g_settings->fb_emulation_enabled())
{ {
pinfo[0].addr = rdp.maincimg[1].addr; pinfo[0].addr = rdp.maincimg[1].addr;
pinfo[0].size = rdp.maincimg[1].size; pinfo[0].size = rdp.maincimg[1].size;
@ -3338,10 +3360,10 @@ void DetectFrameBufferUsage()
rdp.num_of_ci = rdp.ci_count; rdp.num_of_ci = rdp.ci_count;
if (rdp.read_previous_ci && previous_ci_was_read) if (rdp.read_previous_ci && previous_ci_was_read)
{ {
if (!fb_hwfbe_enabled || !rdp.copy_ci_index) if (!g_settings->fb_hwfbe_enabled() || !rdp.copy_ci_index)
rdp.motionblur = TRUE; rdp.motionblur = TRUE;
} }
if (rdp.motionblur || fb_hwfbe_enabled || (rdp.frame_buffers[rdp.copy_ci_index].status == ci_aux_copy)) if (rdp.motionblur || g_settings->fb_hwfbe_enabled() || (rdp.frame_buffers[rdp.copy_ci_index].status == ci_aux_copy))
{ {
rdp.scale_x = rdp.scale_x_bak; rdp.scale_x = rdp.scale_x_bak;
rdp.scale_y = rdp.scale_y_bak; rdp.scale_y = rdp.scale_y_bak;
@ -3351,7 +3373,7 @@ void DetectFrameBufferUsage()
rdp.read_whole_frame = TRUE; rdp.read_whole_frame = TRUE;
if (rdp.read_whole_frame) if (rdp.read_whole_frame)
{ {
if (fb_hwfbe_enabled) if (g_settings->fb_hwfbe_enabled())
{ {
if (rdp.read_previous_ci && !previous_ci_was_read && (g_settings->swapmode != 2) && (g_settings->ucode != ucode_PerfectDark)) if (rdp.read_previous_ci && !previous_ci_was_read && (g_settings->swapmode != 2) && (g_settings->ucode != ucode_PerfectDark))
{ {
@ -3371,10 +3393,14 @@ void DetectFrameBufferUsage()
{ {
if (rdp.motionblur) if (rdp.motionblur)
{ {
if (g_settings->frame_buffer&fb_motionblur) if (g_settings->fb_motionblur_enabled())
{
CopyFrameBuffer(); CopyFrameBuffer();
}
else else
{
memset(gfx.RDRAM + rdp.cimg, 0, rdp.ci_width*rdp.ci_height*rdp.ci_size); memset(gfx.RDRAM + rdp.cimg, 0, rdp.ci_width*rdp.ci_height*rdp.ci_size);
}
} }
else //if (ci_width == rdp.frame_buffers[rdp.main_ci_index].width) else //if (ci_width == rdp.frame_buffers[rdp.main_ci_index].width)
{ {
@ -3396,7 +3422,7 @@ void DetectFrameBufferUsage()
} }
} }
if (fb_hwfbe_enabled) if (g_settings->fb_hwfbe_enabled())
{ {
for (i = 0; i < voodoo.num_tmu; i++) for (i = 0; i < voodoo.num_tmu; i++)
{ {

View File

@ -246,12 +246,12 @@ void DrawHiresDepthImage(const DRAWIMAGE & d)
void DrawDepthImage(const DRAWIMAGE & d) void DrawDepthImage(const DRAWIMAGE & d)
{ {
if (!fb_depth_render_enabled) if (!g_settings->fb_depth_render_enabled())
return; return;
if (d.imageH > d.imageW) if (d.imageH > d.imageW)
return; return;
WriteTrace(TraceRDP, TraceDebug, "Depth image write"); WriteTrace(TraceRDP, TraceDebug, "Depth image write");
if (fb_hwfbe_enabled) if (g_settings->fb_hwfbe_enabled())
{ {
DrawHiresDepthImage(d); DrawHiresDepthImage(d);
return; return;
@ -728,7 +728,7 @@ static void uc6_bg(bool bg_1cyc)
DRAWIMAGE d; DRAWIMAGE d;
uc6_read_background_data(d, bg_1cyc); uc6_read_background_data(d, bg_1cyc);
if (fb_hwfbe_enabled && FindTextureBuffer(d.imagePtr, d.imageW)) if (g_settings->fb_hwfbe_enabled() && FindTextureBuffer(d.imagePtr, d.imageW))
{ {
DrawHiresImage(d); DrawHiresImage(d);
return; return;

View File

@ -222,7 +222,7 @@ static void fb_settextureimage()
rdp.scale_y = 1.0f; rdp.scale_y = 1.0f;
} }
} }
else if (!(g_settings->frame_buffer & fb_ignore_aux_copy) && cur_fb.width < rdp.frame_buffers[rdp.main_ci_index].width) else if (!g_settings->fb_ignore_aux_copy_enabled() && cur_fb.width < rdp.frame_buffers[rdp.main_ci_index].width)
{ {
rdp.copy_ci_index = rdp.ci_count - 1; rdp.copy_ci_index = rdp.ci_count - 1;
cur_fb.status = ci_aux_copy; cur_fb.status = ci_aux_copy;
@ -268,7 +268,7 @@ static void fb_settextureimage()
WriteTrace(TraceRDP, TraceDebug, "read_previous_ci = TRUE"); WriteTrace(TraceRDP, TraceDebug, "read_previous_ci = TRUE");
} }
} }
else if (fb_hwfbe_enabled && (cur_fb.status == ci_main)) else if (g_settings->fb_hwfbe_enabled() && (cur_fb.status == ci_main))
{ {
if ((addr >= rdp.main_ci) && (addr < rdp.main_ci_end)) //addr within main frame buffer if ((addr >= rdp.main_ci) && (addr < rdp.main_ci_end)) //addr within main frame buffer
{ {
@ -407,7 +407,7 @@ static void fb_setcolorimage()
} }
if (rdp.ci_count > 0 && rdp.frame_buffers[rdp.ci_count - 1].status == ci_unknown) //status of previous fb was not changed - it is useless if (rdp.ci_count > 0 && rdp.frame_buffers[rdp.ci_count - 1].status == ci_unknown) //status of previous fb was not changed - it is useless
{ {
if (fb_hwfbe_enabled && !(g_settings->frame_buffer & fb_useless_is_useless)) if (g_settings->fb_hwfbe_enabled() && !g_settings->fb_useless_is_useless_enabled())
{ {
rdp.frame_buffers[rdp.ci_count - 1].status = ci_aux; rdp.frame_buffers[rdp.ci_count - 1].status = ci_aux;
rdp.frame_buffers[rdp.ci_count - 1].changed = 0; rdp.frame_buffers[rdp.ci_count - 1].changed = 0;

View File

@ -138,7 +138,6 @@ FullScreenResolutions::~FullScreenResolutions()
void FullScreenResolutions::init() void FullScreenResolutions::init()
{ {
WriteTrace(TraceGlitch, TraceDebug, "executing");
#ifdef _WIN32 #ifdef _WIN32
currentResolutions = -1; currentResolutions = -1;
DEVMODE enumMode , currentMode; DEVMODE enumMode , currentMode;