blob: d7ec9ff1d61da03a98295c4ef47307968d6583c3 [file] [log] [blame]
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08001/*
2 * Copyright (C) 2007 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
17// tag as surfaceflinger
18#define LOG_TAG "SurfaceFlinger"
19
Huihong Luo6fac5232021-11-22 16:05:23 -080020#include <android/gui/IDisplayEventConnection.h>
Huihong Luoecc1f902021-11-20 11:55:05 -080021#include <android/gui/IRegionSamplingListener.h>
Pablo Gamito6ee484d2020-07-30 14:26:28 +000022#include <android/gui/ITransactionTraceListener.h>
Mathias Agopianc5b2c0b2009-05-19 19:08:10 -070023#include <binder/IPCThreadState.h>
24#include <binder/IServiceManager.h>
Alec Mouriadebf5c2021-01-05 12:57:36 -080025#include <binder/Parcel.h>
Andy McFadden2adaf042012-12-18 09:49:45 -080026#include <gui/IGraphicBufferProducer.h>
Mathias Agopian2b5dd402017-02-07 17:36:19 -080027#include <gui/ISurfaceComposer.h>
28#include <gui/ISurfaceComposerClient.h>
Kalle Raitaa099a242017-01-11 11:17:29 -080029#include <gui/LayerDebugInfo.h>
Robert Carr4cdc58f2017-08-23 14:22:20 -070030#include <gui/LayerState.h>
Marin Shalamanov3b1f7bc2021-03-16 15:51:53 +010031#include <private/gui/ParcelUtils.h>
Alec Mouriadebf5c2021-01-05 12:57:36 -080032#include <stdint.h>
33#include <sys/types.h>
Michael Wright28f24d02016-07-12 13:30:53 -070034#include <system/graphics.h>
Marin Shalamanova7fe3042021-01-29 21:02:08 +010035#include <ui/DisplayMode.h>
Lajos Molnar67d8bd62014-09-11 14:58:45 -070036#include <ui/DisplayStatInfo.h>
Dominik Laskowski3cb3d4e2019-11-21 11:14:45 -080037#include <ui/DisplayState.h>
Marin Shalamanov228f46b2021-01-28 21:11:45 +010038#include <ui/DynamicDisplayInfo.h>
Dan Stozac4f471e2016-03-24 09:31:08 -070039#include <ui/HdrCapabilities.h>
Marin Shalamanov228f46b2021-01-28 21:11:45 +010040#include <ui/StaticDisplayInfo.h>
Jamie Gennis134f0422011-03-08 12:18:54 -080041#include <utils/Log.h>
Mathias Agopian9cce3252010-02-09 17:46:37 -080042
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080043// ---------------------------------------------------------------------------
44
Leon Scroggins IIIe7c51c62022-02-01 15:53:54 -050045using namespace aidl::android::hardware::graphics;
46
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080047namespace android {
48
Huihong Luof5029222021-12-16 14:33:46 -080049using gui::DisplayCaptureArgs;
Huihong Luo6fac5232021-11-22 16:05:23 -080050using gui::IDisplayEventConnection;
Huihong Luoecc1f902021-11-20 11:55:05 -080051using gui::IRegionSamplingListener;
chaviw60c9d3e2021-06-04 12:52:17 -050052using gui::IWindowInfosListener;
Huihong Luof5029222021-12-16 14:33:46 -080053using gui::LayerCaptureArgs;
Peiyong Lin9f034472018-03-28 15:29:00 -070054using ui::ColorMode;
55
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080056class BpSurfaceComposer : public BpInterface<ISurfaceComposer>
57{
58public:
Chih-Hung Hsiehe2347b72016-04-25 15:41:05 -070059 explicit BpSurfaceComposer(const sp<IBinder>& impl)
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080060 : BpInterface<ISurfaceComposer>(impl)
61 {
62 }
63
Dan Stozad723bd72014-11-18 10:24:03 -080064 virtual ~BpSurfaceComposer();
65
Mathias Agopian7e27f052010-05-28 14:22:23 -070066 virtual sp<ISurfaceComposerClient> createConnection()
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080067 {
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080068 Parcel data, reply;
69 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
70 remote()->transact(BnSurfaceComposer::CREATE_CONNECTION, data, &reply);
Mathias Agopian7e27f052010-05-28 14:22:23 -070071 return interface_cast<ISurfaceComposerClient>(reply.readStrongBinder());
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080072 }
73
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -100074 status_t setTransactionState(const FrameTimelineInfo& frameTimelineInfo,
75 const Vector<ComposerState>& state,
76 const Vector<DisplayState>& displays, uint32_t flags,
77 const sp<IBinder>& applyToken, const InputWindowCommands& commands,
78 int64_t desiredPresentTime, bool isAutoTimestamp,
79 const client_cache_t& uncacheBuffer, bool hasListenerCallbacks,
80 const std::vector<ListenerCallbacks>& listenerCallbacks,
81 uint64_t transactionId) override {
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080082 Parcel data, reply;
83 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
Dan Stozad723bd72014-11-18 10:24:03 -080084
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -100085 SAFE_PARCEL(frameTimelineInfo.write, data);
86
chaviw308ddba2020-08-11 16:23:51 -070087 SAFE_PARCEL(data.writeUint32, static_cast<uint32_t>(state.size()));
Dan Stozad723bd72014-11-18 10:24:03 -080088 for (const auto& s : state) {
chaviw308ddba2020-08-11 16:23:51 -070089 SAFE_PARCEL(s.write, data);
Mathias Agopian698c0872011-06-28 19:09:31 -070090 }
Dan Stozad723bd72014-11-18 10:24:03 -080091
chaviw308ddba2020-08-11 16:23:51 -070092 SAFE_PARCEL(data.writeUint32, static_cast<uint32_t>(displays.size()));
Dan Stozad723bd72014-11-18 10:24:03 -080093 for (const auto& d : displays) {
chaviw308ddba2020-08-11 16:23:51 -070094 SAFE_PARCEL(d.write, data);
Mathias Agopian8b33f032012-07-24 20:43:54 -070095 }
Dan Stozad723bd72014-11-18 10:24:03 -080096
chaviw308ddba2020-08-11 16:23:51 -070097 SAFE_PARCEL(data.writeUint32, flags);
98 SAFE_PARCEL(data.writeStrongBinder, applyToken);
99 SAFE_PARCEL(commands.write, data);
100 SAFE_PARCEL(data.writeInt64, desiredPresentTime);
Ady Abrahamf0c56492020-12-17 18:04:15 -0800101 SAFE_PARCEL(data.writeBool, isAutoTimestamp);
chaviw308ddba2020-08-11 16:23:51 -0700102 SAFE_PARCEL(data.writeStrongBinder, uncacheBuffer.token.promote());
103 SAFE_PARCEL(data.writeUint64, uncacheBuffer.id);
104 SAFE_PARCEL(data.writeBool, hasListenerCallbacks);
Marissa Wall3dad52d2019-03-22 14:03:19 -0700105
chaviw308ddba2020-08-11 16:23:51 -0700106 SAFE_PARCEL(data.writeVectorSize, listenerCallbacks);
107 for (const auto& [listener, callbackIds] : listenerCallbacks) {
108 SAFE_PARCEL(data.writeStrongBinder, listener);
Vishnu Nairfc46c1e2021-04-21 08:31:32 -0700109 SAFE_PARCEL(data.writeParcelableVector, callbackIds);
Marissa Wall3dad52d2019-03-22 14:03:19 -0700110 }
111
Pablo Gamito7eb7ee72020-08-05 10:57:05 +0000112 SAFE_PARCEL(data.writeUint64, transactionId);
113
chaviw308ddba2020-08-11 16:23:51 -0700114 return remote()->transact(BnSurfaceComposer::SET_TRANSACTION_STATE, data, &reply);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800115 }
116
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000117 void bootFinished() override {
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800118 Parcel data, reply;
119 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
120 remote()->transact(BnSurfaceComposer::BOOT_FINISHED, data, &reply);
121 }
122
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000123 bool authenticateSurfaceTexture(
124 const sp<IGraphicBufferProducer>& bufferProducer) const override {
Jamie Gennis134f0422011-03-08 12:18:54 -0800125 Parcel data, reply;
126 int err = NO_ERROR;
127 err = data.writeInterfaceToken(
128 ISurfaceComposer::getInterfaceDescriptor());
129 if (err != NO_ERROR) {
Steve Blocke6f43dd2012-01-06 19:20:56 +0000130 ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error writing "
Jamie Gennis134f0422011-03-08 12:18:54 -0800131 "interface descriptor: %s (%d)", strerror(-err), -err);
132 return false;
133 }
Marco Nelissen2ea926b2014-11-14 08:01:01 -0800134 err = data.writeStrongBinder(IInterface::asBinder(bufferProducer));
Jamie Gennis134f0422011-03-08 12:18:54 -0800135 if (err != NO_ERROR) {
Steve Blocke6f43dd2012-01-06 19:20:56 +0000136 ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error writing "
Jamie Gennis582270d2011-08-17 18:19:00 -0700137 "strong binder to parcel: %s (%d)", strerror(-err), -err);
Jamie Gennis134f0422011-03-08 12:18:54 -0800138 return false;
139 }
140 err = remote()->transact(BnSurfaceComposer::AUTHENTICATE_SURFACE, data,
141 &reply);
142 if (err != NO_ERROR) {
Steve Blocke6f43dd2012-01-06 19:20:56 +0000143 ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error "
Jamie Gennis582270d2011-08-17 18:19:00 -0700144 "performing transaction: %s (%d)", strerror(-err), -err);
Jamie Gennis134f0422011-03-08 12:18:54 -0800145 return false;
146 }
147 int32_t result = 0;
148 err = reply.readInt32(&result);
149 if (err != NO_ERROR) {
Steve Blocke6f43dd2012-01-06 19:20:56 +0000150 ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error "
Jamie Gennis582270d2011-08-17 18:19:00 -0700151 "retrieving result: %s (%d)", strerror(-err), -err);
Jamie Gennis134f0422011-03-08 12:18:54 -0800152 return false;
153 }
154 return result != 0;
155 }
Mathias Agopiand0566bc2011-11-17 17:49:17 -0800156
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000157 status_t getSupportedFrameTimestamps(std::vector<FrameEvent>* outSupported) const override {
Brian Anderson6b376712017-04-04 10:51:39 -0700158 if (!outSupported) {
159 return UNEXPECTED_NULL;
160 }
161 outSupported->clear();
162
163 Parcel data, reply;
164
165 status_t err = data.writeInterfaceToken(
166 ISurfaceComposer::getInterfaceDescriptor());
167 if (err != NO_ERROR) {
168 return err;
169 }
170
171 err = remote()->transact(
172 BnSurfaceComposer::GET_SUPPORTED_FRAME_TIMESTAMPS,
173 data, &reply);
174 if (err != NO_ERROR) {
175 return err;
176 }
177
178 int32_t result = 0;
179 err = reply.readInt32(&result);
180 if (err != NO_ERROR) {
181 return err;
182 }
183 if (result != NO_ERROR) {
184 return result;
185 }
186
187 std::vector<int32_t> supported;
188 err = reply.readInt32Vector(&supported);
189 if (err != NO_ERROR) {
190 return err;
191 }
192
193 outSupported->reserve(supported.size());
194 for (int32_t s : supported) {
195 outSupported->push_back(static_cast<FrameEvent>(s));
196 }
197 return NO_ERROR;
198 }
199
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000200 sp<IDisplayEventConnection> createDisplayEventConnection(
201 VsyncSource vsyncSource, EventRegistrationFlags eventRegistration) override {
Mathias Agopiand0566bc2011-11-17 17:49:17 -0800202 Parcel data, reply;
203 sp<IDisplayEventConnection> result;
204 int err = data.writeInterfaceToken(
205 ISurfaceComposer::getInterfaceDescriptor());
206 if (err != NO_ERROR) {
207 return result;
208 }
Jorim Jaggib1e2f8d2017-06-08 15:43:59 -0700209 data.writeInt32(static_cast<int32_t>(vsyncSource));
Ady Abraham62f216c2020-10-13 19:07:23 -0700210 data.writeUint32(eventRegistration.get());
Mathias Agopiand0566bc2011-11-17 17:49:17 -0800211 err = remote()->transact(
212 BnSurfaceComposer::CREATE_DISPLAY_EVENT_CONNECTION,
213 data, &reply);
214 if (err != NO_ERROR) {
Steve Blocke6f43dd2012-01-06 19:20:56 +0000215 ALOGE("ISurfaceComposer::createDisplayEventConnection: error performing "
Mathias Agopiand0566bc2011-11-17 17:49:17 -0800216 "transaction: %s (%d)", strerror(-err), -err);
217 return result;
218 }
219 result = interface_cast<IDisplayEventConnection>(reply.readStrongBinder());
220 return result;
221 }
Colin Cross8e533062012-06-07 13:17:52 -0700222
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000223 status_t getDisplayState(const sp<IBinder>& display, ui::DisplayState* state) override {
Dominik Laskowski3cb3d4e2019-11-21 11:14:45 -0800224 Parcel data, reply;
225 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
226 data.writeStrongBinder(display);
227 remote()->transact(BnSurfaceComposer::GET_DISPLAY_STATE, data, &reply);
228 const status_t result = reply.readInt32();
229 if (result == NO_ERROR) {
230 memcpy(state, reply.readInplace(sizeof(ui::DisplayState)), sizeof(ui::DisplayState));
231 }
232 return result;
233 }
234
Marin Shalamanov228f46b2021-01-28 21:11:45 +0100235 status_t getStaticDisplayInfo(const sp<IBinder>& display,
236 ui::StaticDisplayInfo* info) override {
Dominik Laskowski3cb3d4e2019-11-21 11:14:45 -0800237 Parcel data, reply;
238 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
239 data.writeStrongBinder(display);
Marin Shalamanov228f46b2021-01-28 21:11:45 +0100240 remote()->transact(BnSurfaceComposer::GET_STATIC_DISPLAY_INFO, data, &reply);
Dominik Laskowski3cb3d4e2019-11-21 11:14:45 -0800241 const status_t result = reply.readInt32();
Marin Shalamanov359a7e72020-02-17 17:03:07 +0100242 if (result != NO_ERROR) return result;
243 return reply.read(*info);
Dominik Laskowski3cb3d4e2019-11-21 11:14:45 -0800244 }
245
Marin Shalamanov228f46b2021-01-28 21:11:45 +0100246 status_t getDynamicDisplayInfo(const sp<IBinder>& display,
247 ui::DynamicDisplayInfo* info) override {
Mathias Agopianc666cae2012-07-25 18:56:13 -0700248 Parcel data, reply;
249 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
Jeff Brown9d4e3d22012-08-24 20:00:51 -0700250 data.writeStrongBinder(display);
Marin Shalamanov228f46b2021-01-28 21:11:45 +0100251 remote()->transact(BnSurfaceComposer::GET_DYNAMIC_DISPLAY_INFO, data, &reply);
Dominik Laskowski3cb3d4e2019-11-21 11:14:45 -0800252 const status_t result = reply.readInt32();
Marin Shalamanov228f46b2021-01-28 21:11:45 +0100253 if (result != NO_ERROR) return result;
254 return reply.read(*info);
Dan Stoza7f7da322014-05-02 15:26:25 -0700255 }
256
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000257 status_t getDisplayStats(const sp<IBinder>& display, DisplayStatInfo* stats) override {
Lajos Molnar67d8bd62014-09-11 14:58:45 -0700258 Parcel data, reply;
259 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
260 data.writeStrongBinder(display);
261 remote()->transact(BnSurfaceComposer::GET_DISPLAY_STATS, data, &reply);
262 status_t result = reply.readInt32();
263 if (result == NO_ERROR) {
264 memcpy(stats,
265 reply.readInplace(sizeof(DisplayStatInfo)),
266 sizeof(DisplayStatInfo));
267 }
268 return result;
269 }
270
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000271 status_t getDisplayNativePrimaries(const sp<IBinder>& display,
272 ui::DisplayPrimaries& primaries) override {
Daniel Solomon42d04562019-01-20 21:03:19 -0800273 Parcel data, reply;
274 status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
275 if (result != NO_ERROR) {
276 ALOGE("getDisplayNativePrimaries failed to writeInterfaceToken: %d", result);
277 return result;
278 }
279 result = data.writeStrongBinder(display);
280 if (result != NO_ERROR) {
281 ALOGE("getDisplayNativePrimaries failed to writeStrongBinder: %d", result);
282 return result;
283 }
284 result = remote()->transact(BnSurfaceComposer::GET_DISPLAY_NATIVE_PRIMARIES, data, &reply);
285 if (result != NO_ERROR) {
286 ALOGE("getDisplayNativePrimaries failed to transact: %d", result);
287 return result;
288 }
289 result = reply.readInt32();
290 if (result == NO_ERROR) {
291 memcpy(&primaries, reply.readInplace(sizeof(ui::DisplayPrimaries)),
292 sizeof(ui::DisplayPrimaries));
293 }
294 return result;
295 }
296
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000297 status_t setActiveColorMode(const sp<IBinder>& display, ColorMode colorMode) override {
Michael Wright28f24d02016-07-12 13:30:53 -0700298 Parcel data, reply;
299 status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
300 if (result != NO_ERROR) {
301 ALOGE("setActiveColorMode failed to writeInterfaceToken: %d", result);
302 return result;
303 }
304 result = data.writeStrongBinder(display);
305 if (result != NO_ERROR) {
306 ALOGE("setActiveColorMode failed to writeStrongBinder: %d", result);
307 return result;
308 }
Peiyong Lina52f0292018-03-14 17:26:31 -0700309 result = data.writeInt32(static_cast<int32_t>(colorMode));
Michael Wright28f24d02016-07-12 13:30:53 -0700310 if (result != NO_ERROR) {
311 ALOGE("setActiveColorMode failed to writeInt32: %d", result);
312 return result;
313 }
314 result = remote()->transact(BnSurfaceComposer::SET_ACTIVE_COLOR_MODE, data, &reply);
315 if (result != NO_ERROR) {
316 ALOGE("setActiveColorMode failed to transact: %d", result);
317 return result;
318 }
319 return static_cast<status_t>(reply.readInt32());
320 }
321
Kriti Dang7defaf32021-11-15 11:55:43 +0100322 status_t setBootDisplayMode(const sp<IBinder>& display,
323 ui::DisplayModeId displayModeId) override {
324 Parcel data, reply;
325 status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
326 if (result != NO_ERROR) {
327 ALOGE("setBootDisplayMode failed to writeInterfaceToken: %d", result);
328 return result;
329 }
330 result = data.writeStrongBinder(display);
331 if (result != NO_ERROR) {
332 ALOGE("setBootDisplayMode failed to writeStrongBinder: %d", result);
333 return result;
334 }
335 result = data.writeInt32(displayModeId);
336 if (result != NO_ERROR) {
337 ALOGE("setBootDisplayMode failed to writeIint32: %d", result);
338 return result;
339 }
340 result = remote()->transact(BnSurfaceComposer::SET_BOOT_DISPLAY_MODE, data, &reply);
341 if (result != NO_ERROR) {
342 ALOGE("setBootDisplayMode failed to transact: %d", result);
343 }
344 return result;
345 }
346
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000347 status_t clearAnimationFrameStats() override {
Svetoslavd85084b2014-03-20 10:28:31 -0700348 Parcel data, reply;
Ana Krulec2d41e422018-07-26 12:07:43 -0700349 status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
350 if (result != NO_ERROR) {
351 ALOGE("clearAnimationFrameStats failed to writeInterfaceToken: %d", result);
352 return result;
353 }
354 result = remote()->transact(BnSurfaceComposer::CLEAR_ANIMATION_FRAME_STATS, data, &reply);
355 if (result != NO_ERROR) {
356 ALOGE("clearAnimationFrameStats failed to transact: %d", result);
357 return result;
358 }
Svetoslavd85084b2014-03-20 10:28:31 -0700359 return reply.readInt32();
360 }
361
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000362 status_t getAnimationFrameStats(FrameStats* outStats) const override {
Svetoslavd85084b2014-03-20 10:28:31 -0700363 Parcel data, reply;
364 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
365 remote()->transact(BnSurfaceComposer::GET_ANIMATION_FRAME_STATS, data, &reply);
366 reply.read(*outStats);
367 return reply.readInt32();
368 }
Dan Stozac4f471e2016-03-24 09:31:08 -0700369
Kriti Dang49ad4132021-01-08 11:49:56 +0100370 virtual status_t overrideHdrTypes(const sp<IBinder>& display,
371 const std::vector<ui::Hdr>& hdrTypes) {
372 Parcel data, reply;
373 SAFE_PARCEL(data.writeInterfaceToken, ISurfaceComposer::getInterfaceDescriptor());
374 SAFE_PARCEL(data.writeStrongBinder, display);
375
376 std::vector<int32_t> hdrTypesVector;
377 for (ui::Hdr i : hdrTypes) {
378 hdrTypesVector.push_back(static_cast<int32_t>(i));
379 }
380 SAFE_PARCEL(data.writeInt32Vector, hdrTypesVector);
381
382 status_t result = remote()->transact(BnSurfaceComposer::OVERRIDE_HDR_TYPES, data, &reply);
383 if (result != NO_ERROR) {
384 ALOGE("overrideHdrTypes failed to transact: %d", result);
385 return result;
386 }
387 return result;
388 }
389
Tej Singhe2751772021-04-06 22:05:29 -0700390 status_t onPullAtom(const int32_t atomId, std::string* pulledData, bool* success) {
391 Parcel data, reply;
392 SAFE_PARCEL(data.writeInterfaceToken, ISurfaceComposer::getInterfaceDescriptor());
393 SAFE_PARCEL(data.writeInt32, atomId);
394
395 status_t err = remote()->transact(BnSurfaceComposer::ON_PULL_ATOM, data, &reply);
396 if (err != NO_ERROR) {
397 ALOGE("onPullAtom failed to transact: %d", err);
398 return err;
399 }
400
401 int32_t size = 0;
402 SAFE_PARCEL(reply.readInt32, &size);
403 const void* dataPtr = reply.readInplace(size);
404 if (dataPtr == nullptr) {
405 return UNEXPECTED_NULL;
406 }
407 pulledData->assign((const char*)dataPtr, size);
408 SAFE_PARCEL(reply.readBool, success);
409 return NO_ERROR;
410 }
411
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000412 status_t enableVSyncInjections(bool enable) override {
Sahil Dhanjuc1ba5c42016-06-07 20:09:20 -0700413 Parcel data, reply;
414 status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
415 if (result != NO_ERROR) {
416 ALOGE("enableVSyncInjections failed to writeInterfaceToken: %d", result);
417 return result;
418 }
419 result = data.writeBool(enable);
420 if (result != NO_ERROR) {
421 ALOGE("enableVSyncInjections failed to writeBool: %d", result);
422 return result;
423 }
Steven Moreland366eb422019-04-01 19:22:32 -0700424 result = remote()->transact(BnSurfaceComposer::ENABLE_VSYNC_INJECTIONS, data, &reply,
425 IBinder::FLAG_ONEWAY);
Sahil Dhanjuc1ba5c42016-06-07 20:09:20 -0700426 if (result != NO_ERROR) {
427 ALOGE("enableVSyncInjections failed to transact: %d", result);
428 return result;
429 }
430 return result;
431 }
432
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000433 status_t injectVSync(nsecs_t when) override {
Sahil Dhanjuc1ba5c42016-06-07 20:09:20 -0700434 Parcel data, reply;
435 status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
436 if (result != NO_ERROR) {
437 ALOGE("injectVSync failed to writeInterfaceToken: %d", result);
438 return result;
439 }
440 result = data.writeInt64(when);
441 if (result != NO_ERROR) {
442 ALOGE("injectVSync failed to writeInt64: %d", result);
443 return result;
444 }
Steven Moreland366eb422019-04-01 19:22:32 -0700445 result = remote()->transact(BnSurfaceComposer::INJECT_VSYNC, data, &reply,
446 IBinder::FLAG_ONEWAY);
Sahil Dhanjuc1ba5c42016-06-07 20:09:20 -0700447 if (result != NO_ERROR) {
448 ALOGE("injectVSync failed to transact: %d", result);
449 return result;
450 }
451 return result;
452 }
453
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000454 status_t getLayerDebugInfo(std::vector<LayerDebugInfo>* outLayers) override {
Kalle Raitaa099a242017-01-11 11:17:29 -0800455 if (!outLayers) {
456 return UNEXPECTED_NULL;
457 }
458
459 Parcel data, reply;
460
461 status_t err = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
462 if (err != NO_ERROR) {
463 return err;
464 }
465
466 err = remote()->transact(BnSurfaceComposer::GET_LAYER_DEBUG_INFO, data, &reply);
467 if (err != NO_ERROR) {
468 return err;
469 }
470
471 int32_t result = 0;
472 err = reply.readInt32(&result);
473 if (err != NO_ERROR) {
474 return err;
475 }
476 if (result != NO_ERROR) {
477 return result;
478 }
479
480 outLayers->clear();
481 return reply.readParcelableVector(outLayers);
482 }
Peiyong Lin0256f722018-08-31 15:45:10 -0700483
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000484 status_t getCompositionPreference(ui::Dataspace* defaultDataspace,
485 ui::PixelFormat* defaultPixelFormat,
486 ui::Dataspace* wideColorGamutDataspace,
487 ui::PixelFormat* wideColorGamutPixelFormat) const override {
Peiyong Lin0256f722018-08-31 15:45:10 -0700488 Parcel data, reply;
489 status_t error = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
490 if (error != NO_ERROR) {
491 return error;
492 }
493 error = remote()->transact(BnSurfaceComposer::GET_COMPOSITION_PREFERENCE, data, &reply);
494 if (error != NO_ERROR) {
495 return error;
496 }
497 error = static_cast<status_t>(reply.readInt32());
498 if (error == NO_ERROR) {
Peiyong Linc6780972018-10-28 15:24:08 -0700499 *defaultDataspace = static_cast<ui::Dataspace>(reply.readInt32());
500 *defaultPixelFormat = static_cast<ui::PixelFormat>(reply.readInt32());
501 *wideColorGamutDataspace = static_cast<ui::Dataspace>(reply.readInt32());
502 *wideColorGamutPixelFormat = static_cast<ui::PixelFormat>(reply.readInt32());
Peiyong Lin0256f722018-08-31 15:45:10 -0700503 }
504 return error;
505 }
Ady Abraham2a6ab2a2018-10-26 14:25:30 -0700506
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000507 status_t getColorManagement(bool* outGetColorManagement) const override {
Ady Abraham2a6ab2a2018-10-26 14:25:30 -0700508 Parcel data, reply;
509 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
Ady Abraham37965d42018-11-01 13:43:32 -0700510 remote()->transact(BnSurfaceComposer::GET_COLOR_MANAGEMENT, data, &reply);
511 bool result;
512 status_t err = reply.readBool(&result);
513 if (err == NO_ERROR) {
514 *outGetColorManagement = result;
Ady Abraham2a6ab2a2018-10-26 14:25:30 -0700515 }
Ady Abraham37965d42018-11-01 13:43:32 -0700516 return err;
Ady Abraham2a6ab2a2018-10-26 14:25:30 -0700517 }
Kevin DuBois9c0a1762018-10-16 13:32:31 -0700518
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000519 status_t getDisplayedContentSamplingAttributes(const sp<IBinder>& display,
520 ui::PixelFormat* outFormat,
521 ui::Dataspace* outDataspace,
522 uint8_t* outComponentMask) const override {
Kevin DuBois9c0a1762018-10-16 13:32:31 -0700523 if (!outFormat || !outDataspace || !outComponentMask) return BAD_VALUE;
524 Parcel data, reply;
525 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
526 data.writeStrongBinder(display);
527
528 status_t error =
529 remote()->transact(BnSurfaceComposer::GET_DISPLAYED_CONTENT_SAMPLING_ATTRIBUTES,
530 data, &reply);
531 if (error != NO_ERROR) {
532 return error;
533 }
534
535 uint32_t value = 0;
536 error = reply.readUint32(&value);
537 if (error != NO_ERROR) {
538 return error;
539 }
540 *outFormat = static_cast<ui::PixelFormat>(value);
541
542 error = reply.readUint32(&value);
543 if (error != NO_ERROR) {
544 return error;
545 }
546 *outDataspace = static_cast<ui::Dataspace>(value);
547
548 error = reply.readUint32(&value);
549 if (error != NO_ERROR) {
550 return error;
551 }
552 *outComponentMask = static_cast<uint8_t>(value);
553 return error;
554 }
Kevin DuBois74e53772018-11-19 10:52:38 -0800555
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000556 status_t setDisplayContentSamplingEnabled(const sp<IBinder>& display, bool enable,
557 uint8_t componentMask, uint64_t maxFrames) override {
Kevin DuBois74e53772018-11-19 10:52:38 -0800558 Parcel data, reply;
559 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
560 data.writeStrongBinder(display);
561 data.writeBool(enable);
562 data.writeByte(static_cast<int8_t>(componentMask));
563 data.writeUint64(maxFrames);
564 status_t result =
565 remote()->transact(BnSurfaceComposer::SET_DISPLAY_CONTENT_SAMPLING_ENABLED, data,
566 &reply);
567 return result;
568 }
Kevin DuBois1d4249a2018-08-29 10:45:14 -0700569
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000570 status_t getDisplayedContentSample(const sp<IBinder>& display, uint64_t maxFrames,
571 uint64_t timestamp,
572 DisplayedFrameStats* outStats) const override {
Kevin DuBois1d4249a2018-08-29 10:45:14 -0700573 if (!outStats) return BAD_VALUE;
574
575 Parcel data, reply;
576 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
577 data.writeStrongBinder(display);
578 data.writeUint64(maxFrames);
579 data.writeUint64(timestamp);
580
581 status_t result =
582 remote()->transact(BnSurfaceComposer::GET_DISPLAYED_CONTENT_SAMPLE, data, &reply);
583
584 if (result != NO_ERROR) {
585 return result;
586 }
587
588 result = reply.readUint64(&outStats->numFrames);
589 if (result != NO_ERROR) {
590 return result;
591 }
592
Kevin DuBois1d4c6a62018-12-12 13:59:46 -0800593 result = reply.readUint64Vector(&outStats->component_0_sample);
Kevin DuBois1d4249a2018-08-29 10:45:14 -0700594 if (result != NO_ERROR) {
595 return result;
596 }
Kevin DuBois1d4c6a62018-12-12 13:59:46 -0800597 result = reply.readUint64Vector(&outStats->component_1_sample);
Kevin DuBois1d4249a2018-08-29 10:45:14 -0700598 if (result != NO_ERROR) {
599 return result;
600 }
Kevin DuBois1d4c6a62018-12-12 13:59:46 -0800601 result = reply.readUint64Vector(&outStats->component_2_sample);
Kevin DuBois1d4249a2018-08-29 10:45:14 -0700602 if (result != NO_ERROR) {
603 return result;
604 }
Kevin DuBois1d4c6a62018-12-12 13:59:46 -0800605 result = reply.readUint64Vector(&outStats->component_3_sample);
Kevin DuBois1d4249a2018-08-29 10:45:14 -0700606 return result;
607 }
Peiyong Lin3c2791e2019-01-14 17:05:18 -0800608
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000609 status_t getProtectedContentSupport(bool* outSupported) const override {
Peiyong Lin3c2791e2019-01-14 17:05:18 -0800610 Parcel data, reply;
611 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
Peiyong Linb6888fa2019-01-28 13:20:58 -0800612 status_t error =
613 remote()->transact(BnSurfaceComposer::GET_PROTECTED_CONTENT_SUPPORT, data, &reply);
614 if (error != NO_ERROR) {
615 return error;
Peiyong Lin3c2791e2019-01-14 17:05:18 -0800616 }
Peiyong Linb6888fa2019-01-28 13:20:58 -0800617 error = reply.readBool(outSupported);
618 return error;
Peiyong Lin3c2791e2019-01-14 17:05:18 -0800619 }
Marissa Wallebc2c052019-01-16 19:16:55 -0800620
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000621 status_t addRegionSamplingListener(const Rect& samplingArea, const sp<IBinder>& stopLayerHandle,
622 const sp<IRegionSamplingListener>& listener) override {
Dan Stoza84ab9372018-12-17 15:27:57 -0800623 Parcel data, reply;
624 status_t error = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
625 if (error != NO_ERROR) {
626 ALOGE("addRegionSamplingListener: Failed to write interface token");
627 return error;
628 }
629 error = data.write(samplingArea);
630 if (error != NO_ERROR) {
631 ALOGE("addRegionSamplingListener: Failed to write sampling area");
632 return error;
633 }
634 error = data.writeStrongBinder(stopLayerHandle);
635 if (error != NO_ERROR) {
636 ALOGE("addRegionSamplingListener: Failed to write stop layer handle");
637 return error;
638 }
639 error = data.writeStrongBinder(IInterface::asBinder(listener));
640 if (error != NO_ERROR) {
641 ALOGE("addRegionSamplingListener: Failed to write listener");
642 return error;
643 }
644 error = remote()->transact(BnSurfaceComposer::ADD_REGION_SAMPLING_LISTENER, data, &reply);
645 if (error != NO_ERROR) {
646 ALOGE("addRegionSamplingListener: Failed to transact");
647 }
648 return error;
649 }
650
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000651 status_t removeRegionSamplingListener(const sp<IRegionSamplingListener>& listener) override {
Dan Stoza84ab9372018-12-17 15:27:57 -0800652 Parcel data, reply;
653 status_t error = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
654 if (error != NO_ERROR) {
tangrobinaf45f012019-02-26 18:10:10 +0800655 ALOGE("removeRegionSamplingListener: Failed to write interface token");
Dan Stoza84ab9372018-12-17 15:27:57 -0800656 return error;
657 }
658 error = data.writeStrongBinder(IInterface::asBinder(listener));
659 if (error != NO_ERROR) {
tangrobinaf45f012019-02-26 18:10:10 +0800660 ALOGE("removeRegionSamplingListener: Failed to write listener");
Dan Stoza84ab9372018-12-17 15:27:57 -0800661 return error;
662 }
663 error = remote()->transact(BnSurfaceComposer::REMOVE_REGION_SAMPLING_LISTENER, data,
664 &reply);
665 if (error != NO_ERROR) {
tangrobinaf45f012019-02-26 18:10:10 +0800666 ALOGE("removeRegionSamplingListener: Failed to transact");
Dan Stoza84ab9372018-12-17 15:27:57 -0800667 }
668 return error;
669 }
Ady Abraham838de062019-02-04 10:24:03 -0800670
Alec Mouria9a68a62021-03-04 19:14:50 -0800671 virtual status_t addFpsListener(int32_t taskId, const sp<gui::IFpsListener>& listener) {
Alec Mouriadebf5c2021-01-05 12:57:36 -0800672 Parcel data, reply;
673 SAFE_PARCEL(data.writeInterfaceToken, ISurfaceComposer::getInterfaceDescriptor());
Alec Mouria9a68a62021-03-04 19:14:50 -0800674 SAFE_PARCEL(data.writeInt32, taskId);
Alec Mouriadebf5c2021-01-05 12:57:36 -0800675 SAFE_PARCEL(data.writeStrongBinder, IInterface::asBinder(listener));
676 const status_t error =
677 remote()->transact(BnSurfaceComposer::ADD_FPS_LISTENER, data, &reply);
678 if (error != OK) {
679 ALOGE("addFpsListener: Failed to transact");
680 }
681 return error;
682 }
683
684 virtual status_t removeFpsListener(const sp<gui::IFpsListener>& listener) {
685 Parcel data, reply;
686 SAFE_PARCEL(data.writeInterfaceToken, ISurfaceComposer::getInterfaceDescriptor());
687 SAFE_PARCEL(data.writeStrongBinder, IInterface::asBinder(listener));
688
689 const status_t error =
690 remote()->transact(BnSurfaceComposer::REMOVE_FPS_LISTENER, data, &reply);
691 if (error != OK) {
692 ALOGE("removeFpsListener: Failed to transact");
693 }
694 return error;
695 }
696
Galia Peycheva8f04b302021-04-27 13:25:38 +0200697 virtual status_t addTunnelModeEnabledListener(
698 const sp<gui::ITunnelModeEnabledListener>& listener) {
699 Parcel data, reply;
700 SAFE_PARCEL(data.writeInterfaceToken, ISurfaceComposer::getInterfaceDescriptor());
701 SAFE_PARCEL(data.writeStrongBinder, IInterface::asBinder(listener));
702
703 const status_t error =
704 remote()->transact(BnSurfaceComposer::ADD_TUNNEL_MODE_ENABLED_LISTENER, data,
705 &reply);
706 if (error != NO_ERROR) {
707 ALOGE("addTunnelModeEnabledListener: Failed to transact");
708 }
709 return error;
710 }
711
712 virtual status_t removeTunnelModeEnabledListener(
713 const sp<gui::ITunnelModeEnabledListener>& listener) {
714 Parcel data, reply;
715 SAFE_PARCEL(data.writeInterfaceToken, ISurfaceComposer::getInterfaceDescriptor());
716 SAFE_PARCEL(data.writeStrongBinder, IInterface::asBinder(listener));
717
718 const status_t error =
719 remote()->transact(BnSurfaceComposer::REMOVE_TUNNEL_MODE_ENABLED_LISTENER, data,
720 &reply);
721 if (error != NO_ERROR) {
722 ALOGE("removeTunnelModeEnabledListener: Failed to transact");
723 }
724 return error;
725 }
726
Marin Shalamanov228f46b2021-01-28 21:11:45 +0100727 status_t setDesiredDisplayModeSpecs(const sp<IBinder>& displayToken,
728 ui::DisplayModeId defaultMode, bool allowGroupSwitching,
729 float primaryRefreshRateMin, float primaryRefreshRateMax,
730 float appRequestRefreshRateMin,
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100731 float appRequestRefreshRateMax) override {
Ana Krulec0782b882019-10-15 17:34:54 -0700732 Parcel data, reply;
733 status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
734 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100735 ALOGE("setDesiredDisplayModeSpecs: failed to writeInterfaceToken: %d", result);
Ana Krulec0782b882019-10-15 17:34:54 -0700736 return result;
737 }
738 result = data.writeStrongBinder(displayToken);
739 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100740 ALOGE("setDesiredDisplayModeSpecs: failed to write display token: %d", result);
Ana Krulec0782b882019-10-15 17:34:54 -0700741 return result;
742 }
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100743 result = data.writeInt32(defaultMode);
Ana Krulec0782b882019-10-15 17:34:54 -0700744 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100745 ALOGE("setDesiredDisplayModeSpecs failed to write defaultMode: %d", result);
Ana Krulec0782b882019-10-15 17:34:54 -0700746 return result;
747 }
Marin Shalamanov30b0b3c2020-10-13 19:15:06 +0200748 result = data.writeBool(allowGroupSwitching);
749 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100750 ALOGE("setDesiredDisplayModeSpecs failed to write allowGroupSwitching: %d", result);
Marin Shalamanov30b0b3c2020-10-13 19:15:06 +0200751 return result;
752 }
Steven Thomasf734df42020-04-13 21:09:28 -0700753 result = data.writeFloat(primaryRefreshRateMin);
Ana Krulec0782b882019-10-15 17:34:54 -0700754 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100755 ALOGE("setDesiredDisplayModeSpecs failed to write primaryRefreshRateMin: %d", result);
Ana Krulec0782b882019-10-15 17:34:54 -0700756 return result;
757 }
Steven Thomasf734df42020-04-13 21:09:28 -0700758 result = data.writeFloat(primaryRefreshRateMax);
Ana Krulec0782b882019-10-15 17:34:54 -0700759 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100760 ALOGE("setDesiredDisplayModeSpecs failed to write primaryRefreshRateMax: %d", result);
Steven Thomasf734df42020-04-13 21:09:28 -0700761 return result;
762 }
763 result = data.writeFloat(appRequestRefreshRateMin);
764 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100765 ALOGE("setDesiredDisplayModeSpecs failed to write appRequestRefreshRateMin: %d",
Steven Thomasf734df42020-04-13 21:09:28 -0700766 result);
767 return result;
768 }
769 result = data.writeFloat(appRequestRefreshRateMax);
770 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100771 ALOGE("setDesiredDisplayModeSpecs failed to write appRequestRefreshRateMax: %d",
Steven Thomasf734df42020-04-13 21:09:28 -0700772 result);
Ana Krulec0782b882019-10-15 17:34:54 -0700773 return result;
774 }
775
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100776 result =
777 remote()->transact(BnSurfaceComposer::SET_DESIRED_DISPLAY_MODE_SPECS, data, &reply);
Ana Krulec0782b882019-10-15 17:34:54 -0700778 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100779 ALOGE("setDesiredDisplayModeSpecs failed to transact: %d", result);
Ana Krulec0782b882019-10-15 17:34:54 -0700780 return result;
781 }
782 return reply.readInt32();
783 }
784
Marin Shalamanov228f46b2021-01-28 21:11:45 +0100785 status_t getDesiredDisplayModeSpecs(const sp<IBinder>& displayToken,
786 ui::DisplayModeId* outDefaultMode,
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100787 bool* outAllowGroupSwitching,
788 float* outPrimaryRefreshRateMin,
789 float* outPrimaryRefreshRateMax,
790 float* outAppRequestRefreshRateMin,
791 float* outAppRequestRefreshRateMax) override {
792 if (!outDefaultMode || !outAllowGroupSwitching || !outPrimaryRefreshRateMin ||
Marin Shalamanov30b0b3c2020-10-13 19:15:06 +0200793 !outPrimaryRefreshRateMax || !outAppRequestRefreshRateMin ||
794 !outAppRequestRefreshRateMax) {
Steven Thomasf734df42020-04-13 21:09:28 -0700795 return BAD_VALUE;
796 }
Ady Abrahamd9b3ea62019-02-26 14:08:03 -0800797 Parcel data, reply;
798 status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
799 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100800 ALOGE("getDesiredDisplayModeSpecs failed to writeInterfaceToken: %d", result);
Ady Abrahamd9b3ea62019-02-26 14:08:03 -0800801 return result;
802 }
803 result = data.writeStrongBinder(displayToken);
804 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100805 ALOGE("getDesiredDisplayModeSpecs failed to writeStrongBinder: %d", result);
Ady Abrahamd9b3ea62019-02-26 14:08:03 -0800806 return result;
807 }
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100808 result =
809 remote()->transact(BnSurfaceComposer::GET_DESIRED_DISPLAY_MODE_SPECS, data, &reply);
Ady Abrahamd9b3ea62019-02-26 14:08:03 -0800810 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100811 ALOGE("getDesiredDisplayModeSpecs failed to transact: %d", result);
Ady Abrahamd9b3ea62019-02-26 14:08:03 -0800812 return result;
813 }
Marin Shalamanov228f46b2021-01-28 21:11:45 +0100814
815 result = reply.readInt32(outDefaultMode);
Ady Abrahamd9b3ea62019-02-26 14:08:03 -0800816 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100817 ALOGE("getDesiredDisplayModeSpecs failed to read defaultMode: %d", result);
Ana Krulec234bb162019-11-10 22:55:55 +0100818 return result;
819 }
Marin Shalamanov228f46b2021-01-28 21:11:45 +0100820 if (*outDefaultMode < 0) {
821 ALOGE("%s: defaultMode must be non-negative but it was %d", __func__, *outDefaultMode);
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100822 return BAD_VALUE;
823 }
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100824
Marin Shalamanov30b0b3c2020-10-13 19:15:06 +0200825 result = reply.readBool(outAllowGroupSwitching);
826 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100827 ALOGE("getDesiredDisplayModeSpecs failed to read allowGroupSwitching: %d", result);
Marin Shalamanov30b0b3c2020-10-13 19:15:06 +0200828 return result;
829 }
Steven Thomasf734df42020-04-13 21:09:28 -0700830 result = reply.readFloat(outPrimaryRefreshRateMin);
Ana Krulec234bb162019-11-10 22:55:55 +0100831 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100832 ALOGE("getDesiredDisplayModeSpecs failed to read primaryRefreshRateMin: %d", result);
Ana Krulec234bb162019-11-10 22:55:55 +0100833 return result;
834 }
Steven Thomasf734df42020-04-13 21:09:28 -0700835 result = reply.readFloat(outPrimaryRefreshRateMax);
Ana Krulec234bb162019-11-10 22:55:55 +0100836 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100837 ALOGE("getDesiredDisplayModeSpecs failed to read primaryRefreshRateMax: %d", result);
Steven Thomasf734df42020-04-13 21:09:28 -0700838 return result;
839 }
840 result = reply.readFloat(outAppRequestRefreshRateMin);
841 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100842 ALOGE("getDesiredDisplayModeSpecs failed to read appRequestRefreshRateMin: %d", result);
Steven Thomasf734df42020-04-13 21:09:28 -0700843 return result;
844 }
845 result = reply.readFloat(outAppRequestRefreshRateMax);
846 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100847 ALOGE("getDesiredDisplayModeSpecs failed to read appRequestRefreshRateMax: %d", result);
Ady Abrahamd9b3ea62019-02-26 14:08:03 -0800848 return result;
849 }
850 return reply.readInt32();
851 }
Dan Gittik57e63c52019-01-18 16:37:54 +0000852
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000853 status_t setGlobalShadowSettings(const half4& ambientColor, const half4& spotColor,
854 float lightPosY, float lightPosZ, float lightRadius) override {
Vishnu Nairb13bb952019-11-15 10:24:08 -0800855 Parcel data, reply;
856 status_t error = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
857 if (error != NO_ERROR) {
858 ALOGE("setGlobalShadowSettings: failed to write interface token: %d", error);
859 return error;
860 }
861
862 std::vector<float> shadowConfig = {ambientColor.r, ambientColor.g, ambientColor.b,
863 ambientColor.a, spotColor.r, spotColor.g,
864 spotColor.b, spotColor.a, lightPosY,
865 lightPosZ, lightRadius};
866
867 error = data.writeFloatVector(shadowConfig);
868 if (error != NO_ERROR) {
869 ALOGE("setGlobalShadowSettings: failed to write shadowConfig: %d", error);
870 return error;
871 }
872
873 error = remote()->transact(BnSurfaceComposer::SET_GLOBAL_SHADOW_SETTINGS, data, &reply,
874 IBinder::FLAG_ONEWAY);
875 if (error != NO_ERROR) {
876 ALOGE("setGlobalShadowSettings: failed to transact: %d", error);
877 return error;
878 }
879 return NO_ERROR;
880 }
Steven Thomas62a4cf82020-01-31 12:04:03 -0800881
Leon Scroggins IIIe7c51c62022-02-01 15:53:54 -0500882 status_t getDisplayDecorationSupport(
883 const sp<IBinder>& displayToken,
884 std::optional<common::DisplayDecorationSupport>* outSupport) const override {
Leon Scroggins IIIe5cff632021-12-29 11:53:36 -0500885 Parcel data, reply;
886 status_t error = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
887 if (error != NO_ERROR) {
888 ALOGE("getDisplayDecorationSupport: failed to write interface token: %d", error);
889 return error;
890 }
891 error = data.writeStrongBinder(displayToken);
892 if (error != NO_ERROR) {
893 ALOGE("getDisplayDecorationSupport: failed to write display token: %d", error);
894 return error;
895 }
896 error = remote()->transact(BnSurfaceComposer::GET_DISPLAY_DECORATION_SUPPORT, data, &reply);
897 if (error != NO_ERROR) {
898 ALOGE("getDisplayDecorationSupport: failed to transact: %d", error);
899 return error;
900 }
901 bool support;
902 error = reply.readBool(&support);
903 if (error != NO_ERROR) {
904 ALOGE("getDisplayDecorationSupport: failed to read support: %d", error);
905 return error;
906 }
Leon Scroggins IIIe7c51c62022-02-01 15:53:54 -0500907
908 if (support) {
909 int32_t format, alphaInterpretation;
910 error = reply.readInt32(&format);
911 if (error != NO_ERROR) {
912 ALOGE("getDisplayDecorationSupport: failed to read format: %d", error);
913 return error;
914 }
915 error = reply.readInt32(&alphaInterpretation);
916 if (error != NO_ERROR) {
917 ALOGE("getDisplayDecorationSupport: failed to read alphaInterpretation: %d", error);
918 return error;
919 }
920 outSupport->emplace();
921 outSupport->value().format = static_cast<common::PixelFormat>(format);
922 outSupport->value().alphaInterpretation =
923 static_cast<common::AlphaInterpretation>(alphaInterpretation);
924 } else {
925 outSupport->reset();
926 }
Leon Scroggins IIIe5cff632021-12-29 11:53:36 -0500927 return NO_ERROR;
928 }
929
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000930 status_t setFrameRate(const sp<IGraphicBufferProducer>& surface, float frameRate,
Marin Shalamanovc5986772021-03-16 16:09:49 +0100931 int8_t compatibility, int8_t changeFrameRateStrategy) override {
Steven Thomas62a4cf82020-01-31 12:04:03 -0800932 Parcel data, reply;
Marin Shalamanovc5986772021-03-16 16:09:49 +0100933 SAFE_PARCEL(data.writeInterfaceToken, ISurfaceComposer::getInterfaceDescriptor());
934 SAFE_PARCEL(data.writeStrongBinder, IInterface::asBinder(surface));
935 SAFE_PARCEL(data.writeFloat, frameRate);
936 SAFE_PARCEL(data.writeByte, compatibility);
937 SAFE_PARCEL(data.writeByte, changeFrameRateStrategy);
Steven Thomas62a4cf82020-01-31 12:04:03 -0800938
Marin Shalamanovc5986772021-03-16 16:09:49 +0100939 status_t err = remote()->transact(BnSurfaceComposer::SET_FRAME_RATE, data, &reply);
Steven Thomas62a4cf82020-01-31 12:04:03 -0800940 if (err != NO_ERROR) {
941 ALOGE("setFrameRate: failed to transact: %s (%d)", strerror(-err), err);
942 return err;
943 }
Steven Thomasd4071902020-03-24 16:02:53 -0700944
945 return reply.readInt32();
946 }
947
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000948 status_t setFrameTimelineInfo(const sp<IGraphicBufferProducer>& surface,
949 const FrameTimelineInfo& frameTimelineInfo) override {
Ady Abraham74e17562020-08-24 18:18:19 -0700950 Parcel data, reply;
951 status_t err = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
952 if (err != NO_ERROR) {
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000953 ALOGE("%s: failed writing interface token: %s (%d)", __func__, strerror(-err), -err);
Ady Abraham74e17562020-08-24 18:18:19 -0700954 return err;
955 }
956
957 err = data.writeStrongBinder(IInterface::asBinder(surface));
958 if (err != NO_ERROR) {
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000959 ALOGE("%s: failed writing strong binder: %s (%d)", __func__, strerror(-err), -err);
Ady Abraham74e17562020-08-24 18:18:19 -0700960 return err;
961 }
962
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000963 SAFE_PARCEL(frameTimelineInfo.write, data);
Ady Abraham74e17562020-08-24 18:18:19 -0700964
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000965 err = remote()->transact(BnSurfaceComposer::SET_FRAME_TIMELINE_INFO, data, &reply);
Ady Abraham74e17562020-08-24 18:18:19 -0700966 if (err != NO_ERROR) {
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000967 ALOGE("%s: failed to transact: %s (%d)", __func__, strerror(-err), err);
Ady Abraham74e17562020-08-24 18:18:19 -0700968 return err;
969 }
970
971 return reply.readInt32();
972 }
Pablo Gamito6ee484d2020-07-30 14:26:28 +0000973
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000974 status_t addTransactionTraceListener(
975 const sp<gui::ITransactionTraceListener>& listener) override {
Pablo Gamito6ee484d2020-07-30 14:26:28 +0000976 Parcel data, reply;
977 SAFE_PARCEL(data.writeInterfaceToken, ISurfaceComposer::getInterfaceDescriptor());
978 SAFE_PARCEL(data.writeStrongBinder, IInterface::asBinder(listener));
979
980 return remote()->transact(BnSurfaceComposer::ADD_TRANSACTION_TRACE_LISTENER, data, &reply);
981 }
Ana Krulec31f2b3c2020-12-14 14:30:09 -0800982
983 /**
984 * Get priority of the RenderEngine in surface flinger.
985 */
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000986 int getGPUContextPriority() override {
Ana Krulec31f2b3c2020-12-14 14:30:09 -0800987 Parcel data, reply;
988 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
989 status_t err =
990 remote()->transact(BnSurfaceComposer::GET_GPU_CONTEXT_PRIORITY, data, &reply);
991 if (err != NO_ERROR) {
992 ALOGE("getGPUContextPriority failed to read data: %s (%d)", strerror(-err), err);
993 return 0;
994 }
995 return reply.readInt32();
996 }
Ady Abraham564f9de2021-02-03 18:34:33 -0800997
Ady Abraham899dcdb2021-06-15 16:56:21 -0700998 status_t getMaxAcquiredBufferCount(int* buffers) const override {
Ady Abraham564f9de2021-02-03 18:34:33 -0800999 Parcel data, reply;
1000 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
Ady Abraham899dcdb2021-06-15 16:56:21 -07001001 status_t err =
1002 remote()->transact(BnSurfaceComposer::GET_MAX_ACQUIRED_BUFFER_COUNT, data, &reply);
Ady Abraham564f9de2021-02-03 18:34:33 -08001003 if (err != NO_ERROR) {
Ady Abraham899dcdb2021-06-15 16:56:21 -07001004 ALOGE("getMaxAcquiredBufferCount failed to read data: %s (%d)", strerror(-err), err);
Ady Abraham564f9de2021-02-03 18:34:33 -08001005 return err;
1006 }
1007
Ady Abraham899dcdb2021-06-15 16:56:21 -07001008 return reply.readInt32(buffers);
Ady Abraham564f9de2021-02-03 18:34:33 -08001009 }
chaviw60c9d3e2021-06-04 12:52:17 -05001010
1011 status_t addWindowInfosListener(
1012 const sp<IWindowInfosListener>& windowInfosListener) const override {
1013 Parcel data, reply;
1014 SAFE_PARCEL(data.writeInterfaceToken, ISurfaceComposer::getInterfaceDescriptor());
1015 SAFE_PARCEL(data.writeStrongBinder, IInterface::asBinder(windowInfosListener));
1016 return remote()->transact(BnSurfaceComposer::ADD_WINDOW_INFOS_LISTENER, data, &reply);
1017 }
1018
1019 status_t removeWindowInfosListener(
1020 const sp<IWindowInfosListener>& windowInfosListener) const override {
1021 Parcel data, reply;
1022 SAFE_PARCEL(data.writeInterfaceToken, ISurfaceComposer::getInterfaceDescriptor());
1023 SAFE_PARCEL(data.writeStrongBinder, IInterface::asBinder(windowInfosListener));
1024 return remote()->transact(BnSurfaceComposer::REMOVE_WINDOW_INFOS_LISTENER, data, &reply);
1025 }
Andy Yu2ae6b6b2021-11-18 14:51:06 -08001026
1027 status_t setOverrideFrameRate(uid_t uid, float frameRate) override {
1028 Parcel data, reply;
1029 SAFE_PARCEL(data.writeInterfaceToken, ISurfaceComposer::getInterfaceDescriptor());
1030 SAFE_PARCEL(data.writeUint32, uid);
1031 SAFE_PARCEL(data.writeFloat, frameRate);
1032
1033 status_t err = remote()->transact(BnSurfaceComposer::SET_OVERRIDE_FRAME_RATE, data, &reply);
1034 if (err != NO_ERROR) {
1035 ALOGE("setOverrideFrameRate: failed to transact %s (%d)", strerror(-err), err);
1036 return err;
1037 }
1038
1039 return NO_ERROR;
1040 }
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08001041};
1042
Dan Stozad723bd72014-11-18 10:24:03 -08001043// Out-of-line virtual method definition to trigger vtable emission in this
1044// translation unit (see clang warning -Wweak-vtables)
1045BpSurfaceComposer::~BpSurfaceComposer() {}
1046
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08001047IMPLEMENT_META_INTERFACE(SurfaceComposer, "android.ui.ISurfaceComposer");
1048
1049// ----------------------------------------------------------------------
1050
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08001051status_t BnSurfaceComposer::onTransact(
1052 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
1053{
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08001054 switch(code) {
1055 case CREATE_CONNECTION: {
Mathias Agopian83c04462009-05-22 19:00:22 -07001056 CHECK_INTERFACE(ISurfaceComposer, data, reply);
Marco Nelissen2ea926b2014-11-14 08:01:01 -08001057 sp<IBinder> b = IInterface::asBinder(createConnection());
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08001058 reply->writeStrongBinder(b);
Jesse Hall6c913be2013-08-08 12:15:49 -07001059 return NO_ERROR;
1060 }
Mathias Agopian698c0872011-06-28 19:09:31 -07001061 case SET_TRANSACTION_STATE: {
Mathias Agopian83c04462009-05-22 19:00:22 -07001062 CHECK_INTERFACE(ISurfaceComposer, data, reply);
Dan Stozad723bd72014-11-18 10:24:03 -08001063
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10001064 FrameTimelineInfo frameTimelineInfo;
1065 SAFE_PARCEL(frameTimelineInfo.read, data);
1066
chaviw308ddba2020-08-11 16:23:51 -07001067 uint32_t count = 0;
1068 SAFE_PARCEL_READ_SIZE(data.readUint32, &count, data.dataSize());
Mathias Agopian698c0872011-06-28 19:09:31 -07001069 Vector<ComposerState> state;
1070 state.setCapacity(count);
Dan Stozad723bd72014-11-18 10:24:03 -08001071 for (size_t i = 0; i < count; i++) {
Marissa Wallc837b5e2018-10-12 10:04:44 -07001072 ComposerState s;
chaviw308ddba2020-08-11 16:23:51 -07001073 SAFE_PARCEL(s.read, data);
Mathias Agopian698c0872011-06-28 19:09:31 -07001074 state.add(s);
1075 }
Dan Stozad723bd72014-11-18 10:24:03 -08001076
chaviw308ddba2020-08-11 16:23:51 -07001077 SAFE_PARCEL_READ_SIZE(data.readUint32, &count, data.dataSize());
Mathias Agopian8b33f032012-07-24 20:43:54 -07001078 DisplayState d;
1079 Vector<DisplayState> displays;
1080 displays.setCapacity(count);
Dan Stozad723bd72014-11-18 10:24:03 -08001081 for (size_t i = 0; i < count; i++) {
chaviw308ddba2020-08-11 16:23:51 -07001082 SAFE_PARCEL(d.read, data);
Mathias Agopian8b33f032012-07-24 20:43:54 -07001083 displays.add(d);
1084 }
Dan Stozad723bd72014-11-18 10:24:03 -08001085
chaviw308ddba2020-08-11 16:23:51 -07001086 uint32_t stateFlags = 0;
1087 SAFE_PARCEL(data.readUint32, &stateFlags);
1088 sp<IBinder> applyToken;
1089 SAFE_PARCEL(data.readStrongBinder, &applyToken);
chaviw273171b2018-12-26 11:46:30 -08001090 InputWindowCommands inputWindowCommands;
chaviw308ddba2020-08-11 16:23:51 -07001091 SAFE_PARCEL(inputWindowCommands.read, data);
Marissa Wall17b4e452018-12-26 16:32:34 -08001092
chaviw308ddba2020-08-11 16:23:51 -07001093 int64_t desiredPresentTime = 0;
Ady Abrahamf0c56492020-12-17 18:04:15 -08001094 bool isAutoTimestamp = true;
chaviw308ddba2020-08-11 16:23:51 -07001095 SAFE_PARCEL(data.readInt64, &desiredPresentTime);
Ady Abrahamf0c56492020-12-17 18:04:15 -08001096 SAFE_PARCEL(data.readBool, &isAutoTimestamp);
Marissa Wall78b72202019-03-15 14:58:34 -07001097
Marissa Wall947d34e2019-03-29 14:03:53 -07001098 client_cache_t uncachedBuffer;
chaviw308ddba2020-08-11 16:23:51 -07001099 sp<IBinder> tmpBinder;
1100 SAFE_PARCEL(data.readNullableStrongBinder, &tmpBinder);
1101 uncachedBuffer.token = tmpBinder;
1102 SAFE_PARCEL(data.readUint64, &uncachedBuffer.id);
Marissa Wall78b72202019-03-15 14:58:34 -07001103
chaviw308ddba2020-08-11 16:23:51 -07001104 bool hasListenerCallbacks = false;
1105 SAFE_PARCEL(data.readBool, &hasListenerCallbacks);
Valerie Hau9dab9732019-08-20 09:29:25 -07001106
Marissa Wall3dad52d2019-03-22 14:03:19 -07001107 std::vector<ListenerCallbacks> listenerCallbacks;
chaviw308ddba2020-08-11 16:23:51 -07001108 int32_t listenersSize = 0;
1109 SAFE_PARCEL_READ_SIZE(data.readInt32, &listenersSize, data.dataSize());
Marissa Wall3dad52d2019-03-22 14:03:19 -07001110 for (int32_t i = 0; i < listenersSize; i++) {
chaviw308ddba2020-08-11 16:23:51 -07001111 SAFE_PARCEL(data.readStrongBinder, &tmpBinder);
Marissa Wall3dad52d2019-03-22 14:03:19 -07001112 std::vector<CallbackId> callbackIds;
Vishnu Nairfc46c1e2021-04-21 08:31:32 -07001113 SAFE_PARCEL(data.readParcelableVector, &callbackIds);
chaviw308ddba2020-08-11 16:23:51 -07001114 listenerCallbacks.emplace_back(tmpBinder, callbackIds);
Marissa Wall3dad52d2019-03-22 14:03:19 -07001115 }
Pablo Gamito7eb7ee72020-08-05 10:57:05 +00001116
1117 uint64_t transactionId = -1;
1118 SAFE_PARCEL(data.readUint64, &transactionId);
1119
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10001120 return setTransactionState(frameTimelineInfo, state, displays, stateFlags, applyToken,
1121 inputWindowCommands, desiredPresentTime, isAutoTimestamp,
1122 uncachedBuffer, hasListenerCallbacks, listenerCallbacks,
1123 transactionId);
Jesse Hall6c913be2013-08-08 12:15:49 -07001124 }
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08001125 case BOOT_FINISHED: {
Mathias Agopian83c04462009-05-22 19:00:22 -07001126 CHECK_INTERFACE(ISurfaceComposer, data, reply);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08001127 bootFinished();
Jesse Hall6c913be2013-08-08 12:15:49 -07001128 return NO_ERROR;
1129 }
Jamie Gennis134f0422011-03-08 12:18:54 -08001130 case AUTHENTICATE_SURFACE: {
1131 CHECK_INTERFACE(ISurfaceComposer, data, reply);
Andy McFadden2adaf042012-12-18 09:49:45 -08001132 sp<IGraphicBufferProducer> bufferProducer =
1133 interface_cast<IGraphicBufferProducer>(data.readStrongBinder());
1134 int32_t result = authenticateSurfaceTexture(bufferProducer) ? 1 : 0;
Jamie Gennis134f0422011-03-08 12:18:54 -08001135 reply->writeInt32(result);
Jesse Hall6c913be2013-08-08 12:15:49 -07001136 return NO_ERROR;
1137 }
Brian Anderson6b376712017-04-04 10:51:39 -07001138 case GET_SUPPORTED_FRAME_TIMESTAMPS: {
1139 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1140 std::vector<FrameEvent> supportedTimestamps;
1141 status_t result = getSupportedFrameTimestamps(&supportedTimestamps);
1142 status_t err = reply->writeInt32(result);
1143 if (err != NO_ERROR) {
1144 return err;
1145 }
1146 if (result != NO_ERROR) {
1147 return result;
1148 }
1149
1150 std::vector<int32_t> supported;
1151 supported.reserve(supportedTimestamps.size());
1152 for (FrameEvent s : supportedTimestamps) {
1153 supported.push_back(static_cast<int32_t>(s));
1154 }
1155 return reply->writeInt32Vector(supported);
1156 }
Mathias Agopiand0566bc2011-11-17 17:49:17 -08001157 case CREATE_DISPLAY_EVENT_CONNECTION: {
1158 CHECK_INTERFACE(ISurfaceComposer, data, reply);
Ady Abraham0f4a1b12019-06-04 16:04:04 -07001159 auto vsyncSource = static_cast<ISurfaceComposer::VsyncSource>(data.readInt32());
Ady Abraham62f216c2020-10-13 19:07:23 -07001160 EventRegistrationFlags eventRegistration =
1161 static_cast<EventRegistration>(data.readUint32());
Ady Abraham0f4a1b12019-06-04 16:04:04 -07001162
1163 sp<IDisplayEventConnection> connection(
Ady Abraham62f216c2020-10-13 19:07:23 -07001164 createDisplayEventConnection(vsyncSource, eventRegistration));
Marco Nelissen2ea926b2014-11-14 08:01:01 -08001165 reply->writeStrongBinder(IInterface::asBinder(connection));
Mathias Agopiand0566bc2011-11-17 17:49:17 -08001166 return NO_ERROR;
Jesse Hall6c913be2013-08-08 12:15:49 -07001167 }
Dominik Laskowski3cb3d4e2019-11-21 11:14:45 -08001168 case GET_DISPLAY_STATE: {
1169 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1170 ui::DisplayState state;
1171 const sp<IBinder> display = data.readStrongBinder();
1172 const status_t result = getDisplayState(display, &state);
1173 reply->writeInt32(result);
1174 if (result == NO_ERROR) {
1175 memcpy(reply->writeInplace(sizeof(ui::DisplayState)), &state,
1176 sizeof(ui::DisplayState));
1177 }
1178 return NO_ERROR;
1179 }
Marin Shalamanov228f46b2021-01-28 21:11:45 +01001180 case GET_STATIC_DISPLAY_INFO: {
Dominik Laskowski3cb3d4e2019-11-21 11:14:45 -08001181 CHECK_INTERFACE(ISurfaceComposer, data, reply);
Marin Shalamanov228f46b2021-01-28 21:11:45 +01001182 ui::StaticDisplayInfo info;
Dominik Laskowski3cb3d4e2019-11-21 11:14:45 -08001183 const sp<IBinder> display = data.readStrongBinder();
Marin Shalamanov228f46b2021-01-28 21:11:45 +01001184 const status_t result = getStaticDisplayInfo(display, &info);
1185 SAFE_PARCEL(reply->writeInt32, result);
Marin Shalamanov359a7e72020-02-17 17:03:07 +01001186 if (result != NO_ERROR) return result;
Marin Shalamanov228f46b2021-01-28 21:11:45 +01001187 SAFE_PARCEL(reply->write, info);
1188 return NO_ERROR;
Dominik Laskowski3cb3d4e2019-11-21 11:14:45 -08001189 }
Marin Shalamanov228f46b2021-01-28 21:11:45 +01001190 case GET_DYNAMIC_DISPLAY_INFO: {
Mathias Agopianc666cae2012-07-25 18:56:13 -07001191 CHECK_INTERFACE(ISurfaceComposer, data, reply);
Marin Shalamanov228f46b2021-01-28 21:11:45 +01001192 ui::DynamicDisplayInfo info;
Dominik Laskowski3cb3d4e2019-11-21 11:14:45 -08001193 const sp<IBinder> display = data.readStrongBinder();
Marin Shalamanov228f46b2021-01-28 21:11:45 +01001194 const status_t result = getDynamicDisplayInfo(display, &info);
1195 SAFE_PARCEL(reply->writeInt32, result);
1196 if (result != NO_ERROR) return result;
1197 SAFE_PARCEL(reply->write, info);
Dan Stoza7f7da322014-05-02 15:26:25 -07001198 return NO_ERROR;
1199 }
Lajos Molnar67d8bd62014-09-11 14:58:45 -07001200 case GET_DISPLAY_STATS: {
1201 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1202 DisplayStatInfo stats;
1203 sp<IBinder> display = data.readStrongBinder();
1204 status_t result = getDisplayStats(display, &stats);
1205 reply->writeInt32(result);
1206 if (result == NO_ERROR) {
1207 memcpy(reply->writeInplace(sizeof(DisplayStatInfo)),
1208 &stats, sizeof(DisplayStatInfo));
1209 }
1210 return NO_ERROR;
1211 }
Daniel Solomon42d04562019-01-20 21:03:19 -08001212 case GET_DISPLAY_NATIVE_PRIMARIES: {
1213 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1214 ui::DisplayPrimaries primaries;
1215 sp<IBinder> display = nullptr;
1216
1217 status_t result = data.readStrongBinder(&display);
1218 if (result != NO_ERROR) {
1219 ALOGE("getDisplayNativePrimaries failed to readStrongBinder: %d", result);
1220 return result;
1221 }
1222
1223 result = getDisplayNativePrimaries(display, primaries);
1224 reply->writeInt32(result);
1225 if (result == NO_ERROR) {
1226 memcpy(reply->writeInplace(sizeof(ui::DisplayPrimaries)), &primaries,
1227 sizeof(ui::DisplayPrimaries));
1228 }
1229
1230 return NO_ERROR;
1231 }
Michael Wright28f24d02016-07-12 13:30:53 -07001232 case SET_ACTIVE_COLOR_MODE: {
1233 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1234 sp<IBinder> display = nullptr;
1235 status_t result = data.readStrongBinder(&display);
1236 if (result != NO_ERROR) {
1237 ALOGE("getActiveColorMode failed to readStrongBinder: %d", result);
1238 return result;
1239 }
1240 int32_t colorModeInt = 0;
1241 result = data.readInt32(&colorModeInt);
1242 if (result != NO_ERROR) {
1243 ALOGE("setActiveColorMode failed to readInt32: %d", result);
1244 return result;
1245 }
1246 result = setActiveColorMode(display,
Peiyong Lina52f0292018-03-14 17:26:31 -07001247 static_cast<ColorMode>(colorModeInt));
Michael Wright28f24d02016-07-12 13:30:53 -07001248 result = reply->writeInt32(result);
1249 return result;
1250 }
Kriti Dang7defaf32021-11-15 11:55:43 +01001251 case SET_BOOT_DISPLAY_MODE: {
1252 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1253 sp<IBinder> display = nullptr;
1254 status_t result = data.readStrongBinder(&display);
1255 if (result != NO_ERROR) {
1256 ALOGE("setBootDisplayMode failed to readStrongBinder: %d", result);
1257 return result;
1258 }
1259 ui::DisplayModeId displayModeId;
1260 result = data.readInt32(&displayModeId);
1261 if (result != NO_ERROR) {
1262 ALOGE("setBootDisplayMode failed to readInt32: %d", result);
1263 return result;
1264 }
1265 return setBootDisplayMode(display, displayModeId);
1266 }
Svetoslavd85084b2014-03-20 10:28:31 -07001267 case CLEAR_ANIMATION_FRAME_STATS: {
1268 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1269 status_t result = clearAnimationFrameStats();
1270 reply->writeInt32(result);
1271 return NO_ERROR;
1272 }
1273 case GET_ANIMATION_FRAME_STATS: {
1274 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1275 FrameStats stats;
1276 status_t result = getAnimationFrameStats(&stats);
1277 reply->write(stats);
1278 reply->writeInt32(result);
1279 return NO_ERROR;
1280 }
Sahil Dhanjuc1ba5c42016-06-07 20:09:20 -07001281 case ENABLE_VSYNC_INJECTIONS: {
1282 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1283 bool enable = false;
1284 status_t result = data.readBool(&enable);
1285 if (result != NO_ERROR) {
1286 ALOGE("enableVSyncInjections failed to readBool: %d", result);
1287 return result;
1288 }
1289 return enableVSyncInjections(enable);
1290 }
1291 case INJECT_VSYNC: {
1292 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1293 int64_t when = 0;
1294 status_t result = data.readInt64(&when);
1295 if (result != NO_ERROR) {
1296 ALOGE("enableVSyncInjections failed to readInt64: %d", result);
1297 return result;
1298 }
1299 return injectVSync(when);
1300 }
Kalle Raitaa099a242017-01-11 11:17:29 -08001301 case GET_LAYER_DEBUG_INFO: {
1302 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1303 std::vector<LayerDebugInfo> outLayers;
1304 status_t result = getLayerDebugInfo(&outLayers);
1305 reply->writeInt32(result);
1306 if (result == NO_ERROR)
1307 {
1308 result = reply->writeParcelableVector(outLayers);
1309 }
1310 return result;
1311 }
Peiyong Lin0256f722018-08-31 15:45:10 -07001312 case GET_COMPOSITION_PREFERENCE: {
1313 CHECK_INTERFACE(ISurfaceComposer, data, reply);
Peiyong Linc6780972018-10-28 15:24:08 -07001314 ui::Dataspace defaultDataspace;
1315 ui::PixelFormat defaultPixelFormat;
1316 ui::Dataspace wideColorGamutDataspace;
1317 ui::PixelFormat wideColorGamutPixelFormat;
1318 status_t error =
1319 getCompositionPreference(&defaultDataspace, &defaultPixelFormat,
1320 &wideColorGamutDataspace, &wideColorGamutPixelFormat);
Peiyong Lin0256f722018-08-31 15:45:10 -07001321 reply->writeInt32(error);
1322 if (error == NO_ERROR) {
Peiyong Linc6780972018-10-28 15:24:08 -07001323 reply->writeInt32(static_cast<int32_t>(defaultDataspace));
1324 reply->writeInt32(static_cast<int32_t>(defaultPixelFormat));
1325 reply->writeInt32(static_cast<int32_t>(wideColorGamutDataspace));
Peiyong Linaa3da6a2018-12-12 02:48:43 -08001326 reply->writeInt32(static_cast<int32_t>(wideColorGamutPixelFormat));
Peiyong Lin0256f722018-08-31 15:45:10 -07001327 }
Peiyong Lin3c2791e2019-01-14 17:05:18 -08001328 return error;
Peiyong Lin0256f722018-08-31 15:45:10 -07001329 }
Ady Abraham37965d42018-11-01 13:43:32 -07001330 case GET_COLOR_MANAGEMENT: {
Ady Abraham2a6ab2a2018-10-26 14:25:30 -07001331 CHECK_INTERFACE(ISurfaceComposer, data, reply);
Ady Abraham37965d42018-11-01 13:43:32 -07001332 bool result;
1333 status_t error = getColorManagement(&result);
1334 if (error == NO_ERROR) {
1335 reply->writeBool(result);
1336 }
Peiyong Lin3c2791e2019-01-14 17:05:18 -08001337 return error;
Ady Abraham2a6ab2a2018-10-26 14:25:30 -07001338 }
Kevin DuBois9c0a1762018-10-16 13:32:31 -07001339 case GET_DISPLAYED_CONTENT_SAMPLING_ATTRIBUTES: {
1340 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1341
1342 sp<IBinder> display = data.readStrongBinder();
1343 ui::PixelFormat format;
1344 ui::Dataspace dataspace;
1345 uint8_t component = 0;
1346 auto result =
1347 getDisplayedContentSamplingAttributes(display, &format, &dataspace, &component);
1348 if (result == NO_ERROR) {
1349 reply->writeUint32(static_cast<uint32_t>(format));
1350 reply->writeUint32(static_cast<uint32_t>(dataspace));
1351 reply->writeUint32(static_cast<uint32_t>(component));
1352 }
1353 return result;
1354 }
Kevin DuBois74e53772018-11-19 10:52:38 -08001355 case SET_DISPLAY_CONTENT_SAMPLING_ENABLED: {
1356 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1357
1358 sp<IBinder> display = nullptr;
1359 bool enable = false;
1360 int8_t componentMask = 0;
1361 uint64_t maxFrames = 0;
1362 status_t result = data.readStrongBinder(&display);
1363 if (result != NO_ERROR) {
1364 ALOGE("setDisplayContentSamplingEnabled failure in reading Display token: %d",
1365 result);
1366 return result;
1367 }
1368
1369 result = data.readBool(&enable);
1370 if (result != NO_ERROR) {
1371 ALOGE("setDisplayContentSamplingEnabled failure in reading enable: %d", result);
1372 return result;
1373 }
1374
1375 result = data.readByte(static_cast<int8_t*>(&componentMask));
1376 if (result != NO_ERROR) {
1377 ALOGE("setDisplayContentSamplingEnabled failure in reading component mask: %d",
1378 result);
1379 return result;
1380 }
1381
1382 result = data.readUint64(&maxFrames);
1383 if (result != NO_ERROR) {
1384 ALOGE("setDisplayContentSamplingEnabled failure in reading max frames: %d", result);
1385 return result;
1386 }
1387
1388 return setDisplayContentSamplingEnabled(display, enable,
1389 static_cast<uint8_t>(componentMask), maxFrames);
1390 }
Kevin DuBois1d4249a2018-08-29 10:45:14 -07001391 case GET_DISPLAYED_CONTENT_SAMPLE: {
1392 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1393
1394 sp<IBinder> display = data.readStrongBinder();
1395 uint64_t maxFrames = 0;
1396 uint64_t timestamp = 0;
1397
1398 status_t result = data.readUint64(&maxFrames);
1399 if (result != NO_ERROR) {
1400 ALOGE("getDisplayedContentSample failure in reading max frames: %d", result);
1401 return result;
1402 }
1403
1404 result = data.readUint64(&timestamp);
1405 if (result != NO_ERROR) {
1406 ALOGE("getDisplayedContentSample failure in reading timestamp: %d", result);
1407 return result;
1408 }
1409
1410 DisplayedFrameStats stats;
1411 result = getDisplayedContentSample(display, maxFrames, timestamp, &stats);
1412 if (result == NO_ERROR) {
1413 reply->writeUint64(stats.numFrames);
Kevin DuBois1d4c6a62018-12-12 13:59:46 -08001414 reply->writeUint64Vector(stats.component_0_sample);
1415 reply->writeUint64Vector(stats.component_1_sample);
1416 reply->writeUint64Vector(stats.component_2_sample);
1417 reply->writeUint64Vector(stats.component_3_sample);
Kevin DuBois1d4249a2018-08-29 10:45:14 -07001418 }
1419 return result;
1420 }
Peiyong Lin3c2791e2019-01-14 17:05:18 -08001421 case GET_PROTECTED_CONTENT_SUPPORT: {
1422 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1423 bool result;
1424 status_t error = getProtectedContentSupport(&result);
1425 if (error == NO_ERROR) {
1426 reply->writeBool(result);
1427 }
1428 return error;
1429 }
Dan Stoza84ab9372018-12-17 15:27:57 -08001430 case ADD_REGION_SAMPLING_LISTENER: {
1431 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1432 Rect samplingArea;
1433 status_t result = data.read(samplingArea);
1434 if (result != NO_ERROR) {
1435 ALOGE("addRegionSamplingListener: Failed to read sampling area");
1436 return result;
1437 }
1438 sp<IBinder> stopLayerHandle;
1439 result = data.readNullableStrongBinder(&stopLayerHandle);
1440 if (result != NO_ERROR) {
1441 ALOGE("addRegionSamplingListener: Failed to read stop layer handle");
1442 return result;
1443 }
1444 sp<IRegionSamplingListener> listener;
1445 result = data.readNullableStrongBinder(&listener);
1446 if (result != NO_ERROR) {
1447 ALOGE("addRegionSamplingListener: Failed to read listener");
1448 return result;
1449 }
1450 return addRegionSamplingListener(samplingArea, stopLayerHandle, listener);
1451 }
1452 case REMOVE_REGION_SAMPLING_LISTENER: {
1453 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1454 sp<IRegionSamplingListener> listener;
1455 status_t result = data.readNullableStrongBinder(&listener);
1456 if (result != NO_ERROR) {
1457 ALOGE("removeRegionSamplingListener: Failed to read listener");
1458 return result;
1459 }
1460 return removeRegionSamplingListener(listener);
1461 }
Alec Mouriadebf5c2021-01-05 12:57:36 -08001462 case ADD_FPS_LISTENER: {
1463 CHECK_INTERFACE(ISurfaceComposer, data, reply);
Alec Mouria9a68a62021-03-04 19:14:50 -08001464 int32_t taskId;
1465 status_t result = data.readInt32(&taskId);
Alec Mouriadebf5c2021-01-05 12:57:36 -08001466 if (result != NO_ERROR) {
1467 ALOGE("addFpsListener: Failed to read layer handle");
1468 return result;
1469 }
1470 sp<gui::IFpsListener> listener;
1471 result = data.readNullableStrongBinder(&listener);
1472 if (result != NO_ERROR) {
1473 ALOGE("addFpsListener: Failed to read listener");
1474 return result;
1475 }
Alec Mouria9a68a62021-03-04 19:14:50 -08001476 return addFpsListener(taskId, listener);
Alec Mouriadebf5c2021-01-05 12:57:36 -08001477 }
1478 case REMOVE_FPS_LISTENER: {
1479 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1480 sp<gui::IFpsListener> listener;
1481 status_t result = data.readNullableStrongBinder(&listener);
1482 if (result != NO_ERROR) {
1483 ALOGE("removeFpsListener: Failed to read listener");
1484 return result;
1485 }
1486 return removeFpsListener(listener);
1487 }
Galia Peycheva8f04b302021-04-27 13:25:38 +02001488 case ADD_TUNNEL_MODE_ENABLED_LISTENER: {
1489 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1490 sp<gui::ITunnelModeEnabledListener> listener;
1491 status_t result = data.readNullableStrongBinder(&listener);
1492 if (result != NO_ERROR) {
1493 ALOGE("addTunnelModeEnabledListener: Failed to read listener");
1494 return result;
1495 }
1496 return addTunnelModeEnabledListener(listener);
1497 }
1498 case REMOVE_TUNNEL_MODE_ENABLED_LISTENER: {
1499 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1500 sp<gui::ITunnelModeEnabledListener> listener;
1501 status_t result = data.readNullableStrongBinder(&listener);
1502 if (result != NO_ERROR) {
1503 ALOGE("removeTunnelModeEnabledListener: Failed to read listener");
1504 return result;
1505 }
1506 return removeTunnelModeEnabledListener(listener);
1507 }
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001508 case SET_DESIRED_DISPLAY_MODE_SPECS: {
Ana Krulec0782b882019-10-15 17:34:54 -07001509 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1510 sp<IBinder> displayToken = data.readStrongBinder();
Marin Shalamanov228f46b2021-01-28 21:11:45 +01001511 ui::DisplayModeId defaultMode;
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001512 status_t result = data.readInt32(&defaultMode);
Ana Krulec0782b882019-10-15 17:34:54 -07001513 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001514 ALOGE("setDesiredDisplayModeSpecs: failed to read defaultMode: %d", result);
Ana Krulec0782b882019-10-15 17:34:54 -07001515 return result;
1516 }
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001517 if (defaultMode < 0) {
1518 ALOGE("%s: defaultMode must be non-negative but it was %d", __func__, defaultMode);
1519 return BAD_VALUE;
1520 }
Marin Shalamanov30b0b3c2020-10-13 19:15:06 +02001521 bool allowGroupSwitching;
1522 result = data.readBool(&allowGroupSwitching);
1523 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001524 ALOGE("setDesiredDisplayModeSpecs: failed to read allowGroupSwitching: %d", result);
Marin Shalamanov30b0b3c2020-10-13 19:15:06 +02001525 return result;
1526 }
Steven Thomasf734df42020-04-13 21:09:28 -07001527 float primaryRefreshRateMin;
1528 result = data.readFloat(&primaryRefreshRateMin);
Ana Krulec0782b882019-10-15 17:34:54 -07001529 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001530 ALOGE("setDesiredDisplayModeSpecs: failed to read primaryRefreshRateMin: %d",
Steven Thomasf734df42020-04-13 21:09:28 -07001531 result);
Ana Krulec0782b882019-10-15 17:34:54 -07001532 return result;
1533 }
Steven Thomasf734df42020-04-13 21:09:28 -07001534 float primaryRefreshRateMax;
1535 result = data.readFloat(&primaryRefreshRateMax);
Ana Krulec0782b882019-10-15 17:34:54 -07001536 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001537 ALOGE("setDesiredDisplayModeSpecs: failed to read primaryRefreshRateMax: %d",
Steven Thomasf734df42020-04-13 21:09:28 -07001538 result);
Ana Krulec0782b882019-10-15 17:34:54 -07001539 return result;
1540 }
Steven Thomasf734df42020-04-13 21:09:28 -07001541 float appRequestRefreshRateMin;
1542 result = data.readFloat(&appRequestRefreshRateMin);
1543 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001544 ALOGE("setDesiredDisplayModeSpecs: failed to read appRequestRefreshRateMin: %d",
Steven Thomasf734df42020-04-13 21:09:28 -07001545 result);
1546 return result;
1547 }
1548 float appRequestRefreshRateMax;
1549 result = data.readFloat(&appRequestRefreshRateMax);
1550 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001551 ALOGE("setDesiredDisplayModeSpecs: failed to read appRequestRefreshRateMax: %d",
Steven Thomasf734df42020-04-13 21:09:28 -07001552 result);
1553 return result;
1554 }
Marin Shalamanov228f46b2021-01-28 21:11:45 +01001555 result = setDesiredDisplayModeSpecs(displayToken, defaultMode, allowGroupSwitching,
1556 primaryRefreshRateMin, primaryRefreshRateMax,
1557 appRequestRefreshRateMin, appRequestRefreshRateMax);
Ana Krulec0782b882019-10-15 17:34:54 -07001558 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001559 ALOGE("setDesiredDisplayModeSpecs: failed to call setDesiredDisplayModeSpecs: "
Ana Krulec0782b882019-10-15 17:34:54 -07001560 "%d",
1561 result);
1562 return result;
1563 }
1564 reply->writeInt32(result);
1565 return result;
1566 }
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001567 case GET_DESIRED_DISPLAY_MODE_SPECS: {
Ana Krulec234bb162019-11-10 22:55:55 +01001568 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1569 sp<IBinder> displayToken = data.readStrongBinder();
Marin Shalamanov228f46b2021-01-28 21:11:45 +01001570 ui::DisplayModeId defaultMode;
Marin Shalamanov30b0b3c2020-10-13 19:15:06 +02001571 bool allowGroupSwitching;
Steven Thomasf734df42020-04-13 21:09:28 -07001572 float primaryRefreshRateMin;
1573 float primaryRefreshRateMax;
1574 float appRequestRefreshRateMin;
1575 float appRequestRefreshRateMax;
Ana Krulec234bb162019-11-10 22:55:55 +01001576
Steven Thomasf734df42020-04-13 21:09:28 -07001577 status_t result =
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001578 getDesiredDisplayModeSpecs(displayToken, &defaultMode, &allowGroupSwitching,
1579 &primaryRefreshRateMin, &primaryRefreshRateMax,
1580 &appRequestRefreshRateMin,
1581 &appRequestRefreshRateMax);
Ana Krulec234bb162019-11-10 22:55:55 +01001582 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001583 ALOGE("getDesiredDisplayModeSpecs: failed to get getDesiredDisplayModeSpecs: "
Ana Krulec234bb162019-11-10 22:55:55 +01001584 "%d",
1585 result);
1586 return result;
1587 }
1588
Marin Shalamanov228f46b2021-01-28 21:11:45 +01001589 result = reply->writeInt32(defaultMode);
Ana Krulec234bb162019-11-10 22:55:55 +01001590 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001591 ALOGE("getDesiredDisplayModeSpecs: failed to write defaultMode: %d", result);
Ana Krulec234bb162019-11-10 22:55:55 +01001592 return result;
1593 }
Marin Shalamanov30b0b3c2020-10-13 19:15:06 +02001594 result = reply->writeBool(allowGroupSwitching);
1595 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001596 ALOGE("getDesiredDisplayModeSpecs: failed to write allowGroupSwitching: %d",
Marin Shalamanov30b0b3c2020-10-13 19:15:06 +02001597 result);
1598 return result;
1599 }
Steven Thomasf734df42020-04-13 21:09:28 -07001600 result = reply->writeFloat(primaryRefreshRateMin);
Ana Krulec234bb162019-11-10 22:55:55 +01001601 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001602 ALOGE("getDesiredDisplayModeSpecs: failed to write primaryRefreshRateMin: %d",
Steven Thomasf734df42020-04-13 21:09:28 -07001603 result);
Ana Krulec234bb162019-11-10 22:55:55 +01001604 return result;
1605 }
Steven Thomasf734df42020-04-13 21:09:28 -07001606 result = reply->writeFloat(primaryRefreshRateMax);
Ana Krulec234bb162019-11-10 22:55:55 +01001607 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001608 ALOGE("getDesiredDisplayModeSpecs: failed to write primaryRefreshRateMax: %d",
Steven Thomasf734df42020-04-13 21:09:28 -07001609 result);
1610 return result;
1611 }
1612 result = reply->writeFloat(appRequestRefreshRateMin);
1613 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001614 ALOGE("getDesiredDisplayModeSpecs: failed to write appRequestRefreshRateMin: %d",
Steven Thomasf734df42020-04-13 21:09:28 -07001615 result);
1616 return result;
1617 }
1618 result = reply->writeFloat(appRequestRefreshRateMax);
1619 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001620 ALOGE("getDesiredDisplayModeSpecs: failed to write appRequestRefreshRateMax: %d",
Steven Thomasf734df42020-04-13 21:09:28 -07001621 result);
Ana Krulec234bb162019-11-10 22:55:55 +01001622 return result;
1623 }
1624 reply->writeInt32(result);
1625 return result;
1626 }
Vishnu Nairb13bb952019-11-15 10:24:08 -08001627 case SET_GLOBAL_SHADOW_SETTINGS: {
1628 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1629
1630 std::vector<float> shadowConfig;
1631 status_t error = data.readFloatVector(&shadowConfig);
1632 if (error != NO_ERROR || shadowConfig.size() != 11) {
1633 ALOGE("setGlobalShadowSettings: failed to read shadowConfig: %d", error);
1634 return error;
1635 }
1636
1637 half4 ambientColor = {shadowConfig[0], shadowConfig[1], shadowConfig[2],
1638 shadowConfig[3]};
1639 half4 spotColor = {shadowConfig[4], shadowConfig[5], shadowConfig[6], shadowConfig[7]};
1640 float lightPosY = shadowConfig[8];
1641 float lightPosZ = shadowConfig[9];
1642 float lightRadius = shadowConfig[10];
1643 return setGlobalShadowSettings(ambientColor, spotColor, lightPosY, lightPosZ,
1644 lightRadius);
1645 }
Leon Scroggins IIIe5cff632021-12-29 11:53:36 -05001646 case GET_DISPLAY_DECORATION_SUPPORT: {
1647 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1648 sp<IBinder> displayToken;
Leon Scroggins IIIe7c51c62022-02-01 15:53:54 -05001649 SAFE_PARCEL(data.readNullableStrongBinder, &displayToken);
1650 std::optional<common::DisplayDecorationSupport> support;
1651 auto error = getDisplayDecorationSupport(displayToken, &support);
Leon Scroggins IIIe5cff632021-12-29 11:53:36 -05001652 if (error != NO_ERROR) {
Leon Scroggins IIIe7c51c62022-02-01 15:53:54 -05001653 ALOGE("getDisplayDecorationSupport failed with error %d", error);
Leon Scroggins IIIe5cff632021-12-29 11:53:36 -05001654 return error;
1655 }
Leon Scroggins IIIe7c51c62022-02-01 15:53:54 -05001656 reply->writeBool(support.has_value());
1657 if (support) {
1658 reply->writeInt32(static_cast<int32_t>(support.value().format));
1659 reply->writeInt32(static_cast<int32_t>(support.value().alphaInterpretation));
1660 }
Leon Scroggins IIIe5cff632021-12-29 11:53:36 -05001661 return error;
1662 }
Steven Thomas62a4cf82020-01-31 12:04:03 -08001663 case SET_FRAME_RATE: {
1664 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1665 sp<IBinder> binder;
Marin Shalamanovc5986772021-03-16 16:09:49 +01001666 SAFE_PARCEL(data.readStrongBinder, &binder);
1667
Steven Thomas62a4cf82020-01-31 12:04:03 -08001668 sp<IGraphicBufferProducer> surface = interface_cast<IGraphicBufferProducer>(binder);
1669 if (!surface) {
Marin Shalamanovc5986772021-03-16 16:09:49 +01001670 ALOGE("setFrameRate: failed to cast to IGraphicBufferProducer");
1671 return BAD_VALUE;
Steven Thomas62a4cf82020-01-31 12:04:03 -08001672 }
1673 float frameRate;
Marin Shalamanovc5986772021-03-16 16:09:49 +01001674 SAFE_PARCEL(data.readFloat, &frameRate);
1675
Steven Thomas62a4cf82020-01-31 12:04:03 -08001676 int8_t compatibility;
Marin Shalamanovc5986772021-03-16 16:09:49 +01001677 SAFE_PARCEL(data.readByte, &compatibility);
1678
1679 int8_t changeFrameRateStrategy;
1680 SAFE_PARCEL(data.readByte, &changeFrameRateStrategy);
1681
1682 status_t result =
1683 setFrameRate(surface, frameRate, compatibility, changeFrameRateStrategy);
Steven Thomas62a4cf82020-01-31 12:04:03 -08001684 reply->writeInt32(result);
1685 return NO_ERROR;
1686 }
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10001687 case SET_FRAME_TIMELINE_INFO: {
Ady Abraham74e17562020-08-24 18:18:19 -07001688 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1689 sp<IBinder> binder;
1690 status_t err = data.readStrongBinder(&binder);
1691 if (err != NO_ERROR) {
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10001692 ALOGE("setFrameTimelineInfo: failed to read strong binder: %s (%d)", strerror(-err),
1693 -err);
Ady Abraham74e17562020-08-24 18:18:19 -07001694 return err;
1695 }
1696 sp<IGraphicBufferProducer> surface = interface_cast<IGraphicBufferProducer>(binder);
1697 if (!surface) {
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10001698 ALOGE("setFrameTimelineInfo: failed to cast to IGraphicBufferProducer: %s (%d)",
Ady Abraham74e17562020-08-24 18:18:19 -07001699 strerror(-err), -err);
1700 return err;
1701 }
Ady Abraham74e17562020-08-24 18:18:19 -07001702
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10001703 FrameTimelineInfo frameTimelineInfo;
1704 SAFE_PARCEL(frameTimelineInfo.read, data);
1705
1706 status_t result = setFrameTimelineInfo(surface, frameTimelineInfo);
Ady Abraham74e17562020-08-24 18:18:19 -07001707 reply->writeInt32(result);
1708 return NO_ERROR;
1709 }
Pablo Gamito6ee484d2020-07-30 14:26:28 +00001710 case ADD_TRANSACTION_TRACE_LISTENER: {
1711 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1712 sp<gui::ITransactionTraceListener> listener;
1713 SAFE_PARCEL(data.readStrongBinder, &listener);
1714
1715 return addTransactionTraceListener(listener);
1716 }
Ana Krulec31f2b3c2020-12-14 14:30:09 -08001717 case GET_GPU_CONTEXT_PRIORITY: {
1718 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1719 int priority = getGPUContextPriority();
1720 SAFE_PARCEL(reply->writeInt32, priority);
1721 return NO_ERROR;
1722 }
Ady Abraham899dcdb2021-06-15 16:56:21 -07001723 case GET_MAX_ACQUIRED_BUFFER_COUNT: {
Ady Abraham564f9de2021-02-03 18:34:33 -08001724 CHECK_INTERFACE(ISurfaceComposer, data, reply);
Ady Abraham899dcdb2021-06-15 16:56:21 -07001725 int buffers = 0;
1726 int err = getMaxAcquiredBufferCount(&buffers);
Ady Abraham564f9de2021-02-03 18:34:33 -08001727 if (err != NO_ERROR) {
1728 return err;
1729 }
Ady Abraham899dcdb2021-06-15 16:56:21 -07001730 SAFE_PARCEL(reply->writeInt32, buffers);
Ady Abraham564f9de2021-02-03 18:34:33 -08001731 return NO_ERROR;
1732 }
Kriti Dang49ad4132021-01-08 11:49:56 +01001733 case OVERRIDE_HDR_TYPES: {
1734 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1735 sp<IBinder> display = nullptr;
1736 SAFE_PARCEL(data.readStrongBinder, &display);
1737
1738 std::vector<int32_t> hdrTypes;
1739 SAFE_PARCEL(data.readInt32Vector, &hdrTypes);
1740
1741 std::vector<ui::Hdr> hdrTypesVector;
1742 for (int i : hdrTypes) {
1743 hdrTypesVector.push_back(static_cast<ui::Hdr>(i));
1744 }
1745 return overrideHdrTypes(display, hdrTypesVector);
1746 }
Tej Singhe2751772021-04-06 22:05:29 -07001747 case ON_PULL_ATOM: {
1748 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1749 int32_t atomId = 0;
1750 SAFE_PARCEL(data.readInt32, &atomId);
1751
1752 std::string pulledData;
1753 bool success;
1754 status_t err = onPullAtom(atomId, &pulledData, &success);
1755 SAFE_PARCEL(reply->writeByteArray, pulledData.size(),
1756 reinterpret_cast<const uint8_t*>(pulledData.data()));
1757 SAFE_PARCEL(reply->writeBool, success);
1758 return err;
1759 }
chaviw60c9d3e2021-06-04 12:52:17 -05001760 case ADD_WINDOW_INFOS_LISTENER: {
1761 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1762 sp<IWindowInfosListener> listener;
1763 SAFE_PARCEL(data.readStrongBinder, &listener);
1764
1765 return addWindowInfosListener(listener);
1766 }
1767 case REMOVE_WINDOW_INFOS_LISTENER: {
1768 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1769 sp<IWindowInfosListener> listener;
1770 SAFE_PARCEL(data.readStrongBinder, &listener);
1771
1772 return removeWindowInfosListener(listener);
1773 }
Andy Yu2ae6b6b2021-11-18 14:51:06 -08001774 case SET_OVERRIDE_FRAME_RATE: {
1775 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1776
1777 uid_t uid;
1778 SAFE_PARCEL(data.readUint32, &uid);
1779
1780 float frameRate;
1781 SAFE_PARCEL(data.readFloat, &frameRate);
1782
1783 return setOverrideFrameRate(uid, frameRate);
1784 }
Jesse Hall6c913be2013-08-08 12:15:49 -07001785 default: {
Mathias Agopian83c04462009-05-22 19:00:22 -07001786 return BBinder::onTransact(code, data, reply, flags);
Jesse Hall6c913be2013-08-08 12:15:49 -07001787 }
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08001788 }
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08001789}
1790
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -08001791} // namespace android