1d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin/* 21c83c9c682ae9a6a43bd7e1a199355333c70a8cdNaseer Ahmed* Copyright (c) 2014 - 2016, The Linux Foundation. All rights reserved. 3d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin* 4d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin* Redistribution and use in source and binary forms, with or without modification, are permitted 5d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin* provided that the following conditions are met: 6d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin* * Redistributions of source code must retain the above copyright notice, this list of 7d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin* conditions and the following disclaimer. 8d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin* * Redistributions in binary form must reproduce the above copyright notice, this list of 9d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin* conditions and the following disclaimer in the documentation and/or other materials provided 10d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin* with the distribution. 11d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin* * Neither the name of The Linux Foundation nor the names of its contributors may be used to 12d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin* endorse or promote products derived from this software without specific prior written 13d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin* permission. 14d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin* 15d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 16d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 17d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin* NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE 18d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 19d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 20d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 21d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 22d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 23d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin*/ 24d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 25d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin/*! @file layer_stack.h 26d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin @brief File for display layer stack structure which represents a drawing buffer. 27d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 28d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin @details Display layer is a drawing buffer object which will be blended with other drawing buffers 29d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin under blending rules. 30d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin*/ 31d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#ifndef __LAYER_STACK_H__ 32d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#define __LAYER_STACK_H__ 33d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 34d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#include <stdint.h> 35d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#include <utils/constants.h> 36d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 378089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch#include <vector> 388089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch 39d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#include "layer_buffer.h" 40d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#include "sdm_types.h" 41d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 42d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjinnamespace sdm { 43d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 44d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin/*! @brief This enum represents display layer blending types. 45d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 46d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin @sa Layer 47d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin*/ 48d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjinenum LayerBlending { 49d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin kBlendingPremultiplied, //!< Pixel color is expressed using premultiplied alpha in RGBA tuples. 50d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< If plane alpha is less than 0xFF, apply modulation as well. 51d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< pixel.rgb = src.rgb + dest.rgb x (1 - src.a) 52d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 53d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin kBlendingOpaque, //!< Pixel color is expressed using straight alpha in color tuples. It 54d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< is constant blend operation. The layer would appear opaque if plane 55d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< alpha is 0xFF. 56d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 57d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin kBlendingCoverage, //!< Pixel color is expressed using straight alpha in color tuples. If 58d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< plane alpha is less than 0xff, apply modulation as well. 59d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< pixel.rgb = src.rgb x src.a + dest.rgb x (1 - src.a) 60d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin}; 61d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 62d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin/*! @brief This enum represents display layer composition types. 63d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 64d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin @sa Layer 65d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin*/ 66d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjinenum LayerComposition { 67d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin kCompositionGPU, //!< This layer will be drawn onto the target buffer by GPU. Display 68d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< device will mark the layer for GPU composition if it can not handle 69d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< it completely. 70d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 71d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin kCompositionSDE, //!< This layer will be handled by SDE. It must not be composed by GPU. 72d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 73d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin kCompositionHWCursor, //!< This layer will be handled by SDE using HWCursor. It must not be 74d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< composed by GPU 75d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 76d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin kCompositionHybrid, //!< This layer will be drawn by a blit engine and SDE together. Display 77d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< device will split the layer, update the blit rectangle that 78d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< need to be composed by a blit engine and update original source 79d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< rectangle that will be composed by SDE. 80d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 81d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin kCompositionBlit, //!< This layer will be composed using Blit Engine 82d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 83d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin kCompositionGPUTarget, //!< This layer will hold result of composition for layers marked for 84d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< GPU composition. 85d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< If display device does not set any layer for SDE composition then 86d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< this would be ignored during Commit(). 87d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< Only one layer shall be marked as target buffer by the caller. 88d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< GPU target layer shall be after application layers in layer stack. 89d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 90d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin kCompositionBlitTarget, //!< This layer will hold result of composition for blit rectangles 91d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< from the layers marked for hybrid composition. Nth blit rectangle 92d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< in a layer shall be composed onto Nth blit target. 93d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< If display device does not set any layer for hybrid composition 94d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< then this would be ignored during Commit(). 95d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< Blit target layers shall be after GPU target layer in layer stack. 96d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin}; 97d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 98d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin/*! @brief This structure defines rotation and flip values for a display layer. 99d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 100d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin @sa Layer 101d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin*/ 102d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjinstruct LayerTransform { 1031c83c9c682ae9a6a43bd7e1a199355333c70a8cdNaseer Ahmed float rotation = 0.0f; //!< Left most pixel coordinate. 1041c83c9c682ae9a6a43bd7e1a199355333c70a8cdNaseer Ahmed bool flip_horizontal = false; //!< Mirror reversal of the layer across a horizontal axis. 1051c83c9c682ae9a6a43bd7e1a199355333c70a8cdNaseer Ahmed bool flip_vertical = false; //!< Mirror reversal of the layer across a vertical axis. 1061c83c9c682ae9a6a43bd7e1a199355333c70a8cdNaseer Ahmed 1071c83c9c682ae9a6a43bd7e1a199355333c70a8cdNaseer Ahmed bool operator==(const LayerTransform& transform) const { 1081c83c9c682ae9a6a43bd7e1a199355333c70a8cdNaseer Ahmed return (rotation == transform.rotation && flip_horizontal == transform.flip_horizontal && 1091c83c9c682ae9a6a43bd7e1a199355333c70a8cdNaseer Ahmed flip_vertical == transform.flip_vertical); 1101c83c9c682ae9a6a43bd7e1a199355333c70a8cdNaseer Ahmed } 1111c83c9c682ae9a6a43bd7e1a199355333c70a8cdNaseer Ahmed 1121c83c9c682ae9a6a43bd7e1a199355333c70a8cdNaseer Ahmed bool operator!=(const LayerTransform& transform) const { 1131c83c9c682ae9a6a43bd7e1a199355333c70a8cdNaseer Ahmed return !operator==(transform); 1141c83c9c682ae9a6a43bd7e1a199355333c70a8cdNaseer Ahmed } 115d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin}; 116d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 117d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin/*! @brief This structure defines flags associated with a layer. The 1-bit flag can be set to ON(1) 118d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin or OFF(0). 119d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 120d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin @sa LayerBuffer 121d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin*/ 122d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjinstruct LayerFlags { 123d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin union { 124d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin struct { 125d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin uint32_t skip : 1; //!< This flag shall be set by client to indicate that this layer 126d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< will be handled by GPU. Display Device will not consider it 127d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< for composition. 128d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 129d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin uint32_t updating : 1; //!< This flag shall be set by client to indicate that this is 130d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< updating non-updating. so strategy manager will mark them for 131d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< SDE/GPU composition respectively when the layer stack qualifies 132d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< for cache based composition. 133d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 134d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin uint32_t solid_fill : 1; 135d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< This flag shall be set by client to indicate that this layer 136d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< is for solid fill without input buffer. Display Device will 137d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< use SDE HW feature to achieve it. 138d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 139d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin uint32_t cursor : 1; //!< This flag shall be set by client to indicate that this layer 140d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< is a cursor 141d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< Display Device may handle this layer using HWCursor 142d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 143d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin uint32_t single_buffer : 1; //!< This flag shall be set by client to indicate that the layer 144d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< uses only a single buffer that will not be swapped out 145d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin }; 146d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 147d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin uint32_t flags = 0; //!< For initialization purpose only. 148d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< Client shall not refer it directly. 149d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin }; 150d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin}; 151d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 152d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin/*! @brief This structure defines flags associated with a layer stack. The 1-bit flag can be set to 153d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ON(1) or OFF(0). 154d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 155d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin @sa LayerBuffer 156d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin*/ 157d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjinstruct LayerStackFlags { 158d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin union { 159d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin struct { 160d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin uint32_t geometry_changed : 1; //!< This flag shall be set by client to indicate that the 161d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< layer set passed to Prepare() has changed by more than 162d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< just the buffer handles and acquire fences. 163d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 164d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin uint32_t skip_present : 1; //!< This flag will be set to true, if the current layer 165d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< stack contains skip layers. 166d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 167d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin uint32_t video_present : 1; //!< This flag will be set to true, if current layer stack 168d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< contains video. 169d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 170d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin uint32_t secure_present : 1; //!< This flag will be set to true, if the current layer 171d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< stack contains secure layers. 172d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 173d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin uint32_t animating : 1; //!< This flag shall be set by client to indicate that the 174d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< current frame is animating.i 175d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 176d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin uint32_t attributes_changed : 1; 177d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< This flag shall be set by client to indicate that the 178d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< current frame has some properties changed and 179d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< needs re-config. 180d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 181d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin uint32_t cursor_present : 1; //!< This flag will be set to true if the current layer 182d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< stack contains cursor layer. 183d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 184d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin uint32_t single_buffered_layer_present : 1; //!< Set if stack has single buffered layer 185f31e45897c5f3d981922222644b9778af2302474Patrick Tjin 186f31e45897c5f3d981922222644b9778af2302474Patrick Tjin uint32_t s3d_mode_present : 1; //!< This flag will be set to true, if the current layer 187f31e45897c5f3d981922222644b9778af2302474Patrick Tjin //!< stack contains s3d layer, and the layer stack can enter 188f31e45897c5f3d981922222644b9778af2302474Patrick Tjin //!< s3d mode. 1898089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch 1908089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch uint32_t post_processed_output : 1; // If output_buffer should contain post processed output 1918089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch // This applies only to primary displays currently 192d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin }; 193d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 194d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin uint32_t flags = 0; //!< For initialization purpose only. 195d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< Client shall not refer it directly. 196d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin }; 197d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin}; 198d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 199d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin/*! @brief This structure defines a rectanglular area inside a display layer. 200d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 201d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin @sa LayerRectArray 202d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin*/ 203d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjinstruct LayerRect { 204d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin float left = 0.0f; //!< Left-most pixel coordinate. 205d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin float top = 0.0f; //!< Top-most pixel coordinate. 206d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin float right = 0.0f; //!< Right-most pixel coordinate. 207d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin float bottom = 0.0f; //!< Bottom-most pixel coordinate. 208d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 209d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin LayerRect() = default; 2101c83c9c682ae9a6a43bd7e1a199355333c70a8cdNaseer Ahmed 211d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin LayerRect(float l, float t, float r, float b) : left(l), top(t), right(r), bottom(b) { } 2121c83c9c682ae9a6a43bd7e1a199355333c70a8cdNaseer Ahmed 2131c83c9c682ae9a6a43bd7e1a199355333c70a8cdNaseer Ahmed bool operator==(const LayerRect& rect) const { 2141c83c9c682ae9a6a43bd7e1a199355333c70a8cdNaseer Ahmed return left == rect.left && right == rect.right && top == rect.top && bottom == rect.bottom; 2151c83c9c682ae9a6a43bd7e1a199355333c70a8cdNaseer Ahmed } 2161c83c9c682ae9a6a43bd7e1a199355333c70a8cdNaseer Ahmed 2171c83c9c682ae9a6a43bd7e1a199355333c70a8cdNaseer Ahmed bool operator!=(const LayerRect& rect) const { 2181c83c9c682ae9a6a43bd7e1a199355333c70a8cdNaseer Ahmed return !operator==(rect); 2191c83c9c682ae9a6a43bd7e1a199355333c70a8cdNaseer Ahmed } 220d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin}; 221d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 222d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin/*! @brief This structure defines an array of display layer rectangles. 223d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 224d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin @sa LayerRect 225d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin*/ 226d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjinstruct LayerRectArray { 227d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin LayerRect *rect = NULL; //!< Pointer to first element of array. 228d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin uint32_t count = 0; //!< Number of elements in the array. 229d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin}; 230d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 231d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin/*! @brief This structure defines display layer object which contains layer properties and a drawing 232d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin buffer. 233d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 234d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin @sa LayerArray 235d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin*/ 236d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjinstruct Layer { 237d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin LayerBuffer *input_buffer = NULL; //!< Pointer to the buffer to be composed. 238d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< If this remains unchanged between two 239d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< consecutive Prepare() calls and 240d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< geometry_changed flag is not set for the 241d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< second call, then the display device will 242d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< assume that buffer content has not 243d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< changed. 244d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 245d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin LayerComposition composition = kCompositionGPU; //!< Composition type which can be set by either 246d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< the client or the display device. This value 247d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< should be preserved between Prepare() and 248d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< Commit() calls. 249d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 2508089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch LayerRect src_rect = {}; //!< Rectangular area of the layer buffer to 251d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< consider for composition. 252d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 2538089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch LayerRect dst_rect = {}; //!< The target position where the frame will be 254d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< displayed. Cropping rectangle is scaled to 255d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< fit into this rectangle. The origin is the 256d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< top-left corner of the screen. 257d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 2588089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch std::vector<LayerRect> visible_regions = {}; //!< Visible rectangular areas in screen space. 259d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< The visible region includes areas overlapped 260d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< by a translucent layer. 261d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 2628089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch std::vector<LayerRect> dirty_regions = {}; //!< Rectangular areas in the current frames 263d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< that have changed in comparison to 264d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< previous frame. 265d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 2668089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch std::vector<LayerRect> blit_regions = {}; //!< Rectangular areas of this layer which need 267d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< to be composed to blit target. Display 268d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< device will update blit rectangles if a 269d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< layer composition is set as hybrid. Nth blit 270d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< rectangle shall be composed onto Nth blit 271d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< target. 272d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 273d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin LayerBlending blending = kBlendingPremultiplied; //!< Blending operation which need to be 274d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< applied on the layer buffer during 275d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< composition. 276d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 2778089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch LayerTransform transform = {}; //!< Rotation/Flip operations which need to be 278d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< applied to the layer buffer during 279d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< composition. 280d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 28152af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch uint8_t plane_alpha = 0xff; //!< Alpha value applied to the whole layer. 282d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< Value of each pixel is computed as: 283d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< if(kBlendingPremultiplied) { 284d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< pixel.RGB = pixel.RGB * planeAlpha/255 285d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< } 286d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< pixel.a = pixel.a * planeAlpha 287d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 288d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin uint32_t frame_rate = 0; //!< Rate at which frames are being updated for 289d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< this layer. 290d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 291d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin uint32_t solid_fill_color = 0; //!< Solid color used to fill the layer when 292d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< no content is associated with the layer. 293d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 294d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin LayerFlags flags; //!< Flags associated with this layer. 295d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin}; 296d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 297d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin/*! @brief This structure defines a layer stack that contains layers which need to be composed and 298d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin rendered onto the target. 299d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 300d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin @sa DisplayInterface::Prepare 301d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin @sa DisplayInterface::Commit 302d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin*/ 303d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjinstruct LayerStack { 3048089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch std::vector<Layer *> layers = {}; //!< Vector of layer pointers. 305d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 306d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin int retire_fence_fd = -1; //!< File descriptor referring to a sync fence object which 307d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< will be signaled when this composited frame has been 308d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< replaced on screen by a subsequent frame on a physical 309d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< display. The fence object is created and returned during 310d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< Commit(). Client shall close the returned file 311d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< descriptor. 312d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< NOTE: This field applies to a physical display only. 313d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 314d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin LayerBuffer *output_buffer = NULL; //!< Pointer to the buffer where composed buffer would be 315d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< rendered for virtual displays. 316d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //!< NOTE: This field applies to a virtual display only. 317d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 318d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin LayerStackFlags flags; //!< Flags associated with this layer set. 319d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin}; 320d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 321d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin} // namespace sdm 322d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 323d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#endif // __LAYER_STACK_H__ 324d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 325