blob: ef770e89fe94f9baec742eee15c881633339cae0 [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>
Brian Anderson175a7202016-10-10 16:52:56 -070022#include <utils/String8.h>
Mathias Agopiana4e19522013-07-31 20:09:53 -070023
24#include <binder/Parcel.h>
25#include <binder/IInterface.h>
26
Dan Stozade7100a2015-03-11 16:38:47 -070027#include <gui/BufferItem.h>
Mathias Agopiana4e19522013-07-31 20:09:53 -070028#include <gui/IConsumerListener.h>
29#include <gui/IGraphicBufferConsumer.h>
30
31#include <ui/GraphicBuffer.h>
32#include <ui/Fence.h>
33
34#include <system/window.h>
35
36namespace android {
Mathias Agopiana4e19522013-07-31 20:09:53 -070037
38enum {
39 ACQUIRE_BUFFER = IBinder::FIRST_CALL_TRANSACTION,
Dan Stoza9f3053d2014-03-06 15:14:33 -080040 DETACH_BUFFER,
41 ATTACH_BUFFER,
Mathias Agopiana4e19522013-07-31 20:09:53 -070042 RELEASE_BUFFER,
43 CONSUMER_CONNECT,
44 CONSUMER_DISCONNECT,
45 GET_RELEASED_BUFFERS,
46 SET_DEFAULT_BUFFER_SIZE,
Pablo Ceballos19e3e062015-08-19 16:16:06 -070047 SET_MAX_BUFFER_COUNT,
Mathias Agopiana4e19522013-07-31 20:09:53 -070048 SET_MAX_ACQUIRED_BUFFER_COUNT,
49 SET_CONSUMER_NAME,
50 SET_DEFAULT_BUFFER_FORMAT,
Eino-Ville Talvala5b75a512015-02-19 16:10:43 -080051 SET_DEFAULT_BUFFER_DATA_SPACE,
Mathias Agopiana4e19522013-07-31 20:09:53 -070052 SET_CONSUMER_USAGE_BITS,
Mathias Agopiandb89edc2013-08-02 01:40:18 -070053 SET_TRANSFORM_HINT,
Jesse Hall399184a2014-03-03 15:42:54 -080054 GET_SIDEBAND_STREAM,
Dan Stozae77c7662016-05-13 11:37:28 -070055 GET_OCCUPANCY_HISTORY,
Eino-Ville Talvalabc2df652016-07-21 17:06:58 -070056 DISCARD_FREE_BUFFERS,
Mathias Agopiandb89edc2013-08-02 01:40:18 -070057 DUMP,
Mathias Agopiana4e19522013-07-31 20:09:53 -070058};
59
60
61class BpGraphicBufferConsumer : public BpInterface<IGraphicBufferConsumer>
62{
63public:
Chih-Hung Hsiehe2347b72016-04-25 15:41:05 -070064 explicit BpGraphicBufferConsumer(const sp<IBinder>& impl)
Mathias Agopiana4e19522013-07-31 20:09:53 -070065 : BpInterface<IGraphicBufferConsumer>(impl)
66 {
67 }
68
Dan Stozad723bd72014-11-18 10:24:03 -080069 virtual ~BpGraphicBufferConsumer();
70
Dan Stozaa4650a52015-05-12 12:56:16 -070071 virtual status_t acquireBuffer(BufferItem *buffer, nsecs_t presentWhen,
72 uint64_t maxFrameNumber) {
Mathias Agopiana4e19522013-07-31 20:09:53 -070073 Parcel data, reply;
74 data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor());
75 data.writeInt64(presentWhen);
Dan Stozaa4650a52015-05-12 12:56:16 -070076 data.writeUint64(maxFrameNumber);
Mathias Agopiana4e19522013-07-31 20:09:53 -070077 status_t result = remote()->transact(ACQUIRE_BUFFER, data, &reply);
78 if (result != NO_ERROR) {
79 return result;
80 }
81 result = reply.read(*buffer);
82 if (result != NO_ERROR) {
83 return result;
84 }
85 return reply.readInt32();
86 }
87
Dan Stoza9f3053d2014-03-06 15:14:33 -080088 virtual status_t detachBuffer(int slot) {
89 Parcel data, reply;
90 data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor());
91 data.writeInt32(slot);
92 status_t result = remote()->transact(DETACH_BUFFER, data, &reply);
93 if (result != NO_ERROR) {
94 return result;
95 }
96 result = reply.readInt32();
97 return result;
98 }
99
100 virtual status_t attachBuffer(int* slot, const sp<GraphicBuffer>& buffer) {
101 Parcel data, reply;
102 data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor());
103 data.write(*buffer.get());
104 status_t result = remote()->transact(ATTACH_BUFFER, data, &reply);
105 if (result != NO_ERROR) {
106 return result;
107 }
108 *slot = reply.readInt32();
109 result = reply.readInt32();
110 return result;
111 }
112
Mathias Agopiana4e19522013-07-31 20:09:53 -0700113 virtual status_t releaseBuffer(int buf, uint64_t frameNumber,
Igor Murashkin7d2d1602013-11-12 18:02:20 -0800114 EGLDisplay display __attribute__((unused)), EGLSyncKHR fence __attribute__((unused)),
Mathias Agopiana4e19522013-07-31 20:09:53 -0700115 const sp<Fence>& releaseFence) {
116 Parcel data, reply;
117 data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor());
118 data.writeInt32(buf);
Dan Stozad723bd72014-11-18 10:24:03 -0800119 data.writeInt64(static_cast<int64_t>(frameNumber));
Mathias Agopiana4e19522013-07-31 20:09:53 -0700120 data.write(*releaseFence);
121 status_t result = remote()->transact(RELEASE_BUFFER, data, &reply);
122 if (result != NO_ERROR) {
123 return result;
124 }
125 return reply.readInt32();
126 }
127
128 virtual status_t consumerConnect(const sp<IConsumerListener>& consumer, bool controlledByApp) {
129 Parcel data, reply;
130 data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor());
Marco Nelissen2ea926b2014-11-14 08:01:01 -0800131 data.writeStrongBinder(IInterface::asBinder(consumer));
Mathias Agopiana4e19522013-07-31 20:09:53 -0700132 data.writeInt32(controlledByApp);
133 status_t result = remote()->transact(CONSUMER_CONNECT, data, &reply);
134 if (result != NO_ERROR) {
135 return result;
136 }
137 return reply.readInt32();
138 }
139
140 virtual status_t consumerDisconnect() {
141 Parcel data, reply;
142 data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor());
143 status_t result = remote()->transact(CONSUMER_DISCONNECT, data, &reply);
144 if (result != NO_ERROR) {
145 return result;
146 }
147 return reply.readInt32();
148 }
149
Dan Stozafebd4f42014-04-09 16:14:51 -0700150 virtual status_t getReleasedBuffers(uint64_t* slotMask) {
Mathias Agopiana4e19522013-07-31 20:09:53 -0700151 Parcel data, reply;
Dan Stozafebd4f42014-04-09 16:14:51 -0700152 if (slotMask == NULL) {
153 ALOGE("getReleasedBuffers: slotMask must not be NULL");
154 return BAD_VALUE;
155 }
Mathias Agopiana4e19522013-07-31 20:09:53 -0700156 data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor());
157 status_t result = remote()->transact(GET_RELEASED_BUFFERS, data, &reply);
158 if (result != NO_ERROR) {
159 return result;
160 }
Dan Stozad723bd72014-11-18 10:24:03 -0800161 *slotMask = static_cast<uint64_t>(reply.readInt64());
Mathias Agopiana4e19522013-07-31 20:09:53 -0700162 return reply.readInt32();
163 }
164
Dan Stozad723bd72014-11-18 10:24:03 -0800165 virtual status_t setDefaultBufferSize(uint32_t width, uint32_t height) {
Mathias Agopiana4e19522013-07-31 20:09:53 -0700166 Parcel data, reply;
167 data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor());
Dan Stozad723bd72014-11-18 10:24:03 -0800168 data.writeUint32(width);
169 data.writeUint32(height);
Mathias Agopiana4e19522013-07-31 20:09:53 -0700170 status_t result = remote()->transact(SET_DEFAULT_BUFFER_SIZE, data, &reply);
171 if (result != NO_ERROR) {
172 return result;
173 }
174 return reply.readInt32();
175 }
176
Pablo Ceballos19e3e062015-08-19 16:16:06 -0700177 virtual status_t setMaxBufferCount(int bufferCount) {
Mathias Agopiana4e19522013-07-31 20:09:53 -0700178 Parcel data, reply;
179 data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor());
180 data.writeInt32(bufferCount);
Pablo Ceballos19e3e062015-08-19 16:16:06 -0700181 status_t result = remote()->transact(SET_MAX_BUFFER_COUNT, data, &reply);
Mathias Agopiana4e19522013-07-31 20:09:53 -0700182 if (result != NO_ERROR) {
183 return result;
184 }
185 return reply.readInt32();
186 }
187
188 virtual status_t setMaxAcquiredBufferCount(int maxAcquiredBuffers) {
189 Parcel data, reply;
190 data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor());
191 data.writeInt32(maxAcquiredBuffers);
192 status_t result = remote()->transact(SET_MAX_ACQUIRED_BUFFER_COUNT, data, &reply);
193 if (result != NO_ERROR) {
194 return result;
195 }
196 return reply.readInt32();
197 }
198
199 virtual void setConsumerName(const String8& name) {
200 Parcel data, reply;
201 data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor());
202 data.writeString8(name);
203 remote()->transact(SET_CONSUMER_NAME, data, &reply);
204 }
205
Dan Stozad723bd72014-11-18 10:24:03 -0800206 virtual status_t setDefaultBufferFormat(PixelFormat defaultFormat) {
Mathias Agopiana4e19522013-07-31 20:09:53 -0700207 Parcel data, reply;
208 data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor());
Dan Stozad723bd72014-11-18 10:24:03 -0800209 data.writeInt32(static_cast<int32_t>(defaultFormat));
Mathias Agopiana4e19522013-07-31 20:09:53 -0700210 status_t result = remote()->transact(SET_DEFAULT_BUFFER_FORMAT, data, &reply);
211 if (result != NO_ERROR) {
212 return result;
213 }
214 return reply.readInt32();
215 }
216
Eino-Ville Talvala5b75a512015-02-19 16:10:43 -0800217 virtual status_t setDefaultBufferDataSpace(
218 android_dataspace defaultDataSpace) {
219 Parcel data, reply;
220 data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor());
221 data.writeInt32(static_cast<int32_t>(defaultDataSpace));
222 status_t result = remote()->transact(SET_DEFAULT_BUFFER_DATA_SPACE,
223 data, &reply);
224 if (result != NO_ERROR) {
225 return result;
226 }
227 return reply.readInt32();
228 }
229
Mathias Agopiana4e19522013-07-31 20:09:53 -0700230 virtual status_t setConsumerUsageBits(uint32_t usage) {
231 Parcel data, reply;
232 data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor());
Dan Stozad723bd72014-11-18 10:24:03 -0800233 data.writeUint32(usage);
Mathias Agopiana4e19522013-07-31 20:09:53 -0700234 status_t result = remote()->transact(SET_CONSUMER_USAGE_BITS, data, &reply);
235 if (result != NO_ERROR) {
236 return result;
237 }
238 return reply.readInt32();
239 }
240
241 virtual status_t setTransformHint(uint32_t hint) {
242 Parcel data, reply;
243 data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor());
Dan Stozad723bd72014-11-18 10:24:03 -0800244 data.writeUint32(hint);
Mathias Agopiana4e19522013-07-31 20:09:53 -0700245 status_t result = remote()->transact(SET_TRANSFORM_HINT, data, &reply);
246 if (result != NO_ERROR) {
247 return result;
248 }
249 return reply.readInt32();
250 }
Mathias Agopiandb89edc2013-08-02 01:40:18 -0700251
Jesse Hall399184a2014-03-03 15:42:54 -0800252 virtual sp<NativeHandle> getSidebandStream() const {
253 Parcel data, reply;
254 status_t err;
255 data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor());
256 if ((err = remote()->transact(GET_SIDEBAND_STREAM, data, &reply)) != NO_ERROR) {
257 return NULL;
258 }
259 sp<NativeHandle> stream;
260 if (reply.readInt32()) {
Wonsik Kim0ec54e12014-03-21 10:46:24 +0900261 stream = NativeHandle::create(reply.readNativeHandle(), true);
Jesse Hall399184a2014-03-03 15:42:54 -0800262 }
263 return stream;
264 }
265
Dan Stozae77c7662016-05-13 11:37:28 -0700266 virtual status_t getOccupancyHistory(bool forceFlush,
267 std::vector<OccupancyTracker::Segment>* outHistory) {
268 Parcel data, reply;
269 data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor());
270 status_t error = data.writeBool(forceFlush);
271 if (error != NO_ERROR) {
272 return error;
273 }
274 error = remote()->transact(GET_OCCUPANCY_HISTORY, data,
275 &reply);
276 if (error != NO_ERROR) {
277 return error;
278 }
279 error = reply.readParcelableVector(outHistory);
280 if (error != NO_ERROR) {
281 return error;
282 }
283 status_t result = NO_ERROR;
284 error = reply.readInt32(&result);
285 if (error != NO_ERROR) {
286 return error;
287 }
288 return result;
289 }
290
Eino-Ville Talvalabc2df652016-07-21 17:06:58 -0700291 virtual status_t discardFreeBuffers() {
292 Parcel data, reply;
293 data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor());
294 status_t error = remote()->transact(DISCARD_FREE_BUFFERS, data, &reply);
295 if (error != NO_ERROR) {
296 return error;
297 }
298 int32_t result = NO_ERROR;
299 error = reply.readInt32(&result);
300 if (error != NO_ERROR) {
301 return error;
302 }
303 return result;
304 }
305
Colin Cross3d1d2802016-09-26 18:10:16 -0700306 virtual void dumpState(String8& result, const char* prefix) const {
Mathias Agopiandb89edc2013-08-02 01:40:18 -0700307 Parcel data, reply;
308 data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor());
309 data.writeString8(result);
310 data.writeString8(String8(prefix ? prefix : ""));
311 remote()->transact(DUMP, data, &reply);
312 reply.readString8();
313 }
Mathias Agopiana4e19522013-07-31 20:09:53 -0700314};
315
Dan Stozad723bd72014-11-18 10:24:03 -0800316// Out-of-line virtual method definition to trigger vtable emission in this
317// translation unit (see clang warning -Wweak-vtables)
318BpGraphicBufferConsumer::~BpGraphicBufferConsumer() {}
319
Mathias Agopiana4e19522013-07-31 20:09:53 -0700320IMPLEMENT_META_INTERFACE(GraphicBufferConsumer, "android.gui.IGraphicBufferConsumer");
321
322// ----------------------------------------------------------------------
323
324status_t BnGraphicBufferConsumer::onTransact(
325 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
326{
327 switch(code) {
328 case ACQUIRE_BUFFER: {
329 CHECK_INTERFACE(IGraphicBufferConsumer, data, reply);
330 BufferItem item;
331 int64_t presentWhen = data.readInt64();
Dan Stozaa4650a52015-05-12 12:56:16 -0700332 uint64_t maxFrameNumber = data.readUint64();
333 status_t result = acquireBuffer(&item, presentWhen, maxFrameNumber);
Mathias Agopiana4e19522013-07-31 20:09:53 -0700334 status_t err = reply->write(item);
335 if (err) return err;
336 reply->writeInt32(result);
337 return NO_ERROR;
Dan Stozad723bd72014-11-18 10:24:03 -0800338 }
Dan Stoza9f3053d2014-03-06 15:14:33 -0800339 case DETACH_BUFFER: {
340 CHECK_INTERFACE(IGraphicBufferConsumer, data, reply);
341 int slot = data.readInt32();
342 int result = detachBuffer(slot);
343 reply->writeInt32(result);
344 return NO_ERROR;
Dan Stozad723bd72014-11-18 10:24:03 -0800345 }
Dan Stoza9f3053d2014-03-06 15:14:33 -0800346 case ATTACH_BUFFER: {
347 CHECK_INTERFACE(IGraphicBufferConsumer, data, reply);
348 sp<GraphicBuffer> buffer = new GraphicBuffer();
349 data.read(*buffer.get());
Robert Shihdded8fd2016-01-11 11:42:48 -0800350 int slot = -1;
Dan Stoza9f3053d2014-03-06 15:14:33 -0800351 int result = attachBuffer(&slot, buffer);
352 reply->writeInt32(slot);
353 reply->writeInt32(result);
354 return NO_ERROR;
Dan Stozad723bd72014-11-18 10:24:03 -0800355 }
Mathias Agopiana4e19522013-07-31 20:09:53 -0700356 case RELEASE_BUFFER: {
357 CHECK_INTERFACE(IGraphicBufferConsumer, data, reply);
358 int buf = data.readInt32();
Dan Stozad723bd72014-11-18 10:24:03 -0800359 uint64_t frameNumber = static_cast<uint64_t>(data.readInt64());
Mathias Agopiana4e19522013-07-31 20:09:53 -0700360 sp<Fence> releaseFence = new Fence();
361 status_t err = data.read(*releaseFence);
362 if (err) return err;
363 status_t result = releaseBuffer(buf, frameNumber,
364 EGL_NO_DISPLAY, EGL_NO_SYNC_KHR, releaseFence);
365 reply->writeInt32(result);
366 return NO_ERROR;
Dan Stozad723bd72014-11-18 10:24:03 -0800367 }
Mathias Agopiana4e19522013-07-31 20:09:53 -0700368 case CONSUMER_CONNECT: {
369 CHECK_INTERFACE(IGraphicBufferConsumer, data, reply);
370 sp<IConsumerListener> consumer = IConsumerListener::asInterface( data.readStrongBinder() );
371 bool controlledByApp = data.readInt32();
372 status_t result = consumerConnect(consumer, controlledByApp);
373 reply->writeInt32(result);
374 return NO_ERROR;
Dan Stozad723bd72014-11-18 10:24:03 -0800375 }
Mathias Agopiana4e19522013-07-31 20:09:53 -0700376 case CONSUMER_DISCONNECT: {
377 CHECK_INTERFACE(IGraphicBufferConsumer, data, reply);
378 status_t result = consumerDisconnect();
379 reply->writeInt32(result);
380 return NO_ERROR;
Dan Stozad723bd72014-11-18 10:24:03 -0800381 }
Mathias Agopiana4e19522013-07-31 20:09:53 -0700382 case GET_RELEASED_BUFFERS: {
383 CHECK_INTERFACE(IGraphicBufferConsumer, data, reply);
Pablo Ceballos93c617f2016-03-15 18:10:49 -0700384 uint64_t slotMask = 0;
Mathias Agopiana4e19522013-07-31 20:09:53 -0700385 status_t result = getReleasedBuffers(&slotMask);
Dan Stozad723bd72014-11-18 10:24:03 -0800386 reply->writeInt64(static_cast<int64_t>(slotMask));
Mathias Agopiana4e19522013-07-31 20:09:53 -0700387 reply->writeInt32(result);
388 return NO_ERROR;
Dan Stozad723bd72014-11-18 10:24:03 -0800389 }
Mathias Agopiana4e19522013-07-31 20:09:53 -0700390 case SET_DEFAULT_BUFFER_SIZE: {
391 CHECK_INTERFACE(IGraphicBufferConsumer, data, reply);
Dan Stozad723bd72014-11-18 10:24:03 -0800392 uint32_t width = data.readUint32();
393 uint32_t height = data.readUint32();
394 status_t result = setDefaultBufferSize(width, height);
Mathias Agopiana4e19522013-07-31 20:09:53 -0700395 reply->writeInt32(result);
396 return NO_ERROR;
Dan Stozad723bd72014-11-18 10:24:03 -0800397 }
Pablo Ceballos19e3e062015-08-19 16:16:06 -0700398 case SET_MAX_BUFFER_COUNT: {
Mathias Agopiana4e19522013-07-31 20:09:53 -0700399 CHECK_INTERFACE(IGraphicBufferConsumer, data, reply);
Dan Stozad723bd72014-11-18 10:24:03 -0800400 int bufferCount = data.readInt32();
Pablo Ceballos19e3e062015-08-19 16:16:06 -0700401 status_t result = setMaxBufferCount(bufferCount);
Mathias Agopiana4e19522013-07-31 20:09:53 -0700402 reply->writeInt32(result);
403 return NO_ERROR;
Dan Stozad723bd72014-11-18 10:24:03 -0800404 }
Mathias Agopiana4e19522013-07-31 20:09:53 -0700405 case SET_MAX_ACQUIRED_BUFFER_COUNT: {
406 CHECK_INTERFACE(IGraphicBufferConsumer, data, reply);
Dan Stozad723bd72014-11-18 10:24:03 -0800407 int maxAcquiredBuffers = data.readInt32();
Mathias Agopiana4e19522013-07-31 20:09:53 -0700408 status_t result = setMaxAcquiredBufferCount(maxAcquiredBuffers);
409 reply->writeInt32(result);
410 return NO_ERROR;
Dan Stozad723bd72014-11-18 10:24:03 -0800411 }
Mathias Agopiana4e19522013-07-31 20:09:53 -0700412 case SET_CONSUMER_NAME: {
413 CHECK_INTERFACE(IGraphicBufferConsumer, data, reply);
414 setConsumerName( data.readString8() );
415 return NO_ERROR;
Dan Stozad723bd72014-11-18 10:24:03 -0800416 }
Mathias Agopiana4e19522013-07-31 20:09:53 -0700417 case SET_DEFAULT_BUFFER_FORMAT: {
418 CHECK_INTERFACE(IGraphicBufferConsumer, data, reply);
Dan Stozad723bd72014-11-18 10:24:03 -0800419 PixelFormat defaultFormat = static_cast<PixelFormat>(data.readInt32());
Mathias Agopiana4e19522013-07-31 20:09:53 -0700420 status_t result = setDefaultBufferFormat(defaultFormat);
421 reply->writeInt32(result);
422 return NO_ERROR;
Dan Stozad723bd72014-11-18 10:24:03 -0800423 }
Eino-Ville Talvala5b75a512015-02-19 16:10:43 -0800424 case SET_DEFAULT_BUFFER_DATA_SPACE: {
425 CHECK_INTERFACE(IGraphicBufferConsumer, data, reply);
426 android_dataspace defaultDataSpace =
427 static_cast<android_dataspace>(data.readInt32());
428 status_t result = setDefaultBufferDataSpace(defaultDataSpace);
429 reply->writeInt32(result);
430 return NO_ERROR;
431 }
Mathias Agopiana4e19522013-07-31 20:09:53 -0700432 case SET_CONSUMER_USAGE_BITS: {
433 CHECK_INTERFACE(IGraphicBufferConsumer, data, reply);
Dan Stozad723bd72014-11-18 10:24:03 -0800434 uint32_t usage = data.readUint32();
Mathias Agopiana4e19522013-07-31 20:09:53 -0700435 status_t result = setConsumerUsageBits(usage);
436 reply->writeInt32(result);
437 return NO_ERROR;
Dan Stozad723bd72014-11-18 10:24:03 -0800438 }
Mathias Agopiana4e19522013-07-31 20:09:53 -0700439 case SET_TRANSFORM_HINT: {
440 CHECK_INTERFACE(IGraphicBufferConsumer, data, reply);
Dan Stozad723bd72014-11-18 10:24:03 -0800441 uint32_t hint = data.readUint32();
Mathias Agopiana4e19522013-07-31 20:09:53 -0700442 status_t result = setTransformHint(hint);
443 reply->writeInt32(result);
444 return NO_ERROR;
Dan Stozad723bd72014-11-18 10:24:03 -0800445 }
Dan Stoza80640fc2015-04-28 13:18:07 -0700446 case GET_SIDEBAND_STREAM: {
447 CHECK_INTERFACE(IGraphicBufferConsumer, data, reply);
448 sp<NativeHandle> stream = getSidebandStream();
449 reply->writeInt32(static_cast<int32_t>(stream != NULL));
450 if (stream != NULL) {
451 reply->writeNativeHandle(stream->handle());
452 }
453 return NO_ERROR;
454 }
Dan Stozae77c7662016-05-13 11:37:28 -0700455 case GET_OCCUPANCY_HISTORY: {
456 CHECK_INTERFACE(IGraphicBufferConsumer, data, reply);
457 bool forceFlush = false;
458 status_t error = data.readBool(&forceFlush);
459 if (error != NO_ERROR) {
460 return error;
461 }
462 std::vector<OccupancyTracker::Segment> history;
463 status_t result = getOccupancyHistory(forceFlush, &history);
464 error = reply->writeParcelableVector(history);
465 if (error != NO_ERROR) {
466 return error;
467 }
468 error = reply->writeInt32(result);
469 if (error != NO_ERROR) {
470 return error;
471 }
472 return NO_ERROR;
473 }
Eino-Ville Talvalabc2df652016-07-21 17:06:58 -0700474 case DISCARD_FREE_BUFFERS: {
475 CHECK_INTERFACE(IGraphicBufferConsumer, data, reply);
476 status_t result = discardFreeBuffers();
477 status_t error = reply->writeInt32(result);
478 return error;
479 }
Mathias Agopiandb89edc2013-08-02 01:40:18 -0700480 case DUMP: {
481 CHECK_INTERFACE(IGraphicBufferConsumer, data, reply);
482 String8 result = data.readString8();
483 String8 prefix = data.readString8();
Colin Cross3d1d2802016-09-26 18:10:16 -0700484 static_cast<IGraphicBufferConsumer*>(this)->dumpState(result, prefix);
Mathias Agopiandb89edc2013-08-02 01:40:18 -0700485 reply->writeString8(result);
486 return NO_ERROR;
487 }
Mathias Agopiana4e19522013-07-31 20:09:53 -0700488 }
489 return BBinder::onTransact(code, data, reply, flags);
490}
491
492}; // namespace android