summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
Diffstat (limited to 'libs')
-rw-r--r--libs/androidfw/AssetManager2.cpp2
-rw-r--r--libs/hwui/DisplayListOps.in3
-rw-r--r--libs/hwui/RecordingCanvas.cpp13
-rw-r--r--libs/hwui/RecordingCanvas.h2
-rw-r--r--libs/hwui/SkiaCanvas.cpp13
-rw-r--r--libs/hwui/SkiaCanvas.h1
-rw-r--r--libs/hwui/hwui/Canvas.h1
-rw-r--r--libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp2
-rw-r--r--libs/hwui/pipeline/skia/SkiaPipeline.cpp2
-rw-r--r--libs/hwui/renderthread/EglManager.cpp3
-rw-r--r--libs/hwui/renderthread/VulkanManager.cpp2
-rw-r--r--libs/hwui/renderthread/VulkanManager.h7
-rw-r--r--libs/hwui/renderthread/VulkanSurface.cpp5
-rw-r--r--libs/hwui/utils/Color.cpp8
-rw-r--r--libs/protoutil/include/android/util/ProtoOutputStream.h3
-rw-r--r--libs/protoutil/src/ProtoFileReader.cpp2
-rw-r--r--libs/protoutil/src/ProtoOutputStream.cpp33
-rw-r--r--libs/protoutil/tests/EncodedBuffer_test.cpp122
-rw-r--r--libs/protoutil/tests/ProtoOutputStream_test.cpp132
19 files changed, 266 insertions, 90 deletions
diff --git a/libs/androidfw/AssetManager2.cpp b/libs/androidfw/AssetManager2.cpp
index 1b515ad41e68..d20aecaaf0f6 100644
--- a/libs/androidfw/AssetManager2.cpp
+++ b/libs/androidfw/AssetManager2.cpp
@@ -778,8 +778,6 @@ const ResolvedBag* AssetManager2::GetBag(uint32_t resid) {
}
const ResolvedBag* AssetManager2::GetBag(uint32_t resid, std::vector<uint32_t>& child_resids) {
- ATRACE_NAME("AssetManager::GetBag");
-
auto cached_iter = cached_bags_.find(resid);
if (cached_iter != cached_bags_.end()) {
return cached_iter->second.get();
diff --git a/libs/hwui/DisplayListOps.in b/libs/hwui/DisplayListOps.in
index 14e3a32817a0..2deb5657c877 100644
--- a/libs/hwui/DisplayListOps.in
+++ b/libs/hwui/DisplayListOps.in
@@ -26,7 +26,8 @@ X(ClipPath)
X(ClipRect)
X(ClipRRect)
X(ClipRegion)
-X(DrawPaint)
+X(DrawPaint)
+X(DrawBehind)
X(DrawPath)
X(DrawRect)
X(DrawRegion)
diff --git a/libs/hwui/RecordingCanvas.cpp b/libs/hwui/RecordingCanvas.cpp
index 85947665839a..e58fbbe8e667 100644
--- a/libs/hwui/RecordingCanvas.cpp
+++ b/libs/hwui/RecordingCanvas.cpp
@@ -20,6 +20,7 @@
#include "SkAndroidFrameworkUtils.h"
#include "SkCanvas.h"
+#include "SkCanvasPriv.h"
#include "SkData.h"
#include "SkDrawShadowInfo.h"
#include "SkImage.h"
@@ -187,6 +188,12 @@ struct DrawPaint final : Op {
SkPaint paint;
void draw(SkCanvas* c, const SkMatrix&) const { c->drawPaint(paint); }
};
+struct DrawBehind final : Op {
+ static const auto kType = Type::DrawBehind;
+ DrawBehind(const SkPaint& paint) : paint(paint) {}
+ SkPaint paint;
+ void draw(SkCanvas* c, const SkMatrix&) const { SkCanvasPriv::DrawBehind(c, paint); }
+};
struct DrawPath final : Op {
static const auto kType = Type::DrawPath;
DrawPath(const SkPath& path, const SkPaint& paint) : path(path), paint(paint) {}
@@ -565,6 +572,9 @@ void DisplayListData::clipRegion(const SkRegion& region, SkClipOp op) {
void DisplayListData::drawPaint(const SkPaint& paint) {
this->push<DrawPaint>(0, paint);
}
+void DisplayListData::drawBehind(const SkPaint& paint) {
+ this->push<DrawBehind>(0, paint);
+}
void DisplayListData::drawPath(const SkPath& path, const SkPaint& paint) {
this->push<DrawPath>(0, path, paint);
}
@@ -834,6 +844,9 @@ void RecordingCanvas::onClipRegion(const SkRegion& region, SkClipOp op) {
void RecordingCanvas::onDrawPaint(const SkPaint& paint) {
fDL->drawPaint(paint);
}
+void RecordingCanvas::onDrawBehind(const SkPaint& paint) {
+ fDL->drawBehind(paint);
+}
void RecordingCanvas::onDrawPath(const SkPath& path, const SkPaint& paint) {
fDL->drawPath(path, paint);
}
diff --git a/libs/hwui/RecordingCanvas.h b/libs/hwui/RecordingCanvas.h
index 3a76ca1137a5..7269bcad3d7a 100644
--- a/libs/hwui/RecordingCanvas.h
+++ b/libs/hwui/RecordingCanvas.h
@@ -89,6 +89,7 @@ private:
void clipRegion(const SkRegion&, SkClipOp);
void drawPaint(const SkPaint&);
+ void drawBehind(const SkPaint&);
void drawPath(const SkPath&, const SkPaint&);
void drawRect(const SkRect&, const SkPaint&);
void drawRegion(const SkRegion&, const SkPaint&);
@@ -157,6 +158,7 @@ public:
void onClipRegion(const SkRegion&, SkClipOp) override;
void onDrawPaint(const SkPaint&) override;
+ void onDrawBehind(const SkPaint&) override;
void onDrawPath(const SkPath&, const SkPaint&) override;
void onDrawRect(const SkRect&, const SkPaint&) override;
void onDrawRegion(const SkRegion&, const SkPaint&) override;
diff --git a/libs/hwui/SkiaCanvas.cpp b/libs/hwui/SkiaCanvas.cpp
index f328a5399cbb..bebda8527def 100644
--- a/libs/hwui/SkiaCanvas.cpp
+++ b/libs/hwui/SkiaCanvas.cpp
@@ -26,6 +26,7 @@
#include <SkAndroidFrameworkUtils.h>
#include <SkAnimatedImage.h>
+#include <SkCanvasPriv.h>
#include <SkCanvasStateUtils.h>
#include <SkColorFilter.h>
#include <SkDeque.h>
@@ -191,6 +192,18 @@ int SkiaCanvas::saveUnclippedLayer(int left, int top, int right, int bottom) {
return SkAndroidFrameworkUtils::SaveBehind(mCanvas, &bounds);
}
+void SkiaCanvas::restoreUnclippedLayer(int restoreCount, const SkPaint& paint) {
+
+ while (mCanvas->getSaveCount() > restoreCount + 1) {
+ this->restore();
+ }
+
+ if (mCanvas->getSaveCount() == restoreCount + 1) {
+ SkCanvasPriv::DrawBehind(mCanvas, *filterPaint(paint));
+ this->restore();
+ }
+}
+
class SkiaCanvas::Clip {
public:
Clip(const SkRect& rect, SkClipOp op, const SkMatrix& m)
diff --git a/libs/hwui/SkiaCanvas.h b/libs/hwui/SkiaCanvas.h
index 3fe2bce06b41..bbe91eb2fbc4 100644
--- a/libs/hwui/SkiaCanvas.h
+++ b/libs/hwui/SkiaCanvas.h
@@ -69,6 +69,7 @@ public:
virtual int save(SaveFlags::Flags flags) override;
virtual void restore() override;
virtual void restoreToCount(int saveCount) override;
+ virtual void restoreUnclippedLayer(int saveCount, const SkPaint& paint) override;
virtual int saveLayer(float left, float top, float right, float bottom, const SkPaint* paint,
SaveFlags::Flags flags) override;
diff --git a/libs/hwui/hwui/Canvas.h b/libs/hwui/hwui/Canvas.h
index 11e8579a481f..ac8db216b059 100644
--- a/libs/hwui/hwui/Canvas.h
+++ b/libs/hwui/hwui/Canvas.h
@@ -191,6 +191,7 @@ public:
virtual int save(SaveFlags::Flags flags) = 0;
virtual void restore() = 0;
virtual void restoreToCount(int saveCount) = 0;
+ virtual void restoreUnclippedLayer(int saveCount, const SkPaint& paint) = 0;
virtual int saveLayer(float left, float top, float right, float bottom, const SkPaint* paint,
SaveFlags::Flags flags) = 0;
diff --git a/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp b/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp
index 9248eadbd0ef..8092b1d10659 100644
--- a/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp
+++ b/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp
@@ -166,8 +166,6 @@ static void setBufferCount(ANativeWindow* window, uint32_t extraBuffers) {
auto min_undequeued_buffers = static_cast<uint32_t>(query_value);
int bufferCount = min_undequeued_buffers + 2 + extraBuffers;
- ALOGD("Setting buffer count to %d, min_undequeued %u, extraBuffers %u",
- bufferCount, min_undequeued_buffers, extraBuffers);
native_window_set_buffer_count(window, bufferCount);
}
diff --git a/libs/hwui/pipeline/skia/SkiaPipeline.cpp b/libs/hwui/pipeline/skia/SkiaPipeline.cpp
index ccc1701dcc0b..1f9ab5a242b4 100644
--- a/libs/hwui/pipeline/skia/SkiaPipeline.cpp
+++ b/libs/hwui/pipeline/skia/SkiaPipeline.cpp
@@ -176,7 +176,7 @@ bool SkiaPipeline::createOrUpdateLayer(RenderNode* node, const DamageAccumulator
// position
Matrix4 windowTransform;
damageAccumulator.computeCurrentTransform(&windowTransform);
- node->getSkiaLayer()->inverseTransformInWindow = windowTransform;
+ node->getSkiaLayer()->inverseTransformInWindow.loadInverse(windowTransform);
} else {
String8 cachesOutput;
mRenderThread.cacheManager().dumpMemoryUsage(cachesOutput,
diff --git a/libs/hwui/renderthread/EglManager.cpp b/libs/hwui/renderthread/EglManager.cpp
index 1d553342415c..159cf497384a 100644
--- a/libs/hwui/renderthread/EglManager.cpp
+++ b/libs/hwui/renderthread/EglManager.cpp
@@ -235,8 +235,6 @@ bool EglManager::hasEglContext() {
}
void EglManager::loadConfigs() {
- ALOGD("Swap behavior %d", static_cast<int>(mSwapBehavior));
-
// Note: The default pixel format is RGBA_8888, when other formats are
// available, we should check the target pixel format and configure the
// attributes list properly.
@@ -246,7 +244,6 @@ void EglManager::loadConfigs() {
// Try again without dirty regions enabled
ALOGW("Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without...");
mSwapBehavior = SwapBehavior::Discard;
- ALOGD("Swap behavior %d", static_cast<int>(mSwapBehavior));
mEglConfig = load8BitsConfig(mEglDisplay, mSwapBehavior);
} else {
// Failed to get a valid config
diff --git a/libs/hwui/renderthread/VulkanManager.cpp b/libs/hwui/renderthread/VulkanManager.cpp
index 62fd48940870..5173f638068d 100644
--- a/libs/hwui/renderthread/VulkanManager.cpp
+++ b/libs/hwui/renderthread/VulkanManager.cpp
@@ -167,8 +167,6 @@ void VulkanManager::setupDevice(GrVkExtensions& grExtensions, VkPhysicalDeviceFe
LOG_ALWAYS_FATAL_IF(physDeviceProperties.apiVersion < VK_MAKE_VERSION(1, 1, 0));
mDriverVersion = physDeviceProperties.driverVersion;
- mIsQualcomm = physDeviceProperties.vendorID == 20803;
-
// query to get the initial queue props size
uint32_t queueCount;
mGetPhysicalDeviceQueueFamilyProperties(mPhysicalDevice, &queueCount, nullptr);
diff --git a/libs/hwui/renderthread/VulkanManager.h b/libs/hwui/renderthread/VulkanManager.h
index 31de8030c4c1..dd3c6d0dba81 100644
--- a/libs/hwui/renderthread/VulkanManager.h
+++ b/libs/hwui/renderthread/VulkanManager.h
@@ -179,13 +179,6 @@ private:
SwapBehavior mSwapBehavior = SwapBehavior::Discard;
GrVkExtensions mExtensions;
uint32_t mDriverVersion = 0;
-
- // TODO: Remove once fix has landed. Temporaryly needed for workaround for setting up AHB
- // surfaces on Qualcomm. Currently if you don't use VkSwapchain Qualcomm is not setting
- // reporting that we need to use one of their private vendor usage bits which greatly effects
- // performance if it is not used.
- bool mIsQualcomm = false;
- bool isQualcomm() const { return mIsQualcomm; }
};
} /* namespace renderthread */
diff --git a/libs/hwui/renderthread/VulkanSurface.cpp b/libs/hwui/renderthread/VulkanSurface.cpp
index df6b9ed2cdcb..b2cc23e76b8a 100644
--- a/libs/hwui/renderthread/VulkanSurface.cpp
+++ b/libs/hwui/renderthread/VulkanSurface.cpp
@@ -297,11 +297,6 @@ VulkanSurface* VulkanSurface::Create(ANativeWindow* window, ColorMode colorMode,
native_window_get_consumer_usage(window, &consumerUsage);
windowInfo.windowUsageFlags = consumerUsage | hwbUsage.androidHardwareBufferUsage;
- if (vkManager.isQualcomm()) {
- windowInfo.windowUsageFlags =
- windowInfo.windowUsageFlags | AHARDWAREBUFFER_USAGE_VENDOR_0;
- }
-
/*
* Now we attempt to modify the window!
*/
diff --git a/libs/hwui/utils/Color.cpp b/libs/hwui/utils/Color.cpp
index 39740bd46f9f..cc7725b7b9de 100644
--- a/libs/hwui/utils/Color.cpp
+++ b/libs/hwui/utils/Color.cpp
@@ -40,7 +40,7 @@ android::PixelFormat ColorTypeToPixelFormat(SkColorType colorType) {
case kARGB_4444_SkColorType:
return PIXEL_FORMAT_RGBA_4444;
default:
- ALOGW("Unsupported colorType: %d, return RGBA_8888 by default", (int)colorType);
+ ALOGV("Unsupported colorType: %d, return RGBA_8888 by default", (int)colorType);
return PIXEL_FORMAT_RGBA_8888;
}
}
@@ -54,7 +54,7 @@ SkColorType PixelFormatToColorType(android::PixelFormat format) {
case PIXEL_FORMAT_RGBA_1010102: return kRGBA_1010102_SkColorType;
case PIXEL_FORMAT_RGBA_4444: return kARGB_4444_SkColorType;
default:
- ALOGW("Unsupported PixelFormat: %d, return kUnknown_SkColorType by default", format);
+ ALOGV("Unsupported PixelFormat: %d, return kUnknown_SkColorType by default", format);
return kUnknown_SkColorType;
}
}
@@ -88,7 +88,7 @@ sk_sp<SkColorSpace> DataSpaceToColorSpace(android_dataspace dataspace) {
case HAL_DATASPACE_STANDARD_BT470M:
case HAL_DATASPACE_STANDARD_FILM:
default:
- ALOGW("Unsupported Gamut: %d", dataspace);
+ ALOGV("Unsupported Gamut: %d", dataspace);
return nullptr;
}
@@ -109,7 +109,7 @@ sk_sp<SkColorSpace> DataSpaceToColorSpace(android_dataspace dataspace) {
case HAL_DATASPACE_TRANSFER_ST2084:
case HAL_DATASPACE_TRANSFER_HLG:
default:
- ALOGW("Unsupported Gamma: %d", dataspace);
+ ALOGV("Unsupported Gamma: %d", dataspace);
return nullptr;
}
}
diff --git a/libs/protoutil/include/android/util/ProtoOutputStream.h b/libs/protoutil/include/android/util/ProtoOutputStream.h
index 360e8d3e8c71..a6af4757a140 100644
--- a/libs/protoutil/include/android/util/ProtoOutputStream.h
+++ b/libs/protoutil/include/android/util/ProtoOutputStream.h
@@ -19,6 +19,7 @@
#include <cstdint>
#include <string>
+#include <vector>
#include <android/util/EncodedBuffer.h>
@@ -123,6 +124,8 @@ public:
size_t size(); // Get the size of the serialized protobuf.
sp<ProtoReader> data(); // Get the reader apis of the data.
bool flush(int fd); // Flush data directly to a file descriptor.
+ bool serializeToString(std::string* out); // Serializes the proto to a string.
+ bool serializeToVector(std::vector<uint8_t>* out); // Serializes the proto to a vector<uint8_t>.
/**
* Clears the ProtoOutputStream so the buffer can be reused instead of deallocation/allocation again.
diff --git a/libs/protoutil/src/ProtoFileReader.cpp b/libs/protoutil/src/ProtoFileReader.cpp
index c7f1129fbbaa..bbb1fe374f0e 100644
--- a/libs/protoutil/src/ProtoFileReader.cpp
+++ b/libs/protoutil/src/ProtoFileReader.cpp
@@ -99,7 +99,6 @@ ProtoFileReader::next()
// Shouldn't get to here. Always call hasNext() before calling next().
return 0;
}
- mPos++;
return mBuffer[mOffset++];
}
@@ -131,7 +130,6 @@ ProtoFileReader::move(size_t amt)
const size_t chunk =
mMaxOffset - mOffset > amt ? amt : mMaxOffset - mOffset;
mOffset += chunk;
- mPos += chunk;
amt -= chunk;
}
}
diff --git a/libs/protoutil/src/ProtoOutputStream.cpp b/libs/protoutil/src/ProtoOutputStream.cpp
index ccbb83b2d342..6cfa357b580b 100644
--- a/libs/protoutil/src/ProtoOutputStream.cpp
+++ b/libs/protoutil/src/ProtoOutputStream.cpp
@@ -448,6 +448,39 @@ ProtoOutputStream::flush(int fd)
return true;
}
+bool
+ProtoOutputStream::serializeToString(std::string* out)
+{
+ if (out == nullptr) return false;
+ if (!compact()) return false;
+
+ sp<ProtoReader> reader = mBuffer->read();
+ out->reserve(reader->size());
+ while (reader->hasNext()) {
+ out->append(static_cast<const char*>(static_cast<const void*>(reader->readBuffer())),
+ reader->currentToRead());
+ reader->move(reader->currentToRead());
+ }
+ return true;
+}
+
+bool
+ProtoOutputStream::serializeToVector(std::vector<uint8_t>* out)
+{
+ if (out == nullptr) return false;
+ if (!compact()) return false;
+
+ sp<ProtoReader> reader = mBuffer->read();
+ out->reserve(reader->size());
+ while (reader->hasNext()) {
+ const uint8_t* buf = reader->readBuffer();
+ size_t size = reader->currentToRead();
+ out->insert(out->end(), buf, buf + size);
+ reader->move(size);
+ }
+ return true;
+}
+
sp<ProtoReader>
ProtoOutputStream::data()
{
diff --git a/libs/protoutil/tests/EncodedBuffer_test.cpp b/libs/protoutil/tests/EncodedBuffer_test.cpp
index 398af609c083..f895154c4983 100644
--- a/libs/protoutil/tests/EncodedBuffer_test.cpp
+++ b/libs/protoutil/tests/EncodedBuffer_test.cpp
@@ -29,101 +29,101 @@ static void expectPointer(EncodedBuffer::Pointer* p, size_t pos) {
}
TEST(EncodedBufferTest, WriteSimple) {
- EncodedBuffer buffer(TEST_CHUNK_SIZE);
- EXPECT_EQ(buffer.size(), 0UL);
- expectPointer(buffer.wp(), 0);
- EXPECT_EQ(buffer.currentToWrite(), TEST_CHUNK_SIZE);
+ sp<EncodedBuffer> buffer = new EncodedBuffer(TEST_CHUNK_SIZE);
+ EXPECT_EQ(buffer->size(), 0UL);
+ expectPointer(buffer->wp(), 0);
+ EXPECT_EQ(buffer->currentToWrite(), TEST_CHUNK_SIZE);
for (size_t i = 0; i < TEST_CHUNK_HALF_SIZE; i++) {
- buffer.writeRawByte(50 + i);
+ buffer->writeRawByte(50 + i);
}
- EXPECT_EQ(buffer.size(), TEST_CHUNK_HALF_SIZE);
- expectPointer(buffer.wp(), TEST_CHUNK_HALF_SIZE);
- EXPECT_EQ(buffer.currentToWrite(), TEST_CHUNK_HALF_SIZE);
+ EXPECT_EQ(buffer->size(), TEST_CHUNK_HALF_SIZE);
+ expectPointer(buffer->wp(), TEST_CHUNK_HALF_SIZE);
+ EXPECT_EQ(buffer->currentToWrite(), TEST_CHUNK_HALF_SIZE);
for (size_t i = 0; i < TEST_CHUNK_SIZE; i++) {
- buffer.writeRawByte(80 + i);
+ buffer->writeRawByte(80 + i);
}
- EXPECT_EQ(buffer.size(), TEST_CHUNK_SIZE + TEST_CHUNK_HALF_SIZE);
- expectPointer(buffer.wp(), TEST_CHUNK_SIZE + TEST_CHUNK_HALF_SIZE);
- EXPECT_EQ(buffer.currentToWrite(), TEST_CHUNK_HALF_SIZE);
+ EXPECT_EQ(buffer->size(), TEST_CHUNK_SIZE + TEST_CHUNK_HALF_SIZE);
+ expectPointer(buffer->wp(), TEST_CHUNK_SIZE + TEST_CHUNK_HALF_SIZE);
+ EXPECT_EQ(buffer->currentToWrite(), TEST_CHUNK_HALF_SIZE);
// verifies the buffer's data
- expectPointer(buffer.ep(), 0);
+ expectPointer(buffer->ep(), 0);
for (size_t i = 0; i < TEST_CHUNK_HALF_SIZE; i++) {
- EXPECT_EQ(buffer.readRawByte(), 50 + i);
+ EXPECT_EQ(buffer->readRawByte(), 50 + i);
}
for (size_t i = 0; i < TEST_CHUNK_SIZE; i++) {
- EXPECT_EQ(buffer.readRawByte(), 80 + i);
+ EXPECT_EQ(buffer->readRawByte(), 80 + i);
}
// clears the buffer
- buffer.clear();
- EXPECT_EQ(buffer.size(), 0UL);
- expectPointer(buffer.wp(), 0);
+ buffer->clear();
+ EXPECT_EQ(buffer->size(), 0UL);
+ expectPointer(buffer->wp(), 0);
}
TEST(EncodedBufferTest, WriteVarint) {
- EncodedBuffer buffer(TEST_CHUNK_SIZE);
+ sp<EncodedBuffer> buffer = new EncodedBuffer(TEST_CHUNK_SIZE);
size_t expected_buffer_size = 0;
- EXPECT_EQ(buffer.writeRawVarint32(13), 1);
+ EXPECT_EQ(buffer->writeRawVarint32(13), 1);
expected_buffer_size += 1;
- EXPECT_EQ(buffer.size(), expected_buffer_size);
- EXPECT_EQ(buffer.writeRawVarint32(UINT32_C(-1)), 5);
+ EXPECT_EQ(buffer->size(), expected_buffer_size);
+ EXPECT_EQ(buffer->writeRawVarint32(UINT32_C(-1)), 5);
expected_buffer_size += 5;
- EXPECT_EQ(buffer.size(), expected_buffer_size);
+ EXPECT_EQ(buffer->size(), expected_buffer_size);
- EXPECT_EQ(buffer.writeRawVarint64(200), 2);
+ EXPECT_EQ(buffer->writeRawVarint64(200), 2);
expected_buffer_size += 2;
- EXPECT_EQ(buffer.size(), expected_buffer_size);
- EXPECT_EQ(buffer.writeRawVarint64(UINT64_C(-1)), 10);
+ EXPECT_EQ(buffer->size(), expected_buffer_size);
+ EXPECT_EQ(buffer->writeRawVarint64(UINT64_C(-1)), 10);
expected_buffer_size += 10;
- EXPECT_EQ(buffer.size(), expected_buffer_size);
+ EXPECT_EQ(buffer->size(), expected_buffer_size);
- buffer.writeRawFixed32(UINT32_C(-1));
+ buffer->writeRawFixed32(UINT32_C(-1));
expected_buffer_size += 4;
- EXPECT_EQ(buffer.size(), expected_buffer_size);
- buffer.writeRawFixed64(UINT64_C(-1));
+ EXPECT_EQ(buffer->size(), expected_buffer_size);
+ buffer->writeRawFixed64(UINT64_C(-1));
expected_buffer_size += 8;
- EXPECT_EQ(buffer.size(), expected_buffer_size);
+ EXPECT_EQ(buffer->size(), expected_buffer_size);
- EXPECT_EQ(buffer.writeHeader(32, 2), 2);
+ EXPECT_EQ(buffer->writeHeader(32, 2), 2);
expected_buffer_size += 2;
- EXPECT_EQ(buffer.size(), expected_buffer_size);
+ EXPECT_EQ(buffer->size(), expected_buffer_size);
// verify data are correctly written to the buffer.
- expectPointer(buffer.ep(), 0);
- EXPECT_EQ(buffer.readRawVarint(), UINT32_C(13));
- EXPECT_EQ(buffer.readRawVarint(), UINT32_C(-1));
- EXPECT_EQ(buffer.readRawVarint(), UINT64_C(200));
- EXPECT_EQ(buffer.readRawVarint(), UINT64_C(-1));
- EXPECT_EQ(buffer.readRawFixed32(), UINT32_C(-1));
- EXPECT_EQ(buffer.readRawFixed64(), UINT64_C(-1));
- EXPECT_EQ(buffer.readRawVarint(), UINT64_C((32 << 3) + 2));
- expectPointer(buffer.ep(), expected_buffer_size);
+ expectPointer(buffer->ep(), 0);
+ EXPECT_EQ(buffer->readRawVarint(), UINT32_C(13));
+ EXPECT_EQ(buffer->readRawVarint(), UINT32_C(-1));
+ EXPECT_EQ(buffer->readRawVarint(), UINT64_C(200));
+ EXPECT_EQ(buffer->readRawVarint(), UINT64_C(-1));
+ EXPECT_EQ(buffer->readRawFixed32(), UINT32_C(-1));
+ EXPECT_EQ(buffer->readRawFixed64(), UINT64_C(-1));
+ EXPECT_EQ(buffer->readRawVarint(), UINT64_C((32 << 3) + 2));
+ expectPointer(buffer->ep(), expected_buffer_size);
}
TEST(EncodedBufferTest, Edit) {
- EncodedBuffer buffer(TEST_CHUNK_SIZE);
- buffer.writeRawFixed64(0xdeadbeefdeadbeef);
- EXPECT_EQ(buffer.readRawFixed64(), UINT64_C(0xdeadbeefdeadbeef));
+ sp<EncodedBuffer> buffer = new EncodedBuffer(TEST_CHUNK_SIZE);
+ buffer->writeRawFixed64(0xdeadbeefdeadbeef);
+ EXPECT_EQ(buffer->readRawFixed64(), UINT64_C(0xdeadbeefdeadbeef));
- buffer.editRawFixed32(4, 0x12345678);
+ buffer->editRawFixed32(4, 0x12345678);
// fixed 64 is little endian order.
- buffer.ep()->rewind(); // rewind ep for readRawFixed64 from 0
- EXPECT_EQ(buffer.readRawFixed64(), UINT64_C(0x12345678deadbeef));
-
- buffer.wp()->rewind();
- expectPointer(buffer.wp(), 0);
- buffer.copy(4, 3);
- buffer.ep()->rewind(); // rewind ep for readRawFixed64 from 0
- EXPECT_EQ(buffer.readRawFixed64(), UINT64_C(0x12345678de345678));
+ buffer->ep()->rewind(); // rewind ep for readRawFixed64 from 0
+ EXPECT_EQ(buffer->readRawFixed64(), UINT64_C(0x12345678deadbeef));
+
+ buffer->wp()->rewind();
+ expectPointer(buffer->wp(), 0);
+ buffer->copy(4, 3);
+ buffer->ep()->rewind(); // rewind ep for readRawFixed64 from 0
+ EXPECT_EQ(buffer->readRawFixed64(), UINT64_C(0x12345678de345678));
}
TEST(EncodedBufferTest, ReadSimple) {
- EncodedBuffer buffer(TEST_CHUNK_SIZE);
+ sp<EncodedBuffer> buffer = new EncodedBuffer(TEST_CHUNK_SIZE);
for (size_t i = 0; i < TEST_CHUNK_3X_SIZE; i++) {
- buffer.writeRawByte(i);
+ buffer->writeRawByte(i);
}
- sp<ProtoReader> reader1 = buffer.read();
+ sp<ProtoReader> reader1 = buffer->read();
EXPECT_EQ(reader1->size(), TEST_CHUNK_3X_SIZE);
EXPECT_EQ(reader1->bytesRead(), 0);
@@ -132,7 +132,7 @@ TEST(EncodedBufferTest, ReadSimple) {
}
EXPECT_EQ(reader1->bytesRead(), TEST_CHUNK_3X_SIZE);
- sp<ProtoReader> reader2 = buffer.read();
+ sp<ProtoReader> reader2 = buffer->read();
uint8_t val = 0;
while (reader2->hasNext()) {
EXPECT_EQ(reader2->next(), val);
@@ -143,10 +143,10 @@ TEST(EncodedBufferTest, ReadSimple) {
}
TEST(EncodedBufferTest, ReadVarint) {
- EncodedBuffer buffer;
+ sp<EncodedBuffer> buffer = new EncodedBuffer();
uint64_t val = UINT64_C(1522865904593);
- size_t len = buffer.writeRawVarint64(val);
- sp<ProtoReader> reader = buffer.read();
+ size_t len = buffer->writeRawVarint64(val);
+ sp<ProtoReader> reader = buffer->read();
EXPECT_EQ(reader->size(), len);
EXPECT_EQ(reader->readRawVarint(), val);
}
diff --git a/libs/protoutil/tests/ProtoOutputStream_test.cpp b/libs/protoutil/tests/ProtoOutputStream_test.cpp
index 9d357f3c3363..9b768b73d22b 100644
--- a/libs/protoutil/tests/ProtoOutputStream_test.cpp
+++ b/libs/protoutil/tests/ProtoOutputStream_test.cpp
@@ -88,6 +88,97 @@ TEST(ProtoOutputStreamTest, Primitives) {
EXPECT_EQ(primitives.val_enum(), PrimitiveProto_Count_TWO);
}
+TEST(ProtoOutputStreamTest, SerializeToStringPrimitives) {
+ std::string s = "hello";
+ const char b[5] = { 'a', 'p', 'p', 'l', 'e' };
+
+ ProtoOutputStream proto;
+ EXPECT_TRUE(proto.write(FIELD_TYPE_INT32 | PrimitiveProto::kValInt32FieldNumber, 123));
+ EXPECT_TRUE(proto.write(FIELD_TYPE_INT64 | PrimitiveProto::kValInt64FieldNumber, -1LL));
+ EXPECT_TRUE(proto.write(FIELD_TYPE_FLOAT | PrimitiveProto::kValFloatFieldNumber, -23.5f));
+ EXPECT_TRUE(proto.write(FIELD_TYPE_DOUBLE | PrimitiveProto::kValDoubleFieldNumber, 324.5));
+ EXPECT_TRUE(proto.write(FIELD_TYPE_UINT32 | PrimitiveProto::kValUint32FieldNumber, 3424));
+ EXPECT_TRUE(proto.write(FIELD_TYPE_UINT64 | PrimitiveProto::kValUint64FieldNumber, 57LL));
+ EXPECT_TRUE(proto.write(FIELD_TYPE_FIXED32 | PrimitiveProto::kValFixed32FieldNumber, -20));
+ EXPECT_TRUE(proto.write(FIELD_TYPE_FIXED64 | PrimitiveProto::kValFixed64FieldNumber, -37LL));
+ EXPECT_TRUE(proto.write(FIELD_TYPE_BOOL | PrimitiveProto::kValBoolFieldNumber, true));
+ EXPECT_TRUE(proto.write(FIELD_TYPE_STRING | PrimitiveProto::kValStringFieldNumber, s));
+ EXPECT_TRUE(proto.write(FIELD_TYPE_BYTES | PrimitiveProto::kValBytesFieldNumber, b, 5));
+ EXPECT_TRUE(proto.write(FIELD_TYPE_SFIXED32 | PrimitiveProto::kValSfixed32FieldNumber, 63));
+ EXPECT_TRUE(proto.write(FIELD_TYPE_SFIXED64 | PrimitiveProto::kValSfixed64FieldNumber, -54));
+ EXPECT_TRUE(proto.write(FIELD_TYPE_SINT32 | PrimitiveProto::kValSint32FieldNumber, -533));
+ EXPECT_TRUE(proto.write(FIELD_TYPE_SINT64 | PrimitiveProto::kValSint64FieldNumber, -61224762453LL));
+ EXPECT_TRUE(proto.write(FIELD_TYPE_ENUM | PrimitiveProto::kValEnumFieldNumber, 2));
+
+ PrimitiveProto primitives;
+ std::string serialized;
+ ASSERT_TRUE(proto.serializeToString(&serialized));
+ ASSERT_TRUE(primitives.ParseFromString(serialized));
+ EXPECT_EQ(primitives.val_int32(), 123);
+ EXPECT_EQ(primitives.val_int64(), -1);
+ EXPECT_EQ(primitives.val_float(), -23.5f);
+ EXPECT_EQ(primitives.val_double(), 324.5f);
+ EXPECT_EQ(primitives.val_uint32(), 3424);
+ EXPECT_EQ(primitives.val_uint64(), 57);
+ EXPECT_EQ(primitives.val_fixed32(), -20);
+ EXPECT_EQ(primitives.val_fixed64(), -37);
+ EXPECT_EQ(primitives.val_bool(), true);
+ EXPECT_THAT(primitives.val_string(), StrEq(s.c_str()));
+ EXPECT_THAT(primitives.val_bytes(), StrEq("apple"));
+ EXPECT_EQ(primitives.val_sfixed32(), 63);
+ EXPECT_EQ(primitives.val_sfixed64(), -54);
+ EXPECT_EQ(primitives.val_sint32(), -533);
+ EXPECT_EQ(primitives.val_sint64(), -61224762453LL);
+ EXPECT_EQ(primitives.val_enum(), PrimitiveProto_Count_TWO);
+}
+
+TEST(ProtoOutputStreamTest, SerializeToVectorPrimitives) {
+ std::string s = "hello";
+ const char b[5] = { 'a', 'p', 'p', 'l', 'e' };
+
+ ProtoOutputStream proto;
+ EXPECT_TRUE(proto.write(FIELD_TYPE_INT32 | PrimitiveProto::kValInt32FieldNumber, 123));
+ EXPECT_TRUE(proto.write(FIELD_TYPE_INT64 | PrimitiveProto::kValInt64FieldNumber, -1LL));
+ EXPECT_TRUE(proto.write(FIELD_TYPE_FLOAT | PrimitiveProto::kValFloatFieldNumber, -23.5f));
+ EXPECT_TRUE(proto.write(FIELD_TYPE_DOUBLE | PrimitiveProto::kValDoubleFieldNumber, 324.5));
+ EXPECT_TRUE(proto.write(FIELD_TYPE_UINT32 | PrimitiveProto::kValUint32FieldNumber, 3424));
+ EXPECT_TRUE(proto.write(FIELD_TYPE_UINT64 | PrimitiveProto::kValUint64FieldNumber, 57LL));
+ EXPECT_TRUE(proto.write(FIELD_TYPE_FIXED32 | PrimitiveProto::kValFixed32FieldNumber, -20));
+ EXPECT_TRUE(proto.write(FIELD_TYPE_FIXED64 | PrimitiveProto::kValFixed64FieldNumber, -37LL));
+ EXPECT_TRUE(proto.write(FIELD_TYPE_BOOL | PrimitiveProto::kValBoolFieldNumber, true));
+ EXPECT_TRUE(proto.write(FIELD_TYPE_STRING | PrimitiveProto::kValStringFieldNumber, s));
+ EXPECT_TRUE(proto.write(FIELD_TYPE_BYTES | PrimitiveProto::kValBytesFieldNumber, b, 5));
+ EXPECT_TRUE(proto.write(FIELD_TYPE_SFIXED32 | PrimitiveProto::kValSfixed32FieldNumber, 63));
+ EXPECT_TRUE(proto.write(FIELD_TYPE_SFIXED64 | PrimitiveProto::kValSfixed64FieldNumber, -54));
+ EXPECT_TRUE(proto.write(FIELD_TYPE_SINT32 | PrimitiveProto::kValSint32FieldNumber, -533));
+ EXPECT_TRUE(proto.write(FIELD_TYPE_SINT64 | PrimitiveProto::kValSint64FieldNumber, -61224762453LL));
+ EXPECT_TRUE(proto.write(FIELD_TYPE_ENUM | PrimitiveProto::kValEnumFieldNumber, 2));
+
+ PrimitiveProto primitives;
+ std::vector<uint8_t> vec;
+ ASSERT_TRUE(proto.serializeToVector(&vec));
+
+ std::string serialized(vec.data(), vec.data() + vec.size());
+ ASSERT_TRUE(primitives.ParseFromString(serialized));
+
+ EXPECT_EQ(primitives.val_int32(), 123);
+ EXPECT_EQ(primitives.val_int64(), -1);
+ EXPECT_EQ(primitives.val_float(), -23.5f);
+ EXPECT_EQ(primitives.val_double(), 324.5f);
+ EXPECT_EQ(primitives.val_uint32(), 3424);
+ EXPECT_EQ(primitives.val_uint64(), 57);
+ EXPECT_EQ(primitives.val_fixed32(), -20);
+ EXPECT_EQ(primitives.val_fixed64(), -37);
+ EXPECT_EQ(primitives.val_bool(), true);
+ EXPECT_THAT(primitives.val_string(), StrEq(s.c_str()));
+ EXPECT_THAT(primitives.val_bytes(), StrEq("apple"));
+ EXPECT_EQ(primitives.val_sfixed32(), 63);
+ EXPECT_EQ(primitives.val_sfixed64(), -54);
+ EXPECT_EQ(primitives.val_sint32(), -533);
+ EXPECT_EQ(primitives.val_sint64(), -61224762453LL);
+ EXPECT_EQ(primitives.val_enum(), PrimitiveProto_Count_TWO);
+}
+
TEST(ProtoOutputStreamTest, Complex) {
std::string name1 = "cat";
std::string name2 = "dog";
@@ -127,6 +218,47 @@ TEST(ProtoOutputStreamTest, Complex) {
EXPECT_THAT(log2.data(), StrEq("food"));
}
+TEST(ProtoOutputStreamTest, SerializeToStringComplex) {
+ std::string name1 = "cat";
+ std::string name2 = "dog";
+ const char data1[6] = { 'f', 'u', 'n', 'n', 'y', '!' };
+ const char data2[4] = { 'f', 'o', 'o', 'd' };
+
+ ProtoOutputStream proto;
+ EXPECT_TRUE(proto.write(FIELD_TYPE_INT32 | ComplexProto::kIntsFieldNumber, 23));
+ EXPECT_TRUE(proto.write(FIELD_TYPE_INT32 | ComplexProto::kIntsFieldNumber, 101));
+ EXPECT_TRUE(proto.write(FIELD_TYPE_INT32 | ComplexProto::kIntsFieldNumber, -72));
+ uint64_t token1 = proto.start(FIELD_TYPE_MESSAGE | ComplexProto::kLogsFieldNumber);
+ EXPECT_TRUE(proto.write(FIELD_TYPE_INT32 | ComplexProto::Log::kIdFieldNumber, 12));
+ EXPECT_TRUE(proto.write(FIELD_TYPE_STRING | ComplexProto::Log::kNameFieldNumber, name1));
+ // specify the length to test the write(id, bytes, length) function.
+ EXPECT_TRUE(proto.write(FIELD_TYPE_BYTES | ComplexProto::Log::kDataFieldNumber, data1, 5));
+ proto.end(token1);
+ uint64_t token2 = proto.start(FIELD_TYPE_MESSAGE | ComplexProto::kLogsFieldNumber);
+ EXPECT_TRUE(proto.write(FIELD_TYPE_INT32 | ComplexProto::Log::kIdFieldNumber, 98));
+ EXPECT_TRUE(proto.write(FIELD_TYPE_STRING | ComplexProto::Log::kNameFieldNumber, name2));
+ EXPECT_TRUE(proto.write(FIELD_TYPE_BYTES | ComplexProto::Log::kDataFieldNumber, data2, 4));
+ proto.end(token2);
+
+ ComplexProto complex;
+ std::string serialized;
+ ASSERT_TRUE(proto.serializeToString(&serialized));
+ ASSERT_TRUE(complex.ParseFromString(serialized));
+ EXPECT_EQ(complex.ints_size(), 3);
+ EXPECT_EQ(complex.ints(0), 23);
+ EXPECT_EQ(complex.ints(1), 101);
+ EXPECT_EQ(complex.ints(2), -72);
+ EXPECT_EQ(complex.logs_size(), 2);
+ ComplexProto::Log log1 = complex.logs(0);
+ EXPECT_EQ(log1.id(), 12);
+ EXPECT_THAT(log1.name(), StrEq(name1.c_str()));
+ EXPECT_THAT(log1.data(), StrEq("funny")); // should not contain '!'
+ ComplexProto::Log log2 = complex.logs(1);
+ EXPECT_EQ(log2.id(), 98);
+ EXPECT_THAT(log2.name(), StrEq(name2.c_str()));
+ EXPECT_THAT(log2.data(), StrEq("food"));
+}
+
TEST(ProtoOutputStreamTest, Reusability) {
ProtoOutputStream proto;
EXPECT_TRUE(proto.write(FIELD_TYPE_INT32 | ComplexProto::kIntsFieldNumber, 32));