From 73adab0ce1f5e6f9648e4c7107ec4c33c46edb54 Mon Sep 17 00:00:00 2001 From: Rodolfo Osvaldo Bogado Date: Tue, 14 Sep 2010 22:48:22 +0000 Subject: [PATCH] Dlist Cache step 2: include referenced array data in the hash to avoid problems in some games. this version is a slower than the last version but is more stable, still much work to do but so little time to do it :) Added Dlist Caching Option to the plugin configuration so anyone can compare the performance change. git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@6205 8ced0084-cf51-0410-be5f-012b33b47a6e --- Source/Core/VideoCommon/Src/DLCache.cpp | 235 ++++++++++++------ .../Plugin_VideoDX11/Src/DlgSettings.cpp | 5 + .../Plugins/Plugin_VideoDX11/Src/resource.h | 10 +- .../Plugins/Plugin_VideoDX11/Src/resource.rc | 63 +---- .../Plugin_VideoDX9/Src/DlgSettings.cpp | 8 +- .../Plugins/Plugin_VideoDX9/Src/DlgSettings.h | 3 +- .../Plugin_VideoOGL/Src/GUI/ConfigDlg.cpp | 15 +- .../Plugin_VideoOGL/Src/GUI/ConfigDlg.h | 3 + 8 files changed, 201 insertions(+), 141 deletions(-) diff --git a/Source/Core/VideoCommon/Src/DLCache.cpp b/Source/Core/VideoCommon/Src/DLCache.cpp index d643a81015..934de5f0c0 100644 --- a/Source/Core/VideoCommon/Src/DLCache.cpp +++ b/Source/Core/VideoCommon/Src/DLCache.cpp @@ -57,14 +57,32 @@ enum DisplayListPass { DLPASS_RUN, }; -struct VDataHashRegion +#define DL_HASH_STEPS 512 + +struct ReferencedDataRegion { - u32 hash; - u32 start_address; - int size; + ReferencedDataRegion() + :hash(0), + start_address(NULL), + size(0), + MustClean(false), + NextRegion(NULL) + {} + u64 hash; + u8* start_address; + u32 size; + bool MustClean; + ReferencedDataRegion* NextRegion; + + int IntersectsMemoryRange(u8* range_address, u32 range_size) + { + if (start_address + size < range_address) + return -1; + if (start_address >= range_address + range_size) + return 1; + return 0; + } }; -typedef u8* DataPointer; -typedef std::map VdataMap; struct CachedDisplayList { @@ -72,18 +90,26 @@ struct CachedDisplayList : uncachable(false), pass(DLPASS_ANALYZE), next_check(1), - BufferCount(0), num_xf_reg(0), num_cp_reg(0), num_bp_reg(0), num_index_xf(0), - num_draw_call(0) + num_draw_call(0), + Regions(NULL), + LastRegion(NULL), + BufferCount(0) { frame_count = frameCount; } - + bool uncachable; // if set, this DL will always be interpreted. This gets set if hash ever changes. - + // Analitic data + int num_xf_reg; + int num_cp_reg; + int num_bp_reg; + int num_index_xf; + int num_draw_call; + int pass; u64 dl_hash; @@ -93,17 +119,99 @@ struct CachedDisplayList int frame_count; // ... Something containing cached vertex buffers here ... - u8 BufferCount; - VdataMap Vdata; - - int num_xf_reg; - int num_cp_reg; - int num_bp_reg; - int num_index_xf; - int num_draw_call; - + int BufferCount; + ReferencedDataRegion* Regions; + ReferencedDataRegion* LastRegion; + // Compile the commands themselves down to native code. + const u8* compiled_code; + + void InsertRegion(ReferencedDataRegion* NewRegion) + { + if(LastRegion) + { + LastRegion->NextRegion = NewRegion; + } + LastRegion = NewRegion; + if(!Regions) + { + Regions = LastRegion; + } + BufferCount++; + } + + void InsertOverlapingRegion(u8* RegionStartAddress, u32 Size) + { + ReferencedDataRegion* NewRegion = FindOverlapingRegion(RegionStartAddress, Size); + if(NewRegion) + { + bool RegionChanged = false; + if(RegionStartAddress < NewRegion->start_address) + { + NewRegion->start_address = RegionStartAddress; + RegionChanged = true; + } + if(RegionStartAddress + Size > NewRegion->start_address + NewRegion->size) + { + NewRegion->size += (RegionStartAddress + Size) - (NewRegion->start_address + NewRegion->size); + RegionChanged = true; + } + if(RegionChanged) + NewRegion->hash = GetHash64(NewRegion->start_address, NewRegion->size, DL_HASH_STEPS); + } + else + { + NewRegion = new ReferencedDataRegion; + NewRegion->MustClean = false; + NewRegion->size = Size; + NewRegion->start_address = RegionStartAddress; + NewRegion->hash = GetHash64(RegionStartAddress, Size, DL_HASH_STEPS); + InsertRegion(NewRegion); + } + } + + bool CheckRegions() + { + ReferencedDataRegion* Current = Regions; + while(Current) + { + if(Current->hash) + { + if(Current->hash != GetHash64(Current->start_address, Current->size, DL_HASH_STEPS)) + return false; + } + Current = Current->NextRegion; + } + return true; + } + + ReferencedDataRegion* FindOverlapingRegion(u8* RegionStart, int Regionsize) + { + ReferencedDataRegion* Current = Regions; + while(Current) + { + if(!Current->IntersectsMemoryRange(RegionStart, Regionsize)) + return Current; + Current = Current->NextRegion; + } + return Current; + } + + void ClearRegions() + { + ReferencedDataRegion* Current = Regions; + while(Current) + { + ReferencedDataRegion* temp = Current; + Current = Current->NextRegion; + if(temp->MustClean) + delete [] temp->start_address; + delete temp; + } + LastRegion = NULL; + Regions = NULL; + } }; // We want to allow caching DLs that start at the same address but have different lengths, @@ -116,7 +224,7 @@ inline u64 CreateMapId(u32 address, u32 size) typedef std::map DLMap; static DLMap dl_map; -static DataPointer dlcode_cache; +static u8* dlcode_cache; static Gen::XEmitter emitter; @@ -315,14 +423,17 @@ bool CompileAndRunDisplayList(u32 address, int size, CachedDisplayList *dl) int transfer_size = ((Cmd2 >> 16) & 15) + 1; u32 xf_address = Cmd2 & 0xFFFF; // TODO - speed this up. pshufb? - DataPointer real_data_buffer = (DataPointer) new u8[transfer_size * 4]; - u32 *data_buffer = (u32*)real_data_buffer; + ReferencedDataRegion* NewRegion = new ReferencedDataRegion; + NewRegion->MustClean = true; + NewRegion->size = transfer_size * 4; + NewRegion->start_address = (u8*) new u8[NewRegion->size]; + NewRegion->hash = 0; + dl->InsertRegion(NewRegion); + u32 *data_buffer = (u32*)NewRegion->start_address; for (int i = 0; i < transfer_size; i++) data_buffer[i] = DataReadU32(); LoadXFReg(transfer_size, xf_address, data_buffer); INCSTAT(stats.thisFrame.numXFLoads); - dl->Vdata[dl->BufferCount] = real_data_buffer; - dl->BufferCount++; // Compile emitter.ABI_CallFunctionCCP((void *)&LoadXFReg, transfer_size, xf_address, data_buffer); } @@ -367,7 +478,7 @@ bool CompileAndRunDisplayList(u32 address, int size, CachedDisplayList *dl) case GX_CMD_CALL_DL: { - u32 addr = DataReadU32(); + u32 addr= DataReadU32(); u32 count = DataReadU32(); ExecuteDisplayList(addr, count); emitter.ABI_CallFunctionCC((void *)&ExecuteDisplayList, addr, count); @@ -401,7 +512,6 @@ bool CompileAndRunDisplayList(u32 address, int size, CachedDisplayList *dl) // Execute u16 numVertices = DataReadU16(); - u8* StartAddress = VertexManager::s_pBaseBufferPointer; VertexManager::Flush(); VertexLoaderManager::RunVertices( @@ -413,12 +523,27 @@ bool CompileAndRunDisplayList(u32 address, int size, CachedDisplayList *dl) if (size > 0) { // Compile - DataPointer NewData = (DataPointer)new u8[Vdatasize]; - memcpy(NewData,StartAddress,Vdatasize); - dl->Vdata[dl->BufferCount] = NewData; - dl->BufferCount++; - emitter.ABI_CallFunctionCCCP((void *)&VertexLoaderManager::RunCompiledVertices, - cmd_byte & GX_VAT_MASK, (cmd_byte & GX_PRIMITIVE_MASK) >> GX_PRIMITIVE_SHIFT, numVertices, NewData); + ReferencedDataRegion* NewRegion = new ReferencedDataRegion; + NewRegion->MustClean = true; + NewRegion->size = Vdatasize; + NewRegion->start_address = (u8*)new u8[Vdatasize]; + NewRegion->hash = 0; + dl->InsertRegion(NewRegion); + memcpy(NewRegion->start_address, StartAddress, Vdatasize); + emitter.ABI_CallFunctionCCCP((void *)&VertexLoaderManager::RunCompiledVertices, cmd_byte & GX_VAT_MASK, (cmd_byte & GX_PRIMITIVE_MASK) >> GX_PRIMITIVE_SHIFT, numVertices, NewRegion->start_address); + } + const int tc[12] = { + g_VtxDesc.Position, g_VtxDesc.Normal, g_VtxDesc.Color0, g_VtxDesc.Color1, g_VtxDesc.Tex0Coord, g_VtxDesc.Tex1Coord, + g_VtxDesc.Tex2Coord, g_VtxDesc.Tex3Coord, g_VtxDesc.Tex4Coord, g_VtxDesc.Tex5Coord, g_VtxDesc.Tex6Coord, (g_VtxDesc.Hex >> 31) & 3 + }; + for(int i = 0; i < 12; i++) + { + if(tc[i] > 1) + { + u8* saddr = cached_arraybases[i]; + int arraySize = arraystrides[i] * ((tc[i] == 2)? 256 : 8192); + dl->InsertOverlapingRegion(saddr, arraySize); + } } } else @@ -440,7 +565,7 @@ bool CompileAndRunDisplayList(u32 address, int size, CachedDisplayList *dl) void Init() { - dlcode_cache = (DataPointer)AllocateExecutableMemory(DL_CODE_CACHE_SIZE, false); // Don't need low memory. + dlcode_cache = (u8*)AllocateExecutableMemory(DL_CODE_CACHE_SIZE, false); // Don't need low memory. emitter.SetCodePtr(dlcode_cache); } @@ -456,13 +581,7 @@ void Clear() DLMap::iterator iter = dl_map.begin(); while (iter != dl_map.end()) { CachedDisplayList &entry = iter->second; - VdataMap::iterator viter = entry.Vdata.begin(); - while (viter != entry.Vdata.end()) - { - DataPointer &ventry = viter->second; - delete [] ventry; - entry.Vdata.erase(viter++); - } + entry.ClearRegions(); iter++; } dl_map.clear(); @@ -478,13 +597,7 @@ void ProgressiveCleanup() int limit = iter->second.uncachable ? 1200 : 400; if (entry.frame_count < frameCount - limit) { // entry.Destroy(); - VdataMap::iterator viter = entry.Vdata.begin(); - while (viter != entry.Vdata.end()) - { - DataPointer &ventry = viter->second; - delete [] ventry; - entry.Vdata.erase(viter++); - } + entry.ClearRegions(); dl_map.erase(iter++); // (this is gcc standard!) } else @@ -510,17 +623,7 @@ bool HandleDisplayList(u32 address, u32 size) DLCache::CachedDisplayList &dl = iter->second; if (dl.uncachable) { - dl.check--; - if(dl.check <= 0) - { - dl.pass = DLCache::DLPASS_ANALYZE; - dl.uncachable = false; - dl.check = dl.next_check; - } - else - { - return false; - } + return false; } // Got one! And it's been compiled too, so let's run the compiled code! @@ -543,8 +646,7 @@ bool HandleDisplayList(u32 address, u32 size) if (dl.dl_hash != GetHash64(Memory_GetPtr(address), size, 0)) { // PanicAlert("uncachable %08x", address); - dl.uncachable = true; - dl.check = 60; + dl.uncachable = true; return false; } DLCache::CompileAndRunDisplayList(address, size, &dl); @@ -556,18 +658,11 @@ bool HandleDisplayList(u32 address, u32 size) dl.check--; if (dl.check <= 0) { - if (dl.dl_hash != GetHash64(Memory_GetPtr(address), size, 0)) + if (dl.dl_hash != GetHash64(Memory_GetPtr(address), size, 0) || !dl.CheckRegions()) { dl.uncachable = true; dl.check = 60; - DLCache::VdataMap::iterator viter = dl.Vdata.begin(); - while (viter != dl.Vdata.end()) - { - DLCache::DataPointer &ventry = viter->second; - delete [] ventry; - dl.Vdata.erase(viter++); - } - dl.BufferCount = 0; + dl.ClearRegions(); return false; } dl.check = dl.next_check; @@ -601,7 +696,7 @@ bool HandleDisplayList(u32 address, u32 size) DLCache::CachedDisplayList dl; if (DLCache::AnalyzeAndRunDisplayList(address, size, &dl)) { - dl.dl_hash = GetHash64(Memory_GetPtr(address), size, 0); + dl.dl_hash = GetHash64(Memory_GetPtr(address), size,0); dl.pass = DLCache::DLPASS_COMPILE; dl.check = 1; dl.next_check = 1; diff --git a/Source/Plugins/Plugin_VideoDX11/Src/DlgSettings.cpp b/Source/Plugins/Plugin_VideoDX11/Src/DlgSettings.cpp index 42d97ea8e5..6f2bd39e1d 100644 --- a/Source/Plugins/Plugin_VideoDX11/Src/DlgSettings.cpp +++ b/Source/Plugins/Plugin_VideoDX11/Src/DlgSettings.cpp @@ -91,6 +91,8 @@ struct TabDirect3D : public W32Util::Tab Button_SetCheck(GetDlgItem(hDlg, IDC_WIDESCREEN_HACK), g_Config.bWidescreenHack); Button_SetCheck(GetDlgItem(hDlg, IDC_VSYNC), g_Config.bVSync); Button_SetCheck(GetDlgItem(hDlg, IDC_SAFE_TEXTURE_CACHE), g_Config.bSafeTextureCache); + Button_SetCheck(GetDlgItem(hDlg, IDC_DLIST_CACHING), g_Config.bDlistCachingEnable); + if (g_Config.iSafeTextureCache_ColorSamples == 0) { @@ -136,6 +138,9 @@ struct TabDirect3D : public W32Util::Tab Button_Enable(GetDlgItem(hDlg, IDC_SAFE_TEXTURE_CACHE_NORMAL), g_Config.bSafeTextureCache); Button_Enable(GetDlgItem(hDlg, IDC_SAFE_TEXTURE_CACHE_FAST), g_Config.bSafeTextureCache); break; + case IDC_DLIST_CACHING: + g_Config.bDlistCachingEnable = Button_GetCheck(GetDlgItem(hDlg, IDC_DLIST_CACHING)) == 0 ? false : true; + break; case IDC_EFB_ACCESS_ENABLE: g_Config.bEFBAccessEnable = Button_GetCheck(GetDlgItem(hDlg, IDC_EFB_ACCESS_ENABLE)) == 0 ? false : true; break; diff --git a/Source/Plugins/Plugin_VideoDX11/Src/resource.h b/Source/Plugins/Plugin_VideoDX11/Src/resource.h index e9c4b497d6..7795520c82 100644 --- a/Source/Plugins/Plugin_VideoDX11/Src/resource.h +++ b/Source/Plugins/Plugin_VideoDX11/Src/resource.h @@ -6,7 +6,6 @@ #define IDD_SETTINGS 103 #define IDD_ADVANCED 105 #define IDC_ADAPTER 1001 -//#define IDC_ANTIALIASMODE 1002 #define IDC_VSYNC 1006 #define IDC_ASPECT_16_9 1008 #define IDC_ASPECT_4_3 1009 @@ -19,15 +18,10 @@ #define IDC_OVERLAYSTATS 1016 #define IDC_OVERLAYPROJSTATS 1017 #define IDC_ENABLEEFBCOPY 1018 -//#define IDC_EFBTORAM 1019 -//#define IDC_EFBTOTEX 1020 #define IDC_TEXFMT_OVERLAY 1024 #define IDC_TEXFMT_CENTER 1025 #define IDC_ENABLEXFB 1026 #define IDC_FORCEANISOTROPY 1027 -//#define IDC_ENABLEXFB2 1027 -//#define IDC_ENABLEREALXFB 1027 -//#define IDC_LOADHIRESTEXTURE 1028 #define IDC_EFBSCALEDCOPY 1029 #define IDC_OSDHOTKEY 1030 #define IDC_COMBO2 1040 @@ -36,7 +30,7 @@ #define IDC_SAFE_TEXTURE_CACHE_NORMAL 1042 #define IDC_RADIO3 1043 #define IDC_SAFE_TEXTURE_CACHE_FAST 1043 -//#define IDC_DISABLEMIPS 1100 +#define IDC_DLIST_CACHING 1044 #define IDC_STATIC -1 // Next default values for new objects @@ -45,7 +39,7 @@ #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 106 #define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1044 +#define _APS_NEXT_CONTROL_VALUE 1045 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif diff --git a/Source/Plugins/Plugin_VideoDX11/Src/resource.rc b/Source/Plugins/Plugin_VideoDX11/Src/resource.rc index a4434da7db..e19f898546 100644 --- a/Source/Plugins/Plugin_VideoDX11/Src/resource.rc +++ b/Source/Plugins/Plugin_VideoDX11/Src/resource.rc @@ -46,10 +46,12 @@ BEGIN LTEXT "&Aspect Ratio:",IDC_STATIC,9,40,48,8 COMBOBOX IDC_ASPECTRATIO,60,38,89,57,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP CONTROL "&Enable CPU->EFB access ",IDC_EFB_ACCESS_ENABLE,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,7,60,94,11 - CONTROL "Enable &Safe Texture Cache",IDC_SAFE_TEXTURE_CACHE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,74,108,11 + CONTROL "Enable &Safe Texture Cache",IDC_SAFE_TEXTURE_CACHE, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,74,108,11 CONTROL "Safe",IDC_SAFE_TEXTURE_CACHE_SAFE,"Button",BS_AUTORADIOBUTTON,20,87,32,10 CONTROL "Normal",IDC_SAFE_TEXTURE_CACHE_NORMAL,"Button",BS_AUTORADIOBUTTON,52,87,40,10 CONTROL "Fast",IDC_SAFE_TEXTURE_CACHE_FAST,"Button",BS_AUTORADIOBUTTON,92,87,32,10 + CONTROL "Enable Dlist Caching",IDC_DLIST_CACHING,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,98,80,10 END IDD_ADVANCED DIALOGEX 0, 0, 244, 200 @@ -63,69 +65,14 @@ BEGIN CONTROL "Enable EFB copy",IDC_ENABLEEFBCOPY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,33,81,8 CONTROL "EFB Scaled Copy",IDC_EFBSCALEDCOPY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,48,64,8 CONTROL "Enable &Wireframe",IDC_WIREFRAME,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,114,48,87,8 - CONTROL "Enable 16x &anisotropy filtering",IDC_FORCEANISOTROPY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,63,110,8 - + CONTROL "Enable 16x &anisotropy filtering",IDC_FORCEANISOTROPY, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,63,110,8 GROUPBOX "Debugging Tools",IDC_STATIC,7,148,228,46 CONTROL "&Overlay some statistics",IDC_OVERLAYSTATS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,159,90,8 CONTROL "Enable TexFmt Overlay",IDC_TEXFMT_OVERLAY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,174,92,10 CONTROL "Centered",IDC_TEXFMT_CENTER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,114,174,52,10 END -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO -BEGIN - IDD_ABOUT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 181 - TOPMARGIN, 7 - BOTTOMMARGIN, 74 - END - - IDD_SETTINGS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 237 - VERTGUIDE, 7 - VERTGUIDE, 68 - VERTGUIDE, 81 - VERTGUIDE, 87 - TOPMARGIN, 7 - BOTTOMMARGIN, 176 - END - - IDD_ADVANCED, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 237 - VERTGUIDE, 14 - VERTGUIDE, 29 - VERTGUIDE, 114 - TOPMARGIN, 7 - BOTTOMMARGIN, 195 - HORZGUIDE, 18 - HORZGUIDE, 33 - HORZGUIDE, 49 - HORZGUIDE, 156 - END - - IDD_ENHANCEMENTS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 217 - VERTGUIDE, 16 - VERTGUIDE, 74 - TOPMARGIN, 7 - BOTTOMMARGIN, 168 - END -END -#endif // APSTUDIO_INVOKED - #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// diff --git a/Source/Plugins/Plugin_VideoDX9/Src/DlgSettings.cpp b/Source/Plugins/Plugin_VideoDX9/Src/DlgSettings.cpp index 65d965167b..0f756c68ca 100644 --- a/Source/Plugins/Plugin_VideoDX9/Src/DlgSettings.cpp +++ b/Source/Plugins/Plugin_VideoDX9/Src/DlgSettings.cpp @@ -45,6 +45,7 @@ BEGIN_EVENT_TABLE(GFXConfigDialogDX,wxDialog) EVT_CHOICE(ID_EFBSCALEMODE, GFXConfigDialogDX::DirectXSettingsChanged) EVT_CHECKBOX(ID_EFB_ACCESS_ENABLE, GFXConfigDialogDX::DirectXSettingsChanged) EVT_CHECKBOX(ID_SAFETEXTURECACHE, GFXConfigDialogDX::DirectXSettingsChanged) + EVT_CHECKBOX(ID_DLISTCACHING, GFXConfigDialogDX::DirectXSettingsChanged) EVT_RADIOBUTTON(ID_RADIO_SAFETEXTURECACHE_SAFE, GFXConfigDialogDX::DirectXSettingsChanged) EVT_RADIOBUTTON(ID_RADIO_SAFETEXTURECACHE_NORMAL, GFXConfigDialogDX::DirectXSettingsChanged) EVT_RADIOBUTTON(ID_RADIO_SAFETEXTURECACHE_FAST, GFXConfigDialogDX::DirectXSettingsChanged) @@ -111,6 +112,7 @@ void GFXConfigDialogDX::InitializeGUIValues() m_EFBScaleMode->SetSelection(g_Config.iEFBScale); m_EnableEFBAccess->SetValue(g_Config.bEFBAccessEnable); m_SafeTextureCache->SetValue(g_Config.bSafeTextureCache); + m_DlistCaching->SetValue(g_Config.bDlistCachingEnable); if(g_Config.iSafeTextureCache_ColorSamples == 0) m_Radio_SafeTextureCache_Safe->SetValue(true); else @@ -214,7 +216,7 @@ void GFXConfigDialogDX::CreateGUIControls() m_Radio_SafeTextureCache_Safe = new wxRadioButton( m_PageDirect3D, ID_RADIO_SAFETEXTURECACHE_SAFE, wxT("safe"), wxDefaultPosition, wxDefaultSize, 0 ); m_Radio_SafeTextureCache_Normal = new wxRadioButton( m_PageDirect3D, ID_RADIO_SAFETEXTURECACHE_NORMAL, wxT("normal"), wxDefaultPosition, wxDefaultSize, 0 ); m_Radio_SafeTextureCache_Fast = new wxRadioButton( m_PageDirect3D, ID_RADIO_SAFETEXTURECACHE_FAST, wxT("fast"), wxDefaultPosition, wxDefaultSize, 0 ); - + m_DlistCaching = new wxCheckBox( m_PageDirect3D, ID_DLISTCACHING, wxT("Use DList Caching"), wxDefaultPosition, wxDefaultSize, 0 ); // Sizers wxGridBagSizer* sBasic; wxBoxSizer* sGeneral; @@ -234,6 +236,7 @@ void GFXConfigDialogDX::CreateGUIControls() sBasic->Add( m_EFBScaleText, wxGBPosition( 4, 0 ), wxGBSpan( 1, 1 ), wxALL, 5 ); sBasic->Add( m_EFBScaleMode, wxGBPosition( 4, 1 ), wxGBSpan( 1, 1 ), wxALL, 5 ); sBasic->Add( m_EnableEFBAccess, wxGBPosition( 5, 1 ), wxGBSpan( 1, 1 ), wxALL, 5 ); + sBasic->Add( m_DlistCaching, wxGBPosition( 6, 1 ), wxGBSpan( 1, 1 ), wxALL, 5 ); sbBasic->Add( sBasic, 0, 0, 5 ); sGeneral->Add( sbBasic, 0, wxEXPAND|wxALL, 5 ); @@ -412,6 +415,9 @@ void GFXConfigDialogDX::DirectXSettingsChanged(wxCommandEvent& event) case ID_SAFETEXTURECACHE: g_Config.bSafeTextureCache = m_SafeTextureCache->IsChecked(); break; + case ID_DLISTCACHING: + g_Config.bDlistCachingEnable = m_DlistCaching->IsChecked(); + break; case ID_RADIO_SAFETEXTURECACHE_SAFE: g_Config.iSafeTextureCache_ColorSamples = 0; break; diff --git a/Source/Plugins/Plugin_VideoDX9/Src/DlgSettings.h b/Source/Plugins/Plugin_VideoDX9/Src/DlgSettings.h index 6fcf6e2261..553c98290a 100644 --- a/Source/Plugins/Plugin_VideoDX9/Src/DlgSettings.h +++ b/Source/Plugins/Plugin_VideoDX9/Src/DlgSettings.h @@ -100,7 +100,7 @@ class GFXConfigDialogDX : public wxDialog wxRadioButton *m_Radio_SafeTextureCache_Fast; wxRadioButton *m_Radio_SafeTextureCache_Normal; wxRadioButton *m_Radio_SafeTextureCache_Safe; - + wxCheckBox *m_DlistCaching; //Enhancements Tab wxCheckBox *m_ForceFiltering; wxCheckBox *m_MaxAnisotropy; @@ -141,6 +141,7 @@ class GFXConfigDialogDX : public wxDialog ID_RADIO_SAFETEXTURECACHE_SAFE, ID_RADIO_SAFETEXTURECACHE_NORMAL, ID_RADIO_SAFETEXTURECACHE_FAST, + ID_DLISTCACHING, ID_FORCEFILTERING, ID_FORCEANISOTROPY, ID_LOADHIRESTEXTURES, diff --git a/Source/Plugins/Plugin_VideoOGL/Src/GUI/ConfigDlg.cpp b/Source/Plugins/Plugin_VideoOGL/Src/GUI/ConfigDlg.cpp index 7188488dca..5a22922f33 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/GUI/ConfigDlg.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/GUI/ConfigDlg.cpp @@ -76,6 +76,7 @@ BEGIN_EVENT_TABLE(GFXConfigDialogOGL,wxDialog) EVT_CHECKBOX(ID_CHECKBOX_DISABLECOPYEFB, GFXConfigDialogOGL::AdvancedSettingsChanged) EVT_RADIOBUTTON(ID_RADIO_COPYEFBTORAM, GFXConfigDialogOGL::AdvancedSettingsChanged) EVT_RADIOBUTTON(ID_RADIO_COPYEFBTOGL, GFXConfigDialogOGL::AdvancedSettingsChanged) + EVT_CHECKBOX(ID_DLISTCACHING, GFXConfigDialogOGL::AdvancedSettingsChanged) EVT_CHOICE(ID_PHACKVALUE, GFXConfigDialogOGL::GeneralSettingsChanged) EVT_CHOICE(ID_POSTSHADER, GFXConfigDialogOGL::GeneralSettingsChanged) EVT_BUTTON(ID_RELOADSHADER, GFXConfigDialogOGL::ReloadShaderClick) @@ -230,7 +231,7 @@ void GFXConfigDialogOGL::InitializeGUIValues() m_DisableTexturing->SetValue(g_Config.bDisableTexturing); m_DstAlphaPass->SetValue(g_Config.bDstAlphaPass); m_DisableFog->SetValue(g_Config.bDisableFog); - + m_DlistCaching->SetValue(g_Config.bDlistCachingEnable); m_CheckBox_DisableCopyEFB->SetValue(g_Config.bEFBCopyDisable); g_Config.bCopyEFBToTexture ? m_Radio_CopyEFBToGL->SetValue(true) : m_Radio_CopyEFBToRAM->SetValue(true); @@ -251,6 +252,7 @@ void GFXConfigDialogOGL::InitializeGUIValues() m_Radio_SafeTextureCache_Normal->SetValue(true); else m_Radio_SafeTextureCache_Fast->SetValue(true); + } void GFXConfigDialogOGL::InitializeGUITooltips() @@ -317,6 +319,7 @@ void GFXConfigDialogOGL::InitializeGUITooltips() wxT("[This option will apply immediately and does not require a restart to take effect.]")); m_Radio_SafeTextureCache_Fast->SetToolTip( wxT("[This option will apply immediately and does not require a restart to take effect.]")); + m_DlistCaching->SetToolTip(wxT("This will speed up things a little but still have some glitches in certain games.")); } void GFXConfigDialogOGL::CreateGUIControls() @@ -452,7 +455,7 @@ void GFXConfigDialogOGL::CreateGUIControls() m_CheckBox_DisableCopyEFB = new wxCheckBox(m_PageAdvanced, ID_CHECKBOX_DISABLECOPYEFB, wxT("Disable")); m_Radio_CopyEFBToRAM = new wxRadioButton(m_PageAdvanced, ID_RADIO_COPYEFBTORAM, wxT("To RAM (accuracy)")); m_Radio_CopyEFBToGL = new wxRadioButton(m_PageAdvanced, ID_RADIO_COPYEFBTOGL, wxT("To GL texture (performance)")); - + m_DlistCaching = new wxCheckBox(m_PageAdvanced, ID_DLISTCACHING, wxT("Use Dlist Caching")); // Utility sbUtilities = new wxStaticBoxSizer(wxVERTICAL, m_PageAdvanced, wxT("Utilities")); m_DumpTextures = new wxCheckBox(m_PageAdvanced, ID_DUMPTEXTURES, wxT("Dump textures"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator); @@ -468,7 +471,7 @@ void GFXConfigDialogOGL::CreateGUIControls() m_Radio_SafeTextureCache_Safe = new wxRadioButton(m_PageAdvanced, ID_RADIO_SAFETEXTURECACHE_SAFE, wxT("Safe"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP); m_Radio_SafeTextureCache_Normal = new wxRadioButton(m_PageAdvanced, ID_RADIO_SAFETEXTURECACHE_NORMAL, wxT("Normal")); m_Radio_SafeTextureCache_Fast = new wxRadioButton(m_PageAdvanced, ID_RADIO_SAFETEXTURECACHE_FAST, wxT("Fast")); - + // Sizers sHacks->Add(m_PhackvalueCB, 0, wxTOP, 0); sbHacks = new wxStaticBoxSizer(wxHORIZONTAL, m_PageAdvanced, wxT("Safe Texture Cache")); @@ -477,6 +480,7 @@ void GFXConfigDialogOGL::CreateGUIControls() sbHacks->Add(m_Radio_SafeTextureCache_Safe, 0, wxALL, 5); sbHacks->Add(m_Radio_SafeTextureCache_Normal, 0, wxALL, 5); sbHacks->Add(m_Radio_SafeTextureCache_Fast, 0, wxALL, 5); + sbHacks->AddStretchSpacer(); sHacks->Add(sbHacks, 0, wxEXPAND | (wxTOP), 5); // Sizers @@ -498,6 +502,8 @@ void GFXConfigDialogOGL::CreateGUIControls() sRendering->Add(m_DisableTexturing, wxGBPosition(2, 0), wxGBSpan(1, 1), wxALL, 4); sRendering->Add(m_DstAlphaPass, wxGBPosition(3, 0), wxGBSpan(1, 1), wxALL, 4); sRendering->Add(m_DisableFog, wxGBPosition(4, 0), wxGBSpan(1, 1), wxALL, 4); + sRendering->Add(m_DlistCaching, wxGBPosition(5, 0), wxGBSpan(1, 1), wxALL, 4); + sRenderBoxRow1->Add(sRendering, 0, wxALL|wxEXPAND, 1); wxStaticBoxSizer *sSBox = new wxStaticBoxSizer(m_StaticBox_EFB, wxVERTICAL); wxBoxSizer *sStrip1 = new wxBoxSizer(wxHORIZONTAL); @@ -707,6 +713,9 @@ void GFXConfigDialogOGL::AdvancedSettingsChanged(wxCommandEvent& event) case ID_SAFETEXTURECACHE: g_Config.bSafeTextureCache = m_SafeTextureCache->IsChecked(); break; + case ID_DLISTCACHING: + g_Config.bDlistCachingEnable = m_DlistCaching->IsChecked(); + break; case ID_RADIO_SAFETEXTURECACHE_SAFE: g_Config.iSafeTextureCache_ColorSamples = 0; break; diff --git a/Source/Plugins/Plugin_VideoOGL/Src/GUI/ConfigDlg.h b/Source/Plugins/Plugin_VideoOGL/Src/GUI/ConfigDlg.h index fbc30d8cb6..7592f2aeb9 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/GUI/ConfigDlg.h +++ b/Source/Plugins/Plugin_VideoOGL/Src/GUI/ConfigDlg.h @@ -128,6 +128,7 @@ class GFXConfigDialogOGL : public wxDialog wxRadioButton *m_Radio_SafeTextureCache_Safe; wxRadioButton *m_Radio_SafeTextureCache_Normal; wxRadioButton *m_Radio_SafeTextureCache_Fast; + wxCheckBox *m_DlistCaching; // Screen size wxStaticText *m_TextScreenWidth, *m_TextScreenHeight, *m_TextScreenLeft, *m_TextScreenTop; wxSlider *m_SliderWidth, *m_SliderHeight, *m_SliderLeft, *m_SliderTop; @@ -182,6 +183,7 @@ class GFXConfigDialogOGL : public wxDialog ID_RADIO_SAFETEXTURECACHE_FAST, ID_HACK, ID_PHACKVALUE, + ID_DLISTCACHING, ID_DUMPTEXTURES, ID_HIRESTEXTURES, @@ -200,6 +202,7 @@ class GFXConfigDialogOGL : public wxDialog ID_POSTSHADERTEXT, ID_RELOADSHADER, ID_EDITSHADER, + }; void LoadShaders();