1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker * Copyright 2022 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 #include "LayerCreationArgs.h"
18*38e8c45fSAndroid Build Coastguard Worker #include <binder/IPCThreadState.h>
19*38e8c45fSAndroid Build Coastguard Worker #include <private/android_filesystem_config.h>
20*38e8c45fSAndroid Build Coastguard Worker #include "Client.h"
21*38e8c45fSAndroid Build Coastguard Worker #include "gui/LayerMetadata.h"
22*38e8c45fSAndroid Build Coastguard Worker
23*38e8c45fSAndroid Build Coastguard Worker namespace android::surfaceflinger {
24*38e8c45fSAndroid Build Coastguard Worker
25*38e8c45fSAndroid Build Coastguard Worker std::atomic<uint32_t> LayerCreationArgs::sSequence{1};
26*38e8c45fSAndroid Build Coastguard Worker std::atomic<uint32_t> LayerCreationArgs::sInternalSequence{1};
27*38e8c45fSAndroid Build Coastguard Worker
getInternalLayerId(uint32_t id)28*38e8c45fSAndroid Build Coastguard Worker uint32_t LayerCreationArgs::getInternalLayerId(uint32_t id) {
29*38e8c45fSAndroid Build Coastguard Worker return id | INTERNAL_LAYER_PREFIX;
30*38e8c45fSAndroid Build Coastguard Worker }
31*38e8c45fSAndroid Build Coastguard Worker
LayerCreationArgs(SurfaceFlinger * flinger,sp<Client> client,std::string name,uint32_t flags,gui::LayerMetadata metadataArg,std::optional<uint32_t> id,bool internalLayer)32*38e8c45fSAndroid Build Coastguard Worker LayerCreationArgs::LayerCreationArgs(SurfaceFlinger* flinger, sp<Client> client, std::string name,
33*38e8c45fSAndroid Build Coastguard Worker uint32_t flags, gui::LayerMetadata metadataArg,
34*38e8c45fSAndroid Build Coastguard Worker std::optional<uint32_t> id, bool internalLayer)
35*38e8c45fSAndroid Build Coastguard Worker : flinger(flinger),
36*38e8c45fSAndroid Build Coastguard Worker client(std::move(client)),
37*38e8c45fSAndroid Build Coastguard Worker name(std::move(name)),
38*38e8c45fSAndroid Build Coastguard Worker flags(flags),
39*38e8c45fSAndroid Build Coastguard Worker metadata(std::move(metadataArg)) {
40*38e8c45fSAndroid Build Coastguard Worker IPCThreadState* ipc = IPCThreadState::self();
41*38e8c45fSAndroid Build Coastguard Worker ownerPid = ipc->getCallingPid();
42*38e8c45fSAndroid Build Coastguard Worker uid_t callingUid = ipc->getCallingUid();
43*38e8c45fSAndroid Build Coastguard Worker metadata.setInt32(gui::METADATA_CALLING_UID, static_cast<int32_t>(callingUid));
44*38e8c45fSAndroid Build Coastguard Worker ownerUid = callingUid;
45*38e8c45fSAndroid Build Coastguard Worker if (ownerUid == AID_GRAPHICS || ownerUid == AID_SYSTEM) {
46*38e8c45fSAndroid Build Coastguard Worker // System can override the calling UID/PID since it can create layers on behalf of apps.
47*38e8c45fSAndroid Build Coastguard Worker ownerPid = metadata.getInt32(gui::METADATA_OWNER_PID, ownerPid);
48*38e8c45fSAndroid Build Coastguard Worker ownerUid = static_cast<uid_t>(
49*38e8c45fSAndroid Build Coastguard Worker metadata.getInt32(gui::METADATA_OWNER_UID, static_cast<int32_t>(ownerUid)));
50*38e8c45fSAndroid Build Coastguard Worker }
51*38e8c45fSAndroid Build Coastguard Worker
52*38e8c45fSAndroid Build Coastguard Worker if (internalLayer) {
53*38e8c45fSAndroid Build Coastguard Worker sequence = id.value_or(getInternalLayerId(sInternalSequence++));
54*38e8c45fSAndroid Build Coastguard Worker } else if (id) {
55*38e8c45fSAndroid Build Coastguard Worker sequence = *id;
56*38e8c45fSAndroid Build Coastguard Worker sSequence = *id + 1;
57*38e8c45fSAndroid Build Coastguard Worker } else {
58*38e8c45fSAndroid Build Coastguard Worker sequence = sSequence++;
59*38e8c45fSAndroid Build Coastguard Worker if (sequence >= INTERNAL_LAYER_PREFIX) {
60*38e8c45fSAndroid Build Coastguard Worker sSequence = 1;
61*38e8c45fSAndroid Build Coastguard Worker ALOGW("Layer sequence id rolled over.");
62*38e8c45fSAndroid Build Coastguard Worker sequence = sSequence++;
63*38e8c45fSAndroid Build Coastguard Worker }
64*38e8c45fSAndroid Build Coastguard Worker }
65*38e8c45fSAndroid Build Coastguard Worker }
66*38e8c45fSAndroid Build Coastguard Worker
LayerCreationArgs(std::optional<uint32_t> id,bool internalLayer)67*38e8c45fSAndroid Build Coastguard Worker LayerCreationArgs::LayerCreationArgs(std::optional<uint32_t> id, bool internalLayer)
68*38e8c45fSAndroid Build Coastguard Worker : LayerCreationArgs(nullptr, nullptr, /*name=*/"", /*flags=*/0, /*metadata=*/{}, id,
69*38e8c45fSAndroid Build Coastguard Worker internalLayer) {}
70*38e8c45fSAndroid Build Coastguard Worker
fromOtherArgs(const LayerCreationArgs & other)71*38e8c45fSAndroid Build Coastguard Worker LayerCreationArgs LayerCreationArgs::fromOtherArgs(const LayerCreationArgs& other) {
72*38e8c45fSAndroid Build Coastguard Worker // returns a new instance of LayerCreationArgs with a unique id.
73*38e8c45fSAndroid Build Coastguard Worker return LayerCreationArgs(other.flinger, other.client, other.name, other.flags, other.metadata);
74*38e8c45fSAndroid Build Coastguard Worker }
75*38e8c45fSAndroid Build Coastguard Worker
getDebugString() const76*38e8c45fSAndroid Build Coastguard Worker std::string LayerCreationArgs::getDebugString() const {
77*38e8c45fSAndroid Build Coastguard Worker std::stringstream stream;
78*38e8c45fSAndroid Build Coastguard Worker stream << "LayerCreationArgs{" << name << "[" << sequence << "] flags=" << flags
79*38e8c45fSAndroid Build Coastguard Worker << " pid=" << ownerPid << " uid=" << ownerUid;
80*38e8c45fSAndroid Build Coastguard Worker if (addToRoot) {
81*38e8c45fSAndroid Build Coastguard Worker stream << " addToRoot=" << addToRoot;
82*38e8c45fSAndroid Build Coastguard Worker }
83*38e8c45fSAndroid Build Coastguard Worker if (parentId != UNASSIGNED_LAYER_ID) {
84*38e8c45fSAndroid Build Coastguard Worker stream << " parentId=" << parentId;
85*38e8c45fSAndroid Build Coastguard Worker }
86*38e8c45fSAndroid Build Coastguard Worker if (layerIdToMirror != UNASSIGNED_LAYER_ID) {
87*38e8c45fSAndroid Build Coastguard Worker stream << " layerIdToMirror=" << layerIdToMirror;
88*38e8c45fSAndroid Build Coastguard Worker }
89*38e8c45fSAndroid Build Coastguard Worker if (layerStackToMirror != ui::INVALID_LAYER_STACK) {
90*38e8c45fSAndroid Build Coastguard Worker stream << " layerStackToMirror=" << layerStackToMirror.id;
91*38e8c45fSAndroid Build Coastguard Worker }
92*38e8c45fSAndroid Build Coastguard Worker return stream.str();
93*38e8c45fSAndroid Build Coastguard Worker }
94*38e8c45fSAndroid Build Coastguard Worker
95*38e8c45fSAndroid Build Coastguard Worker } // namespace android::surfaceflinger
96