diff options
-rw-r--r-- | services/surfaceflinger/BufferLayer.cpp | 9 | ||||
-rw-r--r-- | services/surfaceflinger/BufferLayer.h | 3 | ||||
-rw-r--r-- | services/surfaceflinger/BufferQueueLayer.cpp | 6 | ||||
-rw-r--r-- | services/surfaceflinger/BufferQueueLayer.h | 3 | ||||
-rw-r--r-- | services/surfaceflinger/BufferStateLayer.cpp | 7 | ||||
-rw-r--r-- | services/surfaceflinger/BufferStateLayer.h | 1 | ||||
-rw-r--r-- | services/surfaceflinger/layerproto/LayerProtoParser.cpp | 2 | ||||
-rw-r--r-- | services/surfaceflinger/tests/Transaction_test.cpp | 76 |
8 files changed, 80 insertions, 27 deletions
diff --git a/services/surfaceflinger/BufferLayer.cpp b/services/surfaceflinger/BufferLayer.cpp index f51fbb45f6..4517eff6b4 100644 --- a/services/surfaceflinger/BufferLayer.cpp +++ b/services/surfaceflinger/BufferLayer.cpp @@ -250,7 +250,14 @@ bool BufferLayer::isHdrY410() const { // pixel format is HDR Y410 masquerading as RGBA_1010102 return (mCurrentDataSpace == ui::Dataspace::BT2020_ITU_PQ && getDrawingApi() == NATIVE_WINDOW_API_MEDIA && - mActiveBuffer->getPixelFormat() == HAL_PIXEL_FORMAT_RGBA_1010102); + getPixelFormat() == HAL_PIXEL_FORMAT_RGBA_1010102); +} + +PixelFormat BufferLayer::getPixelFormat() const { + if (!mActiveBuffer) { + return PIXEL_FORMAT_NONE; + } + return mActiveBuffer->format; } void BufferLayer::setPerFrameData(const sp<const DisplayDevice>& displayDevice, diff --git a/services/surfaceflinger/BufferLayer.h b/services/surfaceflinger/BufferLayer.h index 46a62eda91..68289388aa 100644 --- a/services/surfaceflinger/BufferLayer.h +++ b/services/surfaceflinger/BufferLayer.h @@ -127,7 +127,6 @@ private: virtual Region getDrawingSurfaceDamage() const = 0; virtual const HdrMetadata& getDrawingHdrMetadata() const = 0; virtual int getDrawingApi() const = 0; - virtual PixelFormat getPixelFormat() const = 0; virtual uint64_t getFrameNumber() const = 0; @@ -191,6 +190,8 @@ private: std::shared_ptr<compositionengine::Layer> mCompositionLayer; FloatRect computeSourceBounds(const FloatRect& parentBounds) const override; + + PixelFormat getPixelFormat() const; }; } // namespace android diff --git a/services/surfaceflinger/BufferQueueLayer.cpp b/services/surfaceflinger/BufferQueueLayer.cpp index cbb9d658e4..dd79d82b20 100644 --- a/services/surfaceflinger/BufferQueueLayer.cpp +++ b/services/surfaceflinger/BufferQueueLayer.cpp @@ -192,10 +192,6 @@ int BufferQueueLayer::getDrawingApi() const { return mConsumer->getCurrentApi(); } -PixelFormat BufferQueueLayer::getPixelFormat() const { - return mFormat; -} - uint64_t BufferQueueLayer::getFrameNumber() const { Mutex::Autolock lock(mQueueItemLock); uint64_t frameNumber = mQueueItems[0].mFrameNumber; @@ -561,8 +557,6 @@ status_t BufferQueueLayer::setDefaultBufferProperties(uint32_t w, uint32_t h, Pi return BAD_VALUE; } - mFormat = format; - setDefaultBufferSize(w, h); mConsumer->setDefaultBufferFormat(format); mConsumer->setConsumerUsageBits(getEffectiveUsage(0)); diff --git a/services/surfaceflinger/BufferQueueLayer.h b/services/surfaceflinger/BufferQueueLayer.h index 7def33ad78..2675643c22 100644 --- a/services/surfaceflinger/BufferQueueLayer.h +++ b/services/surfaceflinger/BufferQueueLayer.h @@ -75,7 +75,6 @@ private: Region getDrawingSurfaceDamage() const override; const HdrMetadata& getDrawingHdrMetadata() const override; int getDrawingApi() const override; - PixelFormat getPixelFormat() const override; uint64_t getFrameNumber() const override; @@ -119,8 +118,6 @@ private: sp<BufferLayerConsumer> mConsumer; sp<IGraphicBufferProducer> mProducer; - PixelFormat mFormat{PIXEL_FORMAT_NONE}; - // Only accessed on the main thread. uint64_t mPreviousFrameNumber{0}; bool mUpdateTexImageFailed{false}; diff --git a/services/surfaceflinger/BufferStateLayer.cpp b/services/surfaceflinger/BufferStateLayer.cpp index 63a07c35ca..de5d6225d9 100644 --- a/services/surfaceflinger/BufferStateLayer.cpp +++ b/services/surfaceflinger/BufferStateLayer.cpp @@ -449,13 +449,6 @@ int BufferStateLayer::getDrawingApi() const { return getDrawingState().api; } -PixelFormat BufferStateLayer::getPixelFormat() const { - if (!mActiveBuffer) { - return PIXEL_FORMAT_NONE; - } - return mActiveBuffer->format; -} - uint64_t BufferStateLayer::getFrameNumber() const { return mFrameNumber; } diff --git a/services/surfaceflinger/BufferStateLayer.h b/services/surfaceflinger/BufferStateLayer.h index 97e24cb277..2b52102bf7 100644 --- a/services/surfaceflinger/BufferStateLayer.h +++ b/services/surfaceflinger/BufferStateLayer.h @@ -116,7 +116,6 @@ private: Region getDrawingSurfaceDamage() const override; const HdrMetadata& getDrawingHdrMetadata() const override; int getDrawingApi() const override; - PixelFormat getPixelFormat() const override; uint64_t getFrameNumber() const override; diff --git a/services/surfaceflinger/layerproto/LayerProtoParser.cpp b/services/surfaceflinger/layerproto/LayerProtoParser.cpp index d3381e5757..973d20c262 100644 --- a/services/surfaceflinger/layerproto/LayerProtoParser.cpp +++ b/services/surfaceflinger/layerproto/LayerProtoParser.cpp @@ -302,7 +302,7 @@ std::string LayerProtoParser::Layer::to_string() const { StringAppendF(&result, "isProtected=%1d, ", isProtected); StringAppendF(&result, "isOpaque=%1d, invalidate=%1d, ", isOpaque, invalidate); StringAppendF(&result, "dataspace=%s, ", dataspace.c_str()); - StringAppendF(&result, "defaultPixelFormat=%s, ", pixelFormat.c_str()); + StringAppendF(&result, "pixelFormat=%s, ", pixelFormat.c_str()); StringAppendF(&result, "color=(%.3f,%.3f,%.3f,%.3f), flags=0x%08x, ", static_cast<double>(color.r), static_cast<double>(color.g), static_cast<double>(color.b), static_cast<double>(color.a), flags); diff --git a/services/surfaceflinger/tests/Transaction_test.cpp b/services/surfaceflinger/tests/Transaction_test.cpp index c93e15ef96..71016db538 100644 --- a/services/surfaceflinger/tests/Transaction_test.cpp +++ b/services/surfaceflinger/tests/Transaction_test.cpp @@ -356,9 +356,9 @@ protected: virtual sp<SurfaceControl> createLayer(const sp<SurfaceComposerClient>& client, const char* name, uint32_t width, uint32_t height, - uint32_t flags = 0, SurfaceControl* parent = nullptr) { - auto layer = - createSurface(client, name, width, height, PIXEL_FORMAT_RGBA_8888, flags, parent); + uint32_t flags = 0, SurfaceControl* parent = nullptr, + PixelFormat format = PIXEL_FORMAT_RGBA_8888) { + auto layer = createSurface(client, name, width, height, format, flags, parent); Transaction t; t.setLayerStack(layer, mDisplayLayerStack).setLayer(layer, mLayerZBase); @@ -382,8 +382,9 @@ protected: } virtual sp<SurfaceControl> createLayer(const char* name, uint32_t width, uint32_t height, - uint32_t flags = 0, SurfaceControl* parent = nullptr) { - return createLayer(mClient, name, width, height, flags, parent); + uint32_t flags = 0, SurfaceControl* parent = nullptr, + PixelFormat format = PIXEL_FORMAT_RGBA_8888) { + return createLayer(mClient, name, width, height, flags, parent, format); } sp<SurfaceControl> createColorLayer(const char* name, const Color& color, @@ -644,12 +645,14 @@ public: LayerTypeTransactionHarness(uint32_t layerType) : mLayerType(layerType) {} sp<SurfaceControl> createLayer(const char* name, uint32_t width, uint32_t height, - uint32_t flags = 0, SurfaceControl* parent = nullptr) { + uint32_t flags = 0, SurfaceControl* parent = nullptr, + PixelFormat format = PIXEL_FORMAT_RGBA_8888) { // if the flags already have a layer type specified, return an error if (flags & ISurfaceComposerClient::eFXSurfaceMask) { return nullptr; } - return LayerTransactionTest::createLayer(name, width, height, flags | mLayerType, parent); + return LayerTransactionTest::createLayer(name, width, height, flags | mLayerType, parent, + format); } void fillLayerColor(const sp<SurfaceControl>& layer, const Color& color, int32_t bufferWidth, @@ -1946,6 +1949,65 @@ TEST_P(LayerTypeAndRenderTypeTransactionTest, SetLayerStackBasic) { } } +TEST_P(LayerTypeAndRenderTypeTransactionTest, SetBufferFormat) { + int32_t width = 100; + int32_t height = 100; + Rect crop = Rect(0, 0, width, height); + + sp<SurfaceControl> behindLayer = createColorLayer("Behind layer", Color::RED); + sp<SurfaceControl> layer; + ASSERT_NO_FATAL_FAILURE( + layer = createLayer("test", width, height, 0, nullptr, PIXEL_FORMAT_RGBX_8888)); + + Transaction() + .setLayer(layer, INT32_MAX - 1) + .show(layer) + .setLayerStack(behindLayer, mDisplayLayerStack) + .setCrop_legacy(behindLayer, crop) + .setLayer(behindLayer, INT32_MAX - 2) + .show(behindLayer) + .apply(); + + sp<Surface> surface = layer->getSurface(); + + sp<GraphicBuffer> buffer = + new GraphicBuffer(width, height, PIXEL_FORMAT_RGBX_8888, 1, + BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN | + BufferUsage::COMPOSER_OVERLAY, + "test"); + ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, crop, Color::TRANSPARENT)); + + if (mLayerType == ISurfaceComposerClient::eFXSurfaceBufferQueue) { + Surface::attachAndQueueBufferWithDataspace(surface.get(), buffer, ui::Dataspace::V0_SRGB); + } else { + Transaction().setBuffer(layer, buffer).apply(); + } + + { + SCOPED_TRACE("Buffer Opaque Format"); + auto shot = screenshot(); + shot->expectColor(crop, Color::BLACK); + } + + buffer = new GraphicBuffer(width, height, PIXEL_FORMAT_RGBA_8888, 1, + BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN | + BufferUsage::COMPOSER_OVERLAY, + "test"); + ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, crop, Color::TRANSPARENT)); + + if (mLayerType == ISurfaceComposerClient::eFXSurfaceBufferQueue) { + Surface::attachAndQueueBufferWithDataspace(surface.get(), buffer, ui::Dataspace::V0_SRGB); + } else { + Transaction().setBuffer(layer, buffer).apply(); + } + + { + SCOPED_TRACE("Buffer Transparent Format"); + auto shot = screenshot(); + shot->expectColor(crop, Color::RED); + } +} + TEST_P(LayerRenderTypeTransactionTest, SetMatrixBasic_BufferQueue) { sp<SurfaceControl> layer; ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32)); |