diff options
| author | 2018-12-04 17:23:44 -0800 | |
|---|---|---|
| committer | 2019-02-01 14:02:32 -0800 | |
| commit | feb73d7951302cb24e86d00a1b72add9ff4121ca (patch) | |
| tree | 99588588dc5ee5e243f00f53790c771462785ad3 | |
| parent | 3b7f2022cd288f9bfcb2ba8f775eef6caca92dad (diff) | |
SF: Setup CompositionEngine::Layer
Add a Layer class to CompositionEngine, and modify ColorLayer and
BufferLayer to create them.
Also sets up CompositionEngine::LayerFE as an interface to be
implemented by the SF Layer class.
Test: atest libsurfaceflinger_unittest libcompositionengine_test
Bug: 121291683
Change-Id: I2ed83355e81f36954b034ec60dd1a24c631f4874
24 files changed, 462 insertions, 39 deletions
diff --git a/services/surfaceflinger/BufferLayer.cpp b/services/surfaceflinger/BufferLayer.cpp index 9662fcd01f..f986329245 100644 --- a/services/surfaceflinger/BufferLayer.cpp +++ b/services/surfaceflinger/BufferLayer.cpp @@ -19,40 +19,42 @@ #define LOG_TAG "BufferLayer" #define ATRACE_TAG ATRACE_TAG_GRAPHICS -#include "BufferLayer.h" -#include "Colorizer.h" -#include "DisplayDevice.h" -#include "LayerRejecter.h" - -#include "TimeStats/TimeStats.h" - -#include <renderengine/RenderEngine.h> +#include <cmath> +#include <cstdlib> +#include <mutex> +#include <compositionengine/CompositionEngine.h> +#include <compositionengine/Layer.h> +#include <compositionengine/LayerCreationArgs.h> +#include <cutils/compiler.h> +#include <cutils/native_handle.h> +#include <cutils/properties.h> #include <gui/BufferItem.h> #include <gui/BufferQueue.h> #include <gui/LayerDebugInfo.h> #include <gui/Surface.h> - +#include <renderengine/RenderEngine.h> #include <ui/DebugUtils.h> - #include <utils/Errors.h> #include <utils/Log.h> #include <utils/NativeHandle.h> #include <utils/StopWatch.h> #include <utils/Trace.h> -#include <cutils/compiler.h> -#include <cutils/native_handle.h> -#include <cutils/properties.h> +#include "BufferLayer.h" +#include "Colorizer.h" +#include "DisplayDevice.h" +#include "LayerRejecter.h" -#include <math.h> -#include <stdlib.h> -#include <mutex> +#include "TimeStats/TimeStats.h" namespace android { BufferLayer::BufferLayer(const LayerCreationArgs& args) - : Layer(args), mTextureName(args.flinger->getNewTexture()) { + : Layer(args), + mTextureName(args.flinger->getNewTexture()), + mCompositionLayer{mFlinger->getCompositionEngine().createLayer( + compositionengine::LayerCreationArgs{this})} { ALOGV("Creating Layer %s", args.name.string()); mPremultipliedAlpha = !(args.flags & ISurfaceComposerClient::eNonPremultiplied); @@ -649,6 +651,10 @@ Rect BufferLayer::getBufferSize(const State& s) const { return Rect(bufWidth, bufHeight); } +std::shared_ptr<compositionengine::Layer> BufferLayer::getCompositionLayer() const { + return mCompositionLayer; +} + } // namespace android #if defined(__gl_h_) diff --git a/services/surfaceflinger/BufferLayer.h b/services/surfaceflinger/BufferLayer.h index 3fe8ed0920..cc4e6c2bc2 100644 --- a/services/surfaceflinger/BufferLayer.h +++ b/services/surfaceflinger/BufferLayer.h @@ -16,35 +16,33 @@ #pragma once -#include "BufferLayerConsumer.h" -#include "Client.h" -#include "Layer.h" -#include "DisplayHardware/HWComposer.h" -#include "DisplayHardware/HWComposerBufferCache.h" -#include "FrameTracker.h" -#include "LayerVector.h" -#include "MonitoredProducer.h" -#include "SurfaceFlinger.h" +#include <sys/types.h> +#include <cstdint> +#include <list> #include <gui/ISurfaceComposerClient.h> #include <gui/LayerState.h> #include <renderengine/Image.h> #include <renderengine/Mesh.h> #include <renderengine/Texture.h> +#include <system/window.h> // For NATIVE_WINDOW_SCALING_MODE_FREEZE #include <ui/FrameStats.h> #include <ui/GraphicBuffer.h> #include <ui/PixelFormat.h> #include <ui/Region.h> - #include <utils/RefBase.h> #include <utils/String8.h> #include <utils/Timers.h> -#include <system/window.h> // For NATIVE_WINDOW_SCALING_MODE_FREEZE - -#include <stdint.h> -#include <sys/types.h> -#include <list> +#include "BufferLayerConsumer.h" +#include "Client.h" +#include "DisplayHardware/HWComposer.h" +#include "DisplayHardware/HWComposerBufferCache.h" +#include "FrameTracker.h" +#include "Layer.h" +#include "LayerVector.h" +#include "MonitoredProducer.h" +#include "SurfaceFlinger.h" namespace android { @@ -57,6 +55,8 @@ public: // Overriden from Layer // ----------------------------------------------------------------------- public: + std::shared_ptr<compositionengine::Layer> getCompositionLayer() const override; + // If we have received a new buffer this frame, we will pass its surface // damage down to hardware composer. Otherwise, we must send a region with // one empty rect. @@ -187,6 +187,8 @@ private: bool mBufferLatched{false}; // TODO: Use mActiveBuffer? Rect getBufferSize(const State& s) const override; + + std::shared_ptr<compositionengine::Layer> mCompositionLayer; }; } // namespace android diff --git a/services/surfaceflinger/ColorLayer.cpp b/services/surfaceflinger/ColorLayer.cpp index 34082c3bed..c2f81c2db0 100644 --- a/services/surfaceflinger/ColorLayer.cpp +++ b/services/surfaceflinger/ColorLayer.cpp @@ -22,6 +22,9 @@ #include <stdlib.h> #include <sys/types.h> +#include <compositionengine/CompositionEngine.h> +#include <compositionengine/Layer.h> +#include <compositionengine/LayerCreationArgs.h> #include <renderengine/RenderEngine.h> #include <ui/GraphicBuffer.h> #include <utils/Errors.h> @@ -34,7 +37,10 @@ namespace android { // --------------------------------------------------------------------------- -ColorLayer::ColorLayer(const LayerCreationArgs& args) : Layer(args) {} +ColorLayer::ColorLayer(const LayerCreationArgs& args) + : Layer(args), + mCompositionLayer{mFlinger->getCompositionEngine().createLayer( + compositionengine::LayerCreationArgs{this})} {} ColorLayer::~ColorLayer() = default; @@ -113,6 +119,10 @@ void ColorLayer::setPerFrameData(DisplayId displayId, const ui::Transform& trans getBE().compositionInfo.hwc.surfaceDamage = surfaceDamageRegion; } +std::shared_ptr<compositionengine::Layer> ColorLayer::getCompositionLayer() const { + return mCompositionLayer; +} + // --------------------------------------------------------------------------- }; // namespace android diff --git a/services/surfaceflinger/ColorLayer.h b/services/surfaceflinger/ColorLayer.h index f43fc3ce35..ecaef82070 100644 --- a/services/surfaceflinger/ColorLayer.h +++ b/services/surfaceflinger/ColorLayer.h @@ -28,6 +28,8 @@ public: explicit ColorLayer(const LayerCreationArgs&); ~ColorLayer() override; + std::shared_ptr<compositionengine::Layer> getCompositionLayer() const override; + virtual const char* getTypeId() const { return "ColorLayer"; } bool isVisible() const override; @@ -41,6 +43,9 @@ protected: virtual bool prepareClientLayer(const RenderArea& renderArea, const Region& clip, bool useIdentityTransform, Region& clearRegion, renderengine::LayerSettings& layer); + +private: + std::shared_ptr<compositionengine::Layer> mCompositionLayer; }; } // namespace android diff --git a/services/surfaceflinger/CompositionEngine/Android.bp b/services/surfaceflinger/CompositionEngine/Android.bp index 49fa84a7ec..564bd5b96b 100644 --- a/services/surfaceflinger/CompositionEngine/Android.bp +++ b/services/surfaceflinger/CompositionEngine/Android.bp @@ -41,6 +41,7 @@ cc_library { "src/DisplayColorProfile.cpp", "src/DisplaySurface.cpp", "src/DumpHelpers.cpp", + "src/Layer.cpp", "src/Output.cpp", "src/OutputCompositionState.cpp", "src/RenderSurface.cpp", @@ -57,6 +58,8 @@ cc_library { "mock/Display.cpp", "mock/DisplayColorProfile.cpp", "mock/DisplaySurface.cpp", + "mock/Layer.cpp", + "mock/LayerFE.cpp", "mock/Output.cpp", "mock/RenderSurface.cpp", ], @@ -77,6 +80,7 @@ cc_test { "tests/CompositionEngineTest.cpp", "tests/DisplayColorProfileTest.cpp", "tests/DisplayTest.cpp", + "tests/LayerTest.cpp", "tests/MockHWComposer.cpp", "tests/OutputTest.cpp", "tests/RenderSurfaceTest.cpp", diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/CompositionEngine.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/CompositionEngine.h index 30cdb49b0d..896f8aaa69 100644 --- a/services/surfaceflinger/CompositionEngine/include/compositionengine/CompositionEngine.h +++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/CompositionEngine.h @@ -29,8 +29,10 @@ class RenderEngine; namespace compositionengine { class Display; +class Layer; struct DisplayCreationArgs; +struct LayerCreationArgs; /** * Encapsulates all the interfaces and implementation details for performing @@ -42,6 +44,7 @@ public: // Create a composition Display virtual std::shared_ptr<Display> createDisplay(DisplayCreationArgs&&) = 0; + virtual std::shared_ptr<Layer> createLayer(LayerCreationArgs&&) = 0; virtual HWComposer& getHwComposer() const = 0; virtual void setHwComposer(std::unique_ptr<HWComposer>) = 0; diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/Layer.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/Layer.h new file mode 100644 index 0000000000..29a7deafce --- /dev/null +++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/Layer.h @@ -0,0 +1,46 @@ +/* + * Copyright 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include <cstdint> + +#include <utils/StrongPointer.h> + +namespace android { + +typedef int64_t nsecs_t; + +namespace compositionengine { + +class Display; +class LayerFE; + +/** + * A layer contains the output-independent composition state for a front-end + * Layer + */ +class Layer { +public: + virtual ~Layer(); + + // Gets the front-end interface for this layer. Can return nullptr if the + // front-end layer no longer exists. + virtual sp<LayerFE> getLayerFE() const = 0; +}; + +} // namespace compositionengine +} // namespace android diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/LayerCreationArgs.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/LayerCreationArgs.h new file mode 100644 index 0000000000..db3312b6e9 --- /dev/null +++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/LayerCreationArgs.h @@ -0,0 +1,35 @@ +/* + * Copyright 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include <utils/RefBase.h> + +namespace android::compositionengine { + +class CompositionEngine; +class LayerFE; + +/** + * A parameter object for creating Layer instances + */ +struct LayerCreationArgs { + // A weak pointer to the front-end layer instance that the new layer will + // represent. + wp<LayerFE> layerFE; +}; + +} // namespace android::compositionengine diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/LayerFE.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/LayerFE.h new file mode 100644 index 0000000000..f9a36241c8 --- /dev/null +++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/LayerFE.h @@ -0,0 +1,27 @@ +/* + * Copyright 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include <utils/RefBase.h> + +namespace android::compositionengine { + +// Defines the interface used by the CompositionEngine to make requests +// of the front-end layer +class LayerFE : public virtual RefBase {}; + +} // namespace android::compositionengine diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/Output.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/Output.h index 6be4ad83b8..ab54b5dd44 100644 --- a/services/surfaceflinger/CompositionEngine/include/compositionengine/Output.h +++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/Output.h @@ -38,6 +38,8 @@ struct OutputCompositionState; */ class Output { public: + virtual ~Output(); + // Returns true if the output is valid. This is meant to be checked post- // construction and prior to use, as not everything is set up by the // constructor. @@ -103,8 +105,6 @@ public: virtual bool belongsInOutput(uint32_t layerStackId, bool internalOnly) const = 0; protected: - ~Output() = default; - virtual void setDisplayColorProfile(std::unique_ptr<DisplayColorProfile>) = 0; virtual void setRenderSurface(std::unique_ptr<RenderSurface>) = 0; }; diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/CompositionEngine.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/CompositionEngine.h index e23c431bc4..b01eb649d8 100644 --- a/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/CompositionEngine.h +++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/CompositionEngine.h @@ -27,6 +27,8 @@ public: std::shared_ptr<compositionengine::Display> createDisplay( compositionengine::DisplayCreationArgs&&) override; + std::shared_ptr<compositionengine::Layer> createLayer( + compositionengine::LayerCreationArgs&&) override; HWComposer& getHwComposer() const override; void setHwComposer(std::unique_ptr<HWComposer>) override; diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/Layer.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/Layer.h new file mode 100644 index 0000000000..631351b857 --- /dev/null +++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/Layer.h @@ -0,0 +1,52 @@ +/* + * Copyright 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include <memory> + +#include <compositionengine/Layer.h> +#include <utils/RefBase.h> +#include <utils/StrongPointer.h> + +namespace android::compositionengine { + +class CompositionEngine; +class LayerFE; + +struct LayerCreationArgs; + +namespace impl { + +class Display; + +class Layer : public compositionengine::Layer { +public: + Layer(const CompositionEngine&, compositionengine::LayerCreationArgs&&); + ~Layer() override; + + sp<LayerFE> getLayerFE() const override; + +private: + const compositionengine::CompositionEngine& mCompositionEngine; + const wp<LayerFE> mLayerFE; +}; + +std::shared_ptr<compositionengine::Layer> createLayer(const compositionengine::CompositionEngine&, + compositionengine::LayerCreationArgs&&); + +} // namespace impl +} // namespace android::compositionengine diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/Output.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/Output.h index 4be0706af7..1e51c5ecf0 100644 --- a/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/Output.h +++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/Output.h @@ -30,7 +30,7 @@ namespace impl { class Output : public virtual compositionengine::Output { public: Output(const CompositionEngine&); - virtual ~Output(); + ~Output() override; bool isValid() const override; diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/mock/CompositionEngine.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/mock/CompositionEngine.h index 1967666d59..0f57685861 100644 --- a/services/surfaceflinger/CompositionEngine/include/compositionengine/mock/CompositionEngine.h +++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/mock/CompositionEngine.h @@ -18,6 +18,7 @@ #include <compositionengine/CompositionEngine.h> #include <compositionengine/DisplayCreationArgs.h> +#include <compositionengine/LayerCreationArgs.h> #include <gmock/gmock.h> #include <renderengine/RenderEngine.h> @@ -31,6 +32,7 @@ public: ~CompositionEngine() override; MOCK_METHOD1(createDisplay, std::shared_ptr<Display>(DisplayCreationArgs&&)); + MOCK_METHOD1(createLayer, std::shared_ptr<Layer>(LayerCreationArgs&&)); MOCK_CONST_METHOD0(getHwComposer, HWComposer&()); MOCK_METHOD1(setHwComposer, void(std::unique_ptr<HWComposer>)); diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/mock/Layer.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/mock/Layer.h new file mode 100644 index 0000000000..a7cc08e117 --- /dev/null +++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/mock/Layer.h @@ -0,0 +1,33 @@ +/* + * Copyright 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include <compositionengine/Layer.h> +#include <compositionengine/LayerFE.h> +#include <gmock/gmock.h> + +namespace android::compositionengine::mock { + +class Layer : public compositionengine::Layer { +public: + Layer(); + virtual ~Layer(); + + MOCK_CONST_METHOD0(getLayerFE, sp<LayerFE>()); +}; + +} // namespace android::compositionengine::mock diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/mock/LayerFE.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/mock/LayerFE.h new file mode 100644 index 0000000000..92e007081b --- /dev/null +++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/mock/LayerFE.h @@ -0,0 +1,32 @@ +/* + * Copyright 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include <compositionengine/LayerFE.h> +#include <gmock/gmock.h> + +namespace android::compositionengine::mock { + +// Defines the interface used by the CompositionEngine to make requests +// of the front-end layer. +class LayerFE : public compositionengine::LayerFE { +public: + LayerFE(); + virtual ~LayerFE(); +}; + +} // namespace android::compositionengine::mock diff --git a/services/surfaceflinger/CompositionEngine/mock/Layer.cpp b/services/surfaceflinger/CompositionEngine/mock/Layer.cpp new file mode 100644 index 0000000000..08483cb301 --- /dev/null +++ b/services/surfaceflinger/CompositionEngine/mock/Layer.cpp @@ -0,0 +1,26 @@ +/* + * Copyright 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <compositionengine/mock/Layer.h> + +namespace android::compositionengine::mock { + +// The Google Mock documentation recommends explicit non-header instantiations +// for better compile time performance. +Layer::Layer() = default; +Layer::~Layer() = default; + +} // namespace android::compositionengine::mock diff --git a/services/surfaceflinger/CompositionEngine/mock/LayerFE.cpp b/services/surfaceflinger/CompositionEngine/mock/LayerFE.cpp new file mode 100644 index 0000000000..607eaad826 --- /dev/null +++ b/services/surfaceflinger/CompositionEngine/mock/LayerFE.cpp @@ -0,0 +1,26 @@ +/* + * Copyright 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <compositionengine/mock/LayerFE.h> + +namespace android::compositionengine::mock { + +// The Google Mock documentation recommends explicit non-header instantiations +// for better compile time performance. +LayerFE::LayerFE() = default; +LayerFE::~LayerFE() = default; + +} // namespace android::compositionengine::mock diff --git a/services/surfaceflinger/CompositionEngine/src/CompositionEngine.cpp b/services/surfaceflinger/CompositionEngine/src/CompositionEngine.cpp index 127d729ded..cb08b81627 100644 --- a/services/surfaceflinger/CompositionEngine/src/CompositionEngine.cpp +++ b/services/surfaceflinger/CompositionEngine/src/CompositionEngine.cpp @@ -16,6 +16,7 @@ #include <compositionengine/impl/CompositionEngine.h> #include <compositionengine/impl/Display.h> +#include <compositionengine/impl/Layer.h> #include <renderengine/RenderEngine.h> #include "DisplayHardware/HWComposer.h" @@ -38,6 +39,10 @@ std::shared_ptr<compositionengine::Display> CompositionEngine::createDisplay( return compositionengine::impl::createDisplay(*this, std::move(args)); } +std::shared_ptr<compositionengine::Layer> CompositionEngine::createLayer(LayerCreationArgs&& args) { + return compositionengine::impl::createLayer(*this, std::move(args)); +} + HWComposer& CompositionEngine::getHwComposer() const { return *mHwComposer.get(); } diff --git a/services/surfaceflinger/CompositionEngine/src/Layer.cpp b/services/surfaceflinger/CompositionEngine/src/Layer.cpp new file mode 100644 index 0000000000..aaa758ea6f --- /dev/null +++ b/services/surfaceflinger/CompositionEngine/src/Layer.cpp @@ -0,0 +1,46 @@ +/* + * Copyright 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <compositionengine/CompositionEngine.h> +#include <compositionengine/LayerCreationArgs.h> +#include <compositionengine/LayerFE.h> +#include <compositionengine/impl/Layer.h> + +namespace android::compositionengine { + +Layer::~Layer() = default; + +namespace impl { + +std::shared_ptr<compositionengine::Layer> createLayer( + const compositionengine::CompositionEngine& compositionEngine, + compositionengine::LayerCreationArgs&& args) { + return std::make_shared<Layer>(compositionEngine, std::move(args)); +} + +Layer::Layer(const CompositionEngine& compositionEngine, LayerCreationArgs&& args) + : mCompositionEngine(compositionEngine), mLayerFE(args.layerFE) { + static_cast<void>(mCompositionEngine); // Temporary use to prevent an unused warning +} + +Layer::~Layer() = default; + +sp<LayerFE> Layer::getLayerFE() const { + return mLayerFE.promote(); +} + +} // namespace impl +} // namespace android::compositionengine diff --git a/services/surfaceflinger/CompositionEngine/src/Output.cpp b/services/surfaceflinger/CompositionEngine/src/Output.cpp index c4d563f798..2d458bfe53 100644 --- a/services/surfaceflinger/CompositionEngine/src/Output.cpp +++ b/services/surfaceflinger/CompositionEngine/src/Output.cpp @@ -21,7 +21,11 @@ #include <compositionengine/impl/Output.h> #include <ui/DebugUtils.h> -namespace android::compositionengine::impl { +namespace android::compositionengine { + +Output::~Output() = default; + +namespace impl { Output::Output(const CompositionEngine& compositionEngine) : mCompositionEngine(compositionEngine) {} @@ -182,4 +186,5 @@ void Output::dirtyEntireOutput() { mState.dirtyRegion.set(mState.bounds); } -} // namespace android::compositionengine::impl +} // namespace impl +} // namespace android::compositionengine diff --git a/services/surfaceflinger/CompositionEngine/tests/LayerTest.cpp b/services/surfaceflinger/CompositionEngine/tests/LayerTest.cpp new file mode 100644 index 0000000000..26115a344e --- /dev/null +++ b/services/surfaceflinger/CompositionEngine/tests/LayerTest.cpp @@ -0,0 +1,45 @@ +/* + * Copyright 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <gtest/gtest.h> + +#include <compositionengine/LayerCreationArgs.h> +#include <compositionengine/impl/Layer.h> +#include <compositionengine/mock/CompositionEngine.h> +#include <compositionengine/mock/LayerFE.h> + +namespace android::compositionengine { +namespace { + +using testing::StrictMock; + +class LayerTest : public testing::Test { +public: + ~LayerTest() override = default; + + StrictMock<mock::CompositionEngine> mCompositionEngine; + sp<LayerFE> mLayerFE = new StrictMock<mock::LayerFE>(); + impl::Layer mLayer{mCompositionEngine, LayerCreationArgs{mLayerFE}}; +}; + +/* ------------------------------------------------------------------------ + * Basic construction + */ + +TEST_F(LayerTest, canInstantiateLayer) {} + +} // namespace +} // namespace android::compositionengine diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index 619964ffbb..f49733bb08 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -2227,6 +2227,10 @@ bool Layer::hasInput() const { return mDrawingState.inputInfo.token != nullptr; } +std::shared_ptr<compositionengine::Layer> Layer::getCompositionLayer() const { + return nullptr; +} + // --------------------------------------------------------------------------- }; // namespace android diff --git a/services/surfaceflinger/Layer.h b/services/surfaceflinger/Layer.h index 00e1a6ff56..c9989c9910 100644 --- a/services/surfaceflinger/Layer.h +++ b/services/surfaceflinger/Layer.h @@ -19,6 +19,7 @@ #include <sys/types.h> +#include <compositionengine/LayerFE.h> #include <gui/BufferQueue.h> #include <gui/ISurfaceComposerClient.h> #include <gui/LayerState.h> @@ -68,6 +69,10 @@ class SurfaceFlinger; class LayerDebugInfo; class LayerBE; +namespace compositionengine { +class Layer; +} + namespace impl { class SurfaceInterceptor; } @@ -87,7 +92,7 @@ struct LayerCreationArgs { uint32_t flags; }; -class Layer : public virtual RefBase { +class Layer : public virtual compositionengine::LayerFE { static std::atomic<int32_t> sSequence; public: @@ -326,6 +331,8 @@ public: // visually. bool isLegacyDataSpace() const; + virtual std::shared_ptr<compositionengine::Layer> getCompositionLayer() const; + // If we have received a new buffer this frame, we will pass its surface // damage down to hardware composer. Otherwise, we must send a region with // one empty rect. |