diff options
| author | 2020-01-21 14:36:08 -0800 | |
|---|---|---|
| committer | 2020-01-21 21:17:50 -0800 | |
| commit | 9b079a2fef76ed1dfa69b158889edd0af5e6e52c (patch) | |
| tree | 0072ca6810ee57122aa5b56abf52b18032b0f6f1 /libs | |
| parent | 0a4b951a590910bab35f20f03d25316426dbf8ae (diff) | |
Skip client composition requests
Keep track of client compositions requests in CompositionEngine and
the buffer used to render the request. If the requests do not change
and the buffer matches, reuse the buffer instead of going
to client composition.
Certain layers properties (buffer format, rounded corner or shadows)
will force the device to go into GPU or mixed composition. In mixed
composition scenarios, we can avoid redundant client composition
requests by reusing the RenderSurface buffers. If the device goes
into GPU composition then all the layers will be composited and there
will be no performance benefit.
Bug: b/136561771, b/144690120
Test: dump SurfaceFlinger --timestats -dump
Test: manual testing with mixed and gpu composition scenarios
Test: atest libcompositionengine_test libsurfaceflinger_unittest SurfaceFlinger_test
Change-Id: I466d5dcded0c9fcfa64bc72fd91dfaddd795f315
Diffstat (limited to 'libs')
| -rw-r--r-- | libs/renderengine/gl/GLESRenderEngine.cpp | 68 | ||||
| -rw-r--r-- | libs/renderengine/gl/GLESRenderEngine.h | 3 | ||||
| -rw-r--r-- | libs/renderengine/include/renderengine/LayerSettings.h | 4 | ||||
| -rw-r--r-- | libs/renderengine/include/renderengine/RenderEngine.h | 2 | ||||
| -rw-r--r-- | libs/renderengine/include/renderengine/mock/RenderEngine.h | 2 | ||||
| -rw-r--r-- | libs/renderengine/tests/RenderEngineTest.cpp | 89 |
6 files changed, 86 insertions, 82 deletions
diff --git a/libs/renderengine/gl/GLESRenderEngine.cpp b/libs/renderengine/gl/GLESRenderEngine.cpp index 09659fe209..e257704750 100644 --- a/libs/renderengine/gl/GLESRenderEngine.cpp +++ b/libs/renderengine/gl/GLESRenderEngine.cpp @@ -960,7 +960,7 @@ EGLImageKHR GLESRenderEngine::createFramebufferImageIfNeeded(ANativeWindowBuffer } status_t GLESRenderEngine::drawLayers(const DisplaySettings& display, - const std::vector<LayerSettings>& layers, + const std::vector<const LayerSettings*>& layers, ANativeWindowBuffer* const buffer, const bool useFramebufferCache, base::unique_fd&& bufferFence, base::unique_fd* drawFence) { @@ -985,9 +985,9 @@ status_t GLESRenderEngine::drawLayers(const DisplaySettings& display, // Blurs in multiple layers are not supported, given the cost of the shader. const LayerSettings* blurLayer = nullptr; if (CC_LIKELY(mBlurFilter != nullptr)) { - for (auto const& layer : layers) { - if (layer.backgroundBlurRadius > 0) { - blurLayer = &layer; + for (auto const layer : layers) { + if (layer->backgroundBlurRadius > 0) { + blurLayer = layer; } } } @@ -1035,9 +1035,9 @@ status_t GLESRenderEngine::drawLayers(const DisplaySettings& display, .setTexCoords(2 /* size */) .setCropCoords(2 /* size */) .build(); - for (auto const& layer : layers) { - if (blurLayer == &layer) { - auto status = mBlurFilter->prepare(layer.backgroundBlurRadius); + for (auto const layer : layers) { + if (blurLayer == layer) { + auto status = mBlurFilter->prepare(layer->backgroundBlurRadius); if (status != NO_ERROR) { ALOGE("Failed to render blur effect! Aborting GPU composition for buffer (%p).", buffer->handle); @@ -1065,40 +1065,40 @@ status_t GLESRenderEngine::drawLayers(const DisplaySettings& display, } } - mState.maxMasteringLuminance = layer.source.buffer.maxMasteringLuminance; - mState.maxContentLuminance = layer.source.buffer.maxContentLuminance; - mState.projectionMatrix = projectionMatrix * layer.geometry.positionTransform; + mState.maxMasteringLuminance = layer->source.buffer.maxMasteringLuminance; + mState.maxContentLuminance = layer->source.buffer.maxContentLuminance; + mState.projectionMatrix = projectionMatrix * layer->geometry.positionTransform; - const FloatRect bounds = layer.geometry.boundaries; + const FloatRect bounds = layer->geometry.boundaries; Mesh::VertexArray<vec2> position(mesh.getPositionArray<vec2>()); position[0] = vec2(bounds.left, bounds.top); position[1] = vec2(bounds.left, bounds.bottom); position[2] = vec2(bounds.right, bounds.bottom); position[3] = vec2(bounds.right, bounds.top); - setupLayerCropping(layer, mesh); - setColorTransform(display.colorTransform * layer.colorTransform); + setupLayerCropping(*layer, mesh); + setColorTransform(display.colorTransform * layer->colorTransform); bool usePremultipliedAlpha = true; bool disableTexture = true; bool isOpaque = false; - if (layer.source.buffer.buffer != nullptr) { + if (layer->source.buffer.buffer != nullptr) { disableTexture = false; - isOpaque = layer.source.buffer.isOpaque; + isOpaque = layer->source.buffer.isOpaque; - sp<GraphicBuffer> gBuf = layer.source.buffer.buffer; - bindExternalTextureBuffer(layer.source.buffer.textureName, gBuf, - layer.source.buffer.fence); + sp<GraphicBuffer> gBuf = layer->source.buffer.buffer; + bindExternalTextureBuffer(layer->source.buffer.textureName, gBuf, + layer->source.buffer.fence); - usePremultipliedAlpha = layer.source.buffer.usePremultipliedAlpha; - Texture texture(Texture::TEXTURE_EXTERNAL, layer.source.buffer.textureName); - mat4 texMatrix = layer.source.buffer.textureTransform; + usePremultipliedAlpha = layer->source.buffer.usePremultipliedAlpha; + Texture texture(Texture::TEXTURE_EXTERNAL, layer->source.buffer.textureName); + mat4 texMatrix = layer->source.buffer.textureTransform; texture.setMatrix(texMatrix.asArray()); - texture.setFiltering(layer.source.buffer.useTextureFiltering); + texture.setFiltering(layer->source.buffer.useTextureFiltering); texture.setDimensions(gBuf->getWidth(), gBuf->getHeight()); - setSourceY410BT2020(layer.source.buffer.isY410BT2020); + setSourceY410BT2020(layer->source.buffer.isY410BT2020); renderengine::Mesh::VertexArray<vec2> texCoords(mesh.getTexCoordArray<vec2>()); texCoords[0] = vec2(0.0, 0.0); @@ -1108,32 +1108,32 @@ status_t GLESRenderEngine::drawLayers(const DisplaySettings& display, setupLayerTexturing(texture); } - const half3 solidColor = layer.source.solidColor; - const half4 color = half4(solidColor.r, solidColor.g, solidColor.b, layer.alpha); + const half3 solidColor = layer->source.solidColor; + const half4 color = half4(solidColor.r, solidColor.g, solidColor.b, layer->alpha); // Buffer sources will have a black solid color ignored in the shader, // so in that scenario the solid color passed here is arbitrary. setupLayerBlending(usePremultipliedAlpha, isOpaque, disableTexture, color, - layer.geometry.roundedCornersRadius); - if (layer.disableBlending) { + layer->geometry.roundedCornersRadius); + if (layer->disableBlending) { glDisable(GL_BLEND); } - setSourceDataSpace(layer.sourceDataspace); + setSourceDataSpace(layer->sourceDataspace); - if (layer.shadow.length > 0.0f) { - handleShadow(layer.geometry.boundaries, layer.geometry.roundedCornersRadius, - layer.shadow); + if (layer->shadow.length > 0.0f) { + handleShadow(layer->geometry.boundaries, layer->geometry.roundedCornersRadius, + layer->shadow); } // We only want to do a special handling for rounded corners when having rounded corners // is the only reason it needs to turn on blending, otherwise, we handle it like the // usual way since it needs to turn on blending anyway. - else if (layer.geometry.roundedCornersRadius > 0.0 && color.a >= 1.0f && isOpaque) { - handleRoundedCorners(display, layer, mesh); + else if (layer->geometry.roundedCornersRadius > 0.0 && color.a >= 1.0f && isOpaque) { + handleRoundedCorners(display, *layer, mesh); } else { drawMesh(mesh); } // Cleanup if there's a buffer source - if (layer.source.buffer.buffer != nullptr) { + if (layer->source.buffer.buffer != nullptr) { disableBlending(); setSourceY410BT2020(false); disableTexturing(); diff --git a/libs/renderengine/gl/GLESRenderEngine.h b/libs/renderengine/gl/GLESRenderEngine.h index 547235a90d..45c85de51e 100644 --- a/libs/renderengine/gl/GLESRenderEngine.h +++ b/libs/renderengine/gl/GLESRenderEngine.h @@ -71,7 +71,8 @@ public: bool isProtected() const override { return mInProtectedContext; } bool supportsProtectedContent() const override; bool useProtectedContext(bool useProtectedContext) override; - status_t drawLayers(const DisplaySettings& display, const std::vector<LayerSettings>& layers, + status_t drawLayers(const DisplaySettings& display, + const std::vector<const LayerSettings*>& layers, ANativeWindowBuffer* buffer, const bool useFramebufferCache, base::unique_fd&& bufferFence, base::unique_fd* drawFence) override; diff --git a/libs/renderengine/include/renderengine/LayerSettings.h b/libs/renderengine/include/renderengine/LayerSettings.h index 3dc198f398..95e9367fea 100644 --- a/libs/renderengine/include/renderengine/LayerSettings.h +++ b/libs/renderengine/include/renderengine/LayerSettings.h @@ -52,7 +52,7 @@ struct Buffer { // Transform matrix to apply to texture coordinates. mat4 textureTransform = mat4(); - // Wheteher to use pre-multiplied alpha + // Whether to use pre-multiplied alpha. bool usePremultipliedAlpha = true; // Override flag that alpha for each pixel in the buffer *must* be 1.0. @@ -153,6 +153,8 @@ struct LayerSettings { int backgroundBlurRadius = 0; }; +// Keep in sync with custom comparison function in +// compositionengine/impl/ClientCompositionRequestCache.cpp static inline bool operator==(const Buffer& lhs, const Buffer& rhs) { return lhs.buffer == rhs.buffer && lhs.fence == rhs.fence && lhs.textureName == rhs.textureName && diff --git a/libs/renderengine/include/renderengine/RenderEngine.h b/libs/renderengine/include/renderengine/RenderEngine.h index e3c2d84e86..46f3fc6de0 100644 --- a/libs/renderengine/include/renderengine/RenderEngine.h +++ b/libs/renderengine/include/renderengine/RenderEngine.h @@ -154,7 +154,7 @@ public: // @return An error code indicating whether drawing was successful. For // now, this always returns NO_ERROR. virtual status_t drawLayers(const DisplaySettings& display, - const std::vector<LayerSettings>& layers, + const std::vector<const LayerSettings*>& layers, ANativeWindowBuffer* buffer, const bool useFramebufferCache, base::unique_fd&& bufferFence, base::unique_fd* drawFence) = 0; diff --git a/libs/renderengine/include/renderengine/mock/RenderEngine.h b/libs/renderengine/include/renderengine/mock/RenderEngine.h index 0750e86988..3358c69fb9 100644 --- a/libs/renderengine/include/renderengine/mock/RenderEngine.h +++ b/libs/renderengine/include/renderengine/mock/RenderEngine.h @@ -56,7 +56,7 @@ public: MOCK_CONST_METHOD0(supportsProtectedContent, bool()); MOCK_METHOD1(useProtectedContext, bool(bool)); MOCK_METHOD6(drawLayers, - status_t(const DisplaySettings&, const std::vector<LayerSettings>&, + status_t(const DisplaySettings&, const std::vector<const LayerSettings*>&, ANativeWindowBuffer*, const bool, base::unique_fd&&, base::unique_fd*)); }; diff --git a/libs/renderengine/tests/RenderEngineTest.cpp b/libs/renderengine/tests/RenderEngineTest.cpp index e676740c6a..afcbc50584 100644 --- a/libs/renderengine/tests/RenderEngineTest.cpp +++ b/libs/renderengine/tests/RenderEngineTest.cpp @@ -249,7 +249,8 @@ struct RenderEngineTest : public ::testing::Test { } void invokeDraw(renderengine::DisplaySettings settings, - std::vector<renderengine::LayerSettings> layers, sp<GraphicBuffer> buffer) { + std::vector<const renderengine::LayerSettings*> layers, + sp<GraphicBuffer> buffer) { base::unique_fd fence; status_t status = sRE->drawLayers(settings, layers, buffer->getNativeBuffer(), true, base::unique_fd(), &fence); @@ -269,7 +270,7 @@ struct RenderEngineTest : public ::testing::Test { void drawEmptyLayers() { renderengine::DisplaySettings settings; - std::vector<renderengine::LayerSettings> layers; + std::vector<const renderengine::LayerSettings*> layers; // Meaningless buffer since we don't do any drawing sp<GraphicBuffer> buffer = new GraphicBuffer(); invokeDraw(settings, layers, buffer); @@ -440,14 +441,14 @@ void RenderEngineTest::fillBuffer(half r, half g, half b, half a) { settings.physicalDisplay = fullscreenRect(); settings.clip = fullscreenRect(); - std::vector<renderengine::LayerSettings> layers; + std::vector<const renderengine::LayerSettings*> layers; renderengine::LayerSettings layer; layer.geometry.boundaries = fullscreenRect().toFloatRect(); SourceVariant::fillColor(layer, r, g, b, this); layer.alpha = a; - layers.push_back(layer); + layers.push_back(&layer); invokeDraw(settings, layers, mBuffer); } @@ -482,14 +483,14 @@ void RenderEngineTest::fillRedOffsetBuffer() { settings.physicalDisplay = offsetRect(); settings.clip = offsetRectAtZero(); - std::vector<renderengine::LayerSettings> layers; + std::vector<const renderengine::LayerSettings*> layers; renderengine::LayerSettings layer; layer.geometry.boundaries = offsetRectAtZero().toFloatRect(); SourceVariant::fillColor(layer, 1.0f, 0.0f, 0.0f, this); layer.alpha = 1.0f; - layers.push_back(layer); + layers.push_back(&layer); invokeDraw(settings, layers, mBuffer); } @@ -515,7 +516,7 @@ void RenderEngineTest::fillBufferCheckers(mat4 transform) { settings.clip = Rect(2, 2); settings.globalTransform = transform; - std::vector<renderengine::LayerSettings> layers; + std::vector<const renderengine::LayerSettings*> layers; renderengine::LayerSettings layerOne; Rect rectOne(0, 0, 1, 1); @@ -535,9 +536,9 @@ void RenderEngineTest::fillBufferCheckers(mat4 transform) { SourceVariant::fillColor(layerThree, 0.0f, 0.0f, 1.0f, this); layerThree.alpha = 1.0f; - layers.push_back(layerOne); - layers.push_back(layerTwo); - layers.push_back(layerThree); + layers.push_back(&layerOne); + layers.push_back(&layerTwo); + layers.push_back(&layerThree); invokeDraw(settings, layers, mBuffer); } @@ -616,7 +617,7 @@ void RenderEngineTest::fillBufferWithLayerTransform() { // Here logical space is 2x2 settings.clip = Rect(2, 2); - std::vector<renderengine::LayerSettings> layers; + std::vector<const renderengine::LayerSettings*> layers; renderengine::LayerSettings layer; layer.geometry.boundaries = Rect(1, 1).toFloatRect(); @@ -626,7 +627,7 @@ void RenderEngineTest::fillBufferWithLayerTransform() { layer.source.solidColor = half3(1.0f, 0.0f, 0.0f); layer.alpha = 1.0f; - layers.push_back(layer); + layers.push_back(&layer); invokeDraw(settings, layers, mBuffer); } @@ -647,7 +648,7 @@ void RenderEngineTest::fillBufferWithColorTransform() { settings.physicalDisplay = fullscreenRect(); settings.clip = Rect(1, 1); - std::vector<renderengine::LayerSettings> layers; + std::vector<const renderengine::LayerSettings*> layers; renderengine::LayerSettings layer; layer.geometry.boundaries = Rect(1, 1).toFloatRect(); @@ -663,7 +664,7 @@ void RenderEngineTest::fillBufferWithColorTransform() { layer.alpha = 1.0f; layer.geometry.boundaries = Rect(1, 1).toFloatRect(); - layers.push_back(layer); + layers.push_back(&layer); invokeDraw(settings, layers, mBuffer); } @@ -680,7 +681,7 @@ void RenderEngineTest::fillRedBufferWithRoundedCorners() { settings.physicalDisplay = fullscreenRect(); settings.clip = fullscreenRect(); - std::vector<renderengine::LayerSettings> layers; + std::vector<const renderengine::LayerSettings*> layers; renderengine::LayerSettings layer; layer.geometry.boundaries = fullscreenRect().toFloatRect(); @@ -689,7 +690,7 @@ void RenderEngineTest::fillRedBufferWithRoundedCorners() { SourceVariant::fillColor(layer, 1.0f, 0.0f, 0.0f, this); layer.alpha = 1.0f; - layers.push_back(layer); + layers.push_back(&layer); invokeDraw(settings, layers, mBuffer); } @@ -726,26 +727,26 @@ void RenderEngineTest::fillBufferAndBlurBackground() { settings.physicalDisplay = fullscreenRect(); settings.clip = fullscreenRect(); - std::vector<renderengine::LayerSettings> layers; + std::vector<const renderengine::LayerSettings*> layers; renderengine::LayerSettings backgroundLayer; backgroundLayer.geometry.boundaries = fullscreenRect().toFloatRect(); SourceVariant::fillColor(backgroundLayer, 0.0f, 1.0f, 0.0f, this); backgroundLayer.alpha = 1.0f; - layers.push_back(backgroundLayer); + layers.push_back(&backgroundLayer); renderengine::LayerSettings leftLayer; leftLayer.geometry.boundaries = Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT).toFloatRect(); SourceVariant::fillColor(leftLayer, 1.0f, 0.0f, 0.0f, this); leftLayer.alpha = 1.0f; - layers.push_back(leftLayer); + layers.push_back(&leftLayer); renderengine::LayerSettings blurLayer; blurLayer.geometry.boundaries = fullscreenRect().toFloatRect(); blurLayer.backgroundBlurRadius = blurRadius; blurLayer.alpha = 0; - layers.push_back(blurLayer); + layers.push_back(&blurLayer); invokeDraw(settings, layers, mBuffer); @@ -761,7 +762,7 @@ void RenderEngineTest::overlayCorners() { settings.physicalDisplay = fullscreenRect(); settings.clip = fullscreenRect(); - std::vector<renderengine::LayerSettings> layersFirst; + std::vector<const renderengine::LayerSettings*> layersFirst; renderengine::LayerSettings layerOne; layerOne.geometry.boundaries = @@ -769,14 +770,14 @@ void RenderEngineTest::overlayCorners() { SourceVariant::fillColor(layerOne, 1.0f, 0.0f, 0.0f, this); layerOne.alpha = 0.2; - layersFirst.push_back(layerOne); + layersFirst.push_back(&layerOne); invokeDraw(settings, layersFirst, mBuffer); expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3, DEFAULT_DISPLAY_HEIGHT / 3), 51, 0, 0, 51); expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3 + 1, DEFAULT_DISPLAY_HEIGHT / 3 + 1, DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 0); - std::vector<renderengine::LayerSettings> layersSecond; + std::vector<const renderengine::LayerSettings*> layersSecond; renderengine::LayerSettings layerTwo; layerTwo.geometry.boundaries = FloatRect(DEFAULT_DISPLAY_WIDTH / 3.0, DEFAULT_DISPLAY_HEIGHT / 3.0, @@ -784,7 +785,7 @@ void RenderEngineTest::overlayCorners() { SourceVariant::fillColor(layerTwo, 0.0f, 1.0f, 0.0f, this); layerTwo.alpha = 1.0f; - layersSecond.push_back(layerTwo); + layersSecond.push_back(&layerTwo); invokeDraw(settings, layersSecond, mBuffer); expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3, DEFAULT_DISPLAY_HEIGHT / 3), 0, 0, 0, 0); @@ -798,7 +799,7 @@ void RenderEngineTest::fillRedBufferTextureTransform() { settings.physicalDisplay = fullscreenRect(); settings.clip = Rect(1, 1); - std::vector<renderengine::LayerSettings> layers; + std::vector<const renderengine::LayerSettings*> layers; renderengine::LayerSettings layer; // Here will allocate a checker board texture, but transform texture @@ -833,7 +834,7 @@ void RenderEngineTest::fillRedBufferTextureTransform() { layer.alpha = 1.0f; layer.geometry.boundaries = Rect(1, 1).toFloatRect(); - layers.push_back(layer); + layers.push_back(&layer); invokeDraw(settings, layers, mBuffer); } @@ -849,7 +850,7 @@ void RenderEngineTest::fillRedBufferWithPremultiplyAlpha() { // Here logical space is 1x1 settings.clip = Rect(1, 1); - std::vector<renderengine::LayerSettings> layers; + std::vector<const renderengine::LayerSettings*> layers; renderengine::LayerSettings layer; sp<GraphicBuffer> buf = allocateSourceBuffer(1, 1); @@ -872,7 +873,7 @@ void RenderEngineTest::fillRedBufferWithPremultiplyAlpha() { layer.alpha = 0.5f; layer.geometry.boundaries = Rect(1, 1).toFloatRect(); - layers.push_back(layer); + layers.push_back(&layer); invokeDraw(settings, layers, mBuffer); } @@ -888,7 +889,7 @@ void RenderEngineTest::fillRedBufferWithoutPremultiplyAlpha() { // Here logical space is 1x1 settings.clip = Rect(1, 1); - std::vector<renderengine::LayerSettings> layers; + std::vector<const renderengine::LayerSettings*> layers; renderengine::LayerSettings layer; sp<GraphicBuffer> buf = allocateSourceBuffer(1, 1); @@ -911,7 +912,7 @@ void RenderEngineTest::fillRedBufferWithoutPremultiplyAlpha() { layer.alpha = 0.5f; layer.geometry.boundaries = Rect(1, 1).toFloatRect(); - layers.push_back(layer); + layers.push_back(&layer); invokeDraw(settings, layers, mBuffer); } @@ -928,10 +929,10 @@ void RenderEngineTest::clearLeftRegion() { settings.clip = Rect(4, 4); settings.globalTransform = mat4::scale(vec4(2, 4, 0, 1)); settings.clearRegion = Region(Rect(1, 1)); - std::vector<renderengine::LayerSettings> layers; + std::vector<const renderengine::LayerSettings*> layers; // dummy layer, without bounds should not render anything renderengine::LayerSettings layer; - layers.push_back(layer); + layers.push_back(&layer); invokeDraw(settings, layers, mBuffer); } @@ -952,7 +953,7 @@ void RenderEngineTest::drawShadow(const renderengine::LayerSettings& castingLaye settings.physicalDisplay = fullscreenRect(); settings.clip = fullscreenRect(); - std::vector<renderengine::LayerSettings> layers; + std::vector<const renderengine::LayerSettings*> layers; // add background layer renderengine::LayerSettings bgLayer; @@ -960,20 +961,20 @@ void RenderEngineTest::drawShadow(const renderengine::LayerSettings& castingLaye ColorSourceVariant::fillColor(bgLayer, backgroundColor.r / 255.0f, backgroundColor.g / 255.0f, backgroundColor.b / 255.0f, this); bgLayer.alpha = backgroundColor.a / 255.0f; - layers.push_back(bgLayer); + layers.push_back(&bgLayer); // add shadow layer renderengine::LayerSettings shadowLayer; shadowLayer.geometry.boundaries = castingLayer.geometry.boundaries; shadowLayer.alpha = castingLayer.alpha; shadowLayer.shadow = shadow; - layers.push_back(shadowLayer); + layers.push_back(&shadowLayer); // add layer casting the shadow renderengine::LayerSettings layer = castingLayer; SourceVariant::fillColor(layer, casterColor.r / 255.0f, casterColor.g / 255.0f, casterColor.b / 255.0f, this); - layers.push_back(layer); + layers.push_back(&layer); invokeDraw(settings, layers, mBuffer); } @@ -984,11 +985,11 @@ TEST_F(RenderEngineTest, drawLayers_noLayersToDraw) { TEST_F(RenderEngineTest, drawLayers_nullOutputBuffer) { renderengine::DisplaySettings settings; - std::vector<renderengine::LayerSettings> layers; + std::vector<const renderengine::LayerSettings*> layers; renderengine::LayerSettings layer; layer.geometry.boundaries = fullscreenRect().toFloatRect(); BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this); - layers.push_back(layer); + layers.push_back(&layer); base::unique_fd fence; status_t status = sRE->drawLayers(settings, layers, nullptr, true, base::unique_fd(), &fence); @@ -1000,12 +1001,12 @@ TEST_F(RenderEngineTest, drawLayers_nullOutputFence) { settings.physicalDisplay = fullscreenRect(); settings.clip = fullscreenRect(); - std::vector<renderengine::LayerSettings> layers; + std::vector<const renderengine::LayerSettings*> layers; renderengine::LayerSettings layer; layer.geometry.boundaries = fullscreenRect().toFloatRect(); BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this); layer.alpha = 1.0; - layers.push_back(layer); + layers.push_back(&layer); status_t status = sRE->drawLayers(settings, layers, mBuffer->getNativeBuffer(), true, base::unique_fd(), nullptr); @@ -1019,12 +1020,12 @@ TEST_F(RenderEngineTest, drawLayers_doesNotCacheFramebuffer) { settings.physicalDisplay = fullscreenRect(); settings.clip = fullscreenRect(); - std::vector<renderengine::LayerSettings> layers; + std::vector<const renderengine::LayerSettings*> layers; renderengine::LayerSettings layer; layer.geometry.boundaries = fullscreenRect().toFloatRect(); BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this); layer.alpha = 1.0; - layers.push_back(layer); + layers.push_back(&layer); status_t status = sRE->drawLayers(settings, layers, mBuffer->getNativeBuffer(), false, base::unique_fd(), nullptr); @@ -1223,13 +1224,13 @@ TEST_F(RenderEngineTest, drawLayers_fillsBufferAndCachesImages) { settings.physicalDisplay = fullscreenRect(); settings.clip = fullscreenRect(); - std::vector<renderengine::LayerSettings> layers; + std::vector<const renderengine::LayerSettings*> layers; renderengine::LayerSettings layer; layer.geometry.boundaries = fullscreenRect().toFloatRect(); BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this); - layers.push_back(layer); + layers.push_back(&layer); invokeDraw(settings, layers, mBuffer); uint64_t bufferId = layer.source.buffer.buffer->getId(); EXPECT_TRUE(sRE->isImageCachedForTesting(bufferId)); |