blob: 6911d89cdb141f53523bd158c1cd2ce8464b2210 [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 void setPowerMode(const sp<IBinder>& display, int mode) override {
Colin Cross8e533062012-06-07 13:17:52 -0700224 Parcel data, reply;
225 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
Andy McFaddenc01a79d2012-09-27 16:02:06 -0700226 data.writeStrongBinder(display);
Prashant Malani2c9b11f2014-05-25 01:36:31 -0700227 data.writeInt32(mode);
228 remote()->transact(BnSurfaceComposer::SET_POWER_MODE, data, &reply);
Colin Cross8e533062012-06-07 13:17:52 -0700229 }
Mathias Agopian3094df32012-06-18 18:06:45 -0700230
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000231 status_t getDisplayState(const sp<IBinder>& display, ui::DisplayState* state) override {
Dominik Laskowski3cb3d4e2019-11-21 11:14:45 -0800232 Parcel data, reply;
233 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
234 data.writeStrongBinder(display);
235 remote()->transact(BnSurfaceComposer::GET_DISPLAY_STATE, data, &reply);
236 const status_t result = reply.readInt32();
237 if (result == NO_ERROR) {
238 memcpy(state, reply.readInplace(sizeof(ui::DisplayState)), sizeof(ui::DisplayState));
239 }
240 return result;
241 }
242
Marin Shalamanov228f46b2021-01-28 21:11:45 +0100243 status_t getStaticDisplayInfo(const sp<IBinder>& display,
244 ui::StaticDisplayInfo* info) override {
Dominik Laskowski3cb3d4e2019-11-21 11:14:45 -0800245 Parcel data, reply;
246 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
247 data.writeStrongBinder(display);
Marin Shalamanov228f46b2021-01-28 21:11:45 +0100248 remote()->transact(BnSurfaceComposer::GET_STATIC_DISPLAY_INFO, data, &reply);
Dominik Laskowski3cb3d4e2019-11-21 11:14:45 -0800249 const status_t result = reply.readInt32();
Marin Shalamanov359a7e72020-02-17 17:03:07 +0100250 if (result != NO_ERROR) return result;
251 return reply.read(*info);
Dominik Laskowski3cb3d4e2019-11-21 11:14:45 -0800252 }
253
Marin Shalamanov228f46b2021-01-28 21:11:45 +0100254 status_t getDynamicDisplayInfo(const sp<IBinder>& display,
255 ui::DynamicDisplayInfo* info) override {
Mathias Agopianc666cae2012-07-25 18:56:13 -0700256 Parcel data, reply;
257 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
Jeff Brown9d4e3d22012-08-24 20:00:51 -0700258 data.writeStrongBinder(display);
Marin Shalamanov228f46b2021-01-28 21:11:45 +0100259 remote()->transact(BnSurfaceComposer::GET_DYNAMIC_DISPLAY_INFO, data, &reply);
Dominik Laskowski3cb3d4e2019-11-21 11:14:45 -0800260 const status_t result = reply.readInt32();
Marin Shalamanov228f46b2021-01-28 21:11:45 +0100261 if (result != NO_ERROR) return result;
262 return reply.read(*info);
Dan Stoza7f7da322014-05-02 15:26:25 -0700263 }
264
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000265 status_t getDisplayStats(const sp<IBinder>& display, DisplayStatInfo* stats) override {
Lajos Molnar67d8bd62014-09-11 14:58:45 -0700266 Parcel data, reply;
267 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
268 data.writeStrongBinder(display);
269 remote()->transact(BnSurfaceComposer::GET_DISPLAY_STATS, data, &reply);
270 status_t result = reply.readInt32();
271 if (result == NO_ERROR) {
272 memcpy(stats,
273 reply.readInplace(sizeof(DisplayStatInfo)),
274 sizeof(DisplayStatInfo));
275 }
276 return result;
277 }
278
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000279 status_t getDisplayNativePrimaries(const sp<IBinder>& display,
280 ui::DisplayPrimaries& primaries) override {
Daniel Solomon42d04562019-01-20 21:03:19 -0800281 Parcel data, reply;
282 status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
283 if (result != NO_ERROR) {
284 ALOGE("getDisplayNativePrimaries failed to writeInterfaceToken: %d", result);
285 return result;
286 }
287 result = data.writeStrongBinder(display);
288 if (result != NO_ERROR) {
289 ALOGE("getDisplayNativePrimaries failed to writeStrongBinder: %d", result);
290 return result;
291 }
292 result = remote()->transact(BnSurfaceComposer::GET_DISPLAY_NATIVE_PRIMARIES, data, &reply);
293 if (result != NO_ERROR) {
294 ALOGE("getDisplayNativePrimaries failed to transact: %d", result);
295 return result;
296 }
297 result = reply.readInt32();
298 if (result == NO_ERROR) {
299 memcpy(&primaries, reply.readInplace(sizeof(ui::DisplayPrimaries)),
300 sizeof(ui::DisplayPrimaries));
301 }
302 return result;
303 }
304
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000305 status_t setActiveColorMode(const sp<IBinder>& display, ColorMode colorMode) override {
Michael Wright28f24d02016-07-12 13:30:53 -0700306 Parcel data, reply;
307 status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
308 if (result != NO_ERROR) {
309 ALOGE("setActiveColorMode failed to writeInterfaceToken: %d", result);
310 return result;
311 }
312 result = data.writeStrongBinder(display);
313 if (result != NO_ERROR) {
314 ALOGE("setActiveColorMode failed to writeStrongBinder: %d", result);
315 return result;
316 }
Peiyong Lina52f0292018-03-14 17:26:31 -0700317 result = data.writeInt32(static_cast<int32_t>(colorMode));
Michael Wright28f24d02016-07-12 13:30:53 -0700318 if (result != NO_ERROR) {
319 ALOGE("setActiveColorMode failed to writeInt32: %d", result);
320 return result;
321 }
322 result = remote()->transact(BnSurfaceComposer::SET_ACTIVE_COLOR_MODE, data, &reply);
323 if (result != NO_ERROR) {
324 ALOGE("setActiveColorMode failed to transact: %d", result);
325 return result;
326 }
327 return static_cast<status_t>(reply.readInt32());
328 }
329
Kriti Dang7defaf32021-11-15 11:55:43 +0100330 // TODO(b/213909104) : Add unit tests to verify surface flinger boot time APIs
331 status_t getBootDisplayModeSupport(bool* outSupport) const override {
332 Parcel data, reply;
333 status_t error = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
334 if (error != NO_ERROR) {
335 ALOGE("getBootDisplayModeSupport: failed to write interface token: %d", error);
336 return error;
337 }
338 error = remote()->transact(BnSurfaceComposer::GET_BOOT_DISPLAY_MODE_SUPPORT, data, &reply);
339 if (error != NO_ERROR) {
340 ALOGE("getBootDisplayModeSupport: failed to transact: %d", error);
341 return error;
342 }
343 bool support;
344 error = reply.readBool(&support);
345 if (error != NO_ERROR) {
346 ALOGE("getBootDisplayModeSupport: failed to read support: %d", error);
347 return error;
348 }
349 *outSupport = support;
350 return NO_ERROR;
351 }
352
353 status_t setBootDisplayMode(const sp<IBinder>& display,
354 ui::DisplayModeId displayModeId) override {
355 Parcel data, reply;
356 status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
357 if (result != NO_ERROR) {
358 ALOGE("setBootDisplayMode failed to writeInterfaceToken: %d", result);
359 return result;
360 }
361 result = data.writeStrongBinder(display);
362 if (result != NO_ERROR) {
363 ALOGE("setBootDisplayMode failed to writeStrongBinder: %d", result);
364 return result;
365 }
366 result = data.writeInt32(displayModeId);
367 if (result != NO_ERROR) {
368 ALOGE("setBootDisplayMode failed to writeIint32: %d", result);
369 return result;
370 }
371 result = remote()->transact(BnSurfaceComposer::SET_BOOT_DISPLAY_MODE, data, &reply);
372 if (result != NO_ERROR) {
373 ALOGE("setBootDisplayMode failed to transact: %d", result);
374 }
375 return result;
376 }
377
378 status_t clearBootDisplayMode(const sp<IBinder>& display) override {
379 Parcel data, reply;
380 status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
381 if (result != NO_ERROR) {
382 ALOGE("clearBootDisplayMode failed to writeInterfaceToken: %d", result);
383 return result;
384 }
385 result = data.writeStrongBinder(display);
386 if (result != NO_ERROR) {
387 ALOGE("clearBootDisplayMode failed to writeStrongBinder: %d", result);
388 return result;
389 }
390 result = remote()->transact(BnSurfaceComposer::CLEAR_BOOT_DISPLAY_MODE, data, &reply);
391 if (result != NO_ERROR) {
392 ALOGE("clearBootDisplayMode failed to transact: %d", result);
393 }
394 return result;
395 }
396
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000397 void setAutoLowLatencyMode(const sp<IBinder>& display, bool on) override {
Galia Peycheva5492cb52019-10-30 14:13:16 +0100398 Parcel data, reply;
399 status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
400 if (result != NO_ERROR) {
401 ALOGE("setAutoLowLatencyMode failed to writeInterfaceToken: %d", result);
402 return;
403 }
404
405 result = data.writeStrongBinder(display);
406 if (result != NO_ERROR) {
407 ALOGE("setAutoLowLatencyMode failed to writeStrongBinder: %d", result);
408 return;
409 }
410 result = data.writeBool(on);
411 if (result != NO_ERROR) {
412 ALOGE("setAutoLowLatencyMode failed to writeBool: %d", result);
413 return;
414 }
415 result = remote()->transact(BnSurfaceComposer::SET_AUTO_LOW_LATENCY_MODE, data, &reply);
416 if (result != NO_ERROR) {
417 ALOGE("setAutoLowLatencyMode failed to transact: %d", result);
418 return;
419 }
420 }
421
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000422 void setGameContentType(const sp<IBinder>& display, bool on) override {
Galia Peycheva5492cb52019-10-30 14:13:16 +0100423 Parcel data, reply;
424 status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
425 if (result != NO_ERROR) {
426 ALOGE("setGameContentType failed to writeInterfaceToken: %d", result);
427 return;
428 }
429 result = data.writeStrongBinder(display);
430 if (result != NO_ERROR) {
431 ALOGE("setGameContentType failed to writeStrongBinder: %d", result);
432 return;
433 }
434 result = data.writeBool(on);
435 if (result != NO_ERROR) {
436 ALOGE("setGameContentType failed to writeBool: %d", result);
437 return;
438 }
439 result = remote()->transact(BnSurfaceComposer::SET_GAME_CONTENT_TYPE, data, &reply);
440 if (result != NO_ERROR) {
441 ALOGE("setGameContentType failed to transact: %d", result);
442 }
443 }
444
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000445 status_t clearAnimationFrameStats() override {
Svetoslavd85084b2014-03-20 10:28:31 -0700446 Parcel data, reply;
Ana Krulec2d41e422018-07-26 12:07:43 -0700447 status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
448 if (result != NO_ERROR) {
449 ALOGE("clearAnimationFrameStats failed to writeInterfaceToken: %d", result);
450 return result;
451 }
452 result = remote()->transact(BnSurfaceComposer::CLEAR_ANIMATION_FRAME_STATS, data, &reply);
453 if (result != NO_ERROR) {
454 ALOGE("clearAnimationFrameStats failed to transact: %d", result);
455 return result;
456 }
Svetoslavd85084b2014-03-20 10:28:31 -0700457 return reply.readInt32();
458 }
459
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000460 status_t getAnimationFrameStats(FrameStats* outStats) const override {
Svetoslavd85084b2014-03-20 10:28:31 -0700461 Parcel data, reply;
462 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
463 remote()->transact(BnSurfaceComposer::GET_ANIMATION_FRAME_STATS, data, &reply);
464 reply.read(*outStats);
465 return reply.readInt32();
466 }
Dan Stozac4f471e2016-03-24 09:31:08 -0700467
Kriti Dang49ad4132021-01-08 11:49:56 +0100468 virtual status_t overrideHdrTypes(const sp<IBinder>& display,
469 const std::vector<ui::Hdr>& hdrTypes) {
470 Parcel data, reply;
471 SAFE_PARCEL(data.writeInterfaceToken, ISurfaceComposer::getInterfaceDescriptor());
472 SAFE_PARCEL(data.writeStrongBinder, display);
473
474 std::vector<int32_t> hdrTypesVector;
475 for (ui::Hdr i : hdrTypes) {
476 hdrTypesVector.push_back(static_cast<int32_t>(i));
477 }
478 SAFE_PARCEL(data.writeInt32Vector, hdrTypesVector);
479
480 status_t result = remote()->transact(BnSurfaceComposer::OVERRIDE_HDR_TYPES, data, &reply);
481 if (result != NO_ERROR) {
482 ALOGE("overrideHdrTypes failed to transact: %d", result);
483 return result;
484 }
485 return result;
486 }
487
Tej Singhe2751772021-04-06 22:05:29 -0700488 status_t onPullAtom(const int32_t atomId, std::string* pulledData, bool* success) {
489 Parcel data, reply;
490 SAFE_PARCEL(data.writeInterfaceToken, ISurfaceComposer::getInterfaceDescriptor());
491 SAFE_PARCEL(data.writeInt32, atomId);
492
493 status_t err = remote()->transact(BnSurfaceComposer::ON_PULL_ATOM, data, &reply);
494 if (err != NO_ERROR) {
495 ALOGE("onPullAtom failed to transact: %d", err);
496 return err;
497 }
498
499 int32_t size = 0;
500 SAFE_PARCEL(reply.readInt32, &size);
501 const void* dataPtr = reply.readInplace(size);
502 if (dataPtr == nullptr) {
503 return UNEXPECTED_NULL;
504 }
505 pulledData->assign((const char*)dataPtr, size);
506 SAFE_PARCEL(reply.readBool, success);
507 return NO_ERROR;
508 }
509
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000510 status_t enableVSyncInjections(bool enable) override {
Sahil Dhanjuc1ba5c42016-06-07 20:09:20 -0700511 Parcel data, reply;
512 status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
513 if (result != NO_ERROR) {
514 ALOGE("enableVSyncInjections failed to writeInterfaceToken: %d", result);
515 return result;
516 }
517 result = data.writeBool(enable);
518 if (result != NO_ERROR) {
519 ALOGE("enableVSyncInjections failed to writeBool: %d", result);
520 return result;
521 }
Steven Moreland366eb422019-04-01 19:22:32 -0700522 result = remote()->transact(BnSurfaceComposer::ENABLE_VSYNC_INJECTIONS, data, &reply,
523 IBinder::FLAG_ONEWAY);
Sahil Dhanjuc1ba5c42016-06-07 20:09:20 -0700524 if (result != NO_ERROR) {
525 ALOGE("enableVSyncInjections failed to transact: %d", result);
526 return result;
527 }
528 return result;
529 }
530
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000531 status_t injectVSync(nsecs_t when) override {
Sahil Dhanjuc1ba5c42016-06-07 20:09:20 -0700532 Parcel data, reply;
533 status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
534 if (result != NO_ERROR) {
535 ALOGE("injectVSync failed to writeInterfaceToken: %d", result);
536 return result;
537 }
538 result = data.writeInt64(when);
539 if (result != NO_ERROR) {
540 ALOGE("injectVSync failed to writeInt64: %d", result);
541 return result;
542 }
Steven Moreland366eb422019-04-01 19:22:32 -0700543 result = remote()->transact(BnSurfaceComposer::INJECT_VSYNC, data, &reply,
544 IBinder::FLAG_ONEWAY);
Sahil Dhanjuc1ba5c42016-06-07 20:09:20 -0700545 if (result != NO_ERROR) {
546 ALOGE("injectVSync failed to transact: %d", result);
547 return result;
548 }
549 return result;
550 }
551
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000552 status_t getLayerDebugInfo(std::vector<LayerDebugInfo>* outLayers) override {
Kalle Raitaa099a242017-01-11 11:17:29 -0800553 if (!outLayers) {
554 return UNEXPECTED_NULL;
555 }
556
557 Parcel data, reply;
558
559 status_t err = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
560 if (err != NO_ERROR) {
561 return err;
562 }
563
564 err = remote()->transact(BnSurfaceComposer::GET_LAYER_DEBUG_INFO, data, &reply);
565 if (err != NO_ERROR) {
566 return err;
567 }
568
569 int32_t result = 0;
570 err = reply.readInt32(&result);
571 if (err != NO_ERROR) {
572 return err;
573 }
574 if (result != NO_ERROR) {
575 return result;
576 }
577
578 outLayers->clear();
579 return reply.readParcelableVector(outLayers);
580 }
Peiyong Lin0256f722018-08-31 15:45:10 -0700581
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000582 status_t getCompositionPreference(ui::Dataspace* defaultDataspace,
583 ui::PixelFormat* defaultPixelFormat,
584 ui::Dataspace* wideColorGamutDataspace,
585 ui::PixelFormat* wideColorGamutPixelFormat) const override {
Peiyong Lin0256f722018-08-31 15:45:10 -0700586 Parcel data, reply;
587 status_t error = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
588 if (error != NO_ERROR) {
589 return error;
590 }
591 error = remote()->transact(BnSurfaceComposer::GET_COMPOSITION_PREFERENCE, data, &reply);
592 if (error != NO_ERROR) {
593 return error;
594 }
595 error = static_cast<status_t>(reply.readInt32());
596 if (error == NO_ERROR) {
Peiyong Linc6780972018-10-28 15:24:08 -0700597 *defaultDataspace = static_cast<ui::Dataspace>(reply.readInt32());
598 *defaultPixelFormat = static_cast<ui::PixelFormat>(reply.readInt32());
599 *wideColorGamutDataspace = static_cast<ui::Dataspace>(reply.readInt32());
600 *wideColorGamutPixelFormat = static_cast<ui::PixelFormat>(reply.readInt32());
Peiyong Lin0256f722018-08-31 15:45:10 -0700601 }
602 return error;
603 }
Ady Abraham2a6ab2a2018-10-26 14:25:30 -0700604
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000605 status_t getColorManagement(bool* outGetColorManagement) const override {
Ady Abraham2a6ab2a2018-10-26 14:25:30 -0700606 Parcel data, reply;
607 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
Ady Abraham37965d42018-11-01 13:43:32 -0700608 remote()->transact(BnSurfaceComposer::GET_COLOR_MANAGEMENT, data, &reply);
609 bool result;
610 status_t err = reply.readBool(&result);
611 if (err == NO_ERROR) {
612 *outGetColorManagement = result;
Ady Abraham2a6ab2a2018-10-26 14:25:30 -0700613 }
Ady Abraham37965d42018-11-01 13:43:32 -0700614 return err;
Ady Abraham2a6ab2a2018-10-26 14:25:30 -0700615 }
Kevin DuBois9c0a1762018-10-16 13:32:31 -0700616
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000617 status_t getDisplayedContentSamplingAttributes(const sp<IBinder>& display,
618 ui::PixelFormat* outFormat,
619 ui::Dataspace* outDataspace,
620 uint8_t* outComponentMask) const override {
Kevin DuBois9c0a1762018-10-16 13:32:31 -0700621 if (!outFormat || !outDataspace || !outComponentMask) return BAD_VALUE;
622 Parcel data, reply;
623 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
624 data.writeStrongBinder(display);
625
626 status_t error =
627 remote()->transact(BnSurfaceComposer::GET_DISPLAYED_CONTENT_SAMPLING_ATTRIBUTES,
628 data, &reply);
629 if (error != NO_ERROR) {
630 return error;
631 }
632
633 uint32_t value = 0;
634 error = reply.readUint32(&value);
635 if (error != NO_ERROR) {
636 return error;
637 }
638 *outFormat = static_cast<ui::PixelFormat>(value);
639
640 error = reply.readUint32(&value);
641 if (error != NO_ERROR) {
642 return error;
643 }
644 *outDataspace = static_cast<ui::Dataspace>(value);
645
646 error = reply.readUint32(&value);
647 if (error != NO_ERROR) {
648 return error;
649 }
650 *outComponentMask = static_cast<uint8_t>(value);
651 return error;
652 }
Kevin DuBois74e53772018-11-19 10:52:38 -0800653
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000654 status_t setDisplayContentSamplingEnabled(const sp<IBinder>& display, bool enable,
655 uint8_t componentMask, uint64_t maxFrames) override {
Kevin DuBois74e53772018-11-19 10:52:38 -0800656 Parcel data, reply;
657 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
658 data.writeStrongBinder(display);
659 data.writeBool(enable);
660 data.writeByte(static_cast<int8_t>(componentMask));
661 data.writeUint64(maxFrames);
662 status_t result =
663 remote()->transact(BnSurfaceComposer::SET_DISPLAY_CONTENT_SAMPLING_ENABLED, data,
664 &reply);
665 return result;
666 }
Kevin DuBois1d4249a2018-08-29 10:45:14 -0700667
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000668 status_t getDisplayedContentSample(const sp<IBinder>& display, uint64_t maxFrames,
669 uint64_t timestamp,
670 DisplayedFrameStats* outStats) const override {
Kevin DuBois1d4249a2018-08-29 10:45:14 -0700671 if (!outStats) return BAD_VALUE;
672
673 Parcel data, reply;
674 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
675 data.writeStrongBinder(display);
676 data.writeUint64(maxFrames);
677 data.writeUint64(timestamp);
678
679 status_t result =
680 remote()->transact(BnSurfaceComposer::GET_DISPLAYED_CONTENT_SAMPLE, data, &reply);
681
682 if (result != NO_ERROR) {
683 return result;
684 }
685
686 result = reply.readUint64(&outStats->numFrames);
687 if (result != NO_ERROR) {
688 return result;
689 }
690
Kevin DuBois1d4c6a62018-12-12 13:59:46 -0800691 result = reply.readUint64Vector(&outStats->component_0_sample);
Kevin DuBois1d4249a2018-08-29 10:45:14 -0700692 if (result != NO_ERROR) {
693 return result;
694 }
Kevin DuBois1d4c6a62018-12-12 13:59:46 -0800695 result = reply.readUint64Vector(&outStats->component_1_sample);
Kevin DuBois1d4249a2018-08-29 10:45:14 -0700696 if (result != NO_ERROR) {
697 return result;
698 }
Kevin DuBois1d4c6a62018-12-12 13:59:46 -0800699 result = reply.readUint64Vector(&outStats->component_2_sample);
Kevin DuBois1d4249a2018-08-29 10:45:14 -0700700 if (result != NO_ERROR) {
701 return result;
702 }
Kevin DuBois1d4c6a62018-12-12 13:59:46 -0800703 result = reply.readUint64Vector(&outStats->component_3_sample);
Kevin DuBois1d4249a2018-08-29 10:45:14 -0700704 return result;
705 }
Peiyong Lin3c2791e2019-01-14 17:05:18 -0800706
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000707 status_t getProtectedContentSupport(bool* outSupported) const override {
Peiyong Lin3c2791e2019-01-14 17:05:18 -0800708 Parcel data, reply;
709 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
Peiyong Linb6888fa2019-01-28 13:20:58 -0800710 status_t error =
711 remote()->transact(BnSurfaceComposer::GET_PROTECTED_CONTENT_SUPPORT, data, &reply);
712 if (error != NO_ERROR) {
713 return error;
Peiyong Lin3c2791e2019-01-14 17:05:18 -0800714 }
Peiyong Linb6888fa2019-01-28 13:20:58 -0800715 error = reply.readBool(outSupported);
716 return error;
Peiyong Lin3c2791e2019-01-14 17:05:18 -0800717 }
Marissa Wallebc2c052019-01-16 19:16:55 -0800718
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000719 status_t isWideColorDisplay(const sp<IBinder>& token,
720 bool* outIsWideColorDisplay) const override {
Peiyong Lin4f3fddf2019-01-24 17:21:24 -0800721 Parcel data, reply;
722 status_t error = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
723 if (error != NO_ERROR) {
724 return error;
725 }
726 error = data.writeStrongBinder(token);
727 if (error != NO_ERROR) {
728 return error;
729 }
730
731 error = remote()->transact(BnSurfaceComposer::IS_WIDE_COLOR_DISPLAY, data, &reply);
732 if (error != NO_ERROR) {
733 return error;
734 }
735 error = reply.readBool(outIsWideColorDisplay);
736 return error;
737 }
Dan Stoza84ab9372018-12-17 15:27:57 -0800738
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000739 status_t addRegionSamplingListener(const Rect& samplingArea, const sp<IBinder>& stopLayerHandle,
740 const sp<IRegionSamplingListener>& listener) override {
Dan Stoza84ab9372018-12-17 15:27:57 -0800741 Parcel data, reply;
742 status_t error = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
743 if (error != NO_ERROR) {
744 ALOGE("addRegionSamplingListener: Failed to write interface token");
745 return error;
746 }
747 error = data.write(samplingArea);
748 if (error != NO_ERROR) {
749 ALOGE("addRegionSamplingListener: Failed to write sampling area");
750 return error;
751 }
752 error = data.writeStrongBinder(stopLayerHandle);
753 if (error != NO_ERROR) {
754 ALOGE("addRegionSamplingListener: Failed to write stop layer handle");
755 return error;
756 }
757 error = data.writeStrongBinder(IInterface::asBinder(listener));
758 if (error != NO_ERROR) {
759 ALOGE("addRegionSamplingListener: Failed to write listener");
760 return error;
761 }
762 error = remote()->transact(BnSurfaceComposer::ADD_REGION_SAMPLING_LISTENER, data, &reply);
763 if (error != NO_ERROR) {
764 ALOGE("addRegionSamplingListener: Failed to transact");
765 }
766 return error;
767 }
768
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000769 status_t removeRegionSamplingListener(const sp<IRegionSamplingListener>& listener) override {
Dan Stoza84ab9372018-12-17 15:27:57 -0800770 Parcel data, reply;
771 status_t error = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
772 if (error != NO_ERROR) {
tangrobinaf45f012019-02-26 18:10:10 +0800773 ALOGE("removeRegionSamplingListener: Failed to write interface token");
Dan Stoza84ab9372018-12-17 15:27:57 -0800774 return error;
775 }
776 error = data.writeStrongBinder(IInterface::asBinder(listener));
777 if (error != NO_ERROR) {
tangrobinaf45f012019-02-26 18:10:10 +0800778 ALOGE("removeRegionSamplingListener: Failed to write listener");
Dan Stoza84ab9372018-12-17 15:27:57 -0800779 return error;
780 }
781 error = remote()->transact(BnSurfaceComposer::REMOVE_REGION_SAMPLING_LISTENER, data,
782 &reply);
783 if (error != NO_ERROR) {
tangrobinaf45f012019-02-26 18:10:10 +0800784 ALOGE("removeRegionSamplingListener: Failed to transact");
Dan Stoza84ab9372018-12-17 15:27:57 -0800785 }
786 return error;
787 }
Ady Abraham838de062019-02-04 10:24:03 -0800788
Alec Mouria9a68a62021-03-04 19:14:50 -0800789 virtual status_t addFpsListener(int32_t taskId, const sp<gui::IFpsListener>& listener) {
Alec Mouriadebf5c2021-01-05 12:57:36 -0800790 Parcel data, reply;
791 SAFE_PARCEL(data.writeInterfaceToken, ISurfaceComposer::getInterfaceDescriptor());
Alec Mouria9a68a62021-03-04 19:14:50 -0800792 SAFE_PARCEL(data.writeInt32, taskId);
Alec Mouriadebf5c2021-01-05 12:57:36 -0800793 SAFE_PARCEL(data.writeStrongBinder, IInterface::asBinder(listener));
794 const status_t error =
795 remote()->transact(BnSurfaceComposer::ADD_FPS_LISTENER, data, &reply);
796 if (error != OK) {
797 ALOGE("addFpsListener: Failed to transact");
798 }
799 return error;
800 }
801
802 virtual status_t removeFpsListener(const sp<gui::IFpsListener>& listener) {
803 Parcel data, reply;
804 SAFE_PARCEL(data.writeInterfaceToken, ISurfaceComposer::getInterfaceDescriptor());
805 SAFE_PARCEL(data.writeStrongBinder, IInterface::asBinder(listener));
806
807 const status_t error =
808 remote()->transact(BnSurfaceComposer::REMOVE_FPS_LISTENER, data, &reply);
809 if (error != OK) {
810 ALOGE("removeFpsListener: Failed to transact");
811 }
812 return error;
813 }
814
Galia Peycheva8f04b302021-04-27 13:25:38 +0200815 virtual status_t addTunnelModeEnabledListener(
816 const sp<gui::ITunnelModeEnabledListener>& listener) {
817 Parcel data, reply;
818 SAFE_PARCEL(data.writeInterfaceToken, ISurfaceComposer::getInterfaceDescriptor());
819 SAFE_PARCEL(data.writeStrongBinder, IInterface::asBinder(listener));
820
821 const status_t error =
822 remote()->transact(BnSurfaceComposer::ADD_TUNNEL_MODE_ENABLED_LISTENER, data,
823 &reply);
824 if (error != NO_ERROR) {
825 ALOGE("addTunnelModeEnabledListener: Failed to transact");
826 }
827 return error;
828 }
829
830 virtual status_t removeTunnelModeEnabledListener(
831 const sp<gui::ITunnelModeEnabledListener>& listener) {
832 Parcel data, reply;
833 SAFE_PARCEL(data.writeInterfaceToken, ISurfaceComposer::getInterfaceDescriptor());
834 SAFE_PARCEL(data.writeStrongBinder, IInterface::asBinder(listener));
835
836 const status_t error =
837 remote()->transact(BnSurfaceComposer::REMOVE_TUNNEL_MODE_ENABLED_LISTENER, data,
838 &reply);
839 if (error != NO_ERROR) {
840 ALOGE("removeTunnelModeEnabledListener: Failed to transact");
841 }
842 return error;
843 }
844
Marin Shalamanov228f46b2021-01-28 21:11:45 +0100845 status_t setDesiredDisplayModeSpecs(const sp<IBinder>& displayToken,
846 ui::DisplayModeId defaultMode, bool allowGroupSwitching,
847 float primaryRefreshRateMin, float primaryRefreshRateMax,
848 float appRequestRefreshRateMin,
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100849 float appRequestRefreshRateMax) override {
Ana Krulec0782b882019-10-15 17:34:54 -0700850 Parcel data, reply;
851 status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
852 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100853 ALOGE("setDesiredDisplayModeSpecs: failed to writeInterfaceToken: %d", result);
Ana Krulec0782b882019-10-15 17:34:54 -0700854 return result;
855 }
856 result = data.writeStrongBinder(displayToken);
857 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100858 ALOGE("setDesiredDisplayModeSpecs: failed to write display token: %d", result);
Ana Krulec0782b882019-10-15 17:34:54 -0700859 return result;
860 }
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100861 result = data.writeInt32(defaultMode);
Ana Krulec0782b882019-10-15 17:34:54 -0700862 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100863 ALOGE("setDesiredDisplayModeSpecs failed to write defaultMode: %d", result);
Ana Krulec0782b882019-10-15 17:34:54 -0700864 return result;
865 }
Marin Shalamanov30b0b3c2020-10-13 19:15:06 +0200866 result = data.writeBool(allowGroupSwitching);
867 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100868 ALOGE("setDesiredDisplayModeSpecs failed to write allowGroupSwitching: %d", result);
Marin Shalamanov30b0b3c2020-10-13 19:15:06 +0200869 return result;
870 }
Steven Thomasf734df42020-04-13 21:09:28 -0700871 result = data.writeFloat(primaryRefreshRateMin);
Ana Krulec0782b882019-10-15 17:34:54 -0700872 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100873 ALOGE("setDesiredDisplayModeSpecs failed to write primaryRefreshRateMin: %d", result);
Ana Krulec0782b882019-10-15 17:34:54 -0700874 return result;
875 }
Steven Thomasf734df42020-04-13 21:09:28 -0700876 result = data.writeFloat(primaryRefreshRateMax);
Ana Krulec0782b882019-10-15 17:34:54 -0700877 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100878 ALOGE("setDesiredDisplayModeSpecs failed to write primaryRefreshRateMax: %d", result);
Steven Thomasf734df42020-04-13 21:09:28 -0700879 return result;
880 }
881 result = data.writeFloat(appRequestRefreshRateMin);
882 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100883 ALOGE("setDesiredDisplayModeSpecs failed to write appRequestRefreshRateMin: %d",
Steven Thomasf734df42020-04-13 21:09:28 -0700884 result);
885 return result;
886 }
887 result = data.writeFloat(appRequestRefreshRateMax);
888 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100889 ALOGE("setDesiredDisplayModeSpecs failed to write appRequestRefreshRateMax: %d",
Steven Thomasf734df42020-04-13 21:09:28 -0700890 result);
Ana Krulec0782b882019-10-15 17:34:54 -0700891 return result;
892 }
893
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100894 result =
895 remote()->transact(BnSurfaceComposer::SET_DESIRED_DISPLAY_MODE_SPECS, data, &reply);
Ana Krulec0782b882019-10-15 17:34:54 -0700896 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100897 ALOGE("setDesiredDisplayModeSpecs failed to transact: %d", result);
Ana Krulec0782b882019-10-15 17:34:54 -0700898 return result;
899 }
900 return reply.readInt32();
901 }
902
Marin Shalamanov228f46b2021-01-28 21:11:45 +0100903 status_t getDesiredDisplayModeSpecs(const sp<IBinder>& displayToken,
904 ui::DisplayModeId* outDefaultMode,
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100905 bool* outAllowGroupSwitching,
906 float* outPrimaryRefreshRateMin,
907 float* outPrimaryRefreshRateMax,
908 float* outAppRequestRefreshRateMin,
909 float* outAppRequestRefreshRateMax) override {
910 if (!outDefaultMode || !outAllowGroupSwitching || !outPrimaryRefreshRateMin ||
Marin Shalamanov30b0b3c2020-10-13 19:15:06 +0200911 !outPrimaryRefreshRateMax || !outAppRequestRefreshRateMin ||
912 !outAppRequestRefreshRateMax) {
Steven Thomasf734df42020-04-13 21:09:28 -0700913 return BAD_VALUE;
914 }
Ady Abrahamd9b3ea62019-02-26 14:08:03 -0800915 Parcel data, reply;
916 status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
917 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100918 ALOGE("getDesiredDisplayModeSpecs failed to writeInterfaceToken: %d", result);
Ady Abrahamd9b3ea62019-02-26 14:08:03 -0800919 return result;
920 }
921 result = data.writeStrongBinder(displayToken);
922 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100923 ALOGE("getDesiredDisplayModeSpecs failed to writeStrongBinder: %d", result);
Ady Abrahamd9b3ea62019-02-26 14:08:03 -0800924 return result;
925 }
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100926 result =
927 remote()->transact(BnSurfaceComposer::GET_DESIRED_DISPLAY_MODE_SPECS, data, &reply);
Ady Abrahamd9b3ea62019-02-26 14:08:03 -0800928 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100929 ALOGE("getDesiredDisplayModeSpecs failed to transact: %d", result);
Ady Abrahamd9b3ea62019-02-26 14:08:03 -0800930 return result;
931 }
Marin Shalamanov228f46b2021-01-28 21:11:45 +0100932
933 result = reply.readInt32(outDefaultMode);
Ady Abrahamd9b3ea62019-02-26 14:08:03 -0800934 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100935 ALOGE("getDesiredDisplayModeSpecs failed to read defaultMode: %d", result);
Ana Krulec234bb162019-11-10 22:55:55 +0100936 return result;
937 }
Marin Shalamanov228f46b2021-01-28 21:11:45 +0100938 if (*outDefaultMode < 0) {
939 ALOGE("%s: defaultMode must be non-negative but it was %d", __func__, *outDefaultMode);
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100940 return BAD_VALUE;
941 }
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100942
Marin Shalamanov30b0b3c2020-10-13 19:15:06 +0200943 result = reply.readBool(outAllowGroupSwitching);
944 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100945 ALOGE("getDesiredDisplayModeSpecs failed to read allowGroupSwitching: %d", result);
Marin Shalamanov30b0b3c2020-10-13 19:15:06 +0200946 return result;
947 }
Steven Thomasf734df42020-04-13 21:09:28 -0700948 result = reply.readFloat(outPrimaryRefreshRateMin);
Ana Krulec234bb162019-11-10 22:55:55 +0100949 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100950 ALOGE("getDesiredDisplayModeSpecs failed to read primaryRefreshRateMin: %d", result);
Ana Krulec234bb162019-11-10 22:55:55 +0100951 return result;
952 }
Steven Thomasf734df42020-04-13 21:09:28 -0700953 result = reply.readFloat(outPrimaryRefreshRateMax);
Ana Krulec234bb162019-11-10 22:55:55 +0100954 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100955 ALOGE("getDesiredDisplayModeSpecs failed to read primaryRefreshRateMax: %d", result);
Steven Thomasf734df42020-04-13 21:09:28 -0700956 return result;
957 }
958 result = reply.readFloat(outAppRequestRefreshRateMin);
959 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100960 ALOGE("getDesiredDisplayModeSpecs failed to read appRequestRefreshRateMin: %d", result);
Steven Thomasf734df42020-04-13 21:09:28 -0700961 return result;
962 }
963 result = reply.readFloat(outAppRequestRefreshRateMax);
964 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100965 ALOGE("getDesiredDisplayModeSpecs failed to read appRequestRefreshRateMax: %d", result);
Ady Abrahamd9b3ea62019-02-26 14:08:03 -0800966 return result;
967 }
968 return reply.readInt32();
969 }
Dan Gittik57e63c52019-01-18 16:37:54 +0000970
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000971 status_t getDisplayBrightnessSupport(const sp<IBinder>& displayToken,
972 bool* outSupport) const override {
Dan Gittik57e63c52019-01-18 16:37:54 +0000973 Parcel data, reply;
974 status_t error = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
975 if (error != NO_ERROR) {
976 ALOGE("getDisplayBrightnessSupport: failed to write interface token: %d", error);
977 return error;
978 }
979 error = data.writeStrongBinder(displayToken);
980 if (error != NO_ERROR) {
981 ALOGE("getDisplayBrightnessSupport: failed to write display token: %d", error);
982 return error;
983 }
984 error = remote()->transact(BnSurfaceComposer::GET_DISPLAY_BRIGHTNESS_SUPPORT, data, &reply);
985 if (error != NO_ERROR) {
986 ALOGE("getDisplayBrightnessSupport: failed to transact: %d", error);
987 return error;
988 }
989 bool support;
990 error = reply.readBool(&support);
991 if (error != NO_ERROR) {
992 ALOGE("getDisplayBrightnessSupport: failed to read support: %d", error);
993 return error;
994 }
995 *outSupport = support;
996 return NO_ERROR;
997 }
998
John Reck22be6962021-03-10 12:59:54 -0500999 status_t setDisplayBrightness(const sp<IBinder>& displayToken,
1000 const gui::DisplayBrightness& brightness) override {
Dan Gittik57e63c52019-01-18 16:37:54 +00001001 Parcel data, reply;
1002 status_t error = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
1003 if (error != NO_ERROR) {
1004 ALOGE("setDisplayBrightness: failed to write interface token: %d", error);
1005 return error;
1006 }
1007 error = data.writeStrongBinder(displayToken);
1008 if (error != NO_ERROR) {
1009 ALOGE("setDisplayBrightness: failed to write display token: %d", error);
1010 return error;
1011 }
John Reck22be6962021-03-10 12:59:54 -05001012 error = data.writeParcelable(brightness);
Dan Gittik57e63c52019-01-18 16:37:54 +00001013 if (error != NO_ERROR) {
1014 ALOGE("setDisplayBrightness: failed to write brightness: %d", error);
1015 return error;
1016 }
1017 error = remote()->transact(BnSurfaceComposer::SET_DISPLAY_BRIGHTNESS, data, &reply);
1018 if (error != NO_ERROR) {
1019 ALOGE("setDisplayBrightness: failed to transact: %d", error);
1020 return error;
1021 }
1022 return NO_ERROR;
1023 }
Ady Abraham8532d012019-05-08 14:50:56 -07001024
John Reck88270902021-03-18 11:27:35 -04001025 status_t addHdrLayerInfoListener(const sp<IBinder>& displayToken,
1026 const sp<gui::IHdrLayerInfoListener>& listener) override {
1027 Parcel data, reply;
1028 SAFE_PARCEL(data.writeInterfaceToken, ISurfaceComposer::getInterfaceDescriptor());
1029 SAFE_PARCEL(data.writeStrongBinder, displayToken);
1030 SAFE_PARCEL(data.writeStrongBinder, IInterface::asBinder(listener));
1031 const status_t error =
1032 remote()->transact(BnSurfaceComposer::ADD_HDR_LAYER_INFO_LISTENER, data, &reply);
1033 if (error != OK) {
1034 ALOGE("addHdrLayerInfoListener: Failed to transact; error = %d", error);
1035 }
1036 return error;
1037 }
1038
1039 status_t removeHdrLayerInfoListener(const sp<IBinder>& displayToken,
1040 const sp<gui::IHdrLayerInfoListener>& listener) override {
1041 Parcel data, reply;
1042 SAFE_PARCEL(data.writeInterfaceToken, ISurfaceComposer::getInterfaceDescriptor());
1043 SAFE_PARCEL(data.writeStrongBinder, displayToken);
1044 SAFE_PARCEL(data.writeStrongBinder, IInterface::asBinder(listener));
1045 const status_t error =
1046 remote()->transact(BnSurfaceComposer::REMOVE_HDR_LAYER_INFO_LISTENER, data, &reply);
1047 if (error != OK) {
1048 ALOGE("removeHdrLayerInfoListener: Failed to transact; error = %d", error);
1049 }
1050 return error;
1051 }
1052
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10001053 status_t notifyPowerBoost(int32_t boostId) override {
Ady Abraham8532d012019-05-08 14:50:56 -07001054 Parcel data, reply;
1055 status_t error = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
1056 if (error != NO_ERROR) {
Lais Andrade3a6e47d2020-04-02 11:20:16 +01001057 ALOGE("notifyPowerBoost: failed to write interface token: %d", error);
Ady Abraham8532d012019-05-08 14:50:56 -07001058 return error;
1059 }
Lais Andrade3a6e47d2020-04-02 11:20:16 +01001060 error = data.writeInt32(boostId);
Ady Abraham8532d012019-05-08 14:50:56 -07001061 if (error != NO_ERROR) {
Lais Andrade3a6e47d2020-04-02 11:20:16 +01001062 ALOGE("notifyPowerBoost: failed to write boostId: %d", error);
Ady Abraham8532d012019-05-08 14:50:56 -07001063 return error;
1064 }
Lais Andrade3a6e47d2020-04-02 11:20:16 +01001065 error = remote()->transact(BnSurfaceComposer::NOTIFY_POWER_BOOST, data, &reply,
Ady Abraham8532d012019-05-08 14:50:56 -07001066 IBinder::FLAG_ONEWAY);
1067 if (error != NO_ERROR) {
Lais Andrade3a6e47d2020-04-02 11:20:16 +01001068 ALOGE("notifyPowerBoost: failed to transact: %d", error);
Ady Abraham8532d012019-05-08 14:50:56 -07001069 return error;
1070 }
1071 return NO_ERROR;
1072 }
Vishnu Nairb13bb952019-11-15 10:24:08 -08001073
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10001074 status_t setGlobalShadowSettings(const half4& ambientColor, const half4& spotColor,
1075 float lightPosY, float lightPosZ, float lightRadius) override {
Vishnu Nairb13bb952019-11-15 10:24:08 -08001076 Parcel data, reply;
1077 status_t error = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
1078 if (error != NO_ERROR) {
1079 ALOGE("setGlobalShadowSettings: failed to write interface token: %d", error);
1080 return error;
1081 }
1082
1083 std::vector<float> shadowConfig = {ambientColor.r, ambientColor.g, ambientColor.b,
1084 ambientColor.a, spotColor.r, spotColor.g,
1085 spotColor.b, spotColor.a, lightPosY,
1086 lightPosZ, lightRadius};
1087
1088 error = data.writeFloatVector(shadowConfig);
1089 if (error != NO_ERROR) {
1090 ALOGE("setGlobalShadowSettings: failed to write shadowConfig: %d", error);
1091 return error;
1092 }
1093
1094 error = remote()->transact(BnSurfaceComposer::SET_GLOBAL_SHADOW_SETTINGS, data, &reply,
1095 IBinder::FLAG_ONEWAY);
1096 if (error != NO_ERROR) {
1097 ALOGE("setGlobalShadowSettings: failed to transact: %d", error);
1098 return error;
1099 }
1100 return NO_ERROR;
1101 }
Steven Thomas62a4cf82020-01-31 12:04:03 -08001102
Leon Scroggins IIIe7c51c62022-02-01 15:53:54 -05001103 status_t getDisplayDecorationSupport(
1104 const sp<IBinder>& displayToken,
1105 std::optional<common::DisplayDecorationSupport>* outSupport) const override {
Leon Scroggins IIIe5cff632021-12-29 11:53:36 -05001106 Parcel data, reply;
1107 status_t error = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
1108 if (error != NO_ERROR) {
1109 ALOGE("getDisplayDecorationSupport: failed to write interface token: %d", error);
1110 return error;
1111 }
1112 error = data.writeStrongBinder(displayToken);
1113 if (error != NO_ERROR) {
1114 ALOGE("getDisplayDecorationSupport: failed to write display token: %d", error);
1115 return error;
1116 }
1117 error = remote()->transact(BnSurfaceComposer::GET_DISPLAY_DECORATION_SUPPORT, data, &reply);
1118 if (error != NO_ERROR) {
1119 ALOGE("getDisplayDecorationSupport: failed to transact: %d", error);
1120 return error;
1121 }
1122 bool support;
1123 error = reply.readBool(&support);
1124 if (error != NO_ERROR) {
1125 ALOGE("getDisplayDecorationSupport: failed to read support: %d", error);
1126 return error;
1127 }
Leon Scroggins IIIe7c51c62022-02-01 15:53:54 -05001128
1129 if (support) {
1130 int32_t format, alphaInterpretation;
1131 error = reply.readInt32(&format);
1132 if (error != NO_ERROR) {
1133 ALOGE("getDisplayDecorationSupport: failed to read format: %d", error);
1134 return error;
1135 }
1136 error = reply.readInt32(&alphaInterpretation);
1137 if (error != NO_ERROR) {
1138 ALOGE("getDisplayDecorationSupport: failed to read alphaInterpretation: %d", error);
1139 return error;
1140 }
1141 outSupport->emplace();
1142 outSupport->value().format = static_cast<common::PixelFormat>(format);
1143 outSupport->value().alphaInterpretation =
1144 static_cast<common::AlphaInterpretation>(alphaInterpretation);
1145 } else {
1146 outSupport->reset();
1147 }
Leon Scroggins IIIe5cff632021-12-29 11:53:36 -05001148 return NO_ERROR;
1149 }
1150
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10001151 status_t setFrameRate(const sp<IGraphicBufferProducer>& surface, float frameRate,
Marin Shalamanovc5986772021-03-16 16:09:49 +01001152 int8_t compatibility, int8_t changeFrameRateStrategy) override {
Steven Thomas62a4cf82020-01-31 12:04:03 -08001153 Parcel data, reply;
Marin Shalamanovc5986772021-03-16 16:09:49 +01001154 SAFE_PARCEL(data.writeInterfaceToken, ISurfaceComposer::getInterfaceDescriptor());
1155 SAFE_PARCEL(data.writeStrongBinder, IInterface::asBinder(surface));
1156 SAFE_PARCEL(data.writeFloat, frameRate);
1157 SAFE_PARCEL(data.writeByte, compatibility);
1158 SAFE_PARCEL(data.writeByte, changeFrameRateStrategy);
Steven Thomas62a4cf82020-01-31 12:04:03 -08001159
Marin Shalamanovc5986772021-03-16 16:09:49 +01001160 status_t err = remote()->transact(BnSurfaceComposer::SET_FRAME_RATE, data, &reply);
Steven Thomas62a4cf82020-01-31 12:04:03 -08001161 if (err != NO_ERROR) {
1162 ALOGE("setFrameRate: failed to transact: %s (%d)", strerror(-err), err);
1163 return err;
1164 }
Steven Thomasd4071902020-03-24 16:02:53 -07001165
1166 return reply.readInt32();
1167 }
1168
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10001169 status_t setFrameTimelineInfo(const sp<IGraphicBufferProducer>& surface,
1170 const FrameTimelineInfo& frameTimelineInfo) override {
Ady Abraham74e17562020-08-24 18:18:19 -07001171 Parcel data, reply;
1172 status_t err = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
1173 if (err != NO_ERROR) {
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10001174 ALOGE("%s: failed writing interface token: %s (%d)", __func__, strerror(-err), -err);
Ady Abraham74e17562020-08-24 18:18:19 -07001175 return err;
1176 }
1177
1178 err = data.writeStrongBinder(IInterface::asBinder(surface));
1179 if (err != NO_ERROR) {
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10001180 ALOGE("%s: failed writing strong binder: %s (%d)", __func__, strerror(-err), -err);
Ady Abraham74e17562020-08-24 18:18:19 -07001181 return err;
1182 }
1183
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10001184 SAFE_PARCEL(frameTimelineInfo.write, data);
Ady Abraham74e17562020-08-24 18:18:19 -07001185
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10001186 err = remote()->transact(BnSurfaceComposer::SET_FRAME_TIMELINE_INFO, data, &reply);
Ady Abraham74e17562020-08-24 18:18:19 -07001187 if (err != NO_ERROR) {
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10001188 ALOGE("%s: failed to transact: %s (%d)", __func__, strerror(-err), err);
Ady Abraham74e17562020-08-24 18:18:19 -07001189 return err;
1190 }
1191
1192 return reply.readInt32();
1193 }
Pablo Gamito6ee484d2020-07-30 14:26:28 +00001194
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10001195 status_t addTransactionTraceListener(
1196 const sp<gui::ITransactionTraceListener>& listener) override {
Pablo Gamito6ee484d2020-07-30 14:26:28 +00001197 Parcel data, reply;
1198 SAFE_PARCEL(data.writeInterfaceToken, ISurfaceComposer::getInterfaceDescriptor());
1199 SAFE_PARCEL(data.writeStrongBinder, IInterface::asBinder(listener));
1200
1201 return remote()->transact(BnSurfaceComposer::ADD_TRANSACTION_TRACE_LISTENER, data, &reply);
1202 }
Ana Krulec31f2b3c2020-12-14 14:30:09 -08001203
1204 /**
1205 * Get priority of the RenderEngine in surface flinger.
1206 */
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10001207 int getGPUContextPriority() override {
Ana Krulec31f2b3c2020-12-14 14:30:09 -08001208 Parcel data, reply;
1209 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
1210 status_t err =
1211 remote()->transact(BnSurfaceComposer::GET_GPU_CONTEXT_PRIORITY, data, &reply);
1212 if (err != NO_ERROR) {
1213 ALOGE("getGPUContextPriority failed to read data: %s (%d)", strerror(-err), err);
1214 return 0;
1215 }
1216 return reply.readInt32();
1217 }
Ady Abraham564f9de2021-02-03 18:34:33 -08001218
Ady Abraham899dcdb2021-06-15 16:56:21 -07001219 status_t getMaxAcquiredBufferCount(int* buffers) const override {
Ady Abraham564f9de2021-02-03 18:34:33 -08001220 Parcel data, reply;
1221 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
Ady Abraham899dcdb2021-06-15 16:56:21 -07001222 status_t err =
1223 remote()->transact(BnSurfaceComposer::GET_MAX_ACQUIRED_BUFFER_COUNT, data, &reply);
Ady Abraham564f9de2021-02-03 18:34:33 -08001224 if (err != NO_ERROR) {
Ady Abraham899dcdb2021-06-15 16:56:21 -07001225 ALOGE("getMaxAcquiredBufferCount failed to read data: %s (%d)", strerror(-err), err);
Ady Abraham564f9de2021-02-03 18:34:33 -08001226 return err;
1227 }
1228
Ady Abraham899dcdb2021-06-15 16:56:21 -07001229 return reply.readInt32(buffers);
Ady Abraham564f9de2021-02-03 18:34:33 -08001230 }
chaviw60c9d3e2021-06-04 12:52:17 -05001231
1232 status_t addWindowInfosListener(
1233 const sp<IWindowInfosListener>& windowInfosListener) const override {
1234 Parcel data, reply;
1235 SAFE_PARCEL(data.writeInterfaceToken, ISurfaceComposer::getInterfaceDescriptor());
1236 SAFE_PARCEL(data.writeStrongBinder, IInterface::asBinder(windowInfosListener));
1237 return remote()->transact(BnSurfaceComposer::ADD_WINDOW_INFOS_LISTENER, data, &reply);
1238 }
1239
1240 status_t removeWindowInfosListener(
1241 const sp<IWindowInfosListener>& windowInfosListener) const override {
1242 Parcel data, reply;
1243 SAFE_PARCEL(data.writeInterfaceToken, ISurfaceComposer::getInterfaceDescriptor());
1244 SAFE_PARCEL(data.writeStrongBinder, IInterface::asBinder(windowInfosListener));
1245 return remote()->transact(BnSurfaceComposer::REMOVE_WINDOW_INFOS_LISTENER, data, &reply);
1246 }
Andy Yu2ae6b6b2021-11-18 14:51:06 -08001247
1248 status_t setOverrideFrameRate(uid_t uid, float frameRate) override {
1249 Parcel data, reply;
1250 SAFE_PARCEL(data.writeInterfaceToken, ISurfaceComposer::getInterfaceDescriptor());
1251 SAFE_PARCEL(data.writeUint32, uid);
1252 SAFE_PARCEL(data.writeFloat, frameRate);
1253
1254 status_t err = remote()->transact(BnSurfaceComposer::SET_OVERRIDE_FRAME_RATE, data, &reply);
1255 if (err != NO_ERROR) {
1256 ALOGE("setOverrideFrameRate: failed to transact %s (%d)", strerror(-err), err);
1257 return err;
1258 }
1259
1260 return NO_ERROR;
1261 }
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08001262};
1263
Dan Stozad723bd72014-11-18 10:24:03 -08001264// Out-of-line virtual method definition to trigger vtable emission in this
1265// translation unit (see clang warning -Wweak-vtables)
1266BpSurfaceComposer::~BpSurfaceComposer() {}
1267
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08001268IMPLEMENT_META_INTERFACE(SurfaceComposer, "android.ui.ISurfaceComposer");
1269
1270// ----------------------------------------------------------------------
1271
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08001272status_t BnSurfaceComposer::onTransact(
1273 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
1274{
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08001275 switch(code) {
1276 case CREATE_CONNECTION: {
Mathias Agopian83c04462009-05-22 19:00:22 -07001277 CHECK_INTERFACE(ISurfaceComposer, data, reply);
Marco Nelissen2ea926b2014-11-14 08:01:01 -08001278 sp<IBinder> b = IInterface::asBinder(createConnection());
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08001279 reply->writeStrongBinder(b);
Jesse Hall6c913be2013-08-08 12:15:49 -07001280 return NO_ERROR;
1281 }
Mathias Agopian698c0872011-06-28 19:09:31 -07001282 case SET_TRANSACTION_STATE: {
Mathias Agopian83c04462009-05-22 19:00:22 -07001283 CHECK_INTERFACE(ISurfaceComposer, data, reply);
Dan Stozad723bd72014-11-18 10:24:03 -08001284
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10001285 FrameTimelineInfo frameTimelineInfo;
1286 SAFE_PARCEL(frameTimelineInfo.read, data);
1287
chaviw308ddba2020-08-11 16:23:51 -07001288 uint32_t count = 0;
1289 SAFE_PARCEL_READ_SIZE(data.readUint32, &count, data.dataSize());
Mathias Agopian698c0872011-06-28 19:09:31 -07001290 Vector<ComposerState> state;
1291 state.setCapacity(count);
Dan Stozad723bd72014-11-18 10:24:03 -08001292 for (size_t i = 0; i < count; i++) {
Marissa Wallc837b5e2018-10-12 10:04:44 -07001293 ComposerState s;
chaviw308ddba2020-08-11 16:23:51 -07001294 SAFE_PARCEL(s.read, data);
Mathias Agopian698c0872011-06-28 19:09:31 -07001295 state.add(s);
1296 }
Dan Stozad723bd72014-11-18 10:24:03 -08001297
chaviw308ddba2020-08-11 16:23:51 -07001298 SAFE_PARCEL_READ_SIZE(data.readUint32, &count, data.dataSize());
Mathias Agopian8b33f032012-07-24 20:43:54 -07001299 DisplayState d;
1300 Vector<DisplayState> displays;
1301 displays.setCapacity(count);
Dan Stozad723bd72014-11-18 10:24:03 -08001302 for (size_t i = 0; i < count; i++) {
chaviw308ddba2020-08-11 16:23:51 -07001303 SAFE_PARCEL(d.read, data);
Mathias Agopian8b33f032012-07-24 20:43:54 -07001304 displays.add(d);
1305 }
Dan Stozad723bd72014-11-18 10:24:03 -08001306
chaviw308ddba2020-08-11 16:23:51 -07001307 uint32_t stateFlags = 0;
1308 SAFE_PARCEL(data.readUint32, &stateFlags);
1309 sp<IBinder> applyToken;
1310 SAFE_PARCEL(data.readStrongBinder, &applyToken);
chaviw273171b2018-12-26 11:46:30 -08001311 InputWindowCommands inputWindowCommands;
chaviw308ddba2020-08-11 16:23:51 -07001312 SAFE_PARCEL(inputWindowCommands.read, data);
Marissa Wall17b4e452018-12-26 16:32:34 -08001313
chaviw308ddba2020-08-11 16:23:51 -07001314 int64_t desiredPresentTime = 0;
Ady Abrahamf0c56492020-12-17 18:04:15 -08001315 bool isAutoTimestamp = true;
chaviw308ddba2020-08-11 16:23:51 -07001316 SAFE_PARCEL(data.readInt64, &desiredPresentTime);
Ady Abrahamf0c56492020-12-17 18:04:15 -08001317 SAFE_PARCEL(data.readBool, &isAutoTimestamp);
Marissa Wall78b72202019-03-15 14:58:34 -07001318
Marissa Wall947d34e2019-03-29 14:03:53 -07001319 client_cache_t uncachedBuffer;
chaviw308ddba2020-08-11 16:23:51 -07001320 sp<IBinder> tmpBinder;
1321 SAFE_PARCEL(data.readNullableStrongBinder, &tmpBinder);
1322 uncachedBuffer.token = tmpBinder;
1323 SAFE_PARCEL(data.readUint64, &uncachedBuffer.id);
Marissa Wall78b72202019-03-15 14:58:34 -07001324
chaviw308ddba2020-08-11 16:23:51 -07001325 bool hasListenerCallbacks = false;
1326 SAFE_PARCEL(data.readBool, &hasListenerCallbacks);
Valerie Hau9dab9732019-08-20 09:29:25 -07001327
Marissa Wall3dad52d2019-03-22 14:03:19 -07001328 std::vector<ListenerCallbacks> listenerCallbacks;
chaviw308ddba2020-08-11 16:23:51 -07001329 int32_t listenersSize = 0;
1330 SAFE_PARCEL_READ_SIZE(data.readInt32, &listenersSize, data.dataSize());
Marissa Wall3dad52d2019-03-22 14:03:19 -07001331 for (int32_t i = 0; i < listenersSize; i++) {
chaviw308ddba2020-08-11 16:23:51 -07001332 SAFE_PARCEL(data.readStrongBinder, &tmpBinder);
Marissa Wall3dad52d2019-03-22 14:03:19 -07001333 std::vector<CallbackId> callbackIds;
Vishnu Nairfc46c1e2021-04-21 08:31:32 -07001334 SAFE_PARCEL(data.readParcelableVector, &callbackIds);
chaviw308ddba2020-08-11 16:23:51 -07001335 listenerCallbacks.emplace_back(tmpBinder, callbackIds);
Marissa Wall3dad52d2019-03-22 14:03:19 -07001336 }
Pablo Gamito7eb7ee72020-08-05 10:57:05 +00001337
1338 uint64_t transactionId = -1;
1339 SAFE_PARCEL(data.readUint64, &transactionId);
1340
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10001341 return setTransactionState(frameTimelineInfo, state, displays, stateFlags, applyToken,
1342 inputWindowCommands, desiredPresentTime, isAutoTimestamp,
1343 uncachedBuffer, hasListenerCallbacks, listenerCallbacks,
1344 transactionId);
Jesse Hall6c913be2013-08-08 12:15:49 -07001345 }
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08001346 case BOOT_FINISHED: {
Mathias Agopian83c04462009-05-22 19:00:22 -07001347 CHECK_INTERFACE(ISurfaceComposer, data, reply);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08001348 bootFinished();
Jesse Hall6c913be2013-08-08 12:15:49 -07001349 return NO_ERROR;
1350 }
Jamie Gennis134f0422011-03-08 12:18:54 -08001351 case AUTHENTICATE_SURFACE: {
1352 CHECK_INTERFACE(ISurfaceComposer, data, reply);
Andy McFadden2adaf042012-12-18 09:49:45 -08001353 sp<IGraphicBufferProducer> bufferProducer =
1354 interface_cast<IGraphicBufferProducer>(data.readStrongBinder());
1355 int32_t result = authenticateSurfaceTexture(bufferProducer) ? 1 : 0;
Jamie Gennis134f0422011-03-08 12:18:54 -08001356 reply->writeInt32(result);
Jesse Hall6c913be2013-08-08 12:15:49 -07001357 return NO_ERROR;
1358 }
Brian Anderson6b376712017-04-04 10:51:39 -07001359 case GET_SUPPORTED_FRAME_TIMESTAMPS: {
1360 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1361 std::vector<FrameEvent> supportedTimestamps;
1362 status_t result = getSupportedFrameTimestamps(&supportedTimestamps);
1363 status_t err = reply->writeInt32(result);
1364 if (err != NO_ERROR) {
1365 return err;
1366 }
1367 if (result != NO_ERROR) {
1368 return result;
1369 }
1370
1371 std::vector<int32_t> supported;
1372 supported.reserve(supportedTimestamps.size());
1373 for (FrameEvent s : supportedTimestamps) {
1374 supported.push_back(static_cast<int32_t>(s));
1375 }
1376 return reply->writeInt32Vector(supported);
1377 }
Mathias Agopiand0566bc2011-11-17 17:49:17 -08001378 case CREATE_DISPLAY_EVENT_CONNECTION: {
1379 CHECK_INTERFACE(ISurfaceComposer, data, reply);
Ady Abraham0f4a1b12019-06-04 16:04:04 -07001380 auto vsyncSource = static_cast<ISurfaceComposer::VsyncSource>(data.readInt32());
Ady Abraham62f216c2020-10-13 19:07:23 -07001381 EventRegistrationFlags eventRegistration =
1382 static_cast<EventRegistration>(data.readUint32());
Ady Abraham0f4a1b12019-06-04 16:04:04 -07001383
1384 sp<IDisplayEventConnection> connection(
Ady Abraham62f216c2020-10-13 19:07:23 -07001385 createDisplayEventConnection(vsyncSource, eventRegistration));
Marco Nelissen2ea926b2014-11-14 08:01:01 -08001386 reply->writeStrongBinder(IInterface::asBinder(connection));
Mathias Agopiand0566bc2011-11-17 17:49:17 -08001387 return NO_ERROR;
Jesse Hall6c913be2013-08-08 12:15:49 -07001388 }
Dominik Laskowski3cb3d4e2019-11-21 11:14:45 -08001389 case GET_DISPLAY_STATE: {
1390 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1391 ui::DisplayState state;
1392 const sp<IBinder> display = data.readStrongBinder();
1393 const status_t result = getDisplayState(display, &state);
1394 reply->writeInt32(result);
1395 if (result == NO_ERROR) {
1396 memcpy(reply->writeInplace(sizeof(ui::DisplayState)), &state,
1397 sizeof(ui::DisplayState));
1398 }
1399 return NO_ERROR;
1400 }
Marin Shalamanov228f46b2021-01-28 21:11:45 +01001401 case GET_STATIC_DISPLAY_INFO: {
Dominik Laskowski3cb3d4e2019-11-21 11:14:45 -08001402 CHECK_INTERFACE(ISurfaceComposer, data, reply);
Marin Shalamanov228f46b2021-01-28 21:11:45 +01001403 ui::StaticDisplayInfo info;
Dominik Laskowski3cb3d4e2019-11-21 11:14:45 -08001404 const sp<IBinder> display = data.readStrongBinder();
Marin Shalamanov228f46b2021-01-28 21:11:45 +01001405 const status_t result = getStaticDisplayInfo(display, &info);
1406 SAFE_PARCEL(reply->writeInt32, result);
Marin Shalamanov359a7e72020-02-17 17:03:07 +01001407 if (result != NO_ERROR) return result;
Marin Shalamanov228f46b2021-01-28 21:11:45 +01001408 SAFE_PARCEL(reply->write, info);
1409 return NO_ERROR;
Dominik Laskowski3cb3d4e2019-11-21 11:14:45 -08001410 }
Marin Shalamanov228f46b2021-01-28 21:11:45 +01001411 case GET_DYNAMIC_DISPLAY_INFO: {
Mathias Agopianc666cae2012-07-25 18:56:13 -07001412 CHECK_INTERFACE(ISurfaceComposer, data, reply);
Marin Shalamanov228f46b2021-01-28 21:11:45 +01001413 ui::DynamicDisplayInfo info;
Dominik Laskowski3cb3d4e2019-11-21 11:14:45 -08001414 const sp<IBinder> display = data.readStrongBinder();
Marin Shalamanov228f46b2021-01-28 21:11:45 +01001415 const status_t result = getDynamicDisplayInfo(display, &info);
1416 SAFE_PARCEL(reply->writeInt32, result);
1417 if (result != NO_ERROR) return result;
1418 SAFE_PARCEL(reply->write, info);
Dan Stoza7f7da322014-05-02 15:26:25 -07001419 return NO_ERROR;
1420 }
Lajos Molnar67d8bd62014-09-11 14:58:45 -07001421 case GET_DISPLAY_STATS: {
1422 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1423 DisplayStatInfo stats;
1424 sp<IBinder> display = data.readStrongBinder();
1425 status_t result = getDisplayStats(display, &stats);
1426 reply->writeInt32(result);
1427 if (result == NO_ERROR) {
1428 memcpy(reply->writeInplace(sizeof(DisplayStatInfo)),
1429 &stats, sizeof(DisplayStatInfo));
1430 }
1431 return NO_ERROR;
1432 }
Daniel Solomon42d04562019-01-20 21:03:19 -08001433 case GET_DISPLAY_NATIVE_PRIMARIES: {
1434 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1435 ui::DisplayPrimaries primaries;
1436 sp<IBinder> display = nullptr;
1437
1438 status_t result = data.readStrongBinder(&display);
1439 if (result != NO_ERROR) {
1440 ALOGE("getDisplayNativePrimaries failed to readStrongBinder: %d", result);
1441 return result;
1442 }
1443
1444 result = getDisplayNativePrimaries(display, primaries);
1445 reply->writeInt32(result);
1446 if (result == NO_ERROR) {
1447 memcpy(reply->writeInplace(sizeof(ui::DisplayPrimaries)), &primaries,
1448 sizeof(ui::DisplayPrimaries));
1449 }
1450
1451 return NO_ERROR;
1452 }
Michael Wright28f24d02016-07-12 13:30:53 -07001453 case SET_ACTIVE_COLOR_MODE: {
1454 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1455 sp<IBinder> display = nullptr;
1456 status_t result = data.readStrongBinder(&display);
1457 if (result != NO_ERROR) {
1458 ALOGE("getActiveColorMode failed to readStrongBinder: %d", result);
1459 return result;
1460 }
1461 int32_t colorModeInt = 0;
1462 result = data.readInt32(&colorModeInt);
1463 if (result != NO_ERROR) {
1464 ALOGE("setActiveColorMode failed to readInt32: %d", result);
1465 return result;
1466 }
1467 result = setActiveColorMode(display,
Peiyong Lina52f0292018-03-14 17:26:31 -07001468 static_cast<ColorMode>(colorModeInt));
Michael Wright28f24d02016-07-12 13:30:53 -07001469 result = reply->writeInt32(result);
1470 return result;
1471 }
Kriti Dang7defaf32021-11-15 11:55:43 +01001472 case GET_BOOT_DISPLAY_MODE_SUPPORT: {
1473 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1474 bool support = false;
1475 status_t result = getBootDisplayModeSupport(&support);
1476 if (result == NO_ERROR) {
1477 reply->writeBool(support);
1478 }
1479 return result;
1480 }
1481 case SET_BOOT_DISPLAY_MODE: {
1482 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1483 sp<IBinder> display = nullptr;
1484 status_t result = data.readStrongBinder(&display);
1485 if (result != NO_ERROR) {
1486 ALOGE("setBootDisplayMode failed to readStrongBinder: %d", result);
1487 return result;
1488 }
1489 ui::DisplayModeId displayModeId;
1490 result = data.readInt32(&displayModeId);
1491 if (result != NO_ERROR) {
1492 ALOGE("setBootDisplayMode failed to readInt32: %d", result);
1493 return result;
1494 }
1495 return setBootDisplayMode(display, displayModeId);
1496 }
1497 case CLEAR_BOOT_DISPLAY_MODE: {
1498 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1499 sp<IBinder> display = nullptr;
1500 status_t result = data.readStrongBinder(&display);
1501 if (result != NO_ERROR) {
1502 ALOGE("clearBootDisplayMode failed to readStrongBinder: %d", result);
1503 return result;
1504 }
1505 return clearBootDisplayMode(display);
1506 }
Galia Peycheva5492cb52019-10-30 14:13:16 +01001507 case SET_AUTO_LOW_LATENCY_MODE: {
1508 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1509 sp<IBinder> display = nullptr;
1510 status_t result = data.readStrongBinder(&display);
1511 if (result != NO_ERROR) {
1512 ALOGE("setAutoLowLatencyMode failed to readStrongBinder: %d", result);
1513 return result;
1514 }
1515 bool setAllm = false;
1516 result = data.readBool(&setAllm);
1517 if (result != NO_ERROR) {
1518 ALOGE("setAutoLowLatencyMode failed to readBool: %d", result);
1519 return result;
1520 }
1521 setAutoLowLatencyMode(display, setAllm);
1522 return result;
1523 }
Galia Peycheva5492cb52019-10-30 14:13:16 +01001524 case SET_GAME_CONTENT_TYPE: {
1525 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1526 sp<IBinder> display = nullptr;
1527 status_t result = data.readStrongBinder(&display);
1528 if (result != NO_ERROR) {
1529 ALOGE("setGameContentType failed to readStrongBinder: %d", result);
1530 return result;
1531 }
1532 bool setGameContentTypeOn = false;
1533 result = data.readBool(&setGameContentTypeOn);
1534 if (result != NO_ERROR) {
1535 ALOGE("setGameContentType failed to readBool: %d", result);
1536 return result;
1537 }
1538 setGameContentType(display, setGameContentTypeOn);
1539 return result;
1540 }
Svetoslavd85084b2014-03-20 10:28:31 -07001541 case CLEAR_ANIMATION_FRAME_STATS: {
1542 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1543 status_t result = clearAnimationFrameStats();
1544 reply->writeInt32(result);
1545 return NO_ERROR;
1546 }
1547 case GET_ANIMATION_FRAME_STATS: {
1548 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1549 FrameStats stats;
1550 status_t result = getAnimationFrameStats(&stats);
1551 reply->write(stats);
1552 reply->writeInt32(result);
1553 return NO_ERROR;
1554 }
Prashant Malani2c9b11f2014-05-25 01:36:31 -07001555 case SET_POWER_MODE: {
1556 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1557 sp<IBinder> display = data.readStrongBinder();
1558 int32_t mode = data.readInt32();
1559 setPowerMode(display, mode);
1560 return NO_ERROR;
1561 }
Sahil Dhanjuc1ba5c42016-06-07 20:09:20 -07001562 case ENABLE_VSYNC_INJECTIONS: {
1563 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1564 bool enable = false;
1565 status_t result = data.readBool(&enable);
1566 if (result != NO_ERROR) {
1567 ALOGE("enableVSyncInjections failed to readBool: %d", result);
1568 return result;
1569 }
1570 return enableVSyncInjections(enable);
1571 }
1572 case INJECT_VSYNC: {
1573 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1574 int64_t when = 0;
1575 status_t result = data.readInt64(&when);
1576 if (result != NO_ERROR) {
1577 ALOGE("enableVSyncInjections failed to readInt64: %d", result);
1578 return result;
1579 }
1580 return injectVSync(when);
1581 }
Kalle Raitaa099a242017-01-11 11:17:29 -08001582 case GET_LAYER_DEBUG_INFO: {
1583 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1584 std::vector<LayerDebugInfo> outLayers;
1585 status_t result = getLayerDebugInfo(&outLayers);
1586 reply->writeInt32(result);
1587 if (result == NO_ERROR)
1588 {
1589 result = reply->writeParcelableVector(outLayers);
1590 }
1591 return result;
1592 }
Peiyong Lin0256f722018-08-31 15:45:10 -07001593 case GET_COMPOSITION_PREFERENCE: {
1594 CHECK_INTERFACE(ISurfaceComposer, data, reply);
Peiyong Linc6780972018-10-28 15:24:08 -07001595 ui::Dataspace defaultDataspace;
1596 ui::PixelFormat defaultPixelFormat;
1597 ui::Dataspace wideColorGamutDataspace;
1598 ui::PixelFormat wideColorGamutPixelFormat;
1599 status_t error =
1600 getCompositionPreference(&defaultDataspace, &defaultPixelFormat,
1601 &wideColorGamutDataspace, &wideColorGamutPixelFormat);
Peiyong Lin0256f722018-08-31 15:45:10 -07001602 reply->writeInt32(error);
1603 if (error == NO_ERROR) {
Peiyong Linc6780972018-10-28 15:24:08 -07001604 reply->writeInt32(static_cast<int32_t>(defaultDataspace));
1605 reply->writeInt32(static_cast<int32_t>(defaultPixelFormat));
1606 reply->writeInt32(static_cast<int32_t>(wideColorGamutDataspace));
Peiyong Linaa3da6a2018-12-12 02:48:43 -08001607 reply->writeInt32(static_cast<int32_t>(wideColorGamutPixelFormat));
Peiyong Lin0256f722018-08-31 15:45:10 -07001608 }
Peiyong Lin3c2791e2019-01-14 17:05:18 -08001609 return error;
Peiyong Lin0256f722018-08-31 15:45:10 -07001610 }
Ady Abraham37965d42018-11-01 13:43:32 -07001611 case GET_COLOR_MANAGEMENT: {
Ady Abraham2a6ab2a2018-10-26 14:25:30 -07001612 CHECK_INTERFACE(ISurfaceComposer, data, reply);
Ady Abraham37965d42018-11-01 13:43:32 -07001613 bool result;
1614 status_t error = getColorManagement(&result);
1615 if (error == NO_ERROR) {
1616 reply->writeBool(result);
1617 }
Peiyong Lin3c2791e2019-01-14 17:05:18 -08001618 return error;
Ady Abraham2a6ab2a2018-10-26 14:25:30 -07001619 }
Kevin DuBois9c0a1762018-10-16 13:32:31 -07001620 case GET_DISPLAYED_CONTENT_SAMPLING_ATTRIBUTES: {
1621 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1622
1623 sp<IBinder> display = data.readStrongBinder();
1624 ui::PixelFormat format;
1625 ui::Dataspace dataspace;
1626 uint8_t component = 0;
1627 auto result =
1628 getDisplayedContentSamplingAttributes(display, &format, &dataspace, &component);
1629 if (result == NO_ERROR) {
1630 reply->writeUint32(static_cast<uint32_t>(format));
1631 reply->writeUint32(static_cast<uint32_t>(dataspace));
1632 reply->writeUint32(static_cast<uint32_t>(component));
1633 }
1634 return result;
1635 }
Kevin DuBois74e53772018-11-19 10:52:38 -08001636 case SET_DISPLAY_CONTENT_SAMPLING_ENABLED: {
1637 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1638
1639 sp<IBinder> display = nullptr;
1640 bool enable = false;
1641 int8_t componentMask = 0;
1642 uint64_t maxFrames = 0;
1643 status_t result = data.readStrongBinder(&display);
1644 if (result != NO_ERROR) {
1645 ALOGE("setDisplayContentSamplingEnabled failure in reading Display token: %d",
1646 result);
1647 return result;
1648 }
1649
1650 result = data.readBool(&enable);
1651 if (result != NO_ERROR) {
1652 ALOGE("setDisplayContentSamplingEnabled failure in reading enable: %d", result);
1653 return result;
1654 }
1655
1656 result = data.readByte(static_cast<int8_t*>(&componentMask));
1657 if (result != NO_ERROR) {
1658 ALOGE("setDisplayContentSamplingEnabled failure in reading component mask: %d",
1659 result);
1660 return result;
1661 }
1662
1663 result = data.readUint64(&maxFrames);
1664 if (result != NO_ERROR) {
1665 ALOGE("setDisplayContentSamplingEnabled failure in reading max frames: %d", result);
1666 return result;
1667 }
1668
1669 return setDisplayContentSamplingEnabled(display, enable,
1670 static_cast<uint8_t>(componentMask), maxFrames);
1671 }
Kevin DuBois1d4249a2018-08-29 10:45:14 -07001672 case GET_DISPLAYED_CONTENT_SAMPLE: {
1673 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1674
1675 sp<IBinder> display = data.readStrongBinder();
1676 uint64_t maxFrames = 0;
1677 uint64_t timestamp = 0;
1678
1679 status_t result = data.readUint64(&maxFrames);
1680 if (result != NO_ERROR) {
1681 ALOGE("getDisplayedContentSample failure in reading max frames: %d", result);
1682 return result;
1683 }
1684
1685 result = data.readUint64(&timestamp);
1686 if (result != NO_ERROR) {
1687 ALOGE("getDisplayedContentSample failure in reading timestamp: %d", result);
1688 return result;
1689 }
1690
1691 DisplayedFrameStats stats;
1692 result = getDisplayedContentSample(display, maxFrames, timestamp, &stats);
1693 if (result == NO_ERROR) {
1694 reply->writeUint64(stats.numFrames);
Kevin DuBois1d4c6a62018-12-12 13:59:46 -08001695 reply->writeUint64Vector(stats.component_0_sample);
1696 reply->writeUint64Vector(stats.component_1_sample);
1697 reply->writeUint64Vector(stats.component_2_sample);
1698 reply->writeUint64Vector(stats.component_3_sample);
Kevin DuBois1d4249a2018-08-29 10:45:14 -07001699 }
1700 return result;
1701 }
Peiyong Lin3c2791e2019-01-14 17:05:18 -08001702 case GET_PROTECTED_CONTENT_SUPPORT: {
1703 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1704 bool result;
1705 status_t error = getProtectedContentSupport(&result);
1706 if (error == NO_ERROR) {
1707 reply->writeBool(result);
1708 }
1709 return error;
1710 }
Peiyong Lin4f3fddf2019-01-24 17:21:24 -08001711 case IS_WIDE_COLOR_DISPLAY: {
1712 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1713 sp<IBinder> display = nullptr;
1714 status_t error = data.readStrongBinder(&display);
1715 if (error != NO_ERROR) {
1716 return error;
1717 }
1718 bool result;
1719 error = isWideColorDisplay(display, &result);
1720 if (error == NO_ERROR) {
1721 reply->writeBool(result);
1722 }
1723 return error;
1724 }
Dan Stoza84ab9372018-12-17 15:27:57 -08001725 case ADD_REGION_SAMPLING_LISTENER: {
1726 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1727 Rect samplingArea;
1728 status_t result = data.read(samplingArea);
1729 if (result != NO_ERROR) {
1730 ALOGE("addRegionSamplingListener: Failed to read sampling area");
1731 return result;
1732 }
1733 sp<IBinder> stopLayerHandle;
1734 result = data.readNullableStrongBinder(&stopLayerHandle);
1735 if (result != NO_ERROR) {
1736 ALOGE("addRegionSamplingListener: Failed to read stop layer handle");
1737 return result;
1738 }
1739 sp<IRegionSamplingListener> listener;
1740 result = data.readNullableStrongBinder(&listener);
1741 if (result != NO_ERROR) {
1742 ALOGE("addRegionSamplingListener: Failed to read listener");
1743 return result;
1744 }
1745 return addRegionSamplingListener(samplingArea, stopLayerHandle, listener);
1746 }
1747 case REMOVE_REGION_SAMPLING_LISTENER: {
1748 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1749 sp<IRegionSamplingListener> listener;
1750 status_t result = data.readNullableStrongBinder(&listener);
1751 if (result != NO_ERROR) {
1752 ALOGE("removeRegionSamplingListener: Failed to read listener");
1753 return result;
1754 }
1755 return removeRegionSamplingListener(listener);
1756 }
Alec Mouriadebf5c2021-01-05 12:57:36 -08001757 case ADD_FPS_LISTENER: {
1758 CHECK_INTERFACE(ISurfaceComposer, data, reply);
Alec Mouria9a68a62021-03-04 19:14:50 -08001759 int32_t taskId;
1760 status_t result = data.readInt32(&taskId);
Alec Mouriadebf5c2021-01-05 12:57:36 -08001761 if (result != NO_ERROR) {
1762 ALOGE("addFpsListener: Failed to read layer handle");
1763 return result;
1764 }
1765 sp<gui::IFpsListener> listener;
1766 result = data.readNullableStrongBinder(&listener);
1767 if (result != NO_ERROR) {
1768 ALOGE("addFpsListener: Failed to read listener");
1769 return result;
1770 }
Alec Mouria9a68a62021-03-04 19:14:50 -08001771 return addFpsListener(taskId, listener);
Alec Mouriadebf5c2021-01-05 12:57:36 -08001772 }
1773 case REMOVE_FPS_LISTENER: {
1774 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1775 sp<gui::IFpsListener> listener;
1776 status_t result = data.readNullableStrongBinder(&listener);
1777 if (result != NO_ERROR) {
1778 ALOGE("removeFpsListener: Failed to read listener");
1779 return result;
1780 }
1781 return removeFpsListener(listener);
1782 }
Galia Peycheva8f04b302021-04-27 13:25:38 +02001783 case ADD_TUNNEL_MODE_ENABLED_LISTENER: {
1784 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1785 sp<gui::ITunnelModeEnabledListener> listener;
1786 status_t result = data.readNullableStrongBinder(&listener);
1787 if (result != NO_ERROR) {
1788 ALOGE("addTunnelModeEnabledListener: Failed to read listener");
1789 return result;
1790 }
1791 return addTunnelModeEnabledListener(listener);
1792 }
1793 case REMOVE_TUNNEL_MODE_ENABLED_LISTENER: {
1794 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1795 sp<gui::ITunnelModeEnabledListener> listener;
1796 status_t result = data.readNullableStrongBinder(&listener);
1797 if (result != NO_ERROR) {
1798 ALOGE("removeTunnelModeEnabledListener: Failed to read listener");
1799 return result;
1800 }
1801 return removeTunnelModeEnabledListener(listener);
1802 }
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001803 case SET_DESIRED_DISPLAY_MODE_SPECS: {
Ana Krulec0782b882019-10-15 17:34:54 -07001804 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1805 sp<IBinder> displayToken = data.readStrongBinder();
Marin Shalamanov228f46b2021-01-28 21:11:45 +01001806 ui::DisplayModeId defaultMode;
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001807 status_t result = data.readInt32(&defaultMode);
Ana Krulec0782b882019-10-15 17:34:54 -07001808 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001809 ALOGE("setDesiredDisplayModeSpecs: failed to read defaultMode: %d", result);
Ana Krulec0782b882019-10-15 17:34:54 -07001810 return result;
1811 }
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001812 if (defaultMode < 0) {
1813 ALOGE("%s: defaultMode must be non-negative but it was %d", __func__, defaultMode);
1814 return BAD_VALUE;
1815 }
Marin Shalamanov30b0b3c2020-10-13 19:15:06 +02001816 bool allowGroupSwitching;
1817 result = data.readBool(&allowGroupSwitching);
1818 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001819 ALOGE("setDesiredDisplayModeSpecs: failed to read allowGroupSwitching: %d", result);
Marin Shalamanov30b0b3c2020-10-13 19:15:06 +02001820 return result;
1821 }
Steven Thomasf734df42020-04-13 21:09:28 -07001822 float primaryRefreshRateMin;
1823 result = data.readFloat(&primaryRefreshRateMin);
Ana Krulec0782b882019-10-15 17:34:54 -07001824 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001825 ALOGE("setDesiredDisplayModeSpecs: failed to read primaryRefreshRateMin: %d",
Steven Thomasf734df42020-04-13 21:09:28 -07001826 result);
Ana Krulec0782b882019-10-15 17:34:54 -07001827 return result;
1828 }
Steven Thomasf734df42020-04-13 21:09:28 -07001829 float primaryRefreshRateMax;
1830 result = data.readFloat(&primaryRefreshRateMax);
Ana Krulec0782b882019-10-15 17:34:54 -07001831 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001832 ALOGE("setDesiredDisplayModeSpecs: failed to read primaryRefreshRateMax: %d",
Steven Thomasf734df42020-04-13 21:09:28 -07001833 result);
Ana Krulec0782b882019-10-15 17:34:54 -07001834 return result;
1835 }
Steven Thomasf734df42020-04-13 21:09:28 -07001836 float appRequestRefreshRateMin;
1837 result = data.readFloat(&appRequestRefreshRateMin);
1838 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001839 ALOGE("setDesiredDisplayModeSpecs: failed to read appRequestRefreshRateMin: %d",
Steven Thomasf734df42020-04-13 21:09:28 -07001840 result);
1841 return result;
1842 }
1843 float appRequestRefreshRateMax;
1844 result = data.readFloat(&appRequestRefreshRateMax);
1845 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001846 ALOGE("setDesiredDisplayModeSpecs: failed to read appRequestRefreshRateMax: %d",
Steven Thomasf734df42020-04-13 21:09:28 -07001847 result);
1848 return result;
1849 }
Marin Shalamanov228f46b2021-01-28 21:11:45 +01001850 result = setDesiredDisplayModeSpecs(displayToken, defaultMode, allowGroupSwitching,
1851 primaryRefreshRateMin, primaryRefreshRateMax,
1852 appRequestRefreshRateMin, appRequestRefreshRateMax);
Ana Krulec0782b882019-10-15 17:34:54 -07001853 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001854 ALOGE("setDesiredDisplayModeSpecs: failed to call setDesiredDisplayModeSpecs: "
Ana Krulec0782b882019-10-15 17:34:54 -07001855 "%d",
1856 result);
1857 return result;
1858 }
1859 reply->writeInt32(result);
1860 return result;
1861 }
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001862 case GET_DESIRED_DISPLAY_MODE_SPECS: {
Ana Krulec234bb162019-11-10 22:55:55 +01001863 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1864 sp<IBinder> displayToken = data.readStrongBinder();
Marin Shalamanov228f46b2021-01-28 21:11:45 +01001865 ui::DisplayModeId defaultMode;
Marin Shalamanov30b0b3c2020-10-13 19:15:06 +02001866 bool allowGroupSwitching;
Steven Thomasf734df42020-04-13 21:09:28 -07001867 float primaryRefreshRateMin;
1868 float primaryRefreshRateMax;
1869 float appRequestRefreshRateMin;
1870 float appRequestRefreshRateMax;
Ana Krulec234bb162019-11-10 22:55:55 +01001871
Steven Thomasf734df42020-04-13 21:09:28 -07001872 status_t result =
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001873 getDesiredDisplayModeSpecs(displayToken, &defaultMode, &allowGroupSwitching,
1874 &primaryRefreshRateMin, &primaryRefreshRateMax,
1875 &appRequestRefreshRateMin,
1876 &appRequestRefreshRateMax);
Ana Krulec234bb162019-11-10 22:55:55 +01001877 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001878 ALOGE("getDesiredDisplayModeSpecs: failed to get getDesiredDisplayModeSpecs: "
Ana Krulec234bb162019-11-10 22:55:55 +01001879 "%d",
1880 result);
1881 return result;
1882 }
1883
Marin Shalamanov228f46b2021-01-28 21:11:45 +01001884 result = reply->writeInt32(defaultMode);
Ana Krulec234bb162019-11-10 22:55:55 +01001885 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001886 ALOGE("getDesiredDisplayModeSpecs: failed to write defaultMode: %d", result);
Ana Krulec234bb162019-11-10 22:55:55 +01001887 return result;
1888 }
Marin Shalamanov30b0b3c2020-10-13 19:15:06 +02001889 result = reply->writeBool(allowGroupSwitching);
1890 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001891 ALOGE("getDesiredDisplayModeSpecs: failed to write allowGroupSwitching: %d",
Marin Shalamanov30b0b3c2020-10-13 19:15:06 +02001892 result);
1893 return result;
1894 }
Steven Thomasf734df42020-04-13 21:09:28 -07001895 result = reply->writeFloat(primaryRefreshRateMin);
Ana Krulec234bb162019-11-10 22:55:55 +01001896 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001897 ALOGE("getDesiredDisplayModeSpecs: failed to write primaryRefreshRateMin: %d",
Steven Thomasf734df42020-04-13 21:09:28 -07001898 result);
Ana Krulec234bb162019-11-10 22:55:55 +01001899 return result;
1900 }
Steven Thomasf734df42020-04-13 21:09:28 -07001901 result = reply->writeFloat(primaryRefreshRateMax);
Ana Krulec234bb162019-11-10 22:55:55 +01001902 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001903 ALOGE("getDesiredDisplayModeSpecs: failed to write primaryRefreshRateMax: %d",
Steven Thomasf734df42020-04-13 21:09:28 -07001904 result);
1905 return result;
1906 }
1907 result = reply->writeFloat(appRequestRefreshRateMin);
1908 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001909 ALOGE("getDesiredDisplayModeSpecs: failed to write appRequestRefreshRateMin: %d",
Steven Thomasf734df42020-04-13 21:09:28 -07001910 result);
1911 return result;
1912 }
1913 result = reply->writeFloat(appRequestRefreshRateMax);
1914 if (result != NO_ERROR) {
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001915 ALOGE("getDesiredDisplayModeSpecs: failed to write appRequestRefreshRateMax: %d",
Steven Thomasf734df42020-04-13 21:09:28 -07001916 result);
Ana Krulec234bb162019-11-10 22:55:55 +01001917 return result;
1918 }
1919 reply->writeInt32(result);
1920 return result;
1921 }
Dan Gittik57e63c52019-01-18 16:37:54 +00001922 case GET_DISPLAY_BRIGHTNESS_SUPPORT: {
1923 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1924 sp<IBinder> displayToken;
1925 status_t error = data.readNullableStrongBinder(&displayToken);
1926 if (error != NO_ERROR) {
1927 ALOGE("getDisplayBrightnessSupport: failed to read display token: %d", error);
1928 return error;
1929 }
1930 bool support = false;
1931 error = getDisplayBrightnessSupport(displayToken, &support);
1932 reply->writeBool(support);
1933 return error;
1934 }
1935 case SET_DISPLAY_BRIGHTNESS: {
1936 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1937 sp<IBinder> displayToken;
1938 status_t error = data.readNullableStrongBinder(&displayToken);
1939 if (error != NO_ERROR) {
1940 ALOGE("setDisplayBrightness: failed to read display token: %d", error);
1941 return error;
1942 }
John Reck22be6962021-03-10 12:59:54 -05001943 gui::DisplayBrightness brightness;
1944 error = data.readParcelable(&brightness);
Dan Gittik57e63c52019-01-18 16:37:54 +00001945 if (error != NO_ERROR) {
1946 ALOGE("setDisplayBrightness: failed to read brightness: %d", error);
1947 return error;
1948 }
1949 return setDisplayBrightness(displayToken, brightness);
1950 }
John Reck88270902021-03-18 11:27:35 -04001951 case ADD_HDR_LAYER_INFO_LISTENER: {
1952 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1953 sp<IBinder> displayToken;
1954 status_t error = data.readNullableStrongBinder(&displayToken);
1955 if (error != NO_ERROR) {
1956 ALOGE("addHdrLayerInfoListener: Failed to read display token");
1957 return error;
1958 }
1959 sp<gui::IHdrLayerInfoListener> listener;
1960 error = data.readNullableStrongBinder(&listener);
1961 if (error != NO_ERROR) {
1962 ALOGE("addHdrLayerInfoListener: Failed to read listener");
1963 return error;
1964 }
1965 return addHdrLayerInfoListener(displayToken, listener);
1966 }
1967 case REMOVE_HDR_LAYER_INFO_LISTENER: {
1968 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1969 sp<IBinder> displayToken;
1970 status_t error = data.readNullableStrongBinder(&displayToken);
1971 if (error != NO_ERROR) {
1972 ALOGE("removeHdrLayerInfoListener: Failed to read display token");
1973 return error;
1974 }
1975 sp<gui::IHdrLayerInfoListener> listener;
1976 error = data.readNullableStrongBinder(&listener);
1977 if (error != NO_ERROR) {
1978 ALOGE("removeHdrLayerInfoListener: Failed to read listener");
1979 return error;
1980 }
1981 return removeHdrLayerInfoListener(displayToken, listener);
1982 }
Lais Andrade3a6e47d2020-04-02 11:20:16 +01001983 case NOTIFY_POWER_BOOST: {
Ady Abraham8532d012019-05-08 14:50:56 -07001984 CHECK_INTERFACE(ISurfaceComposer, data, reply);
Lais Andrade3a6e47d2020-04-02 11:20:16 +01001985 int32_t boostId;
1986 status_t error = data.readInt32(&boostId);
Ady Abraham8532d012019-05-08 14:50:56 -07001987 if (error != NO_ERROR) {
Lais Andrade3a6e47d2020-04-02 11:20:16 +01001988 ALOGE("notifyPowerBoost: failed to read boostId: %d", error);
Ady Abraham8532d012019-05-08 14:50:56 -07001989 return error;
1990 }
Lais Andrade3a6e47d2020-04-02 11:20:16 +01001991 return notifyPowerBoost(boostId);
Ady Abraham8532d012019-05-08 14:50:56 -07001992 }
Vishnu Nairb13bb952019-11-15 10:24:08 -08001993 case SET_GLOBAL_SHADOW_SETTINGS: {
1994 CHECK_INTERFACE(ISurfaceComposer, data, reply);
1995
1996 std::vector<float> shadowConfig;
1997 status_t error = data.readFloatVector(&shadowConfig);
1998 if (error != NO_ERROR || shadowConfig.size() != 11) {
1999 ALOGE("setGlobalShadowSettings: failed to read shadowConfig: %d", error);
2000 return error;
2001 }
2002
2003 half4 ambientColor = {shadowConfig[0], shadowConfig[1], shadowConfig[2],
2004 shadowConfig[3]};
2005 half4 spotColor = {shadowConfig[4], shadowConfig[5], shadowConfig[6], shadowConfig[7]};
2006 float lightPosY = shadowConfig[8];
2007 float lightPosZ = shadowConfig[9];
2008 float lightRadius = shadowConfig[10];
2009 return setGlobalShadowSettings(ambientColor, spotColor, lightPosY, lightPosZ,
2010 lightRadius);
2011 }
Leon Scroggins IIIe5cff632021-12-29 11:53:36 -05002012 case GET_DISPLAY_DECORATION_SUPPORT: {
2013 CHECK_INTERFACE(ISurfaceComposer, data, reply);
2014 sp<IBinder> displayToken;
Leon Scroggins IIIe7c51c62022-02-01 15:53:54 -05002015 SAFE_PARCEL(data.readNullableStrongBinder, &displayToken);
2016 std::optional<common::DisplayDecorationSupport> support;
2017 auto error = getDisplayDecorationSupport(displayToken, &support);
Leon Scroggins IIIe5cff632021-12-29 11:53:36 -05002018 if (error != NO_ERROR) {
Leon Scroggins IIIe7c51c62022-02-01 15:53:54 -05002019 ALOGE("getDisplayDecorationSupport failed with error %d", error);
Leon Scroggins IIIe5cff632021-12-29 11:53:36 -05002020 return error;
2021 }
Leon Scroggins IIIe7c51c62022-02-01 15:53:54 -05002022 reply->writeBool(support.has_value());
2023 if (support) {
2024 reply->writeInt32(static_cast<int32_t>(support.value().format));
2025 reply->writeInt32(static_cast<int32_t>(support.value().alphaInterpretation));
2026 }
Leon Scroggins IIIe5cff632021-12-29 11:53:36 -05002027 return error;
2028 }
Steven Thomas62a4cf82020-01-31 12:04:03 -08002029 case SET_FRAME_RATE: {
2030 CHECK_INTERFACE(ISurfaceComposer, data, reply);
2031 sp<IBinder> binder;
Marin Shalamanovc5986772021-03-16 16:09:49 +01002032 SAFE_PARCEL(data.readStrongBinder, &binder);
2033
Steven Thomas62a4cf82020-01-31 12:04:03 -08002034 sp<IGraphicBufferProducer> surface = interface_cast<IGraphicBufferProducer>(binder);
2035 if (!surface) {
Marin Shalamanovc5986772021-03-16 16:09:49 +01002036 ALOGE("setFrameRate: failed to cast to IGraphicBufferProducer");
2037 return BAD_VALUE;
Steven Thomas62a4cf82020-01-31 12:04:03 -08002038 }
2039 float frameRate;
Marin Shalamanovc5986772021-03-16 16:09:49 +01002040 SAFE_PARCEL(data.readFloat, &frameRate);
2041
Steven Thomas62a4cf82020-01-31 12:04:03 -08002042 int8_t compatibility;
Marin Shalamanovc5986772021-03-16 16:09:49 +01002043 SAFE_PARCEL(data.readByte, &compatibility);
2044
2045 int8_t changeFrameRateStrategy;
2046 SAFE_PARCEL(data.readByte, &changeFrameRateStrategy);
2047
2048 status_t result =
2049 setFrameRate(surface, frameRate, compatibility, changeFrameRateStrategy);
Steven Thomas62a4cf82020-01-31 12:04:03 -08002050 reply->writeInt32(result);
2051 return NO_ERROR;
2052 }
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10002053 case SET_FRAME_TIMELINE_INFO: {
Ady Abraham74e17562020-08-24 18:18:19 -07002054 CHECK_INTERFACE(ISurfaceComposer, data, reply);
2055 sp<IBinder> binder;
2056 status_t err = data.readStrongBinder(&binder);
2057 if (err != NO_ERROR) {
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10002058 ALOGE("setFrameTimelineInfo: failed to read strong binder: %s (%d)", strerror(-err),
2059 -err);
Ady Abraham74e17562020-08-24 18:18:19 -07002060 return err;
2061 }
2062 sp<IGraphicBufferProducer> surface = interface_cast<IGraphicBufferProducer>(binder);
2063 if (!surface) {
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10002064 ALOGE("setFrameTimelineInfo: failed to cast to IGraphicBufferProducer: %s (%d)",
Ady Abraham74e17562020-08-24 18:18:19 -07002065 strerror(-err), -err);
2066 return err;
2067 }
Ady Abraham74e17562020-08-24 18:18:19 -07002068
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10002069 FrameTimelineInfo frameTimelineInfo;
2070 SAFE_PARCEL(frameTimelineInfo.read, data);
2071
2072 status_t result = setFrameTimelineInfo(surface, frameTimelineInfo);
Ady Abraham74e17562020-08-24 18:18:19 -07002073 reply->writeInt32(result);
2074 return NO_ERROR;
2075 }
Pablo Gamito6ee484d2020-07-30 14:26:28 +00002076 case ADD_TRANSACTION_TRACE_LISTENER: {
2077 CHECK_INTERFACE(ISurfaceComposer, data, reply);
2078 sp<gui::ITransactionTraceListener> listener;
2079 SAFE_PARCEL(data.readStrongBinder, &listener);
2080
2081 return addTransactionTraceListener(listener);
2082 }
Ana Krulec31f2b3c2020-12-14 14:30:09 -08002083 case GET_GPU_CONTEXT_PRIORITY: {
2084 CHECK_INTERFACE(ISurfaceComposer, data, reply);
2085 int priority = getGPUContextPriority();
2086 SAFE_PARCEL(reply->writeInt32, priority);
2087 return NO_ERROR;
2088 }
Ady Abraham899dcdb2021-06-15 16:56:21 -07002089 case GET_MAX_ACQUIRED_BUFFER_COUNT: {
Ady Abraham564f9de2021-02-03 18:34:33 -08002090 CHECK_INTERFACE(ISurfaceComposer, data, reply);
Ady Abraham899dcdb2021-06-15 16:56:21 -07002091 int buffers = 0;
2092 int err = getMaxAcquiredBufferCount(&buffers);
Ady Abraham564f9de2021-02-03 18:34:33 -08002093 if (err != NO_ERROR) {
2094 return err;
2095 }
Ady Abraham899dcdb2021-06-15 16:56:21 -07002096 SAFE_PARCEL(reply->writeInt32, buffers);
Ady Abraham564f9de2021-02-03 18:34:33 -08002097 return NO_ERROR;
2098 }
Kriti Dang49ad4132021-01-08 11:49:56 +01002099 case OVERRIDE_HDR_TYPES: {
2100 CHECK_INTERFACE(ISurfaceComposer, data, reply);
2101 sp<IBinder> display = nullptr;
2102 SAFE_PARCEL(data.readStrongBinder, &display);
2103
2104 std::vector<int32_t> hdrTypes;
2105 SAFE_PARCEL(data.readInt32Vector, &hdrTypes);
2106
2107 std::vector<ui::Hdr> hdrTypesVector;
2108 for (int i : hdrTypes) {
2109 hdrTypesVector.push_back(static_cast<ui::Hdr>(i));
2110 }
2111 return overrideHdrTypes(display, hdrTypesVector);
2112 }
Tej Singhe2751772021-04-06 22:05:29 -07002113 case ON_PULL_ATOM: {
2114 CHECK_INTERFACE(ISurfaceComposer, data, reply);
2115 int32_t atomId = 0;
2116 SAFE_PARCEL(data.readInt32, &atomId);
2117
2118 std::string pulledData;
2119 bool success;
2120 status_t err = onPullAtom(atomId, &pulledData, &success);
2121 SAFE_PARCEL(reply->writeByteArray, pulledData.size(),
2122 reinterpret_cast<const uint8_t*>(pulledData.data()));
2123 SAFE_PARCEL(reply->writeBool, success);
2124 return err;
2125 }
chaviw60c9d3e2021-06-04 12:52:17 -05002126 case ADD_WINDOW_INFOS_LISTENER: {
2127 CHECK_INTERFACE(ISurfaceComposer, data, reply);
2128 sp<IWindowInfosListener> listener;
2129 SAFE_PARCEL(data.readStrongBinder, &listener);
2130
2131 return addWindowInfosListener(listener);
2132 }
2133 case REMOVE_WINDOW_INFOS_LISTENER: {
2134 CHECK_INTERFACE(ISurfaceComposer, data, reply);
2135 sp<IWindowInfosListener> listener;
2136 SAFE_PARCEL(data.readStrongBinder, &listener);
2137
2138 return removeWindowInfosListener(listener);
2139 }
Andy Yu2ae6b6b2021-11-18 14:51:06 -08002140 case SET_OVERRIDE_FRAME_RATE: {
2141 CHECK_INTERFACE(ISurfaceComposer, data, reply);
2142
2143 uid_t uid;
2144 SAFE_PARCEL(data.readUint32, &uid);
2145
2146 float frameRate;
2147 SAFE_PARCEL(data.readFloat, &frameRate);
2148
2149 return setOverrideFrameRate(uid, frameRate);
2150 }
Jesse Hall6c913be2013-08-08 12:15:49 -07002151 default: {
Mathias Agopian83c04462009-05-22 19:00:22 -07002152 return BBinder::onTransact(code, data, reply, flags);
Jesse Hall6c913be2013-08-08 12:15:49 -07002153 }
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08002154 }
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08002155}
2156
Dominik Laskowskidcb38bb2019-01-25 02:35:50 -08002157} // namespace android