blob: f38abbeb9eab4a66d2f338940eb2644337fe3dc8 [file] [log] [blame]
Mathias Agopiana4e19522013-07-31 20:09:53 -07001/*
2 * Copyright (C) 2013 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
Mathias Agopiana4e19522013-07-31 20:09:53 -070017#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>
Mathias Agopiana4e19522013-07-31 20:09:53 -070022
23#include <binder/Parcel.h>
24#include <binder/IInterface.h>
25
26#include <gui/IConsumerListener.h>
27#include <gui/IGraphicBufferConsumer.h>
28
29#include <ui/GraphicBuffer.h>
30#include <ui/Fence.h>
31
32#include <system/window.h>
33
34namespace android {
35// ---------------------------------------------------------------------------
36
37IGraphicBufferConsumer::BufferItem::BufferItem() :
38 mTransform(0),
39 mScalingMode(NATIVE_WINDOW_SCALING_MODE_FREEZE),
40 mTimestamp(0),
Andy McFadden3c256212013-08-16 14:55:39 -070041 mIsAutoTimestamp(false),
Eino-Ville Talvala82c6bcc2015-02-19 16:10:43 -080042 mDataSpace(HAL_DATASPACE_UNKNOWN),
Mathias Agopiana4e19522013-07-31 20:09:53 -070043 mFrameNumber(0),
44 mBuf(INVALID_BUFFER_SLOT),
45 mIsDroppable(false),
Mathias Agopianc1c05de2013-09-17 23:45:22 -070046 mAcquireCalled(false),
47 mTransformToDisplayInverse(false) {
Mathias Agopiana4e19522013-07-31 20:09:53 -070048 mCrop.makeInvalid();
49}
50
51size_t IGraphicBufferConsumer::BufferItem::getPodSize() const {
52 size_t c = sizeof(mCrop) +
53 sizeof(mTransform) +
54 sizeof(mScalingMode) +
55 sizeof(mTimestamp) +
Andy McFadden3c256212013-08-16 14:55:39 -070056 sizeof(mIsAutoTimestamp) +
Eino-Ville Talvala82c6bcc2015-02-19 16:10:43 -080057 sizeof(mDataSpace) +
Mathias Agopiana4e19522013-07-31 20:09:53 -070058 sizeof(mFrameNumber) +
59 sizeof(mBuf) +
60 sizeof(mIsDroppable) +
Mathias Agopianc1c05de2013-09-17 23:45:22 -070061 sizeof(mAcquireCalled) +
62 sizeof(mTransformToDisplayInverse);
Mathias Agopiana4e19522013-07-31 20:09:53 -070063 return c;
64}
65
66size_t IGraphicBufferConsumer::BufferItem::getFlattenedSize() const {
67 size_t c = 0;
68 if (mGraphicBuffer != 0) {
69 c += mGraphicBuffer->getFlattenedSize();
Dan Stoza1a0b8612014-03-20 15:36:31 -070070 c = FlattenableUtils::align<4>(c);
Mathias Agopiana4e19522013-07-31 20:09:53 -070071 }
72 if (mFence != 0) {
73 c += mFence->getFlattenedSize();
Dan Stoza1a0b8612014-03-20 15:36:31 -070074 c = FlattenableUtils::align<4>(c);
Mathias Agopiana4e19522013-07-31 20:09:53 -070075 }
76 return sizeof(int32_t) + c + getPodSize();
77}
78
79size_t IGraphicBufferConsumer::BufferItem::getFdCount() const {
80 size_t c = 0;
81 if (mGraphicBuffer != 0) {
82 c += mGraphicBuffer->getFdCount();
83 }
84 if (mFence != 0) {
85 c += mFence->getFdCount();
86 }
87 return c;
88}
89
Dan Stoza1a0b8612014-03-20 15:36:31 -070090static void writeBoolAsInt(void*& buffer, size_t& size, bool b) {
91 FlattenableUtils::write(buffer, size, static_cast<int32_t>(b));
92}
93
94static bool readBoolFromInt(void const*& buffer, size_t& size) {
95 int32_t i;
96 FlattenableUtils::read(buffer, size, i);
97 return static_cast<bool>(i);
98}
99
Mathias Agopiana4e19522013-07-31 20:09:53 -0700100status_t IGraphicBufferConsumer::BufferItem::flatten(
101 void*& buffer, size_t& size, int*& fds, size_t& count) const {
102
103 // make sure we have enough space
Dan Stoza1a0b8612014-03-20 15:36:31 -0700104 if (size < BufferItem::getFlattenedSize()) {
Mathias Agopiana4e19522013-07-31 20:09:53 -0700105 return NO_MEMORY;
106 }
107
108 // content flags are stored first
109 uint32_t& flags = *static_cast<uint32_t*>(buffer);
110
111 // advance the pointer
112 FlattenableUtils::advance(buffer, size, sizeof(uint32_t));
113
114 flags = 0;
115 if (mGraphicBuffer != 0) {
116 status_t err = mGraphicBuffer->flatten(buffer, size, fds, count);
117 if (err) return err;
118 size -= FlattenableUtils::align<4>(buffer);
119 flags |= 1;
120 }
121 if (mFence != 0) {
122 status_t err = mFence->flatten(buffer, size, fds, count);
123 if (err) return err;
124 size -= FlattenableUtils::align<4>(buffer);
125 flags |= 2;
126 }
127
128 // check we have enough space (in case flattening the fence/graphicbuffer lied to us)
129 if (size < getPodSize()) {
130 return NO_MEMORY;
131 }
132
133 FlattenableUtils::write(buffer, size, mCrop);
134 FlattenableUtils::write(buffer, size, mTransform);
135 FlattenableUtils::write(buffer, size, mScalingMode);
136 FlattenableUtils::write(buffer, size, mTimestamp);
Dan Stoza1a0b8612014-03-20 15:36:31 -0700137 writeBoolAsInt(buffer, size, mIsAutoTimestamp);
Eino-Ville Talvala82c6bcc2015-02-19 16:10:43 -0800138 FlattenableUtils::write(buffer, size, mDataSpace);
Mathias Agopiana4e19522013-07-31 20:09:53 -0700139 FlattenableUtils::write(buffer, size, mFrameNumber);
140 FlattenableUtils::write(buffer, size, mBuf);
Dan Stoza1a0b8612014-03-20 15:36:31 -0700141 writeBoolAsInt(buffer, size, mIsDroppable);
142 writeBoolAsInt(buffer, size, mAcquireCalled);
143 writeBoolAsInt(buffer, size, mTransformToDisplayInverse);
Mathias Agopiana4e19522013-07-31 20:09:53 -0700144
145 return NO_ERROR;
146}
147
148status_t IGraphicBufferConsumer::BufferItem::unflatten(
149 void const*& buffer, size_t& size, int const*& fds, size_t& count) {
150
151 if (size < sizeof(uint32_t))
152 return NO_MEMORY;
153
154 uint32_t flags = 0;
155 FlattenableUtils::read(buffer, size, flags);
156
157 if (flags & 1) {
158 mGraphicBuffer = new GraphicBuffer();
159 status_t err = mGraphicBuffer->unflatten(buffer, size, fds, count);
160 if (err) return err;
161 size -= FlattenableUtils::align<4>(buffer);
162 }
163
164 if (flags & 2) {
165 mFence = new Fence();
166 status_t err = mFence->unflatten(buffer, size, fds, count);
167 if (err) return err;
168 size -= FlattenableUtils::align<4>(buffer);
169 }
170
171 // check we have enough space
172 if (size < getPodSize()) {
173 return NO_MEMORY;
174 }
175
176 FlattenableUtils::read(buffer, size, mCrop);
177 FlattenableUtils::read(buffer, size, mTransform);
178 FlattenableUtils::read(buffer, size, mScalingMode);
179 FlattenableUtils::read(buffer, size, mTimestamp);
Dan Stoza1a0b8612014-03-20 15:36:31 -0700180 mIsAutoTimestamp = readBoolFromInt(buffer, size);
Eino-Ville Talvala82c6bcc2015-02-19 16:10:43 -0800181 FlattenableUtils::read(buffer, size, mDataSpace);
Mathias Agopiana4e19522013-07-31 20:09:53 -0700182 FlattenableUtils::read(buffer, size, mFrameNumber);
183 FlattenableUtils::read(buffer, size, mBuf);
Dan Stoza1a0b8612014-03-20 15:36:31 -0700184 mIsDroppable = readBoolFromInt(buffer, size);
185 mAcquireCalled = readBoolFromInt(buffer, size);
186 mTransformToDisplayInverse = readBoolFromInt(buffer, size);
Mathias Agopiana4e19522013-07-31 20:09:53 -0700187
188 return NO_ERROR;
189}
190
191// ---------------------------------------------------------------------------
192
193enum {
194 ACQUIRE_BUFFER = IBinder::FIRST_CALL_TRANSACTION,
Dan Stoza9f3053d2014-03-06 15:14:33 -0800195 DETACH_BUFFER,
196 ATTACH_BUFFER,
Mathias Agopiana4e19522013-07-31 20:09:53 -0700197 RELEASE_BUFFER,
198 CONSUMER_CONNECT,
199 CONSUMER_DISCONNECT,
200 GET_RELEASED_BUFFERS,
201 SET_DEFAULT_BUFFER_SIZE,
202 SET_DEFAULT_MAX_BUFFER_COUNT,
203 DISABLE_ASYNC_BUFFER,
204 SET_MAX_ACQUIRED_BUFFER_COUNT,
205 SET_CONSUMER_NAME,
206 SET_DEFAULT_BUFFER_FORMAT,
Eino-Ville Talvala82c6bcc2015-02-19 16:10:43 -0800207 SET_DEFAULT_BUFFER_DATA_SPACE,
Mathias Agopiana4e19522013-07-31 20:09:53 -0700208 SET_CONSUMER_USAGE_BITS,
Mathias Agopiandb89edc2013-08-02 01:40:18 -0700209 SET_TRANSFORM_HINT,
Jesse Hall399184a2014-03-03 15:42:54 -0800210 GET_SIDEBAND_STREAM,
Mathias Agopiandb89edc2013-08-02 01:40:18 -0700211 DUMP,
Mathias Agopiana4e19522013-07-31 20:09:53 -0700212};
213
214
215class BpGraphicBufferConsumer : public BpInterface<IGraphicBufferConsumer>
216{
217public:
218 BpGraphicBufferConsumer(const sp<IBinder>& impl)
219 : BpInterface<IGraphicBufferConsumer>(impl)
220 {
221 }
222
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800223 virtual ~BpGraphicBufferConsumer();
224
Mathias Agopiana4e19522013-07-31 20:09:53 -0700225 virtual status_t acquireBuffer(BufferItem *buffer, nsecs_t presentWhen) {
226 Parcel data, reply;
227 data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor());
228 data.writeInt64(presentWhen);
229 status_t result = remote()->transact(ACQUIRE_BUFFER, data, &reply);
230 if (result != NO_ERROR) {
231 return result;
232 }
233 result = reply.read(*buffer);
234 if (result != NO_ERROR) {
235 return result;
236 }
237 return reply.readInt32();
238 }
239
Dan Stoza9f3053d2014-03-06 15:14:33 -0800240 virtual status_t detachBuffer(int slot) {
241 Parcel data, reply;
242 data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor());
243 data.writeInt32(slot);
244 status_t result = remote()->transact(DETACH_BUFFER, data, &reply);
245 if (result != NO_ERROR) {
246 return result;
247 }
248 result = reply.readInt32();
249 return result;
250 }
251
252 virtual status_t attachBuffer(int* slot, const sp<GraphicBuffer>& buffer) {
253 Parcel data, reply;
254 data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor());
255 data.write(*buffer.get());
256 status_t result = remote()->transact(ATTACH_BUFFER, data, &reply);
257 if (result != NO_ERROR) {
258 return result;
259 }
260 *slot = reply.readInt32();
261 result = reply.readInt32();
262 return result;
263 }
264
Mathias Agopiana4e19522013-07-31 20:09:53 -0700265 virtual status_t releaseBuffer(int buf, uint64_t frameNumber,
Igor Murashkin7d2d1602013-11-12 18:02:20 -0800266 EGLDisplay display __attribute__((unused)), EGLSyncKHR fence __attribute__((unused)),
Mathias Agopiana4e19522013-07-31 20:09:53 -0700267 const sp<Fence>& releaseFence) {
268 Parcel data, reply;
269 data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor());
270 data.writeInt32(buf);
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800271 data.writeInt64(static_cast<int64_t>(frameNumber));
Mathias Agopiana4e19522013-07-31 20:09:53 -0700272 data.write(*releaseFence);
273 status_t result = remote()->transact(RELEASE_BUFFER, data, &reply);
274 if (result != NO_ERROR) {
275 return result;
276 }
277 return reply.readInt32();
278 }
279
280 virtual status_t consumerConnect(const sp<IConsumerListener>& consumer, bool controlledByApp) {
281 Parcel data, reply;
282 data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor());
Marco Nelissen097ca272014-11-14 08:01:01 -0800283 data.writeStrongBinder(IInterface::asBinder(consumer));
Mathias Agopiana4e19522013-07-31 20:09:53 -0700284 data.writeInt32(controlledByApp);
285 status_t result = remote()->transact(CONSUMER_CONNECT, data, &reply);
286 if (result != NO_ERROR) {
287 return result;
288 }
289 return reply.readInt32();
290 }
291
292 virtual status_t consumerDisconnect() {
293 Parcel data, reply;
294 data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor());
295 status_t result = remote()->transact(CONSUMER_DISCONNECT, data, &reply);
296 if (result != NO_ERROR) {
297 return result;
298 }
299 return reply.readInt32();
300 }
301
Dan Stozafebd4f42014-04-09 16:14:51 -0700302 virtual status_t getReleasedBuffers(uint64_t* slotMask) {
Mathias Agopiana4e19522013-07-31 20:09:53 -0700303 Parcel data, reply;
Dan Stozafebd4f42014-04-09 16:14:51 -0700304 if (slotMask == NULL) {
305 ALOGE("getReleasedBuffers: slotMask must not be NULL");
306 return BAD_VALUE;
307 }
Mathias Agopiana4e19522013-07-31 20:09:53 -0700308 data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor());
309 status_t result = remote()->transact(GET_RELEASED_BUFFERS, data, &reply);
310 if (result != NO_ERROR) {
311 return result;
312 }
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800313 *slotMask = static_cast<uint64_t>(reply.readInt64());
Mathias Agopiana4e19522013-07-31 20:09:53 -0700314 return reply.readInt32();
315 }
316
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800317 virtual status_t setDefaultBufferSize(uint32_t width, uint32_t height) {
Mathias Agopiana4e19522013-07-31 20:09:53 -0700318 Parcel data, reply;
319 data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor());
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800320 data.writeUint32(width);
321 data.writeUint32(height);
Mathias Agopiana4e19522013-07-31 20:09:53 -0700322 status_t result = remote()->transact(SET_DEFAULT_BUFFER_SIZE, data, &reply);
323 if (result != NO_ERROR) {
324 return result;
325 }
326 return reply.readInt32();
327 }
328
329 virtual status_t setDefaultMaxBufferCount(int bufferCount) {
330 Parcel data, reply;
331 data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor());
332 data.writeInt32(bufferCount);
333 status_t result = remote()->transact(SET_DEFAULT_MAX_BUFFER_COUNT, data, &reply);
334 if (result != NO_ERROR) {
335 return result;
336 }
337 return reply.readInt32();
338 }
339
340 virtual status_t disableAsyncBuffer() {
341 Parcel data, reply;
342 data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor());
343 status_t result = remote()->transact(DISABLE_ASYNC_BUFFER, data, &reply);
344 if (result != NO_ERROR) {
345 return result;
346 }
347 return reply.readInt32();
348 }
349
350 virtual status_t setMaxAcquiredBufferCount(int maxAcquiredBuffers) {
351 Parcel data, reply;
352 data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor());
353 data.writeInt32(maxAcquiredBuffers);
354 status_t result = remote()->transact(SET_MAX_ACQUIRED_BUFFER_COUNT, data, &reply);
355 if (result != NO_ERROR) {
356 return result;
357 }
358 return reply.readInt32();
359 }
360
361 virtual void setConsumerName(const String8& name) {
362 Parcel data, reply;
363 data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor());
364 data.writeString8(name);
365 remote()->transact(SET_CONSUMER_NAME, data, &reply);
366 }
367
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800368 virtual status_t setDefaultBufferFormat(PixelFormat defaultFormat) {
Mathias Agopiana4e19522013-07-31 20:09:53 -0700369 Parcel data, reply;
370 data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor());
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800371 data.writeInt32(static_cast<int32_t>(defaultFormat));
Mathias Agopiana4e19522013-07-31 20:09:53 -0700372 status_t result = remote()->transact(SET_DEFAULT_BUFFER_FORMAT, data, &reply);
373 if (result != NO_ERROR) {
374 return result;
375 }
376 return reply.readInt32();
377 }
378
Eino-Ville Talvala82c6bcc2015-02-19 16:10:43 -0800379 virtual status_t setDefaultBufferDataSpace(
380 android_dataspace defaultDataSpace) {
381 Parcel data, reply;
382 data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor());
383 data.writeInt32(static_cast<int32_t>(defaultDataSpace));
384 status_t result = remote()->transact(SET_DEFAULT_BUFFER_DATA_SPACE,
385 data, &reply);
386 if (result != NO_ERROR) {
387 return result;
388 }
389 return reply.readInt32();
390 }
391
Mathias Agopiana4e19522013-07-31 20:09:53 -0700392 virtual status_t setConsumerUsageBits(uint32_t usage) {
393 Parcel data, reply;
394 data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor());
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800395 data.writeUint32(usage);
Mathias Agopiana4e19522013-07-31 20:09:53 -0700396 status_t result = remote()->transact(SET_CONSUMER_USAGE_BITS, data, &reply);
397 if (result != NO_ERROR) {
398 return result;
399 }
400 return reply.readInt32();
401 }
402
403 virtual status_t setTransformHint(uint32_t hint) {
404 Parcel data, reply;
405 data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor());
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800406 data.writeUint32(hint);
Mathias Agopiana4e19522013-07-31 20:09:53 -0700407 status_t result = remote()->transact(SET_TRANSFORM_HINT, data, &reply);
408 if (result != NO_ERROR) {
409 return result;
410 }
411 return reply.readInt32();
412 }
Mathias Agopiandb89edc2013-08-02 01:40:18 -0700413
Jesse Hall399184a2014-03-03 15:42:54 -0800414 virtual sp<NativeHandle> getSidebandStream() const {
415 Parcel data, reply;
416 status_t err;
417 data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor());
418 if ((err = remote()->transact(GET_SIDEBAND_STREAM, data, &reply)) != NO_ERROR) {
419 return NULL;
420 }
421 sp<NativeHandle> stream;
422 if (reply.readInt32()) {
Wonsik Kim0ec54e12014-03-21 10:46:24 +0900423 stream = NativeHandle::create(reply.readNativeHandle(), true);
Jesse Hall399184a2014-03-03 15:42:54 -0800424 }
425 return stream;
426 }
427
Mathias Agopiandb89edc2013-08-02 01:40:18 -0700428 virtual void dump(String8& result, const char* prefix) const {
429 Parcel data, reply;
430 data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor());
431 data.writeString8(result);
432 data.writeString8(String8(prefix ? prefix : ""));
433 remote()->transact(DUMP, data, &reply);
434 reply.readString8();
435 }
Mathias Agopiana4e19522013-07-31 20:09:53 -0700436};
437
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800438// Out-of-line virtual method definition to trigger vtable emission in this
439// translation unit (see clang warning -Wweak-vtables)
440BpGraphicBufferConsumer::~BpGraphicBufferConsumer() {}
441
Mathias Agopiana4e19522013-07-31 20:09:53 -0700442IMPLEMENT_META_INTERFACE(GraphicBufferConsumer, "android.gui.IGraphicBufferConsumer");
443
444// ----------------------------------------------------------------------
445
446status_t BnGraphicBufferConsumer::onTransact(
447 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
448{
449 switch(code) {
450 case ACQUIRE_BUFFER: {
451 CHECK_INTERFACE(IGraphicBufferConsumer, data, reply);
452 BufferItem item;
453 int64_t presentWhen = data.readInt64();
454 status_t result = acquireBuffer(&item, presentWhen);
455 status_t err = reply->write(item);
456 if (err) return err;
457 reply->writeInt32(result);
458 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800459 }
Dan Stoza9f3053d2014-03-06 15:14:33 -0800460 case DETACH_BUFFER: {
461 CHECK_INTERFACE(IGraphicBufferConsumer, data, reply);
462 int slot = data.readInt32();
463 int result = detachBuffer(slot);
464 reply->writeInt32(result);
465 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800466 }
Dan Stoza9f3053d2014-03-06 15:14:33 -0800467 case ATTACH_BUFFER: {
468 CHECK_INTERFACE(IGraphicBufferConsumer, data, reply);
469 sp<GraphicBuffer> buffer = new GraphicBuffer();
470 data.read(*buffer.get());
471 int slot;
472 int result = attachBuffer(&slot, buffer);
473 reply->writeInt32(slot);
474 reply->writeInt32(result);
475 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800476 }
Mathias Agopiana4e19522013-07-31 20:09:53 -0700477 case RELEASE_BUFFER: {
478 CHECK_INTERFACE(IGraphicBufferConsumer, data, reply);
479 int buf = data.readInt32();
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800480 uint64_t frameNumber = static_cast<uint64_t>(data.readInt64());
Mathias Agopiana4e19522013-07-31 20:09:53 -0700481 sp<Fence> releaseFence = new Fence();
482 status_t err = data.read(*releaseFence);
483 if (err) return err;
484 status_t result = releaseBuffer(buf, frameNumber,
485 EGL_NO_DISPLAY, EGL_NO_SYNC_KHR, releaseFence);
486 reply->writeInt32(result);
487 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800488 }
Mathias Agopiana4e19522013-07-31 20:09:53 -0700489 case CONSUMER_CONNECT: {
490 CHECK_INTERFACE(IGraphicBufferConsumer, data, reply);
491 sp<IConsumerListener> consumer = IConsumerListener::asInterface( data.readStrongBinder() );
492 bool controlledByApp = data.readInt32();
493 status_t result = consumerConnect(consumer, controlledByApp);
494 reply->writeInt32(result);
495 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800496 }
Mathias Agopiana4e19522013-07-31 20:09:53 -0700497 case CONSUMER_DISCONNECT: {
498 CHECK_INTERFACE(IGraphicBufferConsumer, data, reply);
499 status_t result = consumerDisconnect();
500 reply->writeInt32(result);
501 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800502 }
Mathias Agopiana4e19522013-07-31 20:09:53 -0700503 case GET_RELEASED_BUFFERS: {
504 CHECK_INTERFACE(IGraphicBufferConsumer, data, reply);
Dan Stozafebd4f42014-04-09 16:14:51 -0700505 uint64_t slotMask;
Mathias Agopiana4e19522013-07-31 20:09:53 -0700506 status_t result = getReleasedBuffers(&slotMask);
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800507 reply->writeInt64(static_cast<int64_t>(slotMask));
Mathias Agopiana4e19522013-07-31 20:09:53 -0700508 reply->writeInt32(result);
509 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800510 }
Mathias Agopiana4e19522013-07-31 20:09:53 -0700511 case SET_DEFAULT_BUFFER_SIZE: {
512 CHECK_INTERFACE(IGraphicBufferConsumer, data, reply);
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800513 uint32_t width = data.readUint32();
514 uint32_t height = data.readUint32();
515 status_t result = setDefaultBufferSize(width, height);
Mathias Agopiana4e19522013-07-31 20:09:53 -0700516 reply->writeInt32(result);
517 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800518 }
Mathias Agopiana4e19522013-07-31 20:09:53 -0700519 case SET_DEFAULT_MAX_BUFFER_COUNT: {
520 CHECK_INTERFACE(IGraphicBufferConsumer, data, reply);
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800521 int bufferCount = data.readInt32();
Mathias Agopiana4e19522013-07-31 20:09:53 -0700522 status_t result = setDefaultMaxBufferCount(bufferCount);
523 reply->writeInt32(result);
524 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800525 }
Mathias Agopiana4e19522013-07-31 20:09:53 -0700526 case DISABLE_ASYNC_BUFFER: {
527 CHECK_INTERFACE(IGraphicBufferConsumer, data, reply);
528 status_t result = disableAsyncBuffer();
529 reply->writeInt32(result);
530 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800531 }
Mathias Agopiana4e19522013-07-31 20:09:53 -0700532 case SET_MAX_ACQUIRED_BUFFER_COUNT: {
533 CHECK_INTERFACE(IGraphicBufferConsumer, data, reply);
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800534 int maxAcquiredBuffers = data.readInt32();
Mathias Agopiana4e19522013-07-31 20:09:53 -0700535 status_t result = setMaxAcquiredBufferCount(maxAcquiredBuffers);
536 reply->writeInt32(result);
537 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800538 }
Mathias Agopiana4e19522013-07-31 20:09:53 -0700539 case SET_CONSUMER_NAME: {
540 CHECK_INTERFACE(IGraphicBufferConsumer, data, reply);
541 setConsumerName( data.readString8() );
542 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800543 }
Mathias Agopiana4e19522013-07-31 20:09:53 -0700544 case SET_DEFAULT_BUFFER_FORMAT: {
545 CHECK_INTERFACE(IGraphicBufferConsumer, data, reply);
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800546 PixelFormat defaultFormat = static_cast<PixelFormat>(data.readInt32());
Mathias Agopiana4e19522013-07-31 20:09:53 -0700547 status_t result = setDefaultBufferFormat(defaultFormat);
548 reply->writeInt32(result);
549 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800550 }
Eino-Ville Talvala82c6bcc2015-02-19 16:10:43 -0800551 case SET_DEFAULT_BUFFER_DATA_SPACE: {
552 CHECK_INTERFACE(IGraphicBufferConsumer, data, reply);
553 android_dataspace defaultDataSpace =
554 static_cast<android_dataspace>(data.readInt32());
555 status_t result = setDefaultBufferDataSpace(defaultDataSpace);
556 reply->writeInt32(result);
557 return NO_ERROR;
558 }
Mathias Agopiana4e19522013-07-31 20:09:53 -0700559 case SET_CONSUMER_USAGE_BITS: {
560 CHECK_INTERFACE(IGraphicBufferConsumer, data, reply);
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800561 uint32_t usage = data.readUint32();
Mathias Agopiana4e19522013-07-31 20:09:53 -0700562 status_t result = setConsumerUsageBits(usage);
563 reply->writeInt32(result);
564 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800565 }
Mathias Agopiana4e19522013-07-31 20:09:53 -0700566 case SET_TRANSFORM_HINT: {
567 CHECK_INTERFACE(IGraphicBufferConsumer, data, reply);
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800568 uint32_t hint = data.readUint32();
Mathias Agopiana4e19522013-07-31 20:09:53 -0700569 status_t result = setTransformHint(hint);
570 reply->writeInt32(result);
571 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800572 }
Mathias Agopiandb89edc2013-08-02 01:40:18 -0700573 case DUMP: {
574 CHECK_INTERFACE(IGraphicBufferConsumer, data, reply);
575 String8 result = data.readString8();
576 String8 prefix = data.readString8();
577 static_cast<IGraphicBufferConsumer*>(this)->dump(result, prefix);
578 reply->writeString8(result);
579 return NO_ERROR;
580 }
Mathias Agopiana4e19522013-07-31 20:09:53 -0700581 }
582 return BBinder::onTransact(code, data, reply, flags);
583}
584
585}; // namespace android