Merge pull request #11131 from Pokechu22/cp-state-savestate-mistakes

Include tangent/binormal cache in savestates and simplify saving CP state
This commit is contained in:
Admiral H. Curtiss 2022-10-11 03:42:17 +02:00 committed by GitHub
commit a056a1366f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 12 additions and 26 deletions

View File

@ -94,7 +94,7 @@ static size_t s_state_writes_in_queue;
static std::condition_variable s_state_write_queue_is_empty; static std::condition_variable s_state_write_queue_is_empty;
// Don't forget to increase this after doing changes on the savestate system // Don't forget to increase this after doing changes on the savestate system
constexpr u32 STATE_VERSION = 151; // Last changed in PR 11125 constexpr u32 STATE_VERSION = 152; // Last changed in PR 11131
// Maps savestate versions to Dolphin versions. // Maps savestate versions to Dolphin versions.
// Versions after 42 don't need to be added to this list, // Versions after 42 don't need to be added to this list,

View File

@ -15,24 +15,6 @@
CPState g_main_cp_state; CPState g_main_cp_state;
CPState g_preprocess_cp_state; CPState g_preprocess_cp_state;
void DoCPState(PointerWrap& p)
{
// We don't save g_preprocess_cp_state separately because the GPU should be
// synced around state save/load.
p.DoArray(g_main_cp_state.array_bases);
p.DoArray(g_main_cp_state.array_strides);
p.Do(g_main_cp_state.matrix_index_a);
p.Do(g_main_cp_state.matrix_index_b);
p.Do(g_main_cp_state.vtx_desc);
p.DoArray(g_main_cp_state.vtx_attr);
p.DoMarker("CP Memory");
if (p.IsReadMode())
{
CopyPreprocessCPStateFromMain();
VertexLoaderManager::g_bases_dirty = true;
}
}
void CopyPreprocessCPStateFromMain() void CopyPreprocessCPStateFromMain()
{ {
std::memcpy(&g_preprocess_cp_state, &g_main_cp_state, sizeof(CPState)); std::memcpy(&g_preprocess_cp_state, &g_main_cp_state, sizeof(CPState));

View File

@ -658,8 +658,6 @@ class PointerWrap;
extern CPState g_main_cp_state; extern CPState g_main_cp_state;
extern CPState g_preprocess_cp_state; extern CPState g_preprocess_cp_state;
void DoCPState(PointerWrap& p);
void CopyPreprocessCPStateFromMain(); void CopyPreprocessCPStateFromMain();
std::pair<std::string, std::string> GetCPRegInfo(u8 cmd, u32 value); std::pair<std::string, std::string> GetCPRegInfo(u8 cmd, u32 value);

View File

@ -123,6 +123,7 @@ struct entry
void MarkAllDirty() void MarkAllDirty()
{ {
g_bases_dirty = true;
g_main_vat_dirty = BitSet8::AllTrue(8); g_main_vat_dirty = BitSet8::AllTrue(8);
g_preprocess_vat_dirty = BitSet8::AllTrue(8); g_preprocess_vat_dirty = BitSet8::AllTrue(8);
} }

View File

@ -557,13 +557,11 @@ void VertexManagerBase::DoState(PointerWrap& p)
{ {
// Flush old vertex data before loading state. // Flush old vertex data before loading state.
Flush(); Flush();
// Clear all caches that touch RAM
// (? these don't appear to touch any emulation state that gets saved. moved to on load only.)
VertexLoaderManager::MarkAllDirty();
} }
p.Do(m_zslope); p.Do(m_zslope);
p.Do(VertexLoaderManager::tangent_cache);
p.Do(VertexLoaderManager::binormal_cache);
} }
void VertexManagerBase::CalculateZSlope(NativeVertexFormat* format) void VertexManagerBase::CalculateZSlope(NativeVertexFormat* format)

View File

@ -18,6 +18,7 @@
#include "VideoCommon/TMEM.h" #include "VideoCommon/TMEM.h"
#include "VideoCommon/TextureCacheBase.h" #include "VideoCommon/TextureCacheBase.h"
#include "VideoCommon/TextureDecoder.h" #include "VideoCommon/TextureDecoder.h"
#include "VideoCommon/VertexLoaderManager.h"
#include "VideoCommon/VertexManagerBase.h" #include "VideoCommon/VertexManagerBase.h"
#include "VideoCommon/VertexShaderManager.h" #include "VideoCommon/VertexShaderManager.h"
#include "VideoCommon/XFMemory.h" #include "VideoCommon/XFMemory.h"
@ -38,7 +39,12 @@ void VideoCommon_DoState(PointerWrap& p)
p.DoMarker("BP Memory"); p.DoMarker("BP Memory");
// CP Memory // CP Memory
DoCPState(p); // We don't save g_preprocess_cp_state separately because the GPU should be
// synced around state save/load.
p.Do(g_main_cp_state);
p.DoMarker("CP Memory");
if (p.IsReadMode())
CopyPreprocessCPStateFromMain();
// XF Memory // XF Memory
p.Do(xfmem); p.Do(xfmem);
@ -90,5 +96,6 @@ void VideoCommon_DoState(PointerWrap& p)
{ {
// Inform backend of new state from registers. // Inform backend of new state from registers.
BPReload(); BPReload();
VertexLoaderManager::MarkAllDirty();
} }
} }