| // 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_IMPELLER_TOOLKIT_ANDROID_SURFACE_CONTROL_H_ |
| #define FLUTTER_IMPELLER_TOOLKIT_ANDROID_SURFACE_CONTROL_H_ |
| |
| #include "flutter/fml/unique_object.h" |
| #include "impeller/toolkit/android/proc_table.h" |
| |
| namespace impeller::android { |
| |
| //------------------------------------------------------------------------------ |
| /// @brief A wrapper for ASurfaceControl. |
| /// https://developer.android.com/ndk/reference/group/native-activity#asurfacecontrol |
| /// |
| /// Instances of this class represent a node in the hierarchy of |
| /// surfaces sent to the system compositor for final composition. |
| /// |
| /// This wrapper is only available on Android API 29 and above. |
| /// |
| class SurfaceControl { |
| public: |
| //---------------------------------------------------------------------------- |
| /// @return `true` if any surface controls can be created on this |
| /// platform. |
| /// |
| static bool IsAvailableOnPlatform(); |
| |
| //---------------------------------------------------------------------------- |
| /// @brief Creates a new surface control and adds it as a child of the |
| /// given window. |
| /// |
| /// @param window The window |
| /// @param[in] debug_name A debug name. See it using |
| /// `adb shell dumpsys SurfaceFlinger` along with |
| /// other control properties. If no debug name is |
| /// specified, the value "Impeller Layer" is used. |
| /// |
| explicit SurfaceControl(ANativeWindow* window, |
| const char* debug_name = nullptr); |
| |
| //---------------------------------------------------------------------------- |
| /// @brief Removes the surface control from the presentation hierarchy |
| /// managed by the system compositor and release the client side |
| /// reference to the control. At this point, it may be collected |
| /// when the compositor is also done using it. |
| /// |
| ~SurfaceControl(); |
| |
| SurfaceControl(const SurfaceControl&) = delete; |
| |
| SurfaceControl& operator=(const SurfaceControl&) = delete; |
| |
| bool IsValid() const; |
| |
| ASurfaceControl* GetHandle() const; |
| |
| //---------------------------------------------------------------------------- |
| /// @brief Remove the surface control from the hierarchy of nodes |
| /// presented by the system compositor. |
| /// |
| /// @return `true` If the control will be removed from the hierarchy of |
| /// nodes presented by the system compositor. |
| /// |
| bool RemoveFromParent() const; |
| |
| private: |
| struct UniqueASurfaceControlTraits { |
| static ASurfaceControl* InvalidValue() { return nullptr; } |
| |
| static bool IsValid(ASurfaceControl* value) { |
| return value != InvalidValue(); |
| } |
| |
| static void Free(ASurfaceControl* value) { |
| GetProcTable().ASurfaceControl_release(value); |
| } |
| }; |
| |
| fml::UniqueObject<ASurfaceControl*, UniqueASurfaceControlTraits> control_; |
| }; |
| |
| } // namespace impeller::android |
| |
| #endif // FLUTTER_IMPELLER_TOOLKIT_ANDROID_SURFACE_CONTROL_H_ |