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