blob: 62f7c2351e1315465cb397babbcaba09ffbfdea5 [file] [log] [blame]
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08001/*
2 * Copyright (C) 2008 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Vishnu Nair217d8e62018-09-12 16:34:49 -070017#define LOG_TAG "LayerState"
18
Garfield Tan8a3083e2018-12-03 13:21:07 -080019#include <inttypes.h>
20
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080021#include <utils/Errors.h>
Mathias Agopianc5b2c0b2009-05-19 19:08:10 -070022#include <binder/Parcel.h>
Mathias Agopian90ac7992012-02-25 18:48:35 -080023#include <gui/ISurfaceComposerClient.h>
Andy McFadden2adaf042012-12-18 09:49:45 -080024#include <gui/IGraphicBufferProducer.h>
Robert Carr4cdc58f2017-08-23 14:22:20 -070025#include <gui/LayerState.h>
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080026
Steven Thomas62a4cf82020-01-31 12:04:03 -080027#include <cmath>
28
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080029namespace android {
30
31status_t layer_state_t::write(Parcel& output) const
32{
chaviw308ddba2020-08-11 16:23:51 -070033 SAFE_PARCEL(output.writeStrongBinder, surface);
34 SAFE_PARCEL(output.writeUint64, what);
35 SAFE_PARCEL(output.writeFloat, x);
36 SAFE_PARCEL(output.writeFloat, y);
37 SAFE_PARCEL(output.writeInt32, z);
38 SAFE_PARCEL(output.writeUint32, w);
39 SAFE_PARCEL(output.writeUint32, h);
40 SAFE_PARCEL(output.writeUint32, layerStack);
41 SAFE_PARCEL(output.writeFloat, alpha);
42 SAFE_PARCEL(output.writeUint32, flags);
43 SAFE_PARCEL(output.writeUint32, mask);
44 SAFE_PARCEL(matrix.write, output);
45 SAFE_PARCEL(output.write, crop_legacy);
46 SAFE_PARCEL(output.writeStrongBinder, barrierHandle_legacy);
47 SAFE_PARCEL(output.writeStrongBinder, reparentHandle);
48 SAFE_PARCEL(output.writeUint64, frameNumber_legacy);
49 SAFE_PARCEL(output.writeInt32, overrideScalingMode);
50 SAFE_PARCEL(output.writeStrongBinder, IInterface::asBinder(barrierGbp_legacy));
51 SAFE_PARCEL(output.writeStrongBinder, relativeLayerHandle);
52 SAFE_PARCEL(output.writeStrongBinder, parentHandleForChild);
53 SAFE_PARCEL(output.writeFloat, color.r);
54 SAFE_PARCEL(output.writeFloat, color.g);
55 SAFE_PARCEL(output.writeFloat, color.b);
Robert Carr2c358bf2018-08-08 15:58:15 -070056#ifndef NO_INPUT
chaviw308ddba2020-08-11 16:23:51 -070057 SAFE_PARCEL(inputHandle->writeToParcel, &output);
Robert Carr2c358bf2018-08-08 15:58:15 -070058#endif
chaviw308ddba2020-08-11 16:23:51 -070059 SAFE_PARCEL(output.write, transparentRegion);
60 SAFE_PARCEL(output.writeUint32, transform);
61 SAFE_PARCEL(output.writeBool, transformToDisplayInverse);
62 SAFE_PARCEL(output.write, crop);
63 SAFE_PARCEL(output.write, orientedDisplaySpaceRect);
64
Marissa Wall61c58622018-07-18 10:12:20 -070065 if (buffer) {
chaviw308ddba2020-08-11 16:23:51 -070066 SAFE_PARCEL(output.writeBool, true);
67 SAFE_PARCEL(output.write, *buffer);
Marissa Wall61c58622018-07-18 10:12:20 -070068 } else {
chaviw308ddba2020-08-11 16:23:51 -070069 SAFE_PARCEL(output.writeBool, false);
Marissa Wall61c58622018-07-18 10:12:20 -070070 }
chaviw308ddba2020-08-11 16:23:51 -070071
Marissa Wall61c58622018-07-18 10:12:20 -070072 if (acquireFence) {
chaviw308ddba2020-08-11 16:23:51 -070073 SAFE_PARCEL(output.writeBool, true);
74 SAFE_PARCEL(output.write, *acquireFence);
Marissa Wall61c58622018-07-18 10:12:20 -070075 } else {
chaviw308ddba2020-08-11 16:23:51 -070076 SAFE_PARCEL(output.writeBool, false);
Marissa Wall61c58622018-07-18 10:12:20 -070077 }
chaviw308ddba2020-08-11 16:23:51 -070078
79 SAFE_PARCEL(output.writeUint32, static_cast<uint32_t>(dataspace));
80 SAFE_PARCEL(output.write, hdrMetadata);
81 SAFE_PARCEL(output.write, surfaceDamageRegion);
82 SAFE_PARCEL(output.writeInt32, api);
83
Marissa Wall61c58622018-07-18 10:12:20 -070084 if (sidebandStream) {
chaviw308ddba2020-08-11 16:23:51 -070085 SAFE_PARCEL(output.writeBool, true);
86 SAFE_PARCEL(output.writeNativeHandle, sidebandStream->handle());
Marissa Wall61c58622018-07-18 10:12:20 -070087 } else {
chaviw308ddba2020-08-11 16:23:51 -070088 SAFE_PARCEL(output.writeBool, false);
Marissa Wall61c58622018-07-18 10:12:20 -070089 }
90
chaviw308ddba2020-08-11 16:23:51 -070091 SAFE_PARCEL(output.write, colorTransform.asArray(), 16 * sizeof(float));
92 SAFE_PARCEL(output.writeFloat, cornerRadius);
93 SAFE_PARCEL(output.writeUint32, backgroundBlurRadius);
94 SAFE_PARCEL(output.writeStrongBinder, cachedBuffer.token.promote());
95 SAFE_PARCEL(output.writeUint64, cachedBuffer.id);
96 SAFE_PARCEL(output.writeParcelable, metadata);
97 SAFE_PARCEL(output.writeFloat, bgColorAlpha);
98 SAFE_PARCEL(output.writeUint32, static_cast<uint32_t>(bgColorDataspace));
99 SAFE_PARCEL(output.writeBool, colorSpaceAgnostic);
100 SAFE_PARCEL(output.writeVectorSize, listeners);
Valerie Hau9dab9732019-08-20 09:29:25 -0700101
102 for (auto listener : listeners) {
chaviw308ddba2020-08-11 16:23:51 -0700103 SAFE_PARCEL(output.writeStrongBinder, listener.transactionCompletedListener);
104 SAFE_PARCEL(output.writeInt64Vector, listener.callbackIds);
Valerie Hau9dab9732019-08-20 09:29:25 -0700105 }
chaviw308ddba2020-08-11 16:23:51 -0700106 SAFE_PARCEL(output.writeFloat, shadowRadius);
107 SAFE_PARCEL(output.writeInt32, frameRateSelectionPriority);
108 SAFE_PARCEL(output.writeFloat, frameRate);
109 SAFE_PARCEL(output.writeByte, frameRateCompatibility);
110 SAFE_PARCEL(output.writeUint32, fixedTransformHint);
Mathias Agopianac9fa422013-02-11 16:40:36 -0800111 return NO_ERROR;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800112}
113
114status_t layer_state_t::read(const Parcel& input)
115{
chaviw308ddba2020-08-11 16:23:51 -0700116 SAFE_PARCEL(input.readNullableStrongBinder, &surface);
117 SAFE_PARCEL(input.readUint64, &what);
118 SAFE_PARCEL(input.readFloat, &x);
119 SAFE_PARCEL(input.readFloat, &y);
120 SAFE_PARCEL(input.readInt32, &z);
121 SAFE_PARCEL(input.readUint32, &w);
122 SAFE_PARCEL(input.readUint32, &h);
123 SAFE_PARCEL(input.readUint32, &layerStack);
124 SAFE_PARCEL(input.readFloat, &alpha);
Robert Carr2c358bf2018-08-08 15:58:15 -0700125
chaviw308ddba2020-08-11 16:23:51 -0700126 uint32_t tmpUint32 = 0;
127 SAFE_PARCEL(input.readUint32, &tmpUint32);
128 flags = static_cast<uint8_t>(tmpUint32);
129
130 SAFE_PARCEL(input.readUint32, &tmpUint32);
131 mask = static_cast<uint8_t>(tmpUint32);
132
133 SAFE_PARCEL(matrix.read, input);
134 SAFE_PARCEL(input.read, crop_legacy);
135 SAFE_PARCEL(input.readNullableStrongBinder, &barrierHandle_legacy);
136 SAFE_PARCEL(input.readNullableStrongBinder, &reparentHandle);
137 SAFE_PARCEL(input.readUint64, &frameNumber_legacy);
138 SAFE_PARCEL(input.readInt32, &overrideScalingMode);
139
140 sp<IBinder> tmpBinder;
141 SAFE_PARCEL(input.readNullableStrongBinder, &tmpBinder);
142 barrierGbp_legacy = interface_cast<IGraphicBufferProducer>(tmpBinder);
143
144 float tmpFloat = 0;
145 SAFE_PARCEL(input.readNullableStrongBinder, &relativeLayerHandle);
146 SAFE_PARCEL(input.readNullableStrongBinder, &parentHandleForChild);
147 SAFE_PARCEL(input.readFloat, &tmpFloat);
148 color.r = tmpFloat;
149 SAFE_PARCEL(input.readFloat, &tmpFloat);
150 color.g = tmpFloat;
151 SAFE_PARCEL(input.readFloat, &tmpFloat);
152 color.b = tmpFloat;
Robert Carr2c358bf2018-08-08 15:58:15 -0700153#ifndef NO_INPUT
chaviw308ddba2020-08-11 16:23:51 -0700154 SAFE_PARCEL(inputHandle->readFromParcel, &input);
Robert Carr2c358bf2018-08-08 15:58:15 -0700155#endif
156
chaviw308ddba2020-08-11 16:23:51 -0700157 SAFE_PARCEL(input.read, transparentRegion);
158 SAFE_PARCEL(input.readUint32, &transform);
159 SAFE_PARCEL(input.readBool, &transformToDisplayInverse);
160 SAFE_PARCEL(input.read, crop);
161 SAFE_PARCEL(input.read, orientedDisplaySpaceRect);
162
163 bool tmpBool = false;
164 SAFE_PARCEL(input.readBool, &tmpBool);
165 if (tmpBool) {
166 buffer = new GraphicBuffer();
167 SAFE_PARCEL(input.read, *buffer);
Marissa Wall61c58622018-07-18 10:12:20 -0700168 }
chaviw308ddba2020-08-11 16:23:51 -0700169
170 SAFE_PARCEL(input.readBool, &tmpBool);
171 if (tmpBool) {
172 acquireFence = new Fence();
173 SAFE_PARCEL(input.read, *acquireFence);
Marissa Wall61c58622018-07-18 10:12:20 -0700174 }
chaviw308ddba2020-08-11 16:23:51 -0700175
176 SAFE_PARCEL(input.readUint32, &tmpUint32);
177 dataspace = static_cast<ui::Dataspace>(tmpUint32);
178
179 SAFE_PARCEL(input.read, hdrMetadata);
180 SAFE_PARCEL(input.read, surfaceDamageRegion);
181 SAFE_PARCEL(input.readInt32, &api);
182 SAFE_PARCEL(input.readBool, &tmpBool);
183 if (tmpBool) {
Marissa Wall61c58622018-07-18 10:12:20 -0700184 sidebandStream = NativeHandle::create(input.readNativeHandle(), true);
185 }
186
chaviw308ddba2020-08-11 16:23:51 -0700187 SAFE_PARCEL(input.read, &colorTransform, 16 * sizeof(float));
188 SAFE_PARCEL(input.readFloat, &cornerRadius);
189 SAFE_PARCEL(input.readUint32, &backgroundBlurRadius);
190 SAFE_PARCEL(input.readNullableStrongBinder, &tmpBinder);
191 cachedBuffer.token = tmpBinder;
192 SAFE_PARCEL(input.readUint64, &cachedBuffer.id);
193 SAFE_PARCEL(input.readParcelable, &metadata);
Marissa Wallebc2c052019-01-16 19:16:55 -0800194
chaviw308ddba2020-08-11 16:23:51 -0700195 SAFE_PARCEL(input.readFloat, &bgColorAlpha);
196 SAFE_PARCEL(input.readUint32, &tmpUint32);
197 bgColorDataspace = static_cast<ui::Dataspace>(tmpUint32);
198 SAFE_PARCEL(input.readBool, &colorSpaceAgnostic);
Valerie Haued54efa2019-01-11 20:03:14 -0800199
chaviw308ddba2020-08-11 16:23:51 -0700200 int32_t numListeners = 0;
201 SAFE_PARCEL_READ_SIZE(input.readInt32, &numListeners, input.dataSize());
Valerie Hau9dab9732019-08-20 09:29:25 -0700202 listeners.clear();
203 for (int i = 0; i < numListeners; i++) {
chaviw308ddba2020-08-11 16:23:51 -0700204 sp<IBinder> listener;
Valerie Hau9dab9732019-08-20 09:29:25 -0700205 std::vector<CallbackId> callbackIds;
chaviw308ddba2020-08-11 16:23:51 -0700206 SAFE_PARCEL(input.readNullableStrongBinder, &listener);
207 SAFE_PARCEL(input.readInt64Vector, &callbackIds);
Valerie Hau9dab9732019-08-20 09:29:25 -0700208 listeners.emplace_back(listener, callbackIds);
209 }
chaviw308ddba2020-08-11 16:23:51 -0700210 SAFE_PARCEL(input.readFloat, &shadowRadius);
211 SAFE_PARCEL(input.readInt32, &frameRateSelectionPriority);
212 SAFE_PARCEL(input.readFloat, &frameRate);
213 SAFE_PARCEL(input.readByte, &frameRateCompatibility);
214 SAFE_PARCEL(input.readUint32, &tmpUint32);
215 fixedTransformHint = static_cast<ui::Transform::RotationFlags>(tmpUint32);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800216 return NO_ERROR;
217}
218
Mathias Agopian698c0872011-06-28 19:09:31 -0700219status_t ComposerState::write(Parcel& output) const {
Mathias Agopian698c0872011-06-28 19:09:31 -0700220 return state.write(output);
221}
222
223status_t ComposerState::read(const Parcel& input) {
Mathias Agopian698c0872011-06-28 19:09:31 -0700224 return state.read(input);
225}
226
Marin Shalamanov6ad317c2020-07-29 23:34:07 +0200227DisplayState::DisplayState()
228 : what(0),
229 layerStack(0),
230 layerStackSpaceRect(Rect::EMPTY_RECT),
231 orientedDisplaySpaceRect(Rect::EMPTY_RECT),
232 width(0),
233 height(0) {}
Pablo Ceballos60d69222015-08-07 14:47:20 -0700234
Mathias Agopian8b33f032012-07-24 20:43:54 -0700235status_t DisplayState::write(Parcel& output) const {
chaviw308ddba2020-08-11 16:23:51 -0700236 SAFE_PARCEL(output.writeStrongBinder, token);
237 SAFE_PARCEL(output.writeStrongBinder, IInterface::asBinder(surface));
238 SAFE_PARCEL(output.writeUint32, what);
239 SAFE_PARCEL(output.writeUint32, layerStack);
240 SAFE_PARCEL(output.writeUint32, toRotationInt(orientation));
241 SAFE_PARCEL(output.write, layerStackSpaceRect);
242 SAFE_PARCEL(output.write, orientedDisplaySpaceRect);
243 SAFE_PARCEL(output.writeUint32, width);
244 SAFE_PARCEL(output.writeUint32, height);
Mathias Agopian8b33f032012-07-24 20:43:54 -0700245 return NO_ERROR;
246}
247
248status_t DisplayState::read(const Parcel& input) {
chaviw308ddba2020-08-11 16:23:51 -0700249 SAFE_PARCEL(input.readStrongBinder, &token);
250 sp<IBinder> tmpBinder;
251 SAFE_PARCEL(input.readNullableStrongBinder, &tmpBinder);
252 surface = interface_cast<IGraphicBufferProducer>(tmpBinder);
253
254 SAFE_PARCEL(input.readUint32, &what);
255 SAFE_PARCEL(input.readUint32, &layerStack);
256 uint32_t tmpUint = 0;
257 SAFE_PARCEL(input.readUint32, &tmpUint);
258 orientation = ui::toRotation(tmpUint);
259
260 SAFE_PARCEL(input.read, layerStackSpaceRect);
261 SAFE_PARCEL(input.read, orientedDisplaySpaceRect);
262 SAFE_PARCEL(input.readUint32, &width);
263 SAFE_PARCEL(input.readUint32, &height);
Mathias Agopian8b33f032012-07-24 20:43:54 -0700264 return NO_ERROR;
265}
266
Robert Carr2c5f6d22017-09-26 12:30:35 -0700267void DisplayState::merge(const DisplayState& other) {
268 if (other.what & eSurfaceChanged) {
269 what |= eSurfaceChanged;
270 surface = other.surface;
271 }
272 if (other.what & eLayerStackChanged) {
273 what |= eLayerStackChanged;
274 layerStack = other.layerStack;
275 }
276 if (other.what & eDisplayProjectionChanged) {
277 what |= eDisplayProjectionChanged;
278 orientation = other.orientation;
Marin Shalamanov6ad317c2020-07-29 23:34:07 +0200279 layerStackSpaceRect = other.layerStackSpaceRect;
280 orientedDisplaySpaceRect = other.orientedDisplaySpaceRect;
Robert Carr2c5f6d22017-09-26 12:30:35 -0700281 }
282 if (other.what & eDisplaySizeChanged) {
283 what |= eDisplaySizeChanged;
284 width = other.width;
285 height = other.height;
286 }
287}
288
289void layer_state_t::merge(const layer_state_t& other) {
290 if (other.what & ePositionChanged) {
291 what |= ePositionChanged;
292 x = other.x;
293 y = other.y;
294 }
295 if (other.what & eLayerChanged) {
296 what |= eLayerChanged;
chaviw32377582019-05-13 11:15:19 -0700297 what &= ~eRelativeLayerChanged;
Robert Carr2c5f6d22017-09-26 12:30:35 -0700298 z = other.z;
299 }
300 if (other.what & eSizeChanged) {
301 what |= eSizeChanged;
302 w = other.w;
303 h = other.h;
304 }
305 if (other.what & eAlphaChanged) {
306 what |= eAlphaChanged;
307 alpha = other.alpha;
308 }
309 if (other.what & eMatrixChanged) {
310 what |= eMatrixChanged;
311 matrix = other.matrix;
312 }
313 if (other.what & eTransparentRegionChanged) {
314 what |= eTransparentRegionChanged;
315 transparentRegion = other.transparentRegion;
316 }
317 if (other.what & eFlagsChanged) {
318 what |= eFlagsChanged;
Vishnu Nair996bc422019-07-16 14:15:33 -0700319 flags &= ~other.mask;
320 flags |= (other.flags & other.mask);
321 mask |= other.mask;
Robert Carr2c5f6d22017-09-26 12:30:35 -0700322 }
323 if (other.what & eLayerStackChanged) {
324 what |= eLayerStackChanged;
325 layerStack = other.layerStack;
326 }
Marissa Wallf58c14b2018-07-24 10:50:43 -0700327 if (other.what & eCropChanged_legacy) {
328 what |= eCropChanged_legacy;
329 crop_legacy = other.crop_legacy;
Robert Carr2c5f6d22017-09-26 12:30:35 -0700330 }
Lucas Dupin1b6531c2018-07-05 17:18:21 -0700331 if (other.what & eCornerRadiusChanged) {
332 what |= eCornerRadiusChanged;
333 cornerRadius = other.cornerRadius;
334 }
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800335 if (other.what & eBackgroundBlurRadiusChanged) {
336 what |= eBackgroundBlurRadiusChanged;
337 backgroundBlurRadius = other.backgroundBlurRadius;
338 }
Marissa Wallf58c14b2018-07-24 10:50:43 -0700339 if (other.what & eDeferTransaction_legacy) {
340 what |= eDeferTransaction_legacy;
341 barrierHandle_legacy = other.barrierHandle_legacy;
342 barrierGbp_legacy = other.barrierGbp_legacy;
343 frameNumber_legacy = other.frameNumber_legacy;
Robert Carr2c5f6d22017-09-26 12:30:35 -0700344 }
Robert Carr2c5f6d22017-09-26 12:30:35 -0700345 if (other.what & eOverrideScalingModeChanged) {
346 what |= eOverrideScalingModeChanged;
347 overrideScalingMode = other.overrideScalingMode;
348 }
Robert Carr2c5f6d22017-09-26 12:30:35 -0700349 if (other.what & eReparentChildren) {
350 what |= eReparentChildren;
351 reparentHandle = other.reparentHandle;
352 }
353 if (other.what & eDetachChildren) {
354 what |= eDetachChildren;
355 }
356 if (other.what & eRelativeLayerChanged) {
357 what |= eRelativeLayerChanged;
chaviw32377582019-05-13 11:15:19 -0700358 what &= ~eLayerChanged;
Robert Carr2c5f6d22017-09-26 12:30:35 -0700359 z = other.z;
360 relativeLayerHandle = other.relativeLayerHandle;
361 }
362 if (other.what & eReparent) {
363 what |= eReparent;
364 parentHandleForChild = other.parentHandleForChild;
365 }
chaviwca27f252018-02-06 16:46:39 -0800366 if (other.what & eDestroySurface) {
367 what |= eDestroySurface;
368 }
Marissa Wall61c58622018-07-18 10:12:20 -0700369 if (other.what & eTransformChanged) {
370 what |= eTransformChanged;
371 transform = other.transform;
372 }
373 if (other.what & eTransformToDisplayInverseChanged) {
374 what |= eTransformToDisplayInverseChanged;
375 transformToDisplayInverse = other.transformToDisplayInverse;
376 }
377 if (other.what & eCropChanged) {
378 what |= eCropChanged;
379 crop = other.crop;
380 }
Marissa Wall861616d2018-10-22 12:52:23 -0700381 if (other.what & eFrameChanged) {
382 what |= eFrameChanged;
Marin Shalamanov6ad317c2020-07-29 23:34:07 +0200383 orientedDisplaySpaceRect = other.orientedDisplaySpaceRect;
Marissa Wall861616d2018-10-22 12:52:23 -0700384 }
Marissa Wall61c58622018-07-18 10:12:20 -0700385 if (other.what & eBufferChanged) {
386 what |= eBufferChanged;
387 buffer = other.buffer;
388 }
389 if (other.what & eAcquireFenceChanged) {
390 what |= eAcquireFenceChanged;
391 acquireFence = other.acquireFence;
392 }
393 if (other.what & eDataspaceChanged) {
394 what |= eDataspaceChanged;
395 dataspace = other.dataspace;
396 }
397 if (other.what & eHdrMetadataChanged) {
398 what |= eHdrMetadataChanged;
399 hdrMetadata = other.hdrMetadata;
400 }
401 if (other.what & eSurfaceDamageRegionChanged) {
402 what |= eSurfaceDamageRegionChanged;
403 surfaceDamageRegion = other.surfaceDamageRegion;
404 }
405 if (other.what & eApiChanged) {
406 what |= eApiChanged;
407 api = other.api;
408 }
409 if (other.what & eSidebandStreamChanged) {
410 what |= eSidebandStreamChanged;
411 sidebandStream = other.sidebandStream;
412 }
Peiyong Lind3788632018-09-18 16:01:31 -0700413 if (other.what & eColorTransformChanged) {
414 what |= eColorTransformChanged;
415 colorTransform = other.colorTransform;
416 }
Marissa Wall3dad52d2019-03-22 14:03:19 -0700417 if (other.what & eHasListenerCallbacksChanged) {
418 what |= eHasListenerCallbacksChanged;
Marissa Wallc837b5e2018-10-12 10:04:44 -0700419 }
Robert Carrd314f162018-08-15 13:12:42 -0700420
Robert Carr2c358bf2018-08-08 15:58:15 -0700421#ifndef NO_INPUT
422 if (other.what & eInputInfoChanged) {
423 what |= eInputInfoChanged;
Chris Ye0783e992020-06-02 21:34:49 -0700424 inputHandle = new InputWindowHandle(*other.inputHandle);
Robert Carr2c358bf2018-08-08 15:58:15 -0700425 }
426#endif
427
Marissa Wallebc2c052019-01-16 19:16:55 -0800428 if (other.what & eCachedBufferChanged) {
429 what |= eCachedBufferChanged;
430 cachedBuffer = other.cachedBuffer;
431 }
Valerie Haudd0b7572019-01-29 14:59:27 -0800432 if (other.what & eBackgroundColorChanged) {
433 what |= eBackgroundColorChanged;
434 color = other.color;
435 bgColorAlpha = other.bgColorAlpha;
436 bgColorDataspace = other.bgColorDataspace;
Valerie Haued54efa2019-01-11 20:03:14 -0800437 }
Evan Rosky1f6d6d52018-12-06 10:47:26 -0800438 if (other.what & eMetadataChanged) {
439 what |= eMetadataChanged;
440 metadata.merge(other.metadata);
441 }
Vishnu Nairc97b8db2019-10-29 18:19:35 -0700442 if (other.what & eShadowRadiusChanged) {
443 what |= eShadowRadiusChanged;
444 shadowRadius = other.shadowRadius;
445 }
Ana Krulecc84d09b2019-11-02 23:10:29 +0100446 if (other.what & eFrameRateSelectionPriority) {
447 what |= eFrameRateSelectionPriority;
448 frameRateSelectionPriority = other.frameRateSelectionPriority;
449 }
Steven Thomas3172e202020-01-06 19:25:30 -0800450 if (other.what & eFrameRateChanged) {
451 what |= eFrameRateChanged;
452 frameRate = other.frameRate;
Steven Thomas62a4cf82020-01-31 12:04:03 -0800453 frameRateCompatibility = other.frameRateCompatibility;
Steven Thomas3172e202020-01-06 19:25:30 -0800454 }
Vishnu Nair6213bd92020-05-08 17:42:25 -0700455 if (other.what & eFixedTransformHintChanged) {
456 what |= eFixedTransformHintChanged;
457 fixedTransformHint = other.fixedTransformHint;
458 }
Vishnu Nair217d8e62018-09-12 16:34:49 -0700459 if ((other.what & what) != other.what) {
460 ALOGE("Unmerged SurfaceComposer Transaction properties. LayerState::merge needs updating? "
Garfield Tan8a3083e2018-12-03 13:21:07 -0800461 "other.what=0x%" PRIu64 " what=0x%" PRIu64,
Vishnu Nair217d8e62018-09-12 16:34:49 -0700462 other.what, what);
Robert Carrd314f162018-08-15 13:12:42 -0700463 }
Robert Carr2c5f6d22017-09-26 12:30:35 -0700464}
Mathias Agopian8b33f032012-07-24 20:43:54 -0700465
chaviw308ddba2020-08-11 16:23:51 -0700466status_t layer_state_t::matrix22_t::write(Parcel& output) const {
467 SAFE_PARCEL(output.writeFloat, dsdx);
468 SAFE_PARCEL(output.writeFloat, dtdx);
469 SAFE_PARCEL(output.writeFloat, dtdy);
470 SAFE_PARCEL(output.writeFloat, dsdy);
471 return NO_ERROR;
472}
473
474status_t layer_state_t::matrix22_t::read(const Parcel& input) {
475 SAFE_PARCEL(input.readFloat, &dsdx);
476 SAFE_PARCEL(input.readFloat, &dtdx);
477 SAFE_PARCEL(input.readFloat, &dtdy);
478 SAFE_PARCEL(input.readFloat, &dsdy);
479 return NO_ERROR;
480}
481
chaviw273171b2018-12-26 11:46:30 -0800482// ------------------------------- InputWindowCommands ----------------------------------------
483
Vishnu Naire798b472020-07-23 13:52:21 -0700484bool InputWindowCommands::merge(const InputWindowCommands& other) {
485 bool changes = false;
486#ifndef NO_INPUT
487 changes |= !other.focusRequests.empty();
488 focusRequests.insert(focusRequests.end(), std::make_move_iterator(other.focusRequests.begin()),
489 std::make_move_iterator(other.focusRequests.end()));
490#endif
491 changes |= other.syncInputWindows && !syncInputWindows;
chaviwa911b102019-02-14 10:18:33 -0800492 syncInputWindows |= other.syncInputWindows;
Vishnu Naire798b472020-07-23 13:52:21 -0700493 return changes;
chaviw273171b2018-12-26 11:46:30 -0800494}
495
496void InputWindowCommands::clear() {
Vishnu Naire798b472020-07-23 13:52:21 -0700497#ifndef NO_INPUT
498 focusRequests.clear();
499#endif
chaviwa911b102019-02-14 10:18:33 -0800500 syncInputWindows = false;
chaviw273171b2018-12-26 11:46:30 -0800501}
502
chaviw308ddba2020-08-11 16:23:51 -0700503status_t InputWindowCommands::write(Parcel& output) const {
Vishnu Naire798b472020-07-23 13:52:21 -0700504#ifndef NO_INPUT
chaviw308ddba2020-08-11 16:23:51 -0700505 SAFE_PARCEL(output.writeParcelableVector, focusRequests);
Vishnu Naire798b472020-07-23 13:52:21 -0700506#endif
chaviw308ddba2020-08-11 16:23:51 -0700507 SAFE_PARCEL(output.writeBool, syncInputWindows);
508 return NO_ERROR;
chaviw273171b2018-12-26 11:46:30 -0800509}
510
chaviw308ddba2020-08-11 16:23:51 -0700511status_t InputWindowCommands::read(const Parcel& input) {
Vishnu Naire798b472020-07-23 13:52:21 -0700512#ifndef NO_INPUT
chaviw308ddba2020-08-11 16:23:51 -0700513 SAFE_PARCEL(input.readParcelableVector, &focusRequests);
Vishnu Naire798b472020-07-23 13:52:21 -0700514#endif
chaviw308ddba2020-08-11 16:23:51 -0700515 SAFE_PARCEL(input.readBool, &syncInputWindows);
516 return NO_ERROR;
chaviw273171b2018-12-26 11:46:30 -0800517}
518
Steven Thomas62a4cf82020-01-31 12:04:03 -0800519bool ValidateFrameRate(float frameRate, int8_t compatibility, const char* inFunctionName) {
520 const char* functionName = inFunctionName != nullptr ? inFunctionName : "call";
521 int floatClassification = std::fpclassify(frameRate);
522 if (frameRate < 0 || floatClassification == FP_INFINITE || floatClassification == FP_NAN) {
523 ALOGE("%s failed - invalid frame rate %f", functionName, frameRate);
524 return false;
525 }
526
527 if (compatibility != ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_DEFAULT &&
528 compatibility != ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_FIXED_SOURCE) {
529 ALOGE("%s failed - invalid compatibility value %d", functionName, compatibility);
530 return false;
531 }
532
533 return true;
534}
535
chaviw618c42d2020-07-24 15:25:08 -0700536// ----------------------------------------------------------------------------
537
538status_t CaptureArgs::write(Parcel& output) const {
chaviw308ddba2020-08-11 16:23:51 -0700539 SAFE_PARCEL(output.writeInt32, static_cast<int32_t>(pixelFormat));
540 SAFE_PARCEL(output.write, sourceCrop);
541 SAFE_PARCEL(output.writeFloat, frameScale);
542 SAFE_PARCEL(output.writeBool, captureSecureLayers);
543 SAFE_PARCEL(output.writeInt32, uid);
544 return NO_ERROR;
chaviw618c42d2020-07-24 15:25:08 -0700545}
546
547status_t CaptureArgs::read(const Parcel& input) {
George Burgess IV4d7aceb2020-07-30 10:01:56 -0700548 int32_t format = 0;
chaviw308ddba2020-08-11 16:23:51 -0700549 SAFE_PARCEL(input.readInt32, &format);
chaviw618c42d2020-07-24 15:25:08 -0700550 pixelFormat = static_cast<ui::PixelFormat>(format);
chaviw308ddba2020-08-11 16:23:51 -0700551 SAFE_PARCEL(input.read, sourceCrop);
552 SAFE_PARCEL(input.readFloat, &frameScale);
553 SAFE_PARCEL(input.readBool, &captureSecureLayers);
554 SAFE_PARCEL(input.readInt32, &uid);
555
556 return NO_ERROR;
chaviw618c42d2020-07-24 15:25:08 -0700557}
558
559status_t DisplayCaptureArgs::write(Parcel& output) const {
chaviw308ddba2020-08-11 16:23:51 -0700560 SAFE_PARCEL(CaptureArgs::write, output);
chaviw618c42d2020-07-24 15:25:08 -0700561
chaviw308ddba2020-08-11 16:23:51 -0700562 SAFE_PARCEL(output.writeStrongBinder, displayToken);
563 SAFE_PARCEL(output.writeUint32, width);
564 SAFE_PARCEL(output.writeUint32, height);
565 SAFE_PARCEL(output.writeBool, useIdentityTransform);
566 return NO_ERROR;
chaviw618c42d2020-07-24 15:25:08 -0700567}
568
569status_t DisplayCaptureArgs::read(const Parcel& input) {
chaviw308ddba2020-08-11 16:23:51 -0700570 SAFE_PARCEL(CaptureArgs::read, input);
chaviw618c42d2020-07-24 15:25:08 -0700571
chaviw308ddba2020-08-11 16:23:51 -0700572 SAFE_PARCEL(input.readStrongBinder, &displayToken);
573 SAFE_PARCEL(input.readUint32, &width);
574 SAFE_PARCEL(input.readUint32, &height);
575 SAFE_PARCEL(input.readBool, &useIdentityTransform);
576 return NO_ERROR;
chaviw618c42d2020-07-24 15:25:08 -0700577}
578
579status_t LayerCaptureArgs::write(Parcel& output) const {
chaviw308ddba2020-08-11 16:23:51 -0700580 SAFE_PARCEL(CaptureArgs::write, output);
chaviw618c42d2020-07-24 15:25:08 -0700581
chaviw308ddba2020-08-11 16:23:51 -0700582 SAFE_PARCEL(output.writeStrongBinder, layerHandle);
583 SAFE_PARCEL(output.writeInt32, excludeHandles.size());
chaviw618c42d2020-07-24 15:25:08 -0700584 for (auto el : excludeHandles) {
chaviw308ddba2020-08-11 16:23:51 -0700585 SAFE_PARCEL(output.writeStrongBinder, el);
chaviw618c42d2020-07-24 15:25:08 -0700586 }
chaviw308ddba2020-08-11 16:23:51 -0700587 SAFE_PARCEL(output.writeBool, childrenOnly);
588 return NO_ERROR;
chaviw618c42d2020-07-24 15:25:08 -0700589}
590
591status_t LayerCaptureArgs::read(const Parcel& input) {
chaviw308ddba2020-08-11 16:23:51 -0700592 SAFE_PARCEL(CaptureArgs::read, input);
chaviw618c42d2020-07-24 15:25:08 -0700593
chaviw308ddba2020-08-11 16:23:51 -0700594 SAFE_PARCEL(input.readStrongBinder, &layerHandle);
chaviw618c42d2020-07-24 15:25:08 -0700595
George Burgess IV4d7aceb2020-07-30 10:01:56 -0700596 int32_t numExcludeHandles = 0;
chaviw308ddba2020-08-11 16:23:51 -0700597 SAFE_PARCEL_READ_SIZE(input.readInt32, &numExcludeHandles, input.dataSize());
chaviw618c42d2020-07-24 15:25:08 -0700598 excludeHandles.reserve(numExcludeHandles);
599 for (int i = 0; i < numExcludeHandles; i++) {
600 sp<IBinder> binder;
chaviw308ddba2020-08-11 16:23:51 -0700601 SAFE_PARCEL(input.readStrongBinder, &binder);
chaviw618c42d2020-07-24 15:25:08 -0700602 excludeHandles.emplace(binder);
603 }
604
chaviw308ddba2020-08-11 16:23:51 -0700605 SAFE_PARCEL(input.readBool, &childrenOnly);
606 return NO_ERROR;
chaviw618c42d2020-07-24 15:25:08 -0700607}
608
609status_t ScreenCaptureResults::write(Parcel& output) const {
chaviw308ddba2020-08-11 16:23:51 -0700610 SAFE_PARCEL(output.write, *buffer);
611 SAFE_PARCEL(output.writeBool, capturedSecureLayers);
612 SAFE_PARCEL(output.writeUint32, static_cast<uint32_t>(capturedDataspace));
613 return NO_ERROR;
chaviw618c42d2020-07-24 15:25:08 -0700614}
615
616status_t ScreenCaptureResults::read(const Parcel& input) {
617 buffer = new GraphicBuffer();
chaviw308ddba2020-08-11 16:23:51 -0700618 SAFE_PARCEL(input.read, *buffer);
619 SAFE_PARCEL(input.readBool, &capturedSecureLayers);
George Burgess IV4d7aceb2020-07-30 10:01:56 -0700620 uint32_t dataspace = 0;
chaviw308ddba2020-08-11 16:23:51 -0700621 SAFE_PARCEL(input.readUint32, &dataspace);
chaviw618c42d2020-07-24 15:25:08 -0700622 capturedDataspace = static_cast<ui::Dataspace>(dataspace);
chaviw308ddba2020-08-11 16:23:51 -0700623 return NO_ERROR;
chaviw618c42d2020-07-24 15:25:08 -0700624}
625
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800626}; // namespace android