xref: /aosp_15_r20/frameworks/native/services/surfaceflinger/RenderAreaBuilder.h (revision 38e8c45f13ce32b0dcecb25141ffecaf386fa17f)
1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker  * Copyright 2024 The Android Open Source Project
3*38e8c45fSAndroid Build Coastguard Worker  *
4*38e8c45fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*38e8c45fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*38e8c45fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*38e8c45fSAndroid Build Coastguard Worker  *
8*38e8c45fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*38e8c45fSAndroid Build Coastguard Worker  *
10*38e8c45fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*38e8c45fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*38e8c45fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*38e8c45fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*38e8c45fSAndroid Build Coastguard Worker  * limitations under the License.
15*38e8c45fSAndroid Build Coastguard Worker  */
16*38e8c45fSAndroid Build Coastguard Worker 
17*38e8c45fSAndroid Build Coastguard Worker #pragma once
18*38e8c45fSAndroid Build Coastguard Worker 
19*38e8c45fSAndroid Build Coastguard Worker #include "DisplayDevice.h"
20*38e8c45fSAndroid Build Coastguard Worker #include "DisplayRenderArea.h"
21*38e8c45fSAndroid Build Coastguard Worker #include "LayerRenderArea.h"
22*38e8c45fSAndroid Build Coastguard Worker #include "ui/Size.h"
23*38e8c45fSAndroid Build Coastguard Worker #include "ui/Transform.h"
24*38e8c45fSAndroid Build Coastguard Worker 
25*38e8c45fSAndroid Build Coastguard Worker namespace android {
26*38e8c45fSAndroid Build Coastguard Worker /**
27*38e8c45fSAndroid Build Coastguard Worker  * A parameter object for creating a render area
28*38e8c45fSAndroid Build Coastguard Worker  */
29*38e8c45fSAndroid Build Coastguard Worker struct RenderAreaBuilder {
30*38e8c45fSAndroid Build Coastguard Worker     // Source crop of the render area
31*38e8c45fSAndroid Build Coastguard Worker     Rect crop;
32*38e8c45fSAndroid Build Coastguard Worker 
33*38e8c45fSAndroid Build Coastguard Worker     // Size of the physical render area
34*38e8c45fSAndroid Build Coastguard Worker     ui::Size reqSize;
35*38e8c45fSAndroid Build Coastguard Worker 
36*38e8c45fSAndroid Build Coastguard Worker     // Composition data space of the render area
37*38e8c45fSAndroid Build Coastguard Worker     ui::Dataspace reqDataSpace;
38*38e8c45fSAndroid Build Coastguard Worker 
39*38e8c45fSAndroid Build Coastguard Worker     ftl::Flags<RenderArea::Options> options;
40*38e8c45fSAndroid Build Coastguard Worker     virtual std::unique_ptr<RenderArea> build() const = 0;
41*38e8c45fSAndroid Build Coastguard Worker 
RenderAreaBuilderRenderAreaBuilder42*38e8c45fSAndroid Build Coastguard Worker     RenderAreaBuilder(Rect crop, ui::Size reqSize, ui::Dataspace reqDataSpace,
43*38e8c45fSAndroid Build Coastguard Worker                       ftl::Flags<RenderArea::Options> options)
44*38e8c45fSAndroid Build Coastguard Worker           : crop(crop), reqSize(reqSize), reqDataSpace(reqDataSpace), options(options) {}
45*38e8c45fSAndroid Build Coastguard Worker 
46*38e8c45fSAndroid Build Coastguard Worker     virtual ~RenderAreaBuilder() = default;
47*38e8c45fSAndroid Build Coastguard Worker };
48*38e8c45fSAndroid Build Coastguard Worker 
49*38e8c45fSAndroid Build Coastguard Worker struct DisplayRenderAreaBuilder : RenderAreaBuilder {
DisplayRenderAreaBuilderDisplayRenderAreaBuilder50*38e8c45fSAndroid Build Coastguard Worker     DisplayRenderAreaBuilder(Rect crop, ui::Size reqSize, ui::Dataspace reqDataSpace,
51*38e8c45fSAndroid Build Coastguard Worker                              wp<const DisplayDevice> displayWeak,
52*38e8c45fSAndroid Build Coastguard Worker                              ftl::Flags<RenderArea::Options> options)
53*38e8c45fSAndroid Build Coastguard Worker           : RenderAreaBuilder(crop, reqSize, reqDataSpace, options), displayWeak(displayWeak) {}
54*38e8c45fSAndroid Build Coastguard Worker 
55*38e8c45fSAndroid Build Coastguard Worker     // Display that render area will be on
56*38e8c45fSAndroid Build Coastguard Worker     wp<const DisplayDevice> displayWeak;
57*38e8c45fSAndroid Build Coastguard Worker 
buildDisplayRenderAreaBuilder58*38e8c45fSAndroid Build Coastguard Worker     std::unique_ptr<RenderArea> build() const override {
59*38e8c45fSAndroid Build Coastguard Worker         return DisplayRenderArea::create(displayWeak, crop, reqSize, reqDataSpace, options);
60*38e8c45fSAndroid Build Coastguard Worker     }
61*38e8c45fSAndroid Build Coastguard Worker };
62*38e8c45fSAndroid Build Coastguard Worker 
63*38e8c45fSAndroid Build Coastguard Worker struct LayerRenderAreaBuilder : RenderAreaBuilder {
LayerRenderAreaBuilderLayerRenderAreaBuilder64*38e8c45fSAndroid Build Coastguard Worker     LayerRenderAreaBuilder(Rect crop, ui::Size reqSize, ui::Dataspace reqDataSpace, sp<Layer> layer,
65*38e8c45fSAndroid Build Coastguard Worker                            bool childrenOnly, ftl::Flags<RenderArea::Options> options)
66*38e8c45fSAndroid Build Coastguard Worker           : RenderAreaBuilder(crop, reqSize, reqDataSpace, options),
67*38e8c45fSAndroid Build Coastguard Worker             layer(layer),
68*38e8c45fSAndroid Build Coastguard Worker             childrenOnly(childrenOnly) {}
69*38e8c45fSAndroid Build Coastguard Worker 
70*38e8c45fSAndroid Build Coastguard Worker     // Root layer of the render area
71*38e8c45fSAndroid Build Coastguard Worker     sp<Layer> layer;
72*38e8c45fSAndroid Build Coastguard Worker 
73*38e8c45fSAndroid Build Coastguard Worker     // Layer snapshot of the root layer
74*38e8c45fSAndroid Build Coastguard Worker     frontend::LayerSnapshot layerSnapshot;
75*38e8c45fSAndroid Build Coastguard Worker 
76*38e8c45fSAndroid Build Coastguard Worker     // Transform to be applied on the layers to transform them
77*38e8c45fSAndroid Build Coastguard Worker     // into the logical render area
78*38e8c45fSAndroid Build Coastguard Worker     ui::Transform layerTransform{ui::Transform()};
79*38e8c45fSAndroid Build Coastguard Worker 
80*38e8c45fSAndroid Build Coastguard Worker     // Buffer bounds
81*38e8c45fSAndroid Build Coastguard Worker     Rect layerBufferSize{Rect()};
82*38e8c45fSAndroid Build Coastguard Worker 
83*38e8c45fSAndroid Build Coastguard Worker     // If false, transform is inverted from the parent snapshot
84*38e8c45fSAndroid Build Coastguard Worker     bool childrenOnly;
85*38e8c45fSAndroid Build Coastguard Worker 
86*38e8c45fSAndroid Build Coastguard Worker     // Uses parent snapshot to determine layer transform and buffer size
setLayerSnapshotLayerRenderAreaBuilder87*38e8c45fSAndroid Build Coastguard Worker     void setLayerSnapshot(const frontend::LayerSnapshot& parentSnapshot) {
88*38e8c45fSAndroid Build Coastguard Worker         layerSnapshot = parentSnapshot;
89*38e8c45fSAndroid Build Coastguard Worker         if (!childrenOnly) {
90*38e8c45fSAndroid Build Coastguard Worker             layerTransform = parentSnapshot.localTransform.inverse();
91*38e8c45fSAndroid Build Coastguard Worker         }
92*38e8c45fSAndroid Build Coastguard Worker         layerBufferSize = parentSnapshot.bufferSize;
93*38e8c45fSAndroid Build Coastguard Worker     }
94*38e8c45fSAndroid Build Coastguard Worker 
buildLayerRenderAreaBuilder95*38e8c45fSAndroid Build Coastguard Worker     std::unique_ptr<RenderArea> build() const override {
96*38e8c45fSAndroid Build Coastguard Worker         return std::make_unique<LayerRenderArea>(layer, std::move(layerSnapshot), crop, reqSize,
97*38e8c45fSAndroid Build Coastguard Worker                                                  reqDataSpace, layerTransform, layerBufferSize,
98*38e8c45fSAndroid Build Coastguard Worker                                                  options);
99*38e8c45fSAndroid Build Coastguard Worker     }
100*38e8c45fSAndroid Build Coastguard Worker };
101*38e8c45fSAndroid Build Coastguard Worker 
102*38e8c45fSAndroid Build Coastguard Worker } // namespace android