summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Sandberg <andreas.sandberg@arm.com>2015-07-07 09:51:04 +0100
committerAndreas Sandberg <andreas.sandberg@arm.com>2015-07-07 09:51:04 +0100
commitb3ecfa6ae00620fa8a89460ff2a57275b973c260 (patch)
treef7a3e188469e613ac83b3b38e1f7d6a9e7cd0513
parent888ec455cba4174863be5ed9148aaf093a061101 (diff)
downloadgem5-b3ecfa6ae00620fa8a89460ff2a57275b973c260.tar.xz
base: Add serialization support to Pixels and FrameBuffer
Serialize pixels as unsigned 32 bit integers by adding the required to_number() and stream operators. This is used by the FrameBuffer, which now implements the Serializable interface. Users of frame buffers are expected to serialize it into its own section by calling serializeSection().
-rw-r--r--src/base/framebuffer.cc17
-rw-r--r--src/base/framebuffer.hh29
-rw-r--r--src/sim/serialize.cc2
3 files changed, 46 insertions, 2 deletions
diff --git a/src/base/framebuffer.cc b/src/base/framebuffer.cc
index dc4c2e1c2..73f724892 100644
--- a/src/base/framebuffer.cc
+++ b/src/base/framebuffer.cc
@@ -122,6 +122,23 @@ FrameBuffer::~FrameBuffer()
{
}
+
+void
+FrameBuffer::serialize(CheckpointOut &cp) const
+{
+ SERIALIZE_SCALAR(_width);
+ SERIALIZE_SCALAR(_height);
+ SERIALIZE_CONTAINER(pixels);
+}
+
+void
+FrameBuffer::unserialize(CheckpointIn &cp)
+{
+ UNSERIALIZE_SCALAR(_width);
+ UNSERIALIZE_SCALAR(_height);
+ UNSERIALIZE_CONTAINER(pixels);
+}
+
void
FrameBuffer::resize(unsigned width, unsigned height)
{
diff --git a/src/base/framebuffer.hh b/src/base/framebuffer.hh
index 457c6d06d..eaac25111 100644
--- a/src/base/framebuffer.hh
+++ b/src/base/framebuffer.hh
@@ -43,9 +43,14 @@
#include <cmath>
#include <cstdint>
+#include <string>
#include <vector>
+#include "base/compiler.hh"
+#include "base/cprintf.hh"
+#include "base/str.hh"
#include "base/types.hh"
+#include "sim/serialize.hh"
/**
* Internal gem5 representation of a Pixel.
@@ -73,7 +78,6 @@ operator==(const Pixel &lhs, const Pixel &rhs)
lhs.padding == rhs.padding;
}
-
/**
* Configurable RGB pixel converter.
*
@@ -208,6 +212,24 @@ class PixelConverter
static const PixelConverter rgb565_be;
};
+inline bool
+to_number(const std::string &value, Pixel &retval)
+{
+ uint32_t num;
+ if (!to_number(value, num))
+ return false;
+
+ retval = PixelConverter::rgba8888_le.toPixel(num);
+ return true;
+}
+
+inline std::ostream &
+operator<<(std::ostream &os, const Pixel &pxl)
+{
+ os << csprintf("0x%.08x", PixelConverter::rgba8888_le.fromPixel(pxl));
+ return os;
+}
+
/**
* Internal gem5 representation of a frame buffer
*
@@ -219,7 +241,7 @@ class PixelConverter
* corner. The backing store is a linear vector of Pixels ordered left
* to right starting in the upper left corner.
*/
-class FrameBuffer
+class FrameBuffer : public Serializable
{
public:
/**
@@ -234,6 +256,9 @@ class FrameBuffer
virtual ~FrameBuffer();
+ void serialize(CheckpointOut &cp) const M5_ATTR_OVERRIDE;
+ void unserialize(CheckpointIn &cp) M5_ATTR_OVERRIDE;
+
/**
* Resize the frame buffer.
*
diff --git a/src/sim/serialize.cc b/src/sim/serialize.cc
index a7c1834cf..b74b4bc9d 100644
--- a/src/sim/serialize.cc
+++ b/src/sim/serialize.cc
@@ -55,6 +55,7 @@
#include <string>
#include <vector>
+#include "base/framebuffer.hh"
#include "base/inifile.hh"
#include "base/misc.hh"
#include "base/output.hh"
@@ -418,6 +419,7 @@ INSTANTIATE_PARAM_TEMPLATES(bool)
INSTANTIATE_PARAM_TEMPLATES(float)
INSTANTIATE_PARAM_TEMPLATES(double)
INSTANTIATE_PARAM_TEMPLATES(string)
+INSTANTIATE_PARAM_TEMPLATES(Pixel)
/////////////////////////////