diff options
Diffstat (limited to 'libs')
| -rw-r--r-- | libs/androidfw/AssetManager2.cpp | 2 | ||||
| -rw-r--r-- | libs/hwui/DisplayListOps.in | 3 | ||||
| -rw-r--r-- | libs/hwui/RecordingCanvas.cpp | 13 | ||||
| -rw-r--r-- | libs/hwui/RecordingCanvas.h | 2 | ||||
| -rw-r--r-- | libs/hwui/SkiaCanvas.cpp | 13 | ||||
| -rw-r--r-- | libs/hwui/SkiaCanvas.h | 1 | ||||
| -rw-r--r-- | libs/hwui/hwui/Canvas.h | 1 | ||||
| -rw-r--r-- | libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp | 2 | ||||
| -rw-r--r-- | libs/hwui/pipeline/skia/SkiaPipeline.cpp | 2 | ||||
| -rw-r--r-- | libs/hwui/renderthread/EglManager.cpp | 3 | ||||
| -rw-r--r-- | libs/hwui/renderthread/VulkanManager.cpp | 2 | ||||
| -rw-r--r-- | libs/hwui/renderthread/VulkanManager.h | 7 | ||||
| -rw-r--r-- | libs/hwui/renderthread/VulkanSurface.cpp | 5 | ||||
| -rw-r--r-- | libs/hwui/utils/Color.cpp | 8 | ||||
| -rw-r--r-- | libs/protoutil/include/android/util/ProtoOutputStream.h | 3 | ||||
| -rw-r--r-- | libs/protoutil/src/ProtoFileReader.cpp | 2 | ||||
| -rw-r--r-- | libs/protoutil/src/ProtoOutputStream.cpp | 33 | ||||
| -rw-r--r-- | libs/protoutil/tests/EncodedBuffer_test.cpp | 122 | ||||
| -rw-r--r-- | libs/protoutil/tests/ProtoOutputStream_test.cpp | 132 |
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)); |