From 96ed3c4607c440eab88d15484c4100c73de730d0 Mon Sep 17 00:00:00 2001 From: Yurii Zubrytskyi Date: Wed, 1 Feb 2017 17:12:03 -0800 Subject: ChecksumCalculator serialization Change-Id: Id135b7e226c0664c3bc2261f0f6b5ab28cb580c6 --- host/libs/virglrenderer/ChecksumCalculator.cpp | 32 +++++++++++++++++++++++++ host/libs/virglrenderer/ChecksumCalculator.h | 10 ++++++-- host/libs/virglrenderer/OpenglRender/IOStream.h | 1 - 3 files changed, 40 insertions(+), 3 deletions(-) (limited to 'host') diff --git a/host/libs/virglrenderer/ChecksumCalculator.cpp b/host/libs/virglrenderer/ChecksumCalculator.cpp index 6a3a38adf..7bd82fc76 100644 --- a/host/libs/virglrenderer/ChecksumCalculator.cpp +++ b/host/libs/virglrenderer/ChecksumCalculator.cpp @@ -16,6 +16,8 @@ #include "ChecksumCalculator.h" +#include "android/base/files/Stream.h" + #include #include @@ -138,3 +140,33 @@ uint32_t ChecksumCalculator::computeV1Checksum() const { revLen = (revLen & 0xaaaaaaaa) >> 1 | (revLen & 0x55555555) << 1; return revLen; } + +void ChecksumCalculator::save(android::base::Stream* stream) { + assert(!m_isEncodingChecksum); + switch (m_version) { + case 1: + assert(m_v1BufferTotalLength == 0); + break; + } + + // Our checksum should never become > 255 bytes. Ever. + assert((uint8_t)m_checksumSize == m_checksumSize); + stream->putByte(m_checksumSize); + stream->putBe32(m_version); + stream->putBe32(m_numRead); + stream->putBe32(m_numWrite); +} + +void ChecksumCalculator::load(android::base::Stream* stream) { + assert(!m_isEncodingChecksum); + switch (m_version) { + case 1: + assert(m_v1BufferTotalLength == 0); + break; + } + + m_checksumSize = stream->getByte(); + m_version = stream->getBe32(); + m_numRead = stream->getBe32(); + m_numWrite = stream->getBe32(); +} diff --git a/host/libs/virglrenderer/ChecksumCalculator.h b/host/libs/virglrenderer/ChecksumCalculator.h index 0cc2f0199..df94403e2 100644 --- a/host/libs/virglrenderer/ChecksumCalculator.h +++ b/host/libs/virglrenderer/ChecksumCalculator.h @@ -29,6 +29,8 @@ #define LOG_CHECKSUMHELPER(x...) #endif +namespace android { namespace base { class Stream; } } + // ChecksumCalculator adds checksum as an array of bytes to GL pipe communication, which // size depends on the protocol version. Each pipe should use one ChecksumCalculator. // It can: @@ -167,7 +169,11 @@ public: // Will reset the list of buffers by calling resetChecksum. bool validate(const void* expectedChecksum, size_t expectedChecksumLen); -protected: + // Snapshot support. + void save(android::base::Stream* stream); + void load(android::base::Stream* stream); + +private: static constexpr size_t kVersion1ChecksumSize = 8; // 2 x uint32_t static_assert(kVersion1ChecksumSize <= kMaxChecksumLength, @@ -185,7 +191,7 @@ protected: uint32_t m_numWrite = 0; // m_isEncodingChecksum is true when between addBuffer and writeChecksum bool m_isEncodingChecksum = false; -private: + // Compute a 32bit checksum // Used in protocol v1 uint32_t computeV1Checksum() const; diff --git a/host/libs/virglrenderer/OpenglRender/IOStream.h b/host/libs/virglrenderer/OpenglRender/IOStream.h index 9d6a6b202..d6ed8d552 100644 --- a/host/libs/virglrenderer/OpenglRender/IOStream.h +++ b/host/libs/virglrenderer/OpenglRender/IOStream.h @@ -30,7 +30,6 @@ protected: ~IOStream() { // NOTE: m_buf was owned by the child class thus we expect it to be // released and flushed before the object destruction. - // TODO(zyy): uncomment this after all GL state is restored on snapshot assert(!m_buf || m_free == m_bufsize); } -- cgit v1.2.3