summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYurii Zubrytskyi <zyy@google.com>2016-10-27 16:59:55 -0700
committerGreg Hartman <ghartman@google.com>2018-08-23 17:24:53 -0700
commit906b2bfce2d42b887da7117b410d3538399fa06e (patch)
tree1bdecb06ef95801fcdee37848b490aa04bee6616
parentc51df0c2bc4016d1670d1b6a424ab0af87429d6f (diff)
downloadopengl-transport-906b2bfce2d42b887da7117b410d3538399fa06e.tar.gz
[gl] Slightly faster checksum calculation
Checksum calculation is something we call on each gl command, so it has to be really fast. This CL gets rid of unneeded memcpy() calls, so it is slightly faster now Change-Id: Ib299580c167be1c94130a4fbda1e81fed88bf3a5
-rw-r--r--distrib/android-emugl/shared/OpenglCodecCommon/ChecksumCalculator.cpp28
-rw-r--r--distrib/android-emugl/shared/OpenglCodecCommon/ChecksumCalculator.h2
2 files changed, 19 insertions, 11 deletions
diff --git a/distrib/android-emugl/shared/OpenglCodecCommon/ChecksumCalculator.cpp b/distrib/android-emugl/shared/OpenglCodecCommon/ChecksumCalculator.cpp
index 60940b896..057e6c668 100644
--- a/distrib/android-emugl/shared/OpenglCodecCommon/ChecksumCalculator.cpp
+++ b/distrib/android-emugl/shared/OpenglCodecCommon/ChecksumCalculator.cpp
@@ -18,6 +18,8 @@
#include <string>
#include <vector>
+
+#include <assert.h>
#include <string.h>
// Checklist when implementing new protocol:
@@ -80,7 +82,7 @@ size_t ChecksumCalculator::checksumByteSize() const {
case 0:
return 0;
case 1:
- return sizeof(uint32_t) + sizeof(m_numWrite);
+ return sizeof(computeV1Checksum()) + sizeof(m_numWrite);
default:
return 0;
}
@@ -120,30 +122,36 @@ void ChecksumCalculator::resetChecksum() {
m_isEncodingChecksum = false;
}
-bool ChecksumCalculator::validate(const void* expectedChecksum, size_t expectedChecksumLen) {
- size_t checksumSize = checksumByteSize();
+bool ChecksumCalculator::validate(const void* expectedChecksum,
+ size_t expectedChecksumLen) {
+ const size_t checksumSize = checksumByteSize();
if (expectedChecksumLen != checksumSize) {
m_numRead++;
resetChecksum();
return false;
}
- // buffers for computing the checksum
- unsigned char sChecksumBuffer[kMaxChecksumSize];
+ bool isValid;
switch (m_version) {
case 1: {
- uint32_t val = computeV1Checksum();
- memcpy(sChecksumBuffer, &val, sizeof(val));
- memcpy(sChecksumBuffer+sizeof(val), &m_numRead, sizeof(m_numRead));
+ const uint32_t val = computeV1Checksum();
+ assert(checksumSize == sizeof(val) + sizeof(m_numRead));
+ isValid = 0 == memcmp(&val, expectedChecksum, sizeof(val)) &&
+ 0 == memcmp(&m_numRead,
+ static_cast<const char*>(expectedChecksum) +
+ sizeof(val),
+ sizeof(m_numRead));
break;
}
+ default:
+ isValid = true; // No checksum is a valid checksum.
+ break;
}
- bool isValid = !memcmp(sChecksumBuffer, expectedChecksum, checksumSize);
m_numRead++;
resetChecksum();
return isValid;
}
-uint32_t ChecksumCalculator::computeV1Checksum() {
+uint32_t ChecksumCalculator::computeV1Checksum() const {
uint32_t revLen = m_v1BufferTotalLength;
revLen = (revLen & 0xffff0000) >> 16 | (revLen & 0x0000ffff) << 16;
revLen = (revLen & 0xff00ff00) >> 8 | (revLen & 0x00ff00ff) << 8;
diff --git a/distrib/android-emugl/shared/OpenglCodecCommon/ChecksumCalculator.h b/distrib/android-emugl/shared/OpenglCodecCommon/ChecksumCalculator.h
index 4cc231a7d..4a1c15c86 100644
--- a/distrib/android-emugl/shared/OpenglCodecCommon/ChecksumCalculator.h
+++ b/distrib/android-emugl/shared/OpenglCodecCommon/ChecksumCalculator.h
@@ -175,7 +175,7 @@ protected:
private:
// Compute a 32bit checksum
// Used in protocol v1
- uint32_t computeV1Checksum();
+ uint32_t computeV1Checksum() const;
// The buffer used in protocol version 1 to compute checksum.
uint32_t m_v1BufferTotalLength = 0;
};