1a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian/* 2a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian * Copyright (C) 2013 The Android Open Source Project 3a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian * 4a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian * Licensed under the Apache License, Version 2.0 (the "License"); 5a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian * you may not use this file except in compliance with the License. 6a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian * You may obtain a copy of the License at 7a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian * 8a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian * http://www.apache.org/licenses/LICENSE-2.0 9a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian * 10a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian * Unless required by applicable law or agreed to in writing, software 11a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian * distributed under the License is distributed on an "AS IS" BASIS, 12a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian * See the License for the specific language governing permissions and 14a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian * limitations under the License. 15a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian */ 16a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 17a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian#include <stdint.h> 18a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian#include <sys/types.h> 19a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 20a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian#include <utils/Errors.h> 21399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall#include <utils/NativeHandle.h> 22a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 23a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian#include <binder/Parcel.h> 24a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian#include <binder/IInterface.h> 25a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 26a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian#include <gui/IConsumerListener.h> 27a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian#include <gui/IGraphicBufferConsumer.h> 28a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 29a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian#include <ui/GraphicBuffer.h> 30a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian#include <ui/Fence.h> 31a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 32a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian#include <system/window.h> 33a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 34a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopiannamespace android { 35a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian// --------------------------------------------------------------------------- 36a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 37a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias AgopianIGraphicBufferConsumer::BufferItem::BufferItem() : 38a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian mTransform(0), 39a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian mScalingMode(NATIVE_WINDOW_SCALING_MODE_FREEZE), 40a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian mTimestamp(0), 413c25621ad7d13f64d3ab95a27fa970fbc9998f73Andy McFadden mIsAutoTimestamp(false), 42a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian mFrameNumber(0), 43a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian mBuf(INVALID_BUFFER_SLOT), 44a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian mIsDroppable(false), 45c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian mAcquireCalled(false), 46c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian mTransformToDisplayInverse(false) { 47a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian mCrop.makeInvalid(); 48a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian} 49a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 50a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopiansize_t IGraphicBufferConsumer::BufferItem::getPodSize() const { 51a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian size_t c = sizeof(mCrop) + 52a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian sizeof(mTransform) + 53a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian sizeof(mScalingMode) + 54a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian sizeof(mTimestamp) + 553c25621ad7d13f64d3ab95a27fa970fbc9998f73Andy McFadden sizeof(mIsAutoTimestamp) + 56a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian sizeof(mFrameNumber) + 57a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian sizeof(mBuf) + 58a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian sizeof(mIsDroppable) + 59c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian sizeof(mAcquireCalled) + 60c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian sizeof(mTransformToDisplayInverse); 61a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return c; 62a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian} 63a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 64a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopiansize_t IGraphicBufferConsumer::BufferItem::getFlattenedSize() const { 65a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian size_t c = 0; 66a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian if (mGraphicBuffer != 0) { 67a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian c += mGraphicBuffer->getFlattenedSize(); 681a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza c = FlattenableUtils::align<4>(c); 69a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 70a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian if (mFence != 0) { 71a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian c += mFence->getFlattenedSize(); 721a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza c = FlattenableUtils::align<4>(c); 73a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 74a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return sizeof(int32_t) + c + getPodSize(); 75a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian} 76a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 77a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopiansize_t IGraphicBufferConsumer::BufferItem::getFdCount() const { 78a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian size_t c = 0; 79a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian if (mGraphicBuffer != 0) { 80a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian c += mGraphicBuffer->getFdCount(); 81a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 82a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian if (mFence != 0) { 83a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian c += mFence->getFdCount(); 84a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 85a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return c; 86a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian} 87a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 881a0b8617909c94f6c7301b651cb7b07463529c8cDan Stozastatic void writeBoolAsInt(void*& buffer, size_t& size, bool b) { 891a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza FlattenableUtils::write(buffer, size, static_cast<int32_t>(b)); 901a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza} 911a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza 921a0b8617909c94f6c7301b651cb7b07463529c8cDan Stozastatic bool readBoolFromInt(void const*& buffer, size_t& size) { 931a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza int32_t i; 941a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza FlattenableUtils::read(buffer, size, i); 951a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza return static_cast<bool>(i); 961a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza} 971a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza 98a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopianstatus_t IGraphicBufferConsumer::BufferItem::flatten( 99a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian void*& buffer, size_t& size, int*& fds, size_t& count) const { 100a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 101a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian // make sure we have enough space 1021a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza if (size < BufferItem::getFlattenedSize()) { 103a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return NO_MEMORY; 104a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 105a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 106a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian // content flags are stored first 107a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian uint32_t& flags = *static_cast<uint32_t*>(buffer); 108a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 109a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian // advance the pointer 110a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian FlattenableUtils::advance(buffer, size, sizeof(uint32_t)); 111a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 112a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian flags = 0; 113a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian if (mGraphicBuffer != 0) { 114a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian status_t err = mGraphicBuffer->flatten(buffer, size, fds, count); 115a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian if (err) return err; 116a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian size -= FlattenableUtils::align<4>(buffer); 117a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian flags |= 1; 118a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 119a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian if (mFence != 0) { 120a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian status_t err = mFence->flatten(buffer, size, fds, count); 121a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian if (err) return err; 122a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian size -= FlattenableUtils::align<4>(buffer); 123a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian flags |= 2; 124a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 125a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 126a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian // check we have enough space (in case flattening the fence/graphicbuffer lied to us) 127a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian if (size < getPodSize()) { 128a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return NO_MEMORY; 129a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 130a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 131a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian FlattenableUtils::write(buffer, size, mCrop); 132a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian FlattenableUtils::write(buffer, size, mTransform); 133a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian FlattenableUtils::write(buffer, size, mScalingMode); 134a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian FlattenableUtils::write(buffer, size, mTimestamp); 1351a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza writeBoolAsInt(buffer, size, mIsAutoTimestamp); 136a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian FlattenableUtils::write(buffer, size, mFrameNumber); 137a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian FlattenableUtils::write(buffer, size, mBuf); 1381a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza writeBoolAsInt(buffer, size, mIsDroppable); 1391a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza writeBoolAsInt(buffer, size, mAcquireCalled); 1401a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza writeBoolAsInt(buffer, size, mTransformToDisplayInverse); 141a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 142a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return NO_ERROR; 143a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian} 144a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 145a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopianstatus_t IGraphicBufferConsumer::BufferItem::unflatten( 146a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian void const*& buffer, size_t& size, int const*& fds, size_t& count) { 147a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 148a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian if (size < sizeof(uint32_t)) 149a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return NO_MEMORY; 150a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 151a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian uint32_t flags = 0; 152a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian FlattenableUtils::read(buffer, size, flags); 153a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 154a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian if (flags & 1) { 155a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian mGraphicBuffer = new GraphicBuffer(); 156a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian status_t err = mGraphicBuffer->unflatten(buffer, size, fds, count); 157a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian if (err) return err; 158a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian size -= FlattenableUtils::align<4>(buffer); 159a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 160a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 161a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian if (flags & 2) { 162a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian mFence = new Fence(); 163a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian status_t err = mFence->unflatten(buffer, size, fds, count); 164a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian if (err) return err; 165a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian size -= FlattenableUtils::align<4>(buffer); 166a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 167a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 168a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian // check we have enough space 169a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian if (size < getPodSize()) { 170a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return NO_MEMORY; 171a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 172a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 173a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian FlattenableUtils::read(buffer, size, mCrop); 174a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian FlattenableUtils::read(buffer, size, mTransform); 175a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian FlattenableUtils::read(buffer, size, mScalingMode); 176a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian FlattenableUtils::read(buffer, size, mTimestamp); 1771a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza mIsAutoTimestamp = readBoolFromInt(buffer, size); 178a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian FlattenableUtils::read(buffer, size, mFrameNumber); 179a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian FlattenableUtils::read(buffer, size, mBuf); 1801a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza mIsDroppable = readBoolFromInt(buffer, size); 1811a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza mAcquireCalled = readBoolFromInt(buffer, size); 1821a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza mTransformToDisplayInverse = readBoolFromInt(buffer, size); 183a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 184a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return NO_ERROR; 185a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian} 186a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 187a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian// --------------------------------------------------------------------------- 188a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 189a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopianenum { 190a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian ACQUIRE_BUFFER = IBinder::FIRST_CALL_TRANSACTION, 1919f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza DETACH_BUFFER, 1929f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza ATTACH_BUFFER, 193a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian RELEASE_BUFFER, 194a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian CONSUMER_CONNECT, 195a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian CONSUMER_DISCONNECT, 196a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian GET_RELEASED_BUFFERS, 197a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian SET_DEFAULT_BUFFER_SIZE, 198a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian SET_DEFAULT_MAX_BUFFER_COUNT, 199a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian DISABLE_ASYNC_BUFFER, 200a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian SET_MAX_ACQUIRED_BUFFER_COUNT, 201a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian SET_CONSUMER_NAME, 202a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian SET_DEFAULT_BUFFER_FORMAT, 203a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian SET_CONSUMER_USAGE_BITS, 204db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian SET_TRANSFORM_HINT, 205399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall GET_SIDEBAND_STREAM, 206db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian DUMP, 207a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian}; 208a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 209a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 210a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopianclass BpGraphicBufferConsumer : public BpInterface<IGraphicBufferConsumer> 211a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian{ 212a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopianpublic: 213a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian BpGraphicBufferConsumer(const sp<IBinder>& impl) 214a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian : BpInterface<IGraphicBufferConsumer>(impl) 215a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian { 216a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 217a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 218a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian virtual status_t acquireBuffer(BufferItem *buffer, nsecs_t presentWhen) { 219a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian Parcel data, reply; 220a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor()); 221a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian data.writeInt64(presentWhen); 222a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian status_t result = remote()->transact(ACQUIRE_BUFFER, data, &reply); 223a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian if (result != NO_ERROR) { 224a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return result; 225a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 226a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian result = reply.read(*buffer); 227a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian if (result != NO_ERROR) { 228a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return result; 229a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 230a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return reply.readInt32(); 231a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 232a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 2339f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza virtual status_t detachBuffer(int slot) { 2349f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza Parcel data, reply; 2359f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor()); 2369f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza data.writeInt32(slot); 2379f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza status_t result = remote()->transact(DETACH_BUFFER, data, &reply); 2389f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza if (result != NO_ERROR) { 2399f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza return result; 2409f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza } 2419f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza result = reply.readInt32(); 2429f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza return result; 2439f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza } 2449f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza 2459f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza virtual status_t attachBuffer(int* slot, const sp<GraphicBuffer>& buffer) { 2469f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza Parcel data, reply; 2479f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor()); 2489f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza data.write(*buffer.get()); 2499f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza status_t result = remote()->transact(ATTACH_BUFFER, data, &reply); 2509f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza if (result != NO_ERROR) { 2519f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza return result; 2529f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza } 2539f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza *slot = reply.readInt32(); 2549f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza result = reply.readInt32(); 2559f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza return result; 2569f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza } 2579f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza 258a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian virtual status_t releaseBuffer(int buf, uint64_t frameNumber, 2597d2d160cdc3cba9f4454f38433c94b68376cb843Igor Murashkin EGLDisplay display __attribute__((unused)), EGLSyncKHR fence __attribute__((unused)), 260a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian const sp<Fence>& releaseFence) { 261a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian Parcel data, reply; 262a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor()); 263a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian data.writeInt32(buf); 264a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian data.writeInt64(frameNumber); 265a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian data.write(*releaseFence); 266a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian status_t result = remote()->transact(RELEASE_BUFFER, data, &reply); 267a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian if (result != NO_ERROR) { 268a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return result; 269a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 270a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return reply.readInt32(); 271a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 272a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 273a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian virtual status_t consumerConnect(const sp<IConsumerListener>& consumer, bool controlledByApp) { 274a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian Parcel data, reply; 275a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor()); 276a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian data.writeStrongBinder(consumer->asBinder()); 277a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian data.writeInt32(controlledByApp); 278a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian status_t result = remote()->transact(CONSUMER_CONNECT, data, &reply); 279a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian if (result != NO_ERROR) { 280a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return result; 281a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 282a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return reply.readInt32(); 283a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 284a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 285a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian virtual status_t consumerDisconnect() { 286a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian Parcel data, reply; 287a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor()); 288a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian status_t result = remote()->transact(CONSUMER_DISCONNECT, data, &reply); 289a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian if (result != NO_ERROR) { 290a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return result; 291a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 292a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return reply.readInt32(); 293a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 294a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 295febd4f4f462444bfcb3f0618d07ac77e3fc1f6adDan Stoza virtual status_t getReleasedBuffers(uint64_t* slotMask) { 296a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian Parcel data, reply; 297febd4f4f462444bfcb3f0618d07ac77e3fc1f6adDan Stoza if (slotMask == NULL) { 298febd4f4f462444bfcb3f0618d07ac77e3fc1f6adDan Stoza ALOGE("getReleasedBuffers: slotMask must not be NULL"); 299febd4f4f462444bfcb3f0618d07ac77e3fc1f6adDan Stoza return BAD_VALUE; 300febd4f4f462444bfcb3f0618d07ac77e3fc1f6adDan Stoza } 301a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor()); 302a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian status_t result = remote()->transact(GET_RELEASED_BUFFERS, data, &reply); 303a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian if (result != NO_ERROR) { 304a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return result; 305a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 306febd4f4f462444bfcb3f0618d07ac77e3fc1f6adDan Stoza *slotMask = reply.readInt64(); 307a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return reply.readInt32(); 308a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 309a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 310a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian virtual status_t setDefaultBufferSize(uint32_t w, uint32_t h) { 311a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian Parcel data, reply; 312a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor()); 313a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian data.writeInt32(w); 314a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian data.writeInt32(h); 315a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian status_t result = remote()->transact(SET_DEFAULT_BUFFER_SIZE, data, &reply); 316a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian if (result != NO_ERROR) { 317a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return result; 318a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 319a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return reply.readInt32(); 320a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 321a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 322a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian virtual status_t setDefaultMaxBufferCount(int bufferCount) { 323a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian Parcel data, reply; 324a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor()); 325a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian data.writeInt32(bufferCount); 326a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian status_t result = remote()->transact(SET_DEFAULT_MAX_BUFFER_COUNT, data, &reply); 327a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian if (result != NO_ERROR) { 328a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return result; 329a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 330a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return reply.readInt32(); 331a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 332a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 333a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian virtual status_t disableAsyncBuffer() { 334a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian Parcel data, reply; 335a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor()); 336a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian status_t result = remote()->transact(DISABLE_ASYNC_BUFFER, data, &reply); 337a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian if (result != NO_ERROR) { 338a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return result; 339a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 340a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return reply.readInt32(); 341a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 342a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 343a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian virtual status_t setMaxAcquiredBufferCount(int maxAcquiredBuffers) { 344a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian Parcel data, reply; 345a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor()); 346a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian data.writeInt32(maxAcquiredBuffers); 347a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian status_t result = remote()->transact(SET_MAX_ACQUIRED_BUFFER_COUNT, data, &reply); 348a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian if (result != NO_ERROR) { 349a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return result; 350a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 351a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return reply.readInt32(); 352a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 353a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 354a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian virtual void setConsumerName(const String8& name) { 355a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian Parcel data, reply; 356a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor()); 357a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian data.writeString8(name); 358a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian remote()->transact(SET_CONSUMER_NAME, data, &reply); 359a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 360a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 361a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian virtual status_t setDefaultBufferFormat(uint32_t defaultFormat) { 362a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian Parcel data, reply; 363a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor()); 364a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian data.writeInt32(defaultFormat); 365a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian status_t result = remote()->transact(SET_DEFAULT_BUFFER_FORMAT, data, &reply); 366a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian if (result != NO_ERROR) { 367a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return result; 368a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 369a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return reply.readInt32(); 370a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 371a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 372a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian virtual status_t setConsumerUsageBits(uint32_t usage) { 373a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian Parcel data, reply; 374a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor()); 375a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian data.writeInt32(usage); 376a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian status_t result = remote()->transact(SET_CONSUMER_USAGE_BITS, data, &reply); 377a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian if (result != NO_ERROR) { 378a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return result; 379a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 380a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return reply.readInt32(); 381a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 382a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 383a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian virtual status_t setTransformHint(uint32_t hint) { 384a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian Parcel data, reply; 385a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor()); 386a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian data.writeInt32(hint); 387a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian status_t result = remote()->transact(SET_TRANSFORM_HINT, data, &reply); 388a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian if (result != NO_ERROR) { 389a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return result; 390a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 391a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return reply.readInt32(); 392a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 393db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian 394399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall virtual sp<NativeHandle> getSidebandStream() const { 395399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall Parcel data, reply; 396399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall status_t err; 397399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor()); 398399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall if ((err = remote()->transact(GET_SIDEBAND_STREAM, data, &reply)) != NO_ERROR) { 399399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall return NULL; 400399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall } 401399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall sp<NativeHandle> stream; 402399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall if (reply.readInt32()) { 4030ec54e156bed93d59900b742c8e9adcfaee90612Wonsik Kim stream = NativeHandle::create(reply.readNativeHandle(), true); 404399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall } 405399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall return stream; 406399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall } 407399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall 408db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian virtual void dump(String8& result, const char* prefix) const { 409db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian Parcel data, reply; 410db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor()); 411db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian data.writeString8(result); 412db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian data.writeString8(String8(prefix ? prefix : "")); 413db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian remote()->transact(DUMP, data, &reply); 414db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian reply.readString8(); 415db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian } 416a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian}; 417a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 418a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias AgopianIMPLEMENT_META_INTERFACE(GraphicBufferConsumer, "android.gui.IGraphicBufferConsumer"); 419a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 420a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian// ---------------------------------------------------------------------- 421a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 422a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopianstatus_t BnGraphicBufferConsumer::onTransact( 423a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 424a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian{ 425a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian switch(code) { 426a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian case ACQUIRE_BUFFER: { 427a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian CHECK_INTERFACE(IGraphicBufferConsumer, data, reply); 428a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian BufferItem item; 429a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian int64_t presentWhen = data.readInt64(); 430a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian status_t result = acquireBuffer(&item, presentWhen); 431a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian status_t err = reply->write(item); 432a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian if (err) return err; 433a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian reply->writeInt32(result); 434a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return NO_ERROR; 435a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } break; 4369f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza case DETACH_BUFFER: { 4379f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza CHECK_INTERFACE(IGraphicBufferConsumer, data, reply); 4389f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza int slot = data.readInt32(); 4399f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza int result = detachBuffer(slot); 4409f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza reply->writeInt32(result); 4419f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza return NO_ERROR; 4429f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza } break; 4439f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza case ATTACH_BUFFER: { 4449f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza CHECK_INTERFACE(IGraphicBufferConsumer, data, reply); 4459f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza sp<GraphicBuffer> buffer = new GraphicBuffer(); 4469f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza data.read(*buffer.get()); 4479f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza int slot; 4489f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza int result = attachBuffer(&slot, buffer); 4499f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza reply->writeInt32(slot); 4509f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza reply->writeInt32(result); 4519f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza return NO_ERROR; 4529f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza } break; 453a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian case RELEASE_BUFFER: { 454a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian CHECK_INTERFACE(IGraphicBufferConsumer, data, reply); 455a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian int buf = data.readInt32(); 456a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian uint64_t frameNumber = data.readInt64(); 457a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian sp<Fence> releaseFence = new Fence(); 458a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian status_t err = data.read(*releaseFence); 459a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian if (err) return err; 460a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian status_t result = releaseBuffer(buf, frameNumber, 461a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian EGL_NO_DISPLAY, EGL_NO_SYNC_KHR, releaseFence); 462a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian reply->writeInt32(result); 463a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return NO_ERROR; 464a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } break; 465a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian case CONSUMER_CONNECT: { 466a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian CHECK_INTERFACE(IGraphicBufferConsumer, data, reply); 467a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian sp<IConsumerListener> consumer = IConsumerListener::asInterface( data.readStrongBinder() ); 468a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian bool controlledByApp = data.readInt32(); 469a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian status_t result = consumerConnect(consumer, controlledByApp); 470a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian reply->writeInt32(result); 471a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return NO_ERROR; 472a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } break; 473a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian case CONSUMER_DISCONNECT: { 474a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian CHECK_INTERFACE(IGraphicBufferConsumer, data, reply); 475a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian status_t result = consumerDisconnect(); 476a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian reply->writeInt32(result); 477a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return NO_ERROR; 478a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } break; 479a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian case GET_RELEASED_BUFFERS: { 480a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian CHECK_INTERFACE(IGraphicBufferConsumer, data, reply); 481febd4f4f462444bfcb3f0618d07ac77e3fc1f6adDan Stoza uint64_t slotMask; 482a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian status_t result = getReleasedBuffers(&slotMask); 483febd4f4f462444bfcb3f0618d07ac77e3fc1f6adDan Stoza reply->writeInt64(slotMask); 484a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian reply->writeInt32(result); 485a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return NO_ERROR; 486a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } break; 487a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian case SET_DEFAULT_BUFFER_SIZE: { 488a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian CHECK_INTERFACE(IGraphicBufferConsumer, data, reply); 489a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian uint32_t w = data.readInt32(); 490a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian uint32_t h = data.readInt32(); 491a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian status_t result = setDefaultBufferSize(w, h); 492a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian reply->writeInt32(result); 493a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return NO_ERROR; 494a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } break; 495a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian case SET_DEFAULT_MAX_BUFFER_COUNT: { 496a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian CHECK_INTERFACE(IGraphicBufferConsumer, data, reply); 497a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian uint32_t bufferCount = data.readInt32(); 498a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian status_t result = setDefaultMaxBufferCount(bufferCount); 499a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian reply->writeInt32(result); 500a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return NO_ERROR; 501a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } break; 502a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian case DISABLE_ASYNC_BUFFER: { 503a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian CHECK_INTERFACE(IGraphicBufferConsumer, data, reply); 504a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian status_t result = disableAsyncBuffer(); 505a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian reply->writeInt32(result); 506a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return NO_ERROR; 507a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } break; 508a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian case SET_MAX_ACQUIRED_BUFFER_COUNT: { 509a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian CHECK_INTERFACE(IGraphicBufferConsumer, data, reply); 510a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian uint32_t maxAcquiredBuffers = data.readInt32(); 511a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian status_t result = setMaxAcquiredBufferCount(maxAcquiredBuffers); 512a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian reply->writeInt32(result); 513a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return NO_ERROR; 514a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } break; 515a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian case SET_CONSUMER_NAME: { 516a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian CHECK_INTERFACE(IGraphicBufferConsumer, data, reply); 517a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian setConsumerName( data.readString8() ); 518a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return NO_ERROR; 519a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } break; 520a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian case SET_DEFAULT_BUFFER_FORMAT: { 521a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian CHECK_INTERFACE(IGraphicBufferConsumer, data, reply); 522a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian uint32_t defaultFormat = data.readInt32(); 523a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian status_t result = setDefaultBufferFormat(defaultFormat); 524a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian reply->writeInt32(result); 525a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return NO_ERROR; 526a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } break; 527a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian case SET_CONSUMER_USAGE_BITS: { 528a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian CHECK_INTERFACE(IGraphicBufferConsumer, data, reply); 529a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian uint32_t usage = data.readInt32(); 530a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian status_t result = setConsumerUsageBits(usage); 531a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian reply->writeInt32(result); 532a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return NO_ERROR; 533a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } break; 534a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian case SET_TRANSFORM_HINT: { 535a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian CHECK_INTERFACE(IGraphicBufferConsumer, data, reply); 536a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian uint32_t hint = data.readInt32(); 537a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian status_t result = setTransformHint(hint); 538a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian reply->writeInt32(result); 539a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return NO_ERROR; 540a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } break; 541db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian case DUMP: { 542db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian CHECK_INTERFACE(IGraphicBufferConsumer, data, reply); 543db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian String8 result = data.readString8(); 544db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian String8 prefix = data.readString8(); 545db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian static_cast<IGraphicBufferConsumer*>(this)->dump(result, prefix); 546db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian reply->writeString8(result); 547db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian return NO_ERROR; 548db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian } 549a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 550a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return BBinder::onTransact(code, data, reply, flags); 551a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian} 552a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 553a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian}; // namespace android 554