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