From 88e5009afa905d24ef86e326b7d075bdd102b6a3 Mon Sep 17 00:00:00 2001 From: zilmar Date: Mon, 30 Jan 2017 05:05:06 +1100 Subject: [PATCH] [Glide64] Get swap mode to use an enum --- Source/Glide64/Config.cpp | 10 +++++----- Source/Glide64/Main.cpp | 10 +++++++++- Source/Glide64/Settings.cpp | 17 +++++++++++++---- Source/Glide64/Settings.h | 11 ++++++++++- Source/Glide64/rdp.cpp | 30 +++++++++++++++++------------- Source/Glide64/ucodeFB.h | 2 +- 6 files changed, 55 insertions(+), 25 deletions(-) diff --git a/Source/Glide64/Config.cpp b/Source/Glide64/Config.cpp index f64557829..a45bbab18 100644 --- a/Source/Glide64/Config.cpp +++ b/Source/Glide64/Config.cpp @@ -491,10 +491,10 @@ public: TTSetTxt(IDC_TXT_BUFFER_SWAPPING, tooltip.c_str()); TTSetTxt(IDC_CMB_BUFFER_SWAPPING, tooltip.c_str()); m_cmbBufferSwap.Attach(GetDlgItem(IDC_CMB_BUFFER_SWAPPING)); - m_cmbBufferSwap.SetItemData(m_cmbBufferSwap.AddString("Old"), 0); - m_cmbBufferSwap.SetItemData(m_cmbBufferSwap.AddString("New"), 1); - m_cmbBufferSwap.SetItemData(m_cmbBufferSwap.AddString("Hybrid"), 2); - SetComboBoxIndex(m_cmbBufferSwap, g_settings->swapmode); + m_cmbBufferSwap.SetItemData(m_cmbBufferSwap.AddString("Old"), CSettings::SwapMode_Old); + m_cmbBufferSwap.SetItemData(m_cmbBufferSwap.AddString("New"), CSettings::SwapMode_New); + m_cmbBufferSwap.SetItemData(m_cmbBufferSwap.AddString("Hybrid"), CSettings::SwapMode_Hybrid); + SetComboBoxIndex(m_cmbBufferSwap, g_settings->swapmode()); tooltip = "Per-pixel level-of-detail calculation:\n\nN64 uses special mechanism for mip-mapping, which nearly impossible to reproduce correctly on PC hardware.\nThis option enables approximate emulation of this feature.\nFor example, it is required for the Peach/Bowser portrait's transition in Super Mario 64.\nThere are 3 modes:\n\n* off - LOD is not calculated\n* fast - fast imprecise LOD calculation.\n* precise - most precise LOD calculation possible, but more slow.\n\n[Recommended: your preference]"; TTSetTxt(IDC_TXT_LOD_CALC, tooltip.c_str()); @@ -562,7 +562,7 @@ public: g_settings->SetFiltering((CSettings::Filtering_t)m_cmbFiltering.GetItemData(m_cmbFiltering.GetCurSel())); g_settings->SetAspectmode((CSettings::AspectMode_t)m_cmbAspect.GetItemData(m_cmbAspect.GetCurSel())); - g_settings->swapmode = m_cmbBufferSwap.GetItemData(m_cmbBufferSwap.GetCurSel()); + g_settings->SetSwapMode((CSettings::SwapMode_t)m_cmbBufferSwap.GetItemData(m_cmbBufferSwap.GetCurSel())); g_settings->fog = m_cbxFog.GetCheck() == BST_CHECKED; g_settings->buff_clear = m_cbxBuffer.GetCheck() == BST_CHECKED; g_settings->lodmode = m_cmbLOD.GetItemData(m_cmbLOD.GetCurSel()); diff --git a/Source/Glide64/Main.cpp b/Source/Glide64/Main.cpp index 7be024051..9ec469b3c 100644 --- a/Source/Glide64/Main.cpp +++ b/Source/Glide64/Main.cpp @@ -1422,17 +1422,23 @@ void CALL UpdateScreen(void) } return; } - if (g_settings->swapmode == 0) + if (g_settings->swapmode() == CSettings::SwapMode_Old) + { newSwapBuffers(); + } } static void DrawWholeFrameBufferToScreen() { static uint32_t toScreenCI = 0; if (rdp.ci_width < 200) + { return; + } if (rdp.cimg == toScreenCI) + { return; + } toScreenCI = rdp.cimg; FB_TO_SCREEN_INFO fb_info; fb_info.addr = rdp.cimg; @@ -1440,7 +1446,9 @@ static void DrawWholeFrameBufferToScreen() fb_info.width = rdp.ci_width; fb_info.height = rdp.ci_height; if (fb_info.height == 0) + { return; + } fb_info.ul_x = 0; fb_info.lr_x = rdp.ci_width - 1; fb_info.ul_y = 0; diff --git a/Source/Glide64/Settings.cpp b/Source/Glide64/Settings.cpp index 159188905..3e0bac4ad 100644 --- a/Source/Glide64/Settings.cpp +++ b/Source/Glide64/Settings.cpp @@ -25,7 +25,7 @@ vsync(0), fog(0), buff_clear(0), -swapmode(0), + m_swapmode(SwapMode_Old), lodmode(0), m_aspectmode(Aspect_4x3), m_frame_buffer(0), @@ -152,7 +152,7 @@ void CSettings::RegisterSettings(void) general_setting(Set_lodmode_default, "lodmode", 0); general_setting(Set_fog_default, "fog", 1); general_setting(Set_buff_clear_default, "buff_clear", 1); - general_setting(Set_swapmode_default, "swapmode", 1); + general_setting(Set_swapmode_default, "swapmode", SwapMode_New); general_setting(Set_aspect_default, "aspect", Aspect_4x3); general_setting(Set_fb_smart_default, "fb_smart", true); @@ -224,6 +224,15 @@ void CSettings::SetFiltering(Filtering_t value) } } +void CSettings::SetSwapMode(SwapMode_t value) +{ + if (value != m_swapmode) + { + m_swapmode = value; + m_dirty = true; + } +} + void CSettings::UpdateFrameBufferBits(uint32_t BitsToAdd, uint32_t BitsToRemove) { uint32_t frame_buffer_original = m_frame_buffer; @@ -494,7 +503,6 @@ void CSettings::ReadGameSettings(const char * name) g_settings->fog = GetSetting(g_romopen ? Set_fog : Set_fog_default); 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); g_settings->lodmode = GetSetting(g_romopen ? Set_lodmode : Set_lodmode_default); #ifdef _WIN32 g_settings->res_data = GetSetting(Set_Resolution); @@ -554,6 +562,7 @@ void CSettings::ReadGameSettings(const char * name) g_settings->UpdateFrameBufferBits(fb_add_bits, fb_remove_bits); SetFiltering((Filtering_t)GetSetting(g_romopen ? Set_filtering : Set_filtering_default)); + SetSwapMode((SwapMode_t)GetSetting(g_romopen ? Set_swapmode : Set_swapmode_default)); SetAspectmode((AspectMode_t)GetSetting(g_romopen ? Set_aspect : Set_aspect_default)); g_settings->flame_corona = g_settings->hacks(hack_Zelda) && !fb_depth_render_enabled(); } @@ -603,7 +612,7 @@ void CSettings::WriteSettings(void) SetSetting(g_romopen ? Set_filtering : Set_filtering_default, filtering()); SetSetting(g_romopen ? Set_fog : Set_fog_default, g_settings->fog); SetSetting(g_romopen ? Set_buff_clear : Set_buff_clear_default, g_settings->buff_clear); - SetSetting(g_romopen ? Set_swapmode : Set_swapmode_default, g_settings->swapmode); + SetSetting(g_romopen ? Set_swapmode : Set_swapmode_default, g_settings->swapmode()); SetSetting(g_romopen ? Set_lodmode : Set_lodmode_default, g_settings->lodmode); SetSetting(g_romopen ? Set_aspect : Set_aspect_default, m_aspectmode); diff --git a/Source/Glide64/Settings.h b/Source/Glide64/Settings.h index f94fd9278..6bacdc215 100644 --- a/Source/Glide64/Settings.h +++ b/Source/Glide64/Settings.h @@ -83,6 +83,13 @@ public: Filter_ForcePointSampled = 2, }; + enum SwapMode_t + { + SwapMode_Old = 0, + SwapMode_New = 1, + SwapMode_Hybrid = 2, + }; + uint32_t res_x, scr_res_x; uint32_t res_y, scr_res_y; #ifndef ANDROID @@ -96,7 +103,6 @@ public: int fog; int buff_clear; - int swapmode; int lodmode; @@ -128,6 +134,7 @@ public: inline ScreenRotate_t rotate(void) const { return m_rotate; } inline Filtering_t filtering(void) const { return m_filtering; } + inline SwapMode_t swapmode(void) const { return m_swapmode; } inline AspectMode_t aspectmode(void) const { return m_aspectmode; } //Texture filtering options std::string texture_dir; @@ -194,6 +201,7 @@ public: int wrpAnisotropic; void SetAspectmode(AspectMode_t value); void SetFiltering(Filtering_t value); + void SetSwapMode(SwapMode_t value); void UpdateFrameBufferBits(uint32_t BitsToAdd, uint32_t BitsToRemove); void ReadGameSettings(const char * name); @@ -211,6 +219,7 @@ private: uint32_t m_frame_buffer; ScreenRotate_t m_rotate; Filtering_t m_filtering; + SwapMode_t m_swapmode; hacks_t m_hacks; }; diff --git a/Source/Glide64/rdp.cpp b/Source/Glide64/rdp.cpp index 457b93f8e..25741125b 100644 --- a/Source/Glide64/rdp.cpp +++ b/Source/Glide64/rdp.cpp @@ -606,8 +606,10 @@ EXPORT void CALL ProcessDList(void) GoToFullScreen(); //* Set states *// - if (g_settings->swapmode > 0) + if (g_settings->swapmode() != CSettings::SwapMode_Old) + { SwapOK = TRUE; + } rdp.updatescreen = 1; rdp.tri_n = 0; // 0 triangles so far this frame @@ -697,11 +699,7 @@ EXPORT void CALL ProcessDList(void) // cmd2 and cmd3 are filled only when needed, by the function that needs them // Output the address before the command -#ifdef LOG_COMMANDS WriteTrace(TraceRDP, TraceDebug, "%08lx (c0:%08lx, c1:%08lx): ", a, rdp.cmd0, rdp.cmd1); -#else - WriteTrace(TraceRDP, TraceDebug, "%08lx: ", a); -#endif // Go to the next instruction rdp.pc[rdp.pc_i] = (a + 8) & BMASK; @@ -2766,7 +2764,7 @@ static void rdp_setcolorimage() rdp.skip_drawing = TRUE; break; case ci_copy_self: - if (g_settings->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() == CSettings::SwapMode_Hybrid)) { OpenTextureBuffer(cur_fb); } @@ -2896,12 +2894,14 @@ static void rdp_setcolorimage() } CI_SET = TRUE; - if (g_settings->swapmode > 0) + if (g_settings->swapmode() != CSettings::SwapMode_Old) { if (rdp.zimg == rdp.cimg) + { rdp.updatescreen = 1; + } - int viSwapOK = ((g_settings->swapmode == 2) && (rdp.vi_org_reg == *gfx.VI_ORIGIN_REG)) ? FALSE : TRUE; + int viSwapOK = ((g_settings->swapmode() == CSettings::SwapMode_Hybrid) && (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 (g_settings->fb_emulation_enabled()) @@ -2912,7 +2912,7 @@ static void rdp_setcolorimage() { 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() == CSettings::SwapMode_Hybrid) ? swapped_addr : rdp.maincimg[0].addr; swapped_addr = rdp.cimg; newSwapBuffers(); rdp.vi_org_reg = *gfx.VI_ORIGIN_REG; @@ -3366,7 +3366,7 @@ void DetectFrameBufferUsage() { 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() != CSettings::SwapMode_Hybrid) && (g_settings->ucode != ucode_PerfectDark)) { int ind = (rdp.ci_count > 0) ? rdp.ci_count - 1 : 0; uint32_t height = rdp.frame_buffers[ind].height; @@ -4054,8 +4054,10 @@ void CALL ProcessRDPList(void) GoToFullScreen(); //* Set states *// - if (g_settings->swapmode > 0) + if (g_settings->swapmode() != CSettings::SwapMode_Old) + { SwapOK = TRUE; + } rdp.updatescreen = 1; rdp.tri_n = 0; // 0 triangles so far this frame @@ -4109,7 +4111,8 @@ void CALL ProcessRDPList(void) bool setZero = true; - while (rdp_cmd_cur != rdp_cmd_ptr) { + while (rdp_cmd_cur != rdp_cmd_ptr) + { uint32_t cmd = (rdp_cmd_data[rdp_cmd_cur] >> 24) & 0x3f; if ((((rdp_cmd_ptr - rdp_cmd_cur)&maxCMDMask) * 4) < rdp_command_length[cmd]) { @@ -4131,7 +4134,8 @@ void CALL ProcessRDPList(void) rdp_cmd_cur = (rdp_cmd_cur + rdp_command_length[cmd] / 4) & maxCMDMask; } - if (setZero) { + if (setZero) + { rdp_cmd_ptr = 0; rdp_cmd_cur = 0; } diff --git a/Source/Glide64/ucodeFB.h b/Source/Glide64/ucodeFB.h index 7605bc711..83c770299 100644 --- a/Source/Glide64/ucodeFB.h +++ b/Source/Glide64/ucodeFB.h @@ -430,7 +430,7 @@ static void fb_setcolorimage() } if (cur_fb.status == ci_main) { - int viSwapOK = ((g_settings->swapmode == 2) && (rdp.vi_org_reg == *gfx.VI_ORIGIN_REG)) ? FALSE : TRUE; + int viSwapOK = ((g_settings->swapmode() == CSettings::SwapMode_Hybrid) && (rdp.vi_org_reg == *gfx.VI_ORIGIN_REG)) ? FALSE : TRUE; if ((rdp.maincimg[0].addr != cur_fb.addr) && SwapOK && viSwapOK) { SwapOK = FALSE;