From 13071868da0c01decfa4a4d96faf48a362d72cf7 Mon Sep 17 00:00:00 2001 From: PabloMK7 Date: Thu, 22 Jan 2026 15:43:32 +0100 Subject: [PATCH] video_core: Make all state dirty after loading a savestate --- src/video_core/pica/dirty_regs.h | 4 ++++ src/video_core/pica/pica_core.cpp | 1 + src/video_core/pica/pica_core.h | 12 ++++++++++++ src/video_core/pica/shader_setup.h | 3 +++ 4 files changed, 20 insertions(+) diff --git a/src/video_core/pica/dirty_regs.h b/src/video_core/pica/dirty_regs.h index cf0410e92..3cdb31b9b 100644 --- a/src/video_core/pica/dirty_regs.h +++ b/src/video_core/pica/dirty_regs.h @@ -16,6 +16,10 @@ union DirtyRegs { qwords[reg_id >> 6] |= 1ULL << (reg_id & 0x3f); } + void SetAllDirty() { + qwords.fill(UINT64_MAX); + } + void Reset() { qwords.fill(0ULL); } diff --git a/src/video_core/pica/pica_core.cpp b/src/video_core/pica/pica_core.cpp index a5768365d..9f19e9572 100644 --- a/src/video_core/pica/pica_core.cpp +++ b/src/video_core/pica/pica_core.cpp @@ -35,6 +35,7 @@ PicaCore::PicaCore(Memory::MemorySystem& memory_, std::shared_ptr geometry_pipeline{regs.internal, gs_unit, gs_setup}, shader_engine{CreateEngine(Settings::values.use_shader_jit.GetValue())} { InitializeRegs(); + dirty_regs.SetAllDirty(); const auto submit_vertex = [this](const AttributeBuffer& buffer) { const auto add_triangle = [this](const OutputVertex& v0, const OutputVertex& v1, diff --git a/src/video_core/pica/pica_core.h b/src/video_core/pica/pica_core.h index 8cdcb493d..61d8e75c2 100644 --- a/src/video_core/pica/pica_core.h +++ b/src/video_core/pica/pica_core.h @@ -185,6 +185,9 @@ public: template void serialize(Archive& ar, const u32 file_version) { ar& boost::serialization::make_binary_object(this, sizeof(ProcTex)); + if (Archive::is_loading::value) { + table_dirty = TableAllDirty; + } } }; @@ -225,6 +228,9 @@ public: template void serialize(Archive& ar, const u32 file_version) { ar& boost::serialization::make_binary_object(this, sizeof(Lighting)); + if (Archive::is_loading::value) { + lut_dirty = LutAllDirty; + } } }; @@ -253,6 +259,9 @@ public: template void serialize(Archive& ar, const u32 file_version) { ar& boost::serialization::make_binary_object(this, sizeof(Fog)); + if (Archive::is_loading::value) { + lut_dirty = true; + } } }; @@ -285,6 +294,9 @@ private: ar & geometry_pipeline; ar & primitive_assembler; ar & cmd_list; + if (Archive::is_loading::value) { + dirty_regs.SetAllDirty(); + } } public: diff --git a/src/video_core/pica/shader_setup.h b/src/video_core/pica/shader_setup.h index 8845e0cb9..3ddd4f366 100644 --- a/src/video_core/pica/shader_setup.h +++ b/src/video_core/pica/shader_setup.h @@ -168,6 +168,9 @@ private: ar & swizzle_data_hash; ar & requires_fixup; ar & has_fixup; + if (Archive::is_loading::value) { + uniforms_dirty = true; + } } };