From 050c3bdee59a41858cfc69f03adf5f14698090a3 Mon Sep 17 00:00:00 2001
From: Hamish Milne <hamishmilne83@gmail.com>
Date: Sun, 22 Dec 2019 16:06:26 +0000
Subject: [PATCH] Serialize primitive_assembly

---
 TODO                                |  5 ++++-
 src/video_core/pica_state.h         |  2 +-
 src/video_core/primitive_assembly.h | 12 ++++++++++++
 src/video_core/shader/shader.h      |  3 +++
 4 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/TODO b/TODO
index 840caba1b..95bdaa926 100644
--- a/TODO
+++ b/TODO
@@ -7,16 +7,19 @@
 ☐ Perf stats
 ☐ Settings
 ☐ Telemetry session
+☐ Replace SERIALIZE_AS_POD with BOOST_IS_BITWISE_SERIALIZABLE
 ✔ HW @done(19-08-13 15:41)
     ✔ GPU regs @done(19-08-13 15:41)
     ✔ LCD regs @done(19-08-13 15:41)
 ☐ Video core @started(19-08-13 16:43)
     ✔ Geometry pipeline @done(19-12-22 15:52)
+        Required more use of g_state
     ✔ PICA state @done(19-08-13 15:41)
-    ☐ Primitive assembly
+    ✔ Primitive assembly @done(19-12-22 16:05)
     ✔ Shader @done(19-08-13 16:03)
 ☐ HLE @started(19-08-13 16:43)
     ☐ Kernel @started(19-08-13 16:43)
+        Most of these require adding g_kernel
         ✔ Address arbiter @done(19-08-13 16:40)
         ✔ Client port @done(19-08-13 16:40)
         ✔ Client session @done(19-08-13 16:40)
diff --git a/src/video_core/pica_state.h b/src/video_core/pica_state.h
index d7ae04c1b..95ee77662 100644
--- a/src/video_core/pica_state.h
+++ b/src/video_core/pica_state.h
@@ -228,7 +228,7 @@ private:
         ar & immediate;
         ar & gs_unit;
         ar & geometry_pipeline;
-        // ar & primitive_assembler;
+        ar & primitive_assembler;
         ar & vs_float_regs_counter;
         ar & vs_uniform_write_buffer;
         ar & gs_float_regs_counter;
diff --git a/src/video_core/primitive_assembly.h b/src/video_core/primitive_assembly.h
index fd5445aa8..1545a6b4c 100644
--- a/src/video_core/primitive_assembly.h
+++ b/src/video_core/primitive_assembly.h
@@ -6,6 +6,7 @@
 
 #include <functional>
 #include "video_core/regs_pipeline.h"
+namespace boost::serialization { class access; }
 
 namespace Pica {
 
@@ -62,6 +63,17 @@ private:
     VertexType buffer[2];
     bool strip_ready = false;
     bool winding = false;
+
+    template <class Archive>
+    void serialize(Archive& ar, const unsigned int version)
+    {
+        ar & topology;
+        ar & buffer_index;
+        ar & buffer;
+        ar & strip_ready;
+        ar & winding;
+    }
+    friend class boost::serialization::access;
 };
 
 } // namespace Pica
diff --git a/src/video_core/shader/shader.h b/src/video_core/shader/shader.h
index ffa60f3b5..f20e08d98 100644
--- a/src/video_core/shader/shader.h
+++ b/src/video_core/shader/shader.h
@@ -16,6 +16,7 @@
 #include "common/common_types.h"
 #include "common/hash.h"
 #include "common/vector_math.h"
+#include "common/pod.h"
 #include "video_core/pica_types.h"
 #include "video_core/regs_rasterizer.h"
 #include "video_core/regs_shader.h"
@@ -64,6 +65,8 @@ struct OutputVertex {
     static void ValidateSemantics(const RasterizerRegs& regs);
     static OutputVertex FromAttributeBuffer(const RasterizerRegs& regs,
                                             const AttributeBuffer& output);
+
+    SERIALIZE_AS_POD
 };
 #define ASSERT_POS(var, pos)                                                                       \
     static_assert(offsetof(OutputVertex, var) == pos * sizeof(float24), "Semantic at wrong "       \