| /* | 
 |  * Copyright (C) 2008 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. | 
 |  */ | 
 |  | 
 | #ifndef ANDROID_SF_LAYER_STATE_H | 
 | #define ANDROID_SF_LAYER_STATE_H | 
 |  | 
 | #include <stdint.h> | 
 | #include <sys/types.h> | 
 |  | 
 | #include <utils/Errors.h> | 
 |  | 
 | #include <gui/IGraphicBufferProducer.h> | 
 | #include <math/mat4.h> | 
 |  | 
 | #ifndef NO_INPUT | 
 | #include <input/InputWindow.h> | 
 | #endif | 
 |  | 
 | #include <gui/LayerMetadata.h> | 
 | #include <math/vec3.h> | 
 | #include <ui/GraphicTypes.h> | 
 | #include <ui/Rect.h> | 
 | #include <ui/Region.h> | 
 |  | 
 | namespace android { | 
 |  | 
 | class Parcel; | 
 | class ISurfaceComposerClient; | 
 |  | 
 | struct client_cache_t { | 
 |     wp<IBinder> token = nullptr; | 
 |     uint64_t id; | 
 |  | 
 |     bool operator==(const client_cache_t& other) const { return id == other.id; } | 
 |  | 
 |     bool isValid() const { return token != nullptr; } | 
 | }; | 
 |  | 
 | /* | 
 |  * Used to communicate layer information between SurfaceFlinger and its clients. | 
 |  */ | 
 | struct layer_state_t { | 
 |     enum { | 
 |         eLayerHidden = 0x01, // SURFACE_HIDDEN in SurfaceControl.java | 
 |         eLayerOpaque = 0x02, // SURFACE_OPAQUE | 
 |         eLayerSecure = 0x80, // SECURE | 
 |     }; | 
 |  | 
 |     enum { | 
 |         ePositionChanged = 0x00000001, | 
 |         eLayerChanged = 0x00000002, | 
 |         eSizeChanged = 0x00000004, | 
 |         eAlphaChanged = 0x00000008, | 
 |         eMatrixChanged = 0x00000010, | 
 |         eTransparentRegionChanged = 0x00000020, | 
 |         eFlagsChanged = 0x00000040, | 
 |         eLayerStackChanged = 0x00000080, | 
 |         eCropChanged_legacy = 0x00000100, | 
 |         eDeferTransaction_legacy = 0x00000200, | 
 |         eOverrideScalingModeChanged = 0x00000400, | 
 |         eGeometryAppliesWithResize = 0x00000800, | 
 |         eReparentChildren = 0x00001000, | 
 |         eDetachChildren = 0x00002000, | 
 |         eRelativeLayerChanged = 0x00004000, | 
 |         eReparent = 0x00008000, | 
 |         eColorChanged = 0x00010000, | 
 |         eDestroySurface = 0x00020000, | 
 |         eTransformChanged = 0x00040000, | 
 |         eTransformToDisplayInverseChanged = 0x00080000, | 
 |         eCropChanged = 0x00100000, | 
 |         eBufferChanged = 0x00200000, | 
 |         eAcquireFenceChanged = 0x00400000, | 
 |         eDataspaceChanged = 0x00800000, | 
 |         eHdrMetadataChanged = 0x01000000, | 
 |         eSurfaceDamageRegionChanged = 0x02000000, | 
 |         eApiChanged = 0x04000000, | 
 |         eSidebandStreamChanged = 0x08000000, | 
 |         eColorTransformChanged = 0x10000000, | 
 |         eHasListenerCallbacksChanged = 0x20000000, | 
 |         eInputInfoChanged = 0x40000000, | 
 |         eCornerRadiusChanged = 0x80000000, | 
 |         eFrameChanged = 0x1'00000000, | 
 |         eCachedBufferChanged = 0x2'00000000, | 
 |         eBackgroundColorChanged = 0x4'00000000, | 
 |         eMetadataChanged = 0x8'00000000, | 
 |         eColorSpaceAgnosticChanged = 0x10'00000000, | 
 |     }; | 
 |  | 
 |     layer_state_t() | 
 |           : what(0), | 
 |             x(0), | 
 |             y(0), | 
 |             z(0), | 
 |             w(0), | 
 |             h(0), | 
 |             layerStack(0), | 
 |             alpha(0), | 
 |             flags(0), | 
 |             mask(0), | 
 |             reserved(0), | 
 |             crop_legacy(Rect::INVALID_RECT), | 
 |             cornerRadius(0.0f), | 
 |             frameNumber_legacy(0), | 
 |             overrideScalingMode(-1), | 
 |             transform(0), | 
 |             transformToDisplayInverse(false), | 
 |             crop(Rect::INVALID_RECT), | 
 |             frame(Rect::INVALID_RECT), | 
 |             dataspace(ui::Dataspace::UNKNOWN), | 
 |             surfaceDamageRegion(), | 
 |             api(-1), | 
 |             colorTransform(mat4()), | 
 |             hasListenerCallbacks(false), | 
 |             bgColorAlpha(0), | 
 |             bgColorDataspace(ui::Dataspace::UNKNOWN), | 
 |             colorSpaceAgnostic(false) { | 
 |         matrix.dsdx = matrix.dtdy = 1.0f; | 
 |         matrix.dsdy = matrix.dtdx = 0.0f; | 
 |         hdrMetadata.validTypes = 0; | 
 |     } | 
 |  | 
 |     void merge(const layer_state_t& other); | 
 |     status_t write(Parcel& output) const; | 
 |     status_t read(const Parcel& input); | 
 |  | 
 |     struct matrix22_t { | 
 |         float dsdx{0}; | 
 |         float dtdx{0}; | 
 |         float dtdy{0}; | 
 |         float dsdy{0}; | 
 |     }; | 
 |     sp<IBinder> surface; | 
 |     uint64_t what; | 
 |     float x; | 
 |     float y; | 
 |     int32_t z; | 
 |     uint32_t w; | 
 |     uint32_t h; | 
 |     uint32_t layerStack; | 
 |     float alpha; | 
 |     uint8_t flags; | 
 |     uint8_t mask; | 
 |     uint8_t reserved; | 
 |     matrix22_t matrix; | 
 |     Rect crop_legacy; | 
 |     float cornerRadius; | 
 |     sp<IBinder> barrierHandle_legacy; | 
 |     sp<IBinder> reparentHandle; | 
 |     uint64_t frameNumber_legacy; | 
 |     int32_t overrideScalingMode; | 
 |  | 
 |     sp<IGraphicBufferProducer> barrierGbp_legacy; | 
 |  | 
 |     sp<IBinder> relativeLayerHandle; | 
 |  | 
 |     sp<IBinder> parentHandleForChild; | 
 |  | 
 |     half3 color; | 
 |  | 
 |     // non POD must be last. see write/read | 
 |     Region transparentRegion; | 
 |  | 
 |     uint32_t transform; | 
 |     bool transformToDisplayInverse; | 
 |     Rect crop; | 
 |     Rect frame; | 
 |     sp<GraphicBuffer> buffer; | 
 |     sp<Fence> acquireFence; | 
 |     ui::Dataspace dataspace; | 
 |     HdrMetadata hdrMetadata; | 
 |     Region surfaceDamageRegion; | 
 |     int32_t api; | 
 |     sp<NativeHandle> sidebandStream; | 
 |     mat4 colorTransform; | 
 |  | 
 |     bool hasListenerCallbacks; | 
 | #ifndef NO_INPUT | 
 |     InputWindowInfo inputInfo; | 
 | #endif | 
 |  | 
 |     client_cache_t cachedBuffer; | 
 |  | 
 |     LayerMetadata metadata; | 
 |  | 
 |     // The following refer to the alpha, and dataspace, respectively of | 
 |     // the background color layer | 
 |     float bgColorAlpha; | 
 |     ui::Dataspace bgColorDataspace; | 
 |  | 
 |     // A color space agnostic layer means the color of this layer can be | 
 |     // interpreted in any color space. | 
 |     bool colorSpaceAgnostic; | 
 | }; | 
 |  | 
 | struct ComposerState { | 
 |     sp<ISurfaceComposerClient> client; | 
 |     layer_state_t state; | 
 |     status_t write(Parcel& output) const; | 
 |     status_t read(const Parcel& input); | 
 | }; | 
 |  | 
 | struct DisplayState { | 
 |     enum { | 
 |         eOrientationDefault = 0, | 
 |         eOrientation90 = 1, | 
 |         eOrientation180 = 2, | 
 |         eOrientation270 = 3, | 
 |         eOrientationUnchanged = 4, | 
 |         eOrientationSwapMask = 0x01 | 
 |     }; | 
 |  | 
 |     enum { | 
 |         eSurfaceChanged = 0x01, | 
 |         eLayerStackChanged = 0x02, | 
 |         eDisplayProjectionChanged = 0x04, | 
 |         eDisplaySizeChanged = 0x08 | 
 |     }; | 
 |  | 
 |     DisplayState(); | 
 |     void merge(const DisplayState& other); | 
 |  | 
 |     uint32_t what; | 
 |     sp<IBinder> token; | 
 |     sp<IGraphicBufferProducer> surface; | 
 |     uint32_t layerStack; | 
 |  | 
 |     // These states define how layers are projected onto the physical display. | 
 |     // | 
 |     // Layers are first clipped to `viewport'.  They are then translated and | 
 |     // scaled from `viewport' to `frame'.  Finally, they are rotated according | 
 |     // to `orientation', `width', and `height'. | 
 |     // | 
 |     // For example, assume viewport is Rect(0, 0, 200, 100), frame is Rect(20, | 
 |     // 10, 420, 210), and the size of the display is WxH.  When orientation is | 
 |     // 0, layers will be scaled by a factor of 2 and translated by (20, 10). | 
 |     // When orientation is 1, layers will be additionally rotated by 90 | 
 |     // degrees around the origin clockwise and translated by (W, 0). | 
 |     uint32_t orientation; | 
 |     Rect viewport; | 
 |     Rect frame; | 
 |  | 
 |     uint32_t width, height; | 
 |  | 
 |     status_t write(Parcel& output) const; | 
 |     status_t read(const Parcel& input); | 
 | }; | 
 |  | 
 | struct InputWindowCommands { | 
 |     struct TransferTouchFocusCommand { | 
 |         sp<IBinder> fromToken; | 
 |         sp<IBinder> toToken; | 
 |     }; | 
 |  | 
 |     std::vector<TransferTouchFocusCommand> transferTouchFocusCommands; | 
 |     bool syncInputWindows{false}; | 
 |  | 
 |     void merge(const InputWindowCommands& other); | 
 |     void clear(); | 
 |     void write(Parcel& output) const; | 
 |     void read(const Parcel& input); | 
 | }; | 
 |  | 
 | static inline int compare_type(const ComposerState& lhs, const ComposerState& rhs) { | 
 |     if (lhs.client < rhs.client) return -1; | 
 |     if (lhs.client > rhs.client) return 1; | 
 |     if (lhs.state.surface < rhs.state.surface) return -1; | 
 |     if (lhs.state.surface > rhs.state.surface) return 1; | 
 |     return 0; | 
 | } | 
 |  | 
 | static inline int compare_type(const DisplayState& lhs, const DisplayState& rhs) { | 
 |     return compare_type(lhs.token, rhs.token); | 
 | } | 
 |  | 
 | }; // namespace android | 
 |  | 
 | #endif // ANDROID_SF_LAYER_STATE_H |