| // Copyright 2013 The Flutter Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #ifndef FLUTTER_SHELL_PLATFORM_EMBEDDER_EMBEDDER_RENDER_TARGET_H_ | |
| #define FLUTTER_SHELL_PLATFORM_EMBEDDER_EMBEDDER_RENDER_TARGET_H_ | |
| #include <memory> | |
| #include "flutter/fml/closure.h" | |
| #include "flutter/fml/macros.h" | |
| #include "flutter/shell/platform/embedder/embedder.h" | |
| #include "third_party/skia/include/core/SkSize.h" | |
| #include "third_party/skia/include/core/SkSurface.h" | |
| namespace impeller { | |
| class RenderTarget; | |
| class AiksContext; | |
| } // namespace impeller | |
| namespace flutter { | |
| //------------------------------------------------------------------------------ | |
| /// @brief Describes a surface whose backing store is managed by the | |
| /// embedder. The type of surface depends on the client rendering | |
| /// API used. The embedder is notified of the collection of this | |
| /// render target via a callback. | |
| /// | |
| class EmbedderRenderTarget { | |
| public: | |
| struct SetCurrentResult { | |
| /// This is true if the operation succeeded (even if it was a no-op), | |
| /// false if the surface could not be made current / the current surface | |
| /// could not be cleared. | |
| bool success; | |
| /// This is true if any native graphics API (e.g. GL, but not EGL) state has | |
| /// changed and Skia/Impeller should not assume any GL state values are the | |
| /// same as before the context change operation was attempted. | |
| bool gl_state_trampled; | |
| }; | |
| using MakeOrClearCurrentCallback = std::function<SetCurrentResult()>; | |
| //---------------------------------------------------------------------------- | |
| /// @brief Destroys this instance of the render target and invokes the | |
| /// callback for the embedder to release its resource associated | |
| /// with the particular backing store. | |
| /// | |
| virtual ~EmbedderRenderTarget(); | |
| //---------------------------------------------------------------------------- | |
| /// @brief A render surface the rasterizer can use to draw into the | |
| /// backing store of this render target. | |
| /// | |
| /// @return The render surface. | |
| /// | |
| virtual sk_sp<SkSurface> GetSkiaSurface() const = 0; | |
| //---------------------------------------------------------------------------- | |
| /// @brief An impeller render target the rasterizer can use to draw into | |
| /// the backing store. | |
| /// | |
| /// @return The Impeller render target. | |
| /// | |
| virtual impeller::RenderTarget* GetImpellerRenderTarget() const = 0; | |
| //---------------------------------------------------------------------------- | |
| /// @brief Returns the AiksContext that should be used for rendering, if | |
| /// this render target is backed by Impeller. | |
| /// | |
| /// @return The Impeller Aiks context. | |
| /// | |
| virtual std::shared_ptr<impeller::AiksContext> GetAiksContext() const = 0; | |
| //---------------------------------------------------------------------------- | |
| /// @brief Returns the size of the render target. | |
| /// | |
| /// @return The size of the render target. | |
| /// | |
| virtual SkISize GetRenderTargetSize() const = 0; | |
| //---------------------------------------------------------------------------- | |
| /// @brief The embedder backing store descriptor. This is the descriptor | |
| /// that was given to the engine by the embedder. This descriptor | |
| /// may contain context the embedder can use to associate it | |
| /// resources with the compositor layers when they are given back | |
| /// to it in present callback. The engine does not use this in any | |
| /// way. | |
| /// | |
| /// @return The backing store. | |
| /// | |
| const FlutterBackingStore* GetBackingStore() const; | |
| //---------------------------------------------------------------------------- | |
| /// @brief Make the render target current. | |
| /// | |
| /// Sometimes render targets are actually (for example) | |
| /// EGL surfaces instead of framebuffers or textures. | |
| /// In that case, we can't fully wrap them as SkSurfaces, instead, | |
| /// the embedder will provide a callback that should be called | |
| /// when the target surface should be made current. | |
| /// | |
| /// @return The result of the operation. | |
| virtual SetCurrentResult MaybeMakeCurrent() const { return {true, false}; } | |
| //---------------------------------------------------------------------------- | |
| /// @brief Clear the current render target. @see MaybeMakeCurrent | |
| /// | |
| /// @return The result of the operation. | |
| virtual SetCurrentResult MaybeClearCurrent() const { return {true, false}; } | |
| protected: | |
| //---------------------------------------------------------------------------- | |
| /// @brief Creates a render target whose backing store is managed by the | |
| /// embedder. The way this render target is exposed to the engine | |
| /// is via an SkSurface and a callback that is invoked by this | |
| /// object in its destructor. | |
| /// | |
| /// @param[in] backing_store The backing store describing this render | |
| /// target. | |
| /// @param[in] on_release The callback to invoke (eventually forwarded | |
| /// to the embedder) when the backing store is no | |
| /// longer required by the engine. | |
| /// | |
| EmbedderRenderTarget(FlutterBackingStore backing_store, | |
| fml::closure on_release); | |
| private: | |
| FlutterBackingStore backing_store_; | |
| fml::closure on_release_; | |
| FML_DISALLOW_COPY_AND_ASSIGN(EmbedderRenderTarget); | |
| }; | |
| } // namespace flutter | |
| #endif // FLUTTER_SHELL_PLATFORM_EMBEDDER_EMBEDDER_RENDER_TARGET_H_ |