blob: 09144806ee05550a29f03a8d0703aecc7d076927 [file] [log] [blame]
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001/*
2 * Copyright (C) 2010 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#include <stdint.h>
18#include <sys/types.h>
19
20#include <utils/Errors.h>
Jesse Hall399184a2014-03-03 15:42:54 -080021#include <utils/NativeHandle.h>
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080022#include <utils/RefBase.h>
Brian Anderson175a7202016-10-10 16:52:56 -070023#include <utils/String8.h>
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080024#include <utils/Timers.h>
Jesse Hall399184a2014-03-03 15:42:54 -080025#include <utils/Vector.h>
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080026
27#include <binder/Parcel.h>
28#include <binder/IInterface.h>
29
Chia-I Wuc79a2962017-05-15 10:32:27 -070030#include <gui/BufferQueueDefs.h>
Ady Abraham107788e2023-10-17 12:31:08 -070031
Andy McFadden2adaf042012-12-18 09:49:45 -080032#include <gui/IGraphicBufferProducer.h>
Dan Stozaf0eaf252014-03-21 13:05:51 -070033#include <gui/IProducerListener.h>
Ady Abraham6cdd3fd2023-09-07 18:45:58 -070034#include <gui/bufferqueue/1.0/H2BGraphicBufferProducer.h>
35#include <gui/bufferqueue/2.0/H2BGraphicBufferProducer.h>
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080036
37namespace android {
38// ----------------------------------------------------------------------------
39
Pawin Vongmasae672cd02019-02-14 16:01:29 -080040using H2BGraphicBufferProducerV1_0 =
41 ::android::hardware::graphics::bufferqueue::V1_0::utils::
42 H2BGraphicBufferProducer;
43using H2BGraphicBufferProducerV2_0 =
44 ::android::hardware::graphics::bufferqueue::V2_0::utils::
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -080045 H2BGraphicBufferProducer;
46
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080047enum {
48 REQUEST_BUFFER = IBinder::FIRST_CALL_TRANSACTION,
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080049 DEQUEUE_BUFFER,
Dan Stoza9f3053d2014-03-06 15:14:33 -080050 DETACH_BUFFER,
Dan Stozad9822a32014-03-28 15:25:31 -070051 DETACH_NEXT_BUFFER,
Dan Stoza9f3053d2014-03-06 15:14:33 -080052 ATTACH_BUFFER,
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080053 QUEUE_BUFFER,
54 CANCEL_BUFFER,
Mathias Agopianeafabcd2011-04-20 14:20:59 -070055 QUERY,
Jamie Gennisfe0a87b2011-07-13 19:12:20 -070056 CONNECT,
57 DISCONNECT,
Jesse Hall399184a2014-03-03 15:42:54 -080058 SET_SIDEBAND_STREAM,
Dan Stoza29a3e902014-06-20 13:13:57 -070059 ALLOCATE_BUFFERS,
Dan Stoza9de72932015-04-16 17:28:43 -070060 ALLOW_ALLOCATION,
Dan Stoza812ed062015-06-02 15:45:22 -070061 SET_GENERATION_NUMBER,
Dan Stozac6f30bd2015-06-08 09:32:50 -070062 GET_CONSUMER_NAME,
Pablo Ceballosfa455352015-08-12 17:47:47 -070063 SET_MAX_DEQUEUED_BUFFER_COUNT,
Dan Stoza7dde5992015-05-22 09:51:44 -070064 SET_ASYNC_MODE,
Pablo Ceballos3559fbf2016-03-17 15:50:23 -070065 SET_SHARED_BUFFER_MODE,
Pablo Ceballosff95aab2016-01-13 17:09:58 -080066 SET_AUTO_REFRESH,
Dan Stoza127fc632015-06-30 13:43:32 -070067 SET_DEQUEUE_TIMEOUT,
Dan Stoza50101d02016-04-07 16:53:23 -070068 GET_LAST_QUEUED_BUFFER,
Pablo Ceballosfc352582016-06-30 17:22:20 -070069 GET_FRAME_TIMESTAMPS,
Chia-I Wue2786ea2017-08-07 10:36:08 -070070 GET_UNIQUE_ID,
71 GET_CONSUMER_USAGE,
Sungtak Lee3249fb62019-03-02 16:40:47 -080072 SET_LEGACY_BUFFER_DROP,
Yiwei Zhang538cedc2019-06-24 19:35:03 -070073 SET_AUTO_PREROTATION,
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +070074 REQUEST_BUFFERS,
75 DEQUEUE_BUFFERS,
76 DETACH_BUFFERS,
77 ATTACH_BUFFERS,
78 QUEUE_BUFFERS,
79 CANCEL_BUFFERS,
80 QUERY_MULTIPLE,
John Reckaa5a0b22021-05-18 00:42:56 -040081 GET_LAST_QUEUED_BUFFER2,
Ady Abraham6cdd3fd2023-09-07 18:45:58 -070082 SET_FRAME_RATE,
John Reckdb164ff2024-04-03 16:59:28 -040083 SET_ADDITIONAL_OPTIONS,
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080084};
85
Andy McFadden2adaf042012-12-18 09:49:45 -080086class BpGraphicBufferProducer : public BpInterface<IGraphicBufferProducer>
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080087{
88public:
Chih-Hung Hsiehe2347b72016-04-25 15:41:05 -070089 explicit BpGraphicBufferProducer(const sp<IBinder>& impl)
Andy McFadden2adaf042012-12-18 09:49:45 -080090 : BpInterface<IGraphicBufferProducer>(impl)
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080091 {
92 }
93
Yi Kongca038512017-05-02 16:55:24 -070094 ~BpGraphicBufferProducer() override;
Dan Stoza3be1c6b2014-11-18 10:24:03 -080095
Jamie Gennis7b305ff2011-07-19 12:08:33 -070096 virtual status_t requestBuffer(int bufferIdx, sp<GraphicBuffer>* buf) {
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080097 Parcel data, reply;
Andy McFadden2adaf042012-12-18 09:49:45 -080098 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080099 data.writeInt32(bufferIdx);
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +0700100 status_t result = remote()->transact(REQUEST_BUFFER, data, &reply);
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700101 if (result != NO_ERROR) {
102 return result;
103 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800104 bool nonNull = reply.readInt32();
105 if (nonNull) {
Jamie Gennis7b305ff2011-07-19 12:08:33 -0700106 *buf = new GraphicBuffer();
Lingyun Zhu2aff7022012-11-20 19:24:35 +0800107 result = reply.read(**buf);
108 if(result != NO_ERROR) {
109 (*buf).clear();
110 return result;
111 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800112 }
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700113 result = reply.readInt32();
Jamie Gennis7b305ff2011-07-19 12:08:33 -0700114 return result;
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800115 }
116
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +0700117 virtual status_t requestBuffers(
118 const std::vector<int32_t>& slots,
119 std::vector<RequestBufferOutput>* outputs) override {
120 Parcel data, reply;
121 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
122 data.writeInt32Vector(slots);
123 status_t result = remote()->transact(REQUEST_BUFFERS, data, &reply);
124 if (result != NO_ERROR) {
125 return result;
126 }
127 result = reply.resizeOutVector(outputs);
128 for (RequestBufferOutput& output : *outputs) {
129 if (result != NO_ERROR) {
130 return result;
131 }
132 result = reply.read(output);
133 }
134
135 return result;
136 }
137
Pablo Ceballosfa455352015-08-12 17:47:47 -0700138 virtual status_t setMaxDequeuedBufferCount(int maxDequeuedBuffers) {
139 Parcel data, reply;
140 data.writeInterfaceToken(
141 IGraphicBufferProducer::getInterfaceDescriptor());
142 data.writeInt32(maxDequeuedBuffers);
143 status_t result = remote()->transact(SET_MAX_DEQUEUED_BUFFER_COUNT,
144 data, &reply);
145 if (result != NO_ERROR) {
146 return result;
147 }
148 result = reply.readInt32();
149 return result;
150 }
151
152 virtual status_t setAsyncMode(bool async) {
153 Parcel data, reply;
154 data.writeInterfaceToken(
155 IGraphicBufferProducer::getInterfaceDescriptor());
156 data.writeInt32(async);
157 status_t result = remote()->transact(SET_ASYNC_MODE,
158 data, &reply);
159 if (result != NO_ERROR) {
160 return result;
161 }
162 result = reply.readInt32();
163 return result;
164 }
165
Ian Elliotta2eb34c2017-07-18 11:05:49 -0600166 virtual status_t dequeueBuffer(int* buf, sp<Fence>* fence, uint32_t width, uint32_t height,
167 PixelFormat format, uint64_t usage, uint64_t* outBufferAge,
168 FrameEventHistoryDelta* outTimestamps) {
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800169 Parcel data, reply;
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700170 bool getFrameTimestamps = (outTimestamps != nullptr);
Brian Andersonbaaad322016-07-22 15:55:13 -0700171
Andy McFadden2adaf042012-12-18 09:49:45 -0800172 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800173 data.writeUint32(width);
174 data.writeUint32(height);
175 data.writeInt32(static_cast<int32_t>(format));
Mathias Agopiancb496ac2017-05-22 14:21:00 -0700176 data.writeUint64(usage);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700177 data.writeBool(getFrameTimestamps);
Brian Andersonbaaad322016-07-22 15:55:13 -0700178
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700179 status_t result = remote()->transact(DEQUEUE_BUFFER, data, &reply);
180 if (result != NO_ERROR) {
181 return result;
182 }
Brian Andersonbaaad322016-07-22 15:55:13 -0700183
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800184 *buf = reply.readInt32();
Brian Andersonbaaad322016-07-22 15:55:13 -0700185 *fence = new Fence();
186 result = reply.read(**fence);
187 if (result != NO_ERROR) {
188 fence->clear();
189 return result;
Jesse Hallf7857542012-06-14 15:26:33 -0700190 }
Ian Elliotta2eb34c2017-07-18 11:05:49 -0600191 if (outBufferAge) {
192 result = reply.readUint64(outBufferAge);
193 } else {
194 // Read the value even if outBufferAge is nullptr:
195 uint64_t bufferAge;
196 result = reply.readUint64(&bufferAge);
197 }
198 if (result != NO_ERROR) {
199 ALOGE("IGBP::dequeueBuffer failed to read buffer age: %d", result);
200 return result;
201 }
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700202 if (getFrameTimestamps) {
203 result = reply.read(*outTimestamps);
204 if (result != NO_ERROR) {
205 ALOGE("IGBP::dequeueBuffer failed to read timestamps: %d",
206 result);
207 return result;
208 }
209 }
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700210 result = reply.readInt32();
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800211 return result;
212 }
213
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +0700214 virtual status_t dequeueBuffers(
215 const std::vector<DequeueBufferInput>& inputs,
216 std::vector<DequeueBufferOutput>* outputs) {
217 Parcel data, reply;
218 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
219 data.writeVectorSize(inputs);
220 for (const auto& input : inputs) {
221 data.write(input);
222 }
223 status_t result = remote()->transact(DEQUEUE_BUFFERS, data, &reply);
224 if (result != NO_ERROR) {
225 return result;
226 }
227 result = reply.resizeOutVector(outputs);
228 for (auto& output : *outputs) {
229 if (result != NO_ERROR) {
230 return result;
231 }
232 result = reply.read(output);
233 }
234 return result;
235 }
236
Dan Stoza9f3053d2014-03-06 15:14:33 -0800237 virtual status_t detachBuffer(int slot) {
238 Parcel data, reply;
239 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
240 data.writeInt32(slot);
241 status_t result = remote()->transact(DETACH_BUFFER, data, &reply);
242 if (result != NO_ERROR) {
243 return result;
244 }
245 result = reply.readInt32();
246 return result;
247 }
248
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +0700249 virtual status_t detachBuffers(const std::vector<int32_t>& slots,
250 std::vector<status_t>* results) {
251 Parcel data, reply;
252 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
253 data.writeInt32Vector(slots);
254 status_t result = remote()->transact(DETACH_BUFFERS, data, &reply);
255 if (result != NO_ERROR) {
256 return result;
257 }
258 result = reply.readInt32Vector(results);
259 return result;
260 }
261
Dan Stozad9822a32014-03-28 15:25:31 -0700262 virtual status_t detachNextBuffer(sp<GraphicBuffer>* outBuffer,
263 sp<Fence>* outFence) {
Yi Kong48a619f2018-06-05 16:34:59 -0700264 if (outBuffer == nullptr) {
Dan Stozad9822a32014-03-28 15:25:31 -0700265 ALOGE("detachNextBuffer: outBuffer must not be NULL");
266 return BAD_VALUE;
Yi Kong48a619f2018-06-05 16:34:59 -0700267 } else if (outFence == nullptr) {
Dan Stozad9822a32014-03-28 15:25:31 -0700268 ALOGE("detachNextBuffer: outFence must not be NULL");
269 return BAD_VALUE;
270 }
271 Parcel data, reply;
272 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
273 status_t result = remote()->transact(DETACH_NEXT_BUFFER, data, &reply);
274 if (result != NO_ERROR) {
275 return result;
276 }
277 result = reply.readInt32();
278 if (result == NO_ERROR) {
279 bool nonNull = reply.readInt32();
280 if (nonNull) {
281 *outBuffer = new GraphicBuffer;
Pablo Ceballos70636b32016-07-06 15:24:54 -0700282 result = reply.read(**outBuffer);
283 if (result != NO_ERROR) {
284 outBuffer->clear();
285 return result;
286 }
Dan Stozad9822a32014-03-28 15:25:31 -0700287 }
288 nonNull = reply.readInt32();
289 if (nonNull) {
290 *outFence = new Fence;
Pablo Ceballos70636b32016-07-06 15:24:54 -0700291 result = reply.read(**outFence);
292 if (result != NO_ERROR) {
293 outBuffer->clear();
294 outFence->clear();
295 return result;
296 }
Dan Stozad9822a32014-03-28 15:25:31 -0700297 }
298 }
299 return result;
300 }
301
Dan Stoza9f3053d2014-03-06 15:14:33 -0800302 virtual status_t attachBuffer(int* slot, const sp<GraphicBuffer>& buffer) {
303 Parcel data, reply;
304 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
305 data.write(*buffer.get());
306 status_t result = remote()->transact(ATTACH_BUFFER, data, &reply);
307 if (result != NO_ERROR) {
308 return result;
309 }
Chia-I Wuc79a2962017-05-15 10:32:27 -0700310
Dan Stoza9f3053d2014-03-06 15:14:33 -0800311 *slot = reply.readInt32();
312 result = reply.readInt32();
Chia-I Wuc79a2962017-05-15 10:32:27 -0700313 if (result == NO_ERROR &&
314 (*slot < 0 || *slot >= BufferQueueDefs::NUM_BUFFER_SLOTS)) {
315 ALOGE("attachBuffer returned invalid slot %d", *slot);
316 android_errorWriteLog(0x534e4554, "37478824");
317 return UNKNOWN_ERROR;
318 }
319
Dan Stoza9f3053d2014-03-06 15:14:33 -0800320 return result;
321 }
322
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +0700323 virtual status_t attachBuffers(
324 const std::vector<sp<GraphicBuffer>>& buffers,
325 std::vector<AttachBufferOutput>* outputs) {
326 Parcel data, reply;
327 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
328 data.writeVectorSize(buffers);
329 for (const sp<GraphicBuffer>& buffer : buffers) {
330 data.write(*buffer.get());
331 }
332 status_t result = remote()->transact(ATTACH_BUFFERS, data, &reply);
333 if (result != NO_ERROR) {
334 return result;
335 }
336 result = reply.resizeOutVector(outputs);
337 for (AttachBufferOutput& output : *outputs) {
338 if (result != NO_ERROR) {
339 return result;
340 }
341 result = reply.read(output);
342 }
343 if (result == NO_ERROR) {
344 for (AttachBufferOutput& output : *outputs) {
345 if (output.result == NO_ERROR && output.slot < 0) {
346 ALOGE("attachBuffers returned invalid slot %d",
347 output.slot);
348 android_errorWriteLog(0x534e4554, "37478824");
349 output.result = UNKNOWN_ERROR;
350 }
351 }
352 }
353 return result;
354 }
355
Mathias Agopianf0bc2f12012-04-09 16:14:01 -0700356 virtual status_t queueBuffer(int buf,
357 const QueueBufferInput& input, QueueBufferOutput* output) {
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800358 Parcel data, reply;
Brian Andersonbaaad322016-07-22 15:55:13 -0700359
Andy McFadden2adaf042012-12-18 09:49:45 -0800360 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800361 data.writeInt32(buf);
Jesse Hallc777b0b2012-06-28 12:52:05 -0700362 data.write(input);
Brian Andersonbaaad322016-07-22 15:55:13 -0700363
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700364 status_t result = remote()->transact(QUEUE_BUFFER, data, &reply);
365 if (result != NO_ERROR) {
366 return result;
367 }
Brian Andersonbaaad322016-07-22 15:55:13 -0700368
369 result = reply.read(*output);
370 if (result != NO_ERROR) {
371 return result;
372 }
373
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700374 result = reply.readInt32();
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800375 return result;
376 }
377
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +0700378 virtual status_t queueBuffers(const std::vector<QueueBufferInput>& inputs,
379 std::vector<QueueBufferOutput>* outputs) {
380 Parcel data, reply;
381 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
382 data.writeVectorSize(inputs);
383 for (const QueueBufferInput& input : inputs) {
384 data.write(input);
385 }
386 status_t result = remote()->transact(QUEUE_BUFFERS, data, &reply);
387 if (result != NO_ERROR) {
388 return result;
389 }
390 result = reply.resizeOutVector(outputs);
391 for (QueueBufferOutput& output : *outputs) {
392 if (result != NO_ERROR) {
393 return result;
394 }
395 result = reply.read(output);
396 }
397 return result;
398 }
399
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700400 virtual status_t cancelBuffer(int buf, const sp<Fence>& fence) {
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800401 Parcel data, reply;
Andy McFadden2adaf042012-12-18 09:49:45 -0800402 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800403 data.writeInt32(buf);
Jamie Gennis1df8c342012-12-20 14:05:45 -0800404 data.write(*fence.get());
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700405 status_t result = remote()->transact(CANCEL_BUFFER, data, &reply);
406 if (result != NO_ERROR) {
407 return result;
408 }
409 result = reply.readInt32();
410 return result;
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800411 }
412
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +0700413 virtual status_t cancelBuffers(
414 const std::vector<CancelBufferInput>& inputs,
415 std::vector<status_t>* results) {
416 Parcel data, reply;
417 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
418 data.writeVectorSize(inputs);
419 for (const CancelBufferInput& input : inputs) {
420 data.write(input);
421 }
422 status_t result = remote()->transact(CANCEL_BUFFERS, data, &reply);
423 if (result != NO_ERROR) {
424 return result;
425 }
426 result = reply.readInt32Vector(results);
427 return result;
428 }
429
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700430 virtual int query(int what, int* value) {
431 Parcel data, reply;
Andy McFadden2adaf042012-12-18 09:49:45 -0800432 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700433 data.writeInt32(what);
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700434 status_t result = remote()->transact(QUERY, data, &reply);
435 if (result != NO_ERROR) {
436 return result;
437 }
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700438 value[0] = reply.readInt32();
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700439 result = reply.readInt32();
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700440 return result;
441 }
442
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +0700443 virtual status_t query(const std::vector<int32_t> inputs,
444 std::vector<QueryOutput>* outputs) {
445 Parcel data, reply;
446 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
447 data.writeInt32Vector(inputs);
448 status_t result = remote()->transact(QUERY_MULTIPLE, data, &reply);
449 if (result != NO_ERROR) {
450 return result;
451 }
452 result = reply.resizeOutVector(outputs);
453 for (QueryOutput& output : *outputs) {
454 if (result != NO_ERROR) {
455 return result;
456 }
457 result = reply.read(output);
458 }
459 return result;
460 }
461
Dan Stozaf0eaf252014-03-21 13:05:51 -0700462 virtual status_t connect(const sp<IProducerListener>& listener,
Mathias Agopian365857d2013-09-11 19:35:45 -0700463 int api, bool producerControlledByApp, QueueBufferOutput* output) {
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700464 Parcel data, reply;
Andy McFadden2adaf042012-12-18 09:49:45 -0800465 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Yi Kong48a619f2018-06-05 16:34:59 -0700466 if (listener != nullptr) {
Dan Stozaf0eaf252014-03-21 13:05:51 -0700467 data.writeInt32(1);
Marco Nelissen097ca272014-11-14 08:01:01 -0800468 data.writeStrongBinder(IInterface::asBinder(listener));
Dan Stozaf0eaf252014-03-21 13:05:51 -0700469 } else {
470 data.writeInt32(0);
471 }
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700472 data.writeInt32(api);
Mathias Agopian595264f2013-07-16 22:56:09 -0700473 data.writeInt32(producerControlledByApp);
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700474 status_t result = remote()->transact(CONNECT, data, &reply);
475 if (result != NO_ERROR) {
476 return result;
477 }
Brian Andersonbaaad322016-07-22 15:55:13 -0700478 reply.read(*output);
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700479 result = reply.readInt32();
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700480 return result;
481 }
Mathias Agopian80727112011-05-02 19:51:12 -0700482
Robert Carr97b9c862016-09-08 13:54:35 -0700483 virtual status_t disconnect(int api, DisconnectMode mode) {
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700484 Parcel data, reply;
Andy McFadden2adaf042012-12-18 09:49:45 -0800485 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700486 data.writeInt32(api);
Robert Carr97b9c862016-09-08 13:54:35 -0700487 data.writeInt32(static_cast<int32_t>(mode));
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700488 status_t result =remote()->transact(DISCONNECT, data, &reply);
489 if (result != NO_ERROR) {
490 return result;
491 }
492 result = reply.readInt32();
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700493 return result;
494 }
Jesse Hall399184a2014-03-03 15:42:54 -0800495
496 virtual status_t setSidebandStream(const sp<NativeHandle>& stream) {
497 Parcel data, reply;
498 status_t result;
499 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
500 if (stream.get()) {
501 data.writeInt32(true);
502 data.writeNativeHandle(stream->handle());
503 } else {
504 data.writeInt32(false);
505 }
506 if ((result = remote()->transact(SET_SIDEBAND_STREAM, data, &reply)) == NO_ERROR) {
507 result = reply.readInt32();
508 }
509 return result;
510 }
Dan Stoza29a3e902014-06-20 13:13:57 -0700511
Pablo Ceballos567dbbb2015-08-26 18:59:08 -0700512 virtual void allocateBuffers(uint32_t width, uint32_t height,
Mathias Agopiancb496ac2017-05-22 14:21:00 -0700513 PixelFormat format, uint64_t usage) {
Dan Stoza29a3e902014-06-20 13:13:57 -0700514 Parcel data, reply;
515 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800516 data.writeUint32(width);
517 data.writeUint32(height);
Dan Stoza29a3e902014-06-20 13:13:57 -0700518 data.writeInt32(static_cast<int32_t>(format));
Mathias Agopiancb496ac2017-05-22 14:21:00 -0700519 data.writeUint64(usage);
Steven Moreland366eb422019-04-01 19:22:32 -0700520 status_t result = remote()->transact(ALLOCATE_BUFFERS, data, &reply, IBinder::FLAG_ONEWAY);
Dan Stoza29a3e902014-06-20 13:13:57 -0700521 if (result != NO_ERROR) {
522 ALOGE("allocateBuffers failed to transact: %d", result);
523 }
524 }
Dan Stoza9de72932015-04-16 17:28:43 -0700525
526 virtual status_t allowAllocation(bool allow) {
527 Parcel data, reply;
528 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
529 data.writeInt32(static_cast<int32_t>(allow));
530 status_t result = remote()->transact(ALLOW_ALLOCATION, data, &reply);
531 if (result != NO_ERROR) {
532 return result;
533 }
534 result = reply.readInt32();
535 return result;
536 }
Dan Stoza812ed062015-06-02 15:45:22 -0700537
538 virtual status_t setGenerationNumber(uint32_t generationNumber) {
539 Parcel data, reply;
540 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
541 data.writeUint32(generationNumber);
542 status_t result = remote()->transact(SET_GENERATION_NUMBER, data, &reply);
543 if (result == NO_ERROR) {
544 result = reply.readInt32();
545 }
546 return result;
547 }
Dan Stozac6f30bd2015-06-08 09:32:50 -0700548
549 virtual String8 getConsumerName() const {
550 Parcel data, reply;
551 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
552 status_t result = remote()->transact(GET_CONSUMER_NAME, data, &reply);
553 if (result != NO_ERROR) {
554 ALOGE("getConsumerName failed to transact: %d", result);
555 return String8("TransactFailed");
556 }
557 return reply.readString8();
558 }
Dan Stoza7dde5992015-05-22 09:51:44 -0700559
Pablo Ceballos3559fbf2016-03-17 15:50:23 -0700560 virtual status_t setSharedBufferMode(bool sharedBufferMode) {
Pablo Ceballosccdfd602015-10-07 15:05:45 -0700561 Parcel data, reply;
562 data.writeInterfaceToken(
563 IGraphicBufferProducer::getInterfaceDescriptor());
Pablo Ceballos3559fbf2016-03-17 15:50:23 -0700564 data.writeInt32(sharedBufferMode);
565 status_t result = remote()->transact(SET_SHARED_BUFFER_MODE, data,
Pablo Ceballosccdfd602015-10-07 15:05:45 -0700566 &reply);
567 if (result == NO_ERROR) {
568 result = reply.readInt32();
569 }
570 return result;
571 }
Dan Stoza127fc632015-06-30 13:43:32 -0700572
Pablo Ceballosff95aab2016-01-13 17:09:58 -0800573 virtual status_t setAutoRefresh(bool autoRefresh) {
574 Parcel data, reply;
575 data.writeInterfaceToken(
576 IGraphicBufferProducer::getInterfaceDescriptor());
577 data.writeInt32(autoRefresh);
578 status_t result = remote()->transact(SET_AUTO_REFRESH, data, &reply);
579 if (result == NO_ERROR) {
580 result = reply.readInt32();
581 }
582 return result;
583 }
584
Dan Stoza127fc632015-06-30 13:43:32 -0700585 virtual status_t setDequeueTimeout(nsecs_t timeout) {
586 Parcel data, reply;
587 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
588 data.writeInt64(timeout);
589 status_t result = remote()->transact(SET_DEQUEUE_TIMEOUT, data, &reply);
590 if (result != NO_ERROR) {
591 ALOGE("setDequeueTimeout failed to transact: %d", result);
592 return result;
593 }
594 return reply.readInt32();
595 }
Dan Stoza50101d02016-04-07 16:53:23 -0700596
Sungtak Lee3249fb62019-03-02 16:40:47 -0800597 virtual status_t setLegacyBufferDrop(bool drop) {
598 Parcel data, reply;
599 data.writeInterfaceToken(
600 IGraphicBufferProducer::getInterfaceDescriptor());
601 data.writeInt32(drop);
602 status_t result = remote()->transact(SET_LEGACY_BUFFER_DROP,
603 data, &reply);
604 if (result != NO_ERROR) {
605 return result;
606 }
607 result = reply.readInt32();
608 return result;
609 }
610
Dan Stoza50101d02016-04-07 16:53:23 -0700611 virtual status_t getLastQueuedBuffer(sp<GraphicBuffer>* outBuffer,
John Reck1a61da52016-04-28 13:18:15 -0700612 sp<Fence>* outFence, float outTransformMatrix[16]) override {
Dan Stoza50101d02016-04-07 16:53:23 -0700613 Parcel data, reply;
614 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
615 status_t result = remote()->transact(GET_LAST_QUEUED_BUFFER, data,
616 &reply);
617 if (result != NO_ERROR) {
618 ALOGE("getLastQueuedBuffer failed to transact: %d", result);
619 return result;
620 }
621 result = reply.readInt32();
622 if (result != NO_ERROR) {
623 return result;
624 }
John Reckce8e5df2016-04-28 10:12:47 -0700625 bool hasBuffer = reply.readBool();
626 sp<GraphicBuffer> buffer;
627 if (hasBuffer) {
628 buffer = new GraphicBuffer();
629 result = reply.read(*buffer);
John Reck1a61da52016-04-28 13:18:15 -0700630 if (result == NO_ERROR) {
631 result = reply.read(outTransformMatrix, sizeof(float) * 16);
632 }
John Reckce8e5df2016-04-28 10:12:47 -0700633 }
Dan Stoza50101d02016-04-07 16:53:23 -0700634 if (result != NO_ERROR) {
635 ALOGE("getLastQueuedBuffer failed to read buffer: %d", result);
636 return result;
637 }
638 sp<Fence> fence(new Fence);
639 result = reply.read(*fence);
640 if (result != NO_ERROR) {
641 ALOGE("getLastQueuedBuffer failed to read fence: %d", result);
642 return result;
643 }
644 *outBuffer = buffer;
645 *outFence = fence;
646 return result;
647 }
Pablo Ceballosce796e72016-02-04 19:10:51 -0800648
John Reckaa5a0b22021-05-18 00:42:56 -0400649 virtual status_t getLastQueuedBuffer(sp<GraphicBuffer>* outBuffer, sp<Fence>* outFence,
650 Rect* outRect, uint32_t* outTransform) override {
651 Parcel data, reply;
652 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
653 status_t result = remote()->transact(GET_LAST_QUEUED_BUFFER2, data, &reply);
654 if (result != NO_ERROR) {
655 ALOGE("getLastQueuedBuffer failed to transact: %d", result);
656 return result;
657 }
658 status_t remoteError = NO_ERROR;
659 result = reply.readInt32(&remoteError);
660 if (result != NO_ERROR) {
661 ALOGE("getLastQueuedBuffer failed to read status: %d", result);
662 return result;
663 }
664 if (remoteError != NO_ERROR) {
665 return remoteError;
666 }
667 bool hasBuffer = false;
668 result = reply.readBool(&hasBuffer);
669 if (result != NO_ERROR) {
670 ALOGE("getLastQueuedBuffer failed to read buffer: %d", result);
671 return result;
672 }
673 sp<GraphicBuffer> buffer;
674 if (hasBuffer) {
675 buffer = new GraphicBuffer();
676 result = reply.read(*buffer);
677 if (result == NO_ERROR) {
678 result = reply.read(*outRect);
679 }
680 if (result == NO_ERROR) {
681 result = reply.readUint32(outTransform);
682 }
683 }
684 if (result != NO_ERROR) {
685 ALOGE("getLastQueuedBuffer failed to read buffer: %d", result);
686 return result;
687 }
688 sp<Fence> fence(new Fence);
689 result = reply.read(*fence);
690 if (result != NO_ERROR) {
691 ALOGE("getLastQueuedBuffer failed to read fence: %d", result);
692 return result;
693 }
694 *outBuffer = buffer;
695 *outFence = fence;
696 return result;
697 }
698
Brian Anderson3890c392016-07-25 12:48:08 -0700699 virtual void getFrameTimestamps(FrameEventHistoryDelta* outDelta) {
Pablo Ceballosce796e72016-02-04 19:10:51 -0800700 Parcel data, reply;
701 status_t result = data.writeInterfaceToken(
702 IGraphicBufferProducer::getInterfaceDescriptor());
703 if (result != NO_ERROR) {
Brian Anderson3890c392016-07-25 12:48:08 -0700704 ALOGE("IGBP::getFrameTimestamps failed to write token: %d", result);
705 return;
Pablo Ceballosce796e72016-02-04 19:10:51 -0800706 }
707 result = remote()->transact(GET_FRAME_TIMESTAMPS, data, &reply);
708 if (result != NO_ERROR) {
Brian Anderson3890c392016-07-25 12:48:08 -0700709 ALOGE("IGBP::getFrameTimestamps failed to transact: %d", result);
710 return;
Pablo Ceballosce796e72016-02-04 19:10:51 -0800711 }
Brian Anderson3890c392016-07-25 12:48:08 -0700712 result = reply.read(*outDelta);
Pablo Ceballosce796e72016-02-04 19:10:51 -0800713 if (result != NO_ERROR) {
Brian Anderson3890c392016-07-25 12:48:08 -0700714 ALOGE("IGBP::getFrameTimestamps failed to read timestamps: %d",
715 result);
Pablo Ceballosce796e72016-02-04 19:10:51 -0800716 }
Pablo Ceballosce796e72016-02-04 19:10:51 -0800717 }
Pablo Ceballos6155b402016-06-30 17:01:49 -0700718
Pablo Ceballos8e3e92b2016-06-27 17:56:53 -0700719 virtual status_t getUniqueId(uint64_t* outId) const {
720 Parcel data, reply;
721 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
722 status_t result = remote()->transact(GET_UNIQUE_ID, data, &reply);
723 if (result != NO_ERROR) {
724 ALOGE("getUniqueId failed to transact: %d", result);
725 }
726 status_t actualResult = NO_ERROR;
727 result = reply.readInt32(&actualResult);
728 if (result != NO_ERROR) {
729 return result;
730 }
731 result = reply.readUint64(outId);
732 if (result != NO_ERROR) {
733 return result;
734 }
735 return actualResult;
736 }
Chia-I Wue2786ea2017-08-07 10:36:08 -0700737
738 virtual status_t getConsumerUsage(uint64_t* outUsage) const {
739 Parcel data, reply;
740 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
741 status_t result = remote()->transact(GET_CONSUMER_USAGE, data, &reply);
742 if (result != NO_ERROR) {
743 ALOGE("getConsumerUsage failed to transact: %d", result);
744 }
745 status_t actualResult = NO_ERROR;
746 result = reply.readInt32(&actualResult);
747 if (result != NO_ERROR) {
748 return result;
749 }
750 result = reply.readUint64(outUsage);
751 if (result != NO_ERROR) {
752 return result;
753 }
754 return actualResult;
755 }
Yiwei Zhang538cedc2019-06-24 19:35:03 -0700756
757 virtual status_t setAutoPrerotation(bool autoPrerotation) {
758 Parcel data, reply;
759 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
760 data.writeBool(autoPrerotation);
761 status_t result = remote()->transact(SET_AUTO_PREROTATION, data, &reply);
762 if (result == NO_ERROR) {
763 result = reply.readInt32();
764 }
765 return result;
766 }
Ady Abraham107788e2023-10-17 12:31:08 -0700767#if COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(BQ_SETFRAMERATE)
Ady Abraham6cdd3fd2023-09-07 18:45:58 -0700768 virtual status_t setFrameRate(float frameRate, int8_t compatibility,
769 int8_t changeFrameRateStrategy) override {
770 Parcel data, reply;
771 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
772 data.writeFloat(frameRate);
773 data.writeInt32(compatibility);
774 data.writeInt32(changeFrameRateStrategy);
775 status_t result = remote()->transact(SET_FRAME_RATE, data, &reply);
776 if (result == NO_ERROR) {
777 result = reply.readInt32();
778 }
779 return result;
780 }
781#endif
John Reckdb164ff2024-04-03 16:59:28 -0400782#if COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(BQ_EXTENDEDALLOCATE)
783 virtual status_t setAdditionalOptions(const std::vector<gui::AdditionalOptions>& options) {
784 Parcel data, reply;
785 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
786 if (options.size() > 100) {
787 return BAD_VALUE;
788 }
789 data.writeInt32(options.size());
790 for (const auto& it : options) {
791 data.writeCString(it.name.c_str());
792 data.writeInt64(it.value);
793 }
794 status_t result = remote()->transact(SET_ADDITIONAL_OPTIONS, data, &reply);
795 if (result == NO_ERROR) {
796 result = reply.readInt32();
797 }
798 return result;
799 }
800#endif
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800801};
802
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800803// Out-of-line virtual method definition to trigger vtable emission in this
804// translation unit (see clang warning -Wweak-vtables)
805BpGraphicBufferProducer::~BpGraphicBufferProducer() {}
806
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800807class HpGraphicBufferProducer : public HpInterface<
Pawin Vongmasae672cd02019-02-14 16:01:29 -0800808 BpGraphicBufferProducer,
809 H2BGraphicBufferProducerV1_0,
810 H2BGraphicBufferProducerV2_0> {
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800811public:
Chih-Hung Hsiehaaf62162018-12-20 15:45:04 -0800812 explicit HpGraphicBufferProducer(const sp<IBinder>& base) : PBase(base) {}
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800813
814 status_t requestBuffer(int slot, sp<GraphicBuffer>* buf) override {
815 return mBase->requestBuffer(slot, buf);
816 }
817
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +0700818 status_t requestBuffers(
819 const std::vector<int32_t>& slots,
820 std::vector<RequestBufferOutput>* outputs) override {
821 return mBase->requestBuffers(slots, outputs);
822 }
823
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800824 status_t setMaxDequeuedBufferCount(int maxDequeuedBuffers) override {
825 return mBase->setMaxDequeuedBufferCount(maxDequeuedBuffers);
826 }
827
828 status_t setAsyncMode(bool async) override {
829 return mBase->setAsyncMode(async);
830 }
831
Ian Elliotta2eb34c2017-07-18 11:05:49 -0600832 status_t dequeueBuffer(int* slot, sp<Fence>* fence, uint32_t w, uint32_t h, PixelFormat format,
833 uint64_t usage, uint64_t* outBufferAge,
834 FrameEventHistoryDelta* outTimestamps) override {
835 return mBase->dequeueBuffer(slot, fence, w, h, format, usage, outBufferAge, outTimestamps);
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800836 }
837
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +0700838 status_t dequeueBuffers(
839 const std::vector<DequeueBufferInput>& inputs,
840 std::vector<DequeueBufferOutput>* outputs) override {
841 return mBase->dequeueBuffers(inputs, outputs);
842 }
843
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800844 status_t detachBuffer(int slot) override {
845 return mBase->detachBuffer(slot);
846 }
847
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +0700848 status_t detachBuffers(const std::vector<int32_t>& slots,
849 std::vector<status_t>* results) override {
850 return mBase->detachBuffers(slots, results);
851 }
852
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800853 status_t detachNextBuffer(
854 sp<GraphicBuffer>* outBuffer, sp<Fence>* outFence) override {
855 return mBase->detachNextBuffer(outBuffer, outFence);
856 }
857
858 status_t attachBuffer(
859 int* outSlot, const sp<GraphicBuffer>& buffer) override {
860 return mBase->attachBuffer(outSlot, buffer);
861 }
862
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +0700863 status_t attachBuffers(
864 const std::vector<sp<GraphicBuffer>>& buffers,
865 std::vector<AttachBufferOutput>* outputs) override {
866 return mBase->attachBuffers(buffers, outputs);
867 }
868
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800869 status_t queueBuffer(
870 int slot,
871 const QueueBufferInput& input,
872 QueueBufferOutput* output) override {
873 return mBase->queueBuffer(slot, input, output);
874 }
875
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +0700876 status_t queueBuffers(const std::vector<QueueBufferInput>& inputs,
877 std::vector<QueueBufferOutput>* outputs) override {
878 return mBase->queueBuffers(inputs, outputs);
879 }
880
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800881 status_t cancelBuffer(int slot, const sp<Fence>& fence) override {
882 return mBase->cancelBuffer(slot, fence);
883 }
884
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +0700885 status_t cancelBuffers(
886 const std::vector<CancelBufferInput>& inputs,
887 std::vector<status_t>* results) override {
888 return mBase->cancelBuffers(inputs, results);
889 }
890
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800891 int query(int what, int* value) override {
892 return mBase->query(what, value);
893 }
894
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +0700895 status_t query(const std::vector<int32_t> inputs,
896 std::vector<QueryOutput>* outputs) override {
897 return mBase->query(inputs, outputs);
898 }
899
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800900 status_t connect(
901 const sp<IProducerListener>& listener,
902 int api, bool producerControlledByApp,
903 QueueBufferOutput* output) override {
904 return mBase->connect(listener, api, producerControlledByApp, output);
905 }
906
907 status_t disconnect(
908 int api, DisconnectMode mode = DisconnectMode::Api) override {
909 return mBase->disconnect(api, mode);
910 }
911
912 status_t setSidebandStream(const sp<NativeHandle>& stream) override {
913 return mBase->setSidebandStream(stream);
914 }
915
916 void allocateBuffers(uint32_t width, uint32_t height,
Mathias Agopiancb496ac2017-05-22 14:21:00 -0700917 PixelFormat format, uint64_t usage) override {
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800918 return mBase->allocateBuffers(width, height, format, usage);
919 }
920
921 status_t allowAllocation(bool allow) override {
922 return mBase->allowAllocation(allow);
923 }
924
925 status_t setGenerationNumber(uint32_t generationNumber) override {
926 return mBase->setGenerationNumber(generationNumber);
927 }
928
929 String8 getConsumerName() const override {
930 return mBase->getConsumerName();
931 }
932
933 status_t setSharedBufferMode(bool sharedBufferMode) override {
934 return mBase->setSharedBufferMode(sharedBufferMode);
935 }
936
937 status_t setAutoRefresh(bool autoRefresh) override {
938 return mBase->setAutoRefresh(autoRefresh);
939 }
940
941 status_t setDequeueTimeout(nsecs_t timeout) override {
942 return mBase->setDequeueTimeout(timeout);
943 }
944
Sungtak Lee3249fb62019-03-02 16:40:47 -0800945 status_t setLegacyBufferDrop(bool drop) override {
946 return mBase->setLegacyBufferDrop(drop);
947 }
948
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800949 status_t getLastQueuedBuffer(
950 sp<GraphicBuffer>* outBuffer,
951 sp<Fence>* outFence,
952 float outTransformMatrix[16]) override {
953 return mBase->getLastQueuedBuffer(
954 outBuffer, outFence, outTransformMatrix);
955 }
956
John Reckaa5a0b22021-05-18 00:42:56 -0400957 status_t getLastQueuedBuffer(sp<GraphicBuffer>* outBuffer, sp<Fence>* outFence, Rect* outRect,
958 uint32_t* outTransform) override {
959 return mBase->getLastQueuedBuffer(outBuffer, outFence, outRect, outTransform);
960 }
961
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800962 void getFrameTimestamps(FrameEventHistoryDelta* outDelta) override {
963 return mBase->getFrameTimestamps(outDelta);
964 }
965
966 status_t getUniqueId(uint64_t* outId) const override {
967 return mBase->getUniqueId(outId);
968 }
Chia-I Wue2786ea2017-08-07 10:36:08 -0700969
970 status_t getConsumerUsage(uint64_t* outUsage) const override {
971 return mBase->getConsumerUsage(outUsage);
972 }
Yiwei Zhang538cedc2019-06-24 19:35:03 -0700973
974 status_t setAutoPrerotation(bool autoPrerotation) override {
975 return mBase->setAutoPrerotation(autoPrerotation);
976 }
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800977};
978
Pawin Vongmasa338b81d2019-01-31 05:20:07 -0800979IMPLEMENT_HYBRID_META_INTERFACE(GraphicBufferProducer,
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800980 "android.gui.IGraphicBufferProducer");
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800981
982// ----------------------------------------------------------------------
983
Sungtak Lee3249fb62019-03-02 16:40:47 -0800984status_t IGraphicBufferProducer::setLegacyBufferDrop(bool drop) {
985 // No-op for IGBP other than BufferQueue.
986 (void) drop;
987 return INVALID_OPERATION;
988}
989
Yiwei Zhang538cedc2019-06-24 19:35:03 -0700990status_t IGraphicBufferProducer::setAutoPrerotation(bool autoPrerotation) {
991 // No-op for IGBP other than BufferQueue.
992 (void)autoPrerotation;
993 return INVALID_OPERATION;
994}
995
Ady Abraham107788e2023-10-17 12:31:08 -0700996#if COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(BQ_SETFRAMERATE)
Ady Abraham6cdd3fd2023-09-07 18:45:58 -0700997status_t IGraphicBufferProducer::setFrameRate(float /*frameRate*/, int8_t /*compatibility*/,
998 int8_t /*changeFrameRateStrategy*/) {
999 // No-op for IGBP other than BufferQueue.
1000 return INVALID_OPERATION;
1001}
1002#endif
1003
John Reckdb164ff2024-04-03 16:59:28 -04001004#if COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(BQ_EXTENDEDALLOCATE)
1005status_t IGraphicBufferProducer::setAdditionalOptions(const std::vector<gui::AdditionalOptions>&) {
1006 // No-op for IGBP other than BufferQueue.
1007 return INVALID_OPERATION;
1008}
1009#endif
1010
Jiwen 'Steve' Caic90a77f2018-01-14 15:42:29 -08001011status_t IGraphicBufferProducer::exportToParcel(Parcel* parcel) {
1012 status_t res = OK;
1013 res = parcel->writeUint32(USE_BUFFER_QUEUE);
1014 if (res != NO_ERROR) {
1015 ALOGE("exportToParcel: Cannot write magic, res=%d.", res);
1016 return res;
1017 }
1018
1019 return parcel->writeStrongBinder(IInterface::asBinder(this));
1020}
1021
1022/* static */
1023status_t IGraphicBufferProducer::exportToParcel(const sp<IGraphicBufferProducer>& producer,
1024 Parcel* parcel) {
1025 if (parcel == nullptr) {
1026 ALOGE("exportToParcel: Invalid parcel object.");
1027 return BAD_VALUE;
1028 }
1029
1030 if (producer == nullptr) {
1031 status_t res = OK;
1032 res = parcel->writeUint32(IGraphicBufferProducer::USE_BUFFER_QUEUE);
1033 if (res != NO_ERROR) return res;
1034 return parcel->writeStrongBinder(nullptr);
1035 } else {
1036 return producer->exportToParcel(parcel);
1037 }
1038}
1039
1040/* static */
1041sp<IGraphicBufferProducer> IGraphicBufferProducer::createFromParcel(const Parcel* parcel) {
1042 uint32_t outMagic = 0;
1043 status_t res = NO_ERROR;
1044
1045 res = parcel->readUint32(&outMagic);
1046 if (res != NO_ERROR) {
1047 ALOGE("createFromParcel: Failed to read magic, error=%d.", res);
1048 return nullptr;
1049 }
1050
1051 switch (outMagic) {
1052 case USE_BUFFER_QUEUE: {
1053 sp<IBinder> binder;
1054 res = parcel->readNullableStrongBinder(&binder);
1055 if (res != NO_ERROR) {
1056 ALOGE("createFromParcel: Can't read strong binder.");
1057 return nullptr;
1058 }
1059 return interface_cast<IGraphicBufferProducer>(binder);
1060 }
1061 case USE_BUFFER_HUB: {
1062 ALOGE("createFromParcel: BufferHub not implemented.");
Jiyong Parka75d3d62018-04-09 12:16:30 +09001063 return nullptr;
Jiwen 'Steve' Caic90a77f2018-01-14 15:42:29 -08001064 }
1065 default: {
1066 ALOGE("createFromParcel: Unexpected mgaic: 0x%x.", outMagic);
1067 return nullptr;
1068 }
1069 }
1070}
1071
1072// ----------------------------------------------------------------------------
1073
Andy McFadden2adaf042012-12-18 09:49:45 -08001074status_t BnGraphicBufferProducer::onTransact(
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001075 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
1076{
1077 switch(code) {
1078 case REQUEST_BUFFER: {
Andy McFadden2adaf042012-12-18 09:49:45 -08001079 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +07001080 int bufferIdx = data.readInt32();
Jamie Gennis7b305ff2011-07-19 12:08:33 -07001081 sp<GraphicBuffer> buffer;
1082 int result = requestBuffer(bufferIdx, &buffer);
Yi Kong48a619f2018-06-05 16:34:59 -07001083 reply->writeInt32(buffer != nullptr);
1084 if (buffer != nullptr) {
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001085 reply->write(*buffer);
1086 }
Jamie Gennis7b305ff2011-07-19 12:08:33 -07001087 reply->writeInt32(result);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001088 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -08001089 }
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +07001090 case REQUEST_BUFFERS: {
1091 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1092 std::vector<int32_t> slots;
1093 std::vector<RequestBufferOutput> outputs;
1094 status_t result = data.readInt32Vector(&slots);
1095 if (result != NO_ERROR) {
1096 return result;
1097 }
1098 (void)requestBuffers(slots, &outputs);
1099 result = reply->writeVectorSize(outputs);
1100 for (const RequestBufferOutput& output : outputs) {
1101 if (result != NO_ERROR) {
1102 return result;
1103 }
1104 result = reply->write(output);
1105 }
1106 return result;
1107 }
Pablo Ceballosfa455352015-08-12 17:47:47 -07001108 case SET_MAX_DEQUEUED_BUFFER_COUNT: {
1109 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1110 int maxDequeuedBuffers = data.readInt32();
1111 int result = setMaxDequeuedBufferCount(maxDequeuedBuffers);
1112 reply->writeInt32(result);
1113 return NO_ERROR;
1114 }
1115 case SET_ASYNC_MODE: {
1116 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1117 bool async = data.readInt32();
1118 int result = setAsyncMode(async);
1119 reply->writeInt32(result);
1120 return NO_ERROR;
1121 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001122 case DEQUEUE_BUFFER: {
Andy McFadden2adaf042012-12-18 09:49:45 -08001123 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Dan Stoza3be1c6b2014-11-18 10:24:03 -08001124 uint32_t width = data.readUint32();
1125 uint32_t height = data.readUint32();
1126 PixelFormat format = static_cast<PixelFormat>(data.readInt32());
Mathias Agopiancb496ac2017-05-22 14:21:00 -07001127 uint64_t usage = data.readUint64();
Ian Elliotta2eb34c2017-07-18 11:05:49 -06001128 uint64_t bufferAge = 0;
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001129 bool getTimestamps = data.readBool();
Brian Andersonbaaad322016-07-22 15:55:13 -07001130
Naveen Leekha12ba0f52015-09-21 17:28:04 -07001131 int buf = 0;
Brian Andersonbaaad322016-07-22 15:55:13 -07001132 sp<Fence> fence = Fence::NO_FENCE;
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001133 FrameEventHistoryDelta frameTimestamps;
Ian Elliotta2eb34c2017-07-18 11:05:49 -06001134 int result = dequeueBuffer(&buf, &fence, width, height, format, usage, &bufferAge,
1135 getTimestamps ? &frameTimestamps : nullptr);
Brian Andersonbaaad322016-07-22 15:55:13 -07001136
Tobin Ehlis209e5fb2019-03-26 14:06:29 -06001137 if (fence == nullptr) {
1138 ALOGE("dequeueBuffer returned a NULL fence, setting to Fence::NO_FENCE");
1139 fence = Fence::NO_FENCE;
1140 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001141 reply->writeInt32(buf);
Brian Andersonbaaad322016-07-22 15:55:13 -07001142 reply->write(*fence);
Ian Elliotta2eb34c2017-07-18 11:05:49 -06001143 reply->writeUint64(bufferAge);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001144 if (getTimestamps) {
1145 reply->write(frameTimestamps);
1146 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001147 reply->writeInt32(result);
1148 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -08001149 }
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +07001150 case DEQUEUE_BUFFERS: {
1151 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1152 std::vector<DequeueBufferInput> inputs;
1153 std::vector<DequeueBufferOutput> outputs;
1154 status_t result = data.resizeOutVector(&inputs);
1155 if (result != NO_ERROR) {
1156 return result;
1157 }
1158 for (DequeueBufferInput& input : inputs) {
1159 result = data.read(input);
1160 if (result != NO_ERROR) {
1161 return result;
1162 }
1163 }
1164 (void)dequeueBuffers(inputs, &outputs);
1165 result = reply->writeVectorSize(outputs);
1166 for (const DequeueBufferOutput& output : outputs) {
1167 if (result != NO_ERROR) {
1168 return result;
1169 }
1170 result = reply->write(output);
1171 }
1172 return result;
1173 }
Dan Stoza9f3053d2014-03-06 15:14:33 -08001174 case DETACH_BUFFER: {
1175 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1176 int slot = data.readInt32();
1177 int result = detachBuffer(slot);
1178 reply->writeInt32(result);
1179 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -08001180 }
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +07001181 case DETACH_BUFFERS: {
1182 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1183 std::vector<int32_t> slots;
1184 std::vector<status_t> results;
1185 status_t result = data.readInt32Vector(&slots);
1186 if (result != NO_ERROR) {
1187 return result;
1188 }
1189 (void)detachBuffers(slots, &results);
1190 return reply->writeInt32Vector(results);
1191 }
Dan Stozad9822a32014-03-28 15:25:31 -07001192 case DETACH_NEXT_BUFFER: {
1193 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1194 sp<GraphicBuffer> buffer;
1195 sp<Fence> fence;
1196 int32_t result = detachNextBuffer(&buffer, &fence);
1197 reply->writeInt32(result);
1198 if (result == NO_ERROR) {
Yi Kong48a619f2018-06-05 16:34:59 -07001199 reply->writeInt32(buffer != nullptr);
1200 if (buffer != nullptr) {
Dan Stozad9822a32014-03-28 15:25:31 -07001201 reply->write(*buffer);
1202 }
Yi Kong48a619f2018-06-05 16:34:59 -07001203 reply->writeInt32(fence != nullptr);
1204 if (fence != nullptr) {
Dan Stozad9822a32014-03-28 15:25:31 -07001205 reply->write(*fence);
1206 }
1207 }
1208 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -08001209 }
Dan Stoza9f3053d2014-03-06 15:14:33 -08001210 case ATTACH_BUFFER: {
1211 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1212 sp<GraphicBuffer> buffer = new GraphicBuffer();
Pablo Ceballos70636b32016-07-06 15:24:54 -07001213 status_t result = data.read(*buffer.get());
Naveen Leekha12ba0f52015-09-21 17:28:04 -07001214 int slot = 0;
Pablo Ceballos70636b32016-07-06 15:24:54 -07001215 if (result == NO_ERROR) {
1216 result = attachBuffer(&slot, buffer);
1217 }
Dan Stoza9f3053d2014-03-06 15:14:33 -08001218 reply->writeInt32(slot);
1219 reply->writeInt32(result);
1220 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -08001221 }
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +07001222 case ATTACH_BUFFERS: {
1223 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1224 std::vector<sp<GraphicBuffer>> buffers;
1225 status_t result = data.resizeOutVector(&buffers);
1226 if (result != NO_ERROR) {
1227 return result;
1228 }
1229 for (sp<GraphicBuffer>& buffer : buffers) {
1230 buffer = new GraphicBuffer();
1231 result = data.read(*buffer.get());
1232 if (result != NO_ERROR) {
1233 return result;
1234 }
1235 }
1236 std::vector<AttachBufferOutput> outputs;
1237 (void)attachBuffers(buffers, &outputs);
1238 result = reply->writeVectorSize(outputs);
1239 for (const AttachBufferOutput& output : outputs) {
1240 if (result != NO_ERROR) {
1241 return result;
1242 }
1243 result = reply->write(output);
1244 }
1245 return result;
1246 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001247 case QUEUE_BUFFER: {
Andy McFadden2adaf042012-12-18 09:49:45 -08001248 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001249
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001250 int buf = data.readInt32();
Jesse Hallc777b0b2012-06-28 12:52:05 -07001251 QueueBufferInput input(data);
Brian Andersonbaaad322016-07-22 15:55:13 -07001252 QueueBufferOutput output;
1253 status_t result = queueBuffer(buf, input, &output);
Brian Andersonbaaad322016-07-22 15:55:13 -07001254 reply->write(output);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001255 reply->writeInt32(result);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001256
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001257 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -08001258 }
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +07001259 case QUEUE_BUFFERS: {
1260 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1261 std::vector<QueueBufferInput> inputs;
1262 status_t result = data.resizeOutVector(&inputs);
1263 if (result != NO_ERROR) {
1264 return result;
1265 }
1266 for (QueueBufferInput& input : inputs) {
1267 result = data.read(input);
1268 if (result != NO_ERROR) {
1269 return result;
1270 }
1271 }
1272 std::vector<QueueBufferOutput> outputs;
1273 (void)queueBuffers(inputs, &outputs);
1274 result = reply->writeVectorSize(outputs);
1275 for (const QueueBufferOutput& output : outputs) {
1276 if (result != NO_ERROR) {
1277 return result;
1278 }
1279 result = reply->write(output);
1280 }
1281 return result;
1282 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001283 case CANCEL_BUFFER: {
Andy McFadden2adaf042012-12-18 09:49:45 -08001284 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001285 int buf = data.readInt32();
Jamie Gennis1df8c342012-12-20 14:05:45 -08001286 sp<Fence> fence = new Fence();
Pablo Ceballos70636b32016-07-06 15:24:54 -07001287 status_t result = data.read(*fence.get());
1288 if (result == NO_ERROR) {
1289 result = cancelBuffer(buf, fence);
1290 }
Pablo Ceballos583b1b32015-09-03 18:23:52 -07001291 reply->writeInt32(result);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001292 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -08001293 }
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +07001294 case CANCEL_BUFFERS: {
1295 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1296 std::vector<CancelBufferInput> inputs;
1297 status_t result = data.resizeOutVector(&inputs);
1298 for (CancelBufferInput& input : inputs) {
1299 if (result != NO_ERROR) {
1300 return result;
1301 }
1302 result = data.read(input);
1303 }
1304 if (result != NO_ERROR) {
1305 return result;
1306 }
1307 std::vector<status_t> results;
1308 result = cancelBuffers(inputs, &results);
1309 if (result != NO_ERROR) {
1310 return result;
1311 }
1312 return reply->writeInt32Vector(results);
1313 }
Mathias Agopianeafabcd2011-04-20 14:20:59 -07001314 case QUERY: {
Andy McFadden2adaf042012-12-18 09:49:45 -08001315 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Naveen Leekha12ba0f52015-09-21 17:28:04 -07001316 int value = 0;
Mathias Agopianeafabcd2011-04-20 14:20:59 -07001317 int what = data.readInt32();
1318 int res = query(what, &value);
1319 reply->writeInt32(value);
1320 reply->writeInt32(res);
1321 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -08001322 }
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +07001323 case QUERY_MULTIPLE: {
1324 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1325 std::vector<int32_t> inputs;
1326 status_t result = data.readInt32Vector(&inputs);
1327 if (result != NO_ERROR) {
1328 return result;
1329 }
1330 std::vector<QueryOutput> outputs;
1331 result = query(inputs, &outputs);
1332 if (result != NO_ERROR) {
1333 return result;
1334 }
1335 result = reply->writeVectorSize(outputs);
1336 for (const QueryOutput& output : outputs) {
1337 if (result != NO_ERROR) {
1338 return result;
1339 }
1340 result = reply->write(output);
1341 }
1342 return result;
1343 }
Jamie Gennisfe0a87b2011-07-13 19:12:20 -07001344 case CONNECT: {
Andy McFadden2adaf042012-12-18 09:49:45 -08001345 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Dan Stozaf0eaf252014-03-21 13:05:51 -07001346 sp<IProducerListener> listener;
1347 if (data.readInt32() == 1) {
1348 listener = IProducerListener::asInterface(data.readStrongBinder());
1349 }
Jamie Gennisfe0a87b2011-07-13 19:12:20 -07001350 int api = data.readInt32();
Mathias Agopian595264f2013-07-16 22:56:09 -07001351 bool producerControlledByApp = data.readInt32();
Brian Andersonbaaad322016-07-22 15:55:13 -07001352 QueueBufferOutput output;
1353 status_t res = connect(listener, api, producerControlledByApp, &output);
1354 reply->write(output);
Jamie Gennisfe0a87b2011-07-13 19:12:20 -07001355 reply->writeInt32(res);
1356 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -08001357 }
Jamie Gennisfe0a87b2011-07-13 19:12:20 -07001358 case DISCONNECT: {
Andy McFadden2adaf042012-12-18 09:49:45 -08001359 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Jamie Gennisfe0a87b2011-07-13 19:12:20 -07001360 int api = data.readInt32();
Robert Carr97b9c862016-09-08 13:54:35 -07001361 DisconnectMode mode = static_cast<DisconnectMode>(data.readInt32());
1362 status_t res = disconnect(api, mode);
Jamie Gennisfe0a87b2011-07-13 19:12:20 -07001363 reply->writeInt32(res);
1364 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -08001365 }
Jesse Hall399184a2014-03-03 15:42:54 -08001366 case SET_SIDEBAND_STREAM: {
1367 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1368 sp<NativeHandle> stream;
1369 if (data.readInt32()) {
Wonsik Kim0ec54e12014-03-21 10:46:24 +09001370 stream = NativeHandle::create(data.readNativeHandle(), true);
Jesse Hall399184a2014-03-03 15:42:54 -08001371 }
1372 status_t result = setSidebandStream(stream);
1373 reply->writeInt32(result);
1374 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -08001375 }
Dan Stoza9de72932015-04-16 17:28:43 -07001376 case ALLOCATE_BUFFERS: {
Dan Stoza29a3e902014-06-20 13:13:57 -07001377 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Dan Stoza3be1c6b2014-11-18 10:24:03 -08001378 uint32_t width = data.readUint32();
1379 uint32_t height = data.readUint32();
1380 PixelFormat format = static_cast<PixelFormat>(data.readInt32());
Mathias Agopiancb496ac2017-05-22 14:21:00 -07001381 uint64_t usage = data.readUint64();
Pablo Ceballos567dbbb2015-08-26 18:59:08 -07001382 allocateBuffers(width, height, format, usage);
Dan Stoza29a3e902014-06-20 13:13:57 -07001383 return NO_ERROR;
Dan Stoza9de72932015-04-16 17:28:43 -07001384 }
1385 case ALLOW_ALLOCATION: {
1386 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1387 bool allow = static_cast<bool>(data.readInt32());
1388 status_t result = allowAllocation(allow);
1389 reply->writeInt32(result);
1390 return NO_ERROR;
1391 }
Dan Stoza812ed062015-06-02 15:45:22 -07001392 case SET_GENERATION_NUMBER: {
1393 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1394 uint32_t generationNumber = data.readUint32();
1395 status_t result = setGenerationNumber(generationNumber);
1396 reply->writeInt32(result);
1397 return NO_ERROR;
1398 }
Dan Stozac6f30bd2015-06-08 09:32:50 -07001399 case GET_CONSUMER_NAME: {
1400 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1401 reply->writeString8(getConsumerName());
1402 return NO_ERROR;
1403 }
Pablo Ceballos3559fbf2016-03-17 15:50:23 -07001404 case SET_SHARED_BUFFER_MODE: {
Pablo Ceballosccdfd602015-10-07 15:05:45 -07001405 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Pablo Ceballos3559fbf2016-03-17 15:50:23 -07001406 bool sharedBufferMode = data.readInt32();
1407 status_t result = setSharedBufferMode(sharedBufferMode);
Pablo Ceballosccdfd602015-10-07 15:05:45 -07001408 reply->writeInt32(result);
1409 return NO_ERROR;
1410 }
Pablo Ceballosff95aab2016-01-13 17:09:58 -08001411 case SET_AUTO_REFRESH: {
1412 CHECK_INTERFACE(IGraphicBuffer, data, reply);
1413 bool autoRefresh = data.readInt32();
1414 status_t result = setAutoRefresh(autoRefresh);
1415 reply->writeInt32(result);
1416 return NO_ERROR;
1417 }
Dan Stoza127fc632015-06-30 13:43:32 -07001418 case SET_DEQUEUE_TIMEOUT: {
1419 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1420 nsecs_t timeout = data.readInt64();
1421 status_t result = setDequeueTimeout(timeout);
1422 reply->writeInt32(result);
1423 return NO_ERROR;
1424 }
Dan Stoza50101d02016-04-07 16:53:23 -07001425 case GET_LAST_QUEUED_BUFFER: {
1426 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1427 sp<GraphicBuffer> buffer(nullptr);
1428 sp<Fence> fence(Fence::NO_FENCE);
John Reck1a61da52016-04-28 13:18:15 -07001429 float transform[16] = {};
1430 status_t result = getLastQueuedBuffer(&buffer, &fence, transform);
Dan Stoza50101d02016-04-07 16:53:23 -07001431 reply->writeInt32(result);
1432 if (result != NO_ERROR) {
1433 return result;
1434 }
John Reckce8e5df2016-04-28 10:12:47 -07001435 if (!buffer.get()) {
1436 reply->writeBool(false);
1437 } else {
1438 reply->writeBool(true);
1439 result = reply->write(*buffer);
John Reck1a61da52016-04-28 13:18:15 -07001440 if (result == NO_ERROR) {
1441 reply->write(transform, sizeof(float) * 16);
1442 }
John Reckce8e5df2016-04-28 10:12:47 -07001443 }
Dan Stoza50101d02016-04-07 16:53:23 -07001444 if (result != NO_ERROR) {
1445 ALOGE("getLastQueuedBuffer failed to write buffer: %d", result);
1446 return result;
1447 }
Tobin Ehlis209e5fb2019-03-26 14:06:29 -06001448 if (fence == nullptr) {
1449 ALOGE("getLastQueuedBuffer returned a NULL fence, setting to Fence::NO_FENCE");
1450 fence = Fence::NO_FENCE;
1451 }
Dan Stoza50101d02016-04-07 16:53:23 -07001452 result = reply->write(*fence);
1453 if (result != NO_ERROR) {
1454 ALOGE("getLastQueuedBuffer failed to write fence: %d", result);
1455 return result;
1456 }
1457 return NO_ERROR;
1458 }
John Reckaa5a0b22021-05-18 00:42:56 -04001459 case GET_LAST_QUEUED_BUFFER2: {
1460 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1461 sp<GraphicBuffer> buffer(nullptr);
1462 sp<Fence> fence(Fence::NO_FENCE);
1463 Rect crop;
1464 uint32_t transform;
1465 status_t result = getLastQueuedBuffer(&buffer, &fence, &crop, &transform);
1466 reply->writeInt32(result);
1467 if (result != NO_ERROR) {
1468 return result;
1469 }
1470 if (!buffer.get()) {
1471 reply->writeBool(false);
1472 } else {
1473 reply->writeBool(true);
1474 result = reply->write(*buffer);
1475 if (result == NO_ERROR) {
1476 result = reply->write(crop);
1477 }
1478 if (result == NO_ERROR) {
1479 result = reply->writeUint32(transform);
1480 }
1481 }
1482 if (result != NO_ERROR) {
1483 ALOGE("getLastQueuedBuffer failed to write buffer: %d", result);
1484 return result;
1485 }
1486 if (fence == nullptr) {
1487 ALOGE("getLastQueuedBuffer returned a NULL fence, setting to Fence::NO_FENCE");
1488 fence = Fence::NO_FENCE;
1489 }
1490 result = reply->write(*fence);
1491 if (result != NO_ERROR) {
1492 ALOGE("getLastQueuedBuffer failed to write fence: %d", result);
1493 return result;
1494 }
1495 return NO_ERROR;
1496 }
1497
Pablo Ceballosce796e72016-02-04 19:10:51 -08001498 case GET_FRAME_TIMESTAMPS: {
1499 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Brian Anderson3890c392016-07-25 12:48:08 -07001500 FrameEventHistoryDelta frameTimestamps;
1501 getFrameTimestamps(&frameTimestamps);
1502 status_t result = reply->write(frameTimestamps);
Pablo Ceballosce796e72016-02-04 19:10:51 -08001503 if (result != NO_ERROR) {
Brian Anderson3890c392016-07-25 12:48:08 -07001504 ALOGE("BnGBP::GET_FRAME_TIMESTAMPS failed to write buffer: %d",
1505 result);
Pablo Ceballosce796e72016-02-04 19:10:51 -08001506 return result;
1507 }
Pablo Ceballosce796e72016-02-04 19:10:51 -08001508 return NO_ERROR;
1509 }
Pablo Ceballos8e3e92b2016-06-27 17:56:53 -07001510 case GET_UNIQUE_ID: {
1511 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1512 uint64_t outId = 0;
1513 status_t actualResult = getUniqueId(&outId);
1514 status_t result = reply->writeInt32(actualResult);
1515 if (result != NO_ERROR) {
1516 return result;
1517 }
1518 result = reply->writeUint64(outId);
1519 if (result != NO_ERROR) {
1520 return result;
1521 }
1522 return NO_ERROR;
1523 }
Chia-I Wue2786ea2017-08-07 10:36:08 -07001524 case GET_CONSUMER_USAGE: {
1525 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1526 uint64_t outUsage = 0;
1527 status_t actualResult = getConsumerUsage(&outUsage);
1528 status_t result = reply->writeInt32(actualResult);
1529 if (result != NO_ERROR) {
1530 return result;
1531 }
1532 result = reply->writeUint64(outUsage);
1533 if (result != NO_ERROR) {
1534 return result;
1535 }
1536 return NO_ERROR;
1537 }
Sungtak Lee3249fb62019-03-02 16:40:47 -08001538 case SET_LEGACY_BUFFER_DROP: {
1539 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1540 bool drop = data.readInt32();
1541 int result = setLegacyBufferDrop(drop);
1542 reply->writeInt32(result);
1543 return NO_ERROR;
1544 }
Yiwei Zhang538cedc2019-06-24 19:35:03 -07001545 case SET_AUTO_PREROTATION: {
1546 CHECK_INTERFACE(IGraphicBuffer, data, reply);
1547 bool autoPrerotation = data.readBool();
1548 status_t result = setAutoPrerotation(autoPrerotation);
1549 reply->writeInt32(result);
1550 return NO_ERROR;
1551 }
Ady Abraham107788e2023-10-17 12:31:08 -07001552#if COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(BQ_SETFRAMERATE)
Ady Abraham6cdd3fd2023-09-07 18:45:58 -07001553 case SET_FRAME_RATE: {
1554 CHECK_INTERFACE(IGraphicBuffer, data, reply);
1555 float frameRate = data.readFloat();
1556 int8_t compatibility = data.readInt32();
1557 int8_t changeFrameRateStrategy = data.readInt32();
1558 status_t result = setFrameRate(frameRate, compatibility, changeFrameRateStrategy);
1559 reply->writeInt32(result);
1560 return NO_ERROR;
1561 }
1562#endif
John Reckdb164ff2024-04-03 16:59:28 -04001563#if COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(BQ_EXTENDEDALLOCATE)
1564 case SET_ADDITIONAL_OPTIONS: {
1565 CHECK_INTERFACE(IGraphicBuffer, data, reply);
1566 int optionCount = data.readInt32();
1567 if (optionCount < 0 || optionCount > 100) {
1568 return BAD_VALUE;
1569 }
1570 std::vector<gui::AdditionalOptions> opts;
1571 opts.reserve(optionCount);
1572 for (int i = 0; i < optionCount; i++) {
1573 const char* name = data.readCString();
1574 int64_t value = 0;
1575 if (name == nullptr || data.readInt64(&value) != NO_ERROR) {
1576 return BAD_VALUE;
1577 }
1578 opts.emplace_back(name, value);
1579 }
1580 status_t result = setAdditionalOptions(opts);
1581 reply->writeInt32(result);
1582 return NO_ERROR;
1583 }
1584#endif
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001585 }
1586 return BBinder::onTransact(code, data, reply, flags);
1587}
1588
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001589}; // namespace android