IGraphicBufferConsumer.cpp revision febd4f4f462444bfcb3f0618d07ac77e3fc1f6ad
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#define EGL_EGLEXT_PROTOTYPES 18a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 19a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian#include <EGL/egl.h> 20a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian#include <EGL/eglext.h> 21a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 22a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 23a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian#include <stdint.h> 24a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian#include <sys/types.h> 25a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 26a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian#include <utils/Errors.h> 27399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall#include <utils/NativeHandle.h> 28a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 29a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian#include <binder/Parcel.h> 30a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian#include <binder/IInterface.h> 31a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 32a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian#include <gui/IConsumerListener.h> 33a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian#include <gui/IGraphicBufferConsumer.h> 34a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 35a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian#include <ui/GraphicBuffer.h> 36a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian#include <ui/Fence.h> 37a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 38a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian#include <system/window.h> 39a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 40a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopiannamespace android { 41a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian// --------------------------------------------------------------------------- 42a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 43a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias AgopianIGraphicBufferConsumer::BufferItem::BufferItem() : 44a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian mTransform(0), 45a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian mScalingMode(NATIVE_WINDOW_SCALING_MODE_FREEZE), 46a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian mTimestamp(0), 473c25621ad7d13f64d3ab95a27fa970fbc9998f73Andy McFadden mIsAutoTimestamp(false), 48a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian mFrameNumber(0), 49a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian mBuf(INVALID_BUFFER_SLOT), 50a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian mIsDroppable(false), 51c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian mAcquireCalled(false), 52c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian mTransformToDisplayInverse(false) { 53a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian mCrop.makeInvalid(); 54a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian} 55a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 56a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopiansize_t IGraphicBufferConsumer::BufferItem::getPodSize() const { 57a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian size_t c = sizeof(mCrop) + 58a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian sizeof(mTransform) + 59a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian sizeof(mScalingMode) + 60a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian sizeof(mTimestamp) + 613c25621ad7d13f64d3ab95a27fa970fbc9998f73Andy McFadden sizeof(mIsAutoTimestamp) + 62a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian sizeof(mFrameNumber) + 63a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian sizeof(mBuf) + 64a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian sizeof(mIsDroppable) + 65c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian sizeof(mAcquireCalled) + 66c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian sizeof(mTransformToDisplayInverse); 67a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return c; 68a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian} 69a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 70a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopiansize_t IGraphicBufferConsumer::BufferItem::getFlattenedSize() const { 71a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian size_t c = 0; 72a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian if (mGraphicBuffer != 0) { 73a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian c += mGraphicBuffer->getFlattenedSize(); 741a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza c = FlattenableUtils::align<4>(c); 75a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 76a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian if (mFence != 0) { 77a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian c += mFence->getFlattenedSize(); 781a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza c = FlattenableUtils::align<4>(c); 79a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 80a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return sizeof(int32_t) + c + getPodSize(); 81a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian} 82a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 83a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopiansize_t IGraphicBufferConsumer::BufferItem::getFdCount() const { 84a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian size_t c = 0; 85a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian if (mGraphicBuffer != 0) { 86a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian c += mGraphicBuffer->getFdCount(); 87a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 88a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian if (mFence != 0) { 89a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian c += mFence->getFdCount(); 90a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 91a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return c; 92a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian} 93a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 941a0b8617909c94f6c7301b651cb7b07463529c8cDan Stozastatic void writeBoolAsInt(void*& buffer, size_t& size, bool b) { 951a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza FlattenableUtils::write(buffer, size, static_cast<int32_t>(b)); 961a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza} 971a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza 981a0b8617909c94f6c7301b651cb7b07463529c8cDan Stozastatic bool readBoolFromInt(void const*& buffer, size_t& size) { 991a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza int32_t i; 1001a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza FlattenableUtils::read(buffer, size, i); 1011a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza return static_cast<bool>(i); 1021a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza} 1031a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza 104a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopianstatus_t IGraphicBufferConsumer::BufferItem::flatten( 105a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian void*& buffer, size_t& size, int*& fds, size_t& count) const { 106a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 107a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian // make sure we have enough space 1081a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza if (size < BufferItem::getFlattenedSize()) { 109a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return NO_MEMORY; 110a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 111a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 112a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian // content flags are stored first 113a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian uint32_t& flags = *static_cast<uint32_t*>(buffer); 114a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 115a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian // advance the pointer 116a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian FlattenableUtils::advance(buffer, size, sizeof(uint32_t)); 117a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 118a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian flags = 0; 119a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian if (mGraphicBuffer != 0) { 120a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian status_t err = mGraphicBuffer->flatten(buffer, size, fds, count); 121a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian if (err) return err; 122a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian size -= FlattenableUtils::align<4>(buffer); 123a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian flags |= 1; 124a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 125a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian if (mFence != 0) { 126a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian status_t err = mFence->flatten(buffer, size, fds, count); 127a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian if (err) return err; 128a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian size -= FlattenableUtils::align<4>(buffer); 129a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian flags |= 2; 130a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 131a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 132a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian // check we have enough space (in case flattening the fence/graphicbuffer lied to us) 133a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian if (size < getPodSize()) { 134a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return NO_MEMORY; 135a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 136a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 137a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian FlattenableUtils::write(buffer, size, mCrop); 138a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian FlattenableUtils::write(buffer, size, mTransform); 139a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian FlattenableUtils::write(buffer, size, mScalingMode); 140a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian FlattenableUtils::write(buffer, size, mTimestamp); 1411a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza writeBoolAsInt(buffer, size, mIsAutoTimestamp); 142a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian FlattenableUtils::write(buffer, size, mFrameNumber); 143a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian FlattenableUtils::write(buffer, size, mBuf); 1441a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza writeBoolAsInt(buffer, size, mIsDroppable); 1451a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza writeBoolAsInt(buffer, size, mAcquireCalled); 1461a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza writeBoolAsInt(buffer, size, mTransformToDisplayInverse); 147a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 148a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return NO_ERROR; 149a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian} 150a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 151a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopianstatus_t IGraphicBufferConsumer::BufferItem::unflatten( 152a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian void const*& buffer, size_t& size, int const*& fds, size_t& count) { 153a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 154a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian if (size < sizeof(uint32_t)) 155a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return NO_MEMORY; 156a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 157a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian uint32_t flags = 0; 158a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian FlattenableUtils::read(buffer, size, flags); 159a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 160a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian if (flags & 1) { 161a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian mGraphicBuffer = new GraphicBuffer(); 162a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian status_t err = mGraphicBuffer->unflatten(buffer, size, fds, count); 163a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian if (err) return err; 164a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian size -= FlattenableUtils::align<4>(buffer); 165a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 166a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 167a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian if (flags & 2) { 168a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian mFence = new Fence(); 169a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian status_t err = mFence->unflatten(buffer, size, fds, count); 170a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian if (err) return err; 171a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian size -= FlattenableUtils::align<4>(buffer); 172a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 173a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 174a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian // check we have enough space 175a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian if (size < getPodSize()) { 176a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return NO_MEMORY; 177a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 178a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 179a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian FlattenableUtils::read(buffer, size, mCrop); 180a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian FlattenableUtils::read(buffer, size, mTransform); 181a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian FlattenableUtils::read(buffer, size, mScalingMode); 182a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian FlattenableUtils::read(buffer, size, mTimestamp); 1831a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza mIsAutoTimestamp = readBoolFromInt(buffer, size); 184a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian FlattenableUtils::read(buffer, size, mFrameNumber); 185a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian FlattenableUtils::read(buffer, size, mBuf); 1861a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza mIsDroppable = readBoolFromInt(buffer, size); 1871a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza mAcquireCalled = readBoolFromInt(buffer, size); 1881a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza mTransformToDisplayInverse = readBoolFromInt(buffer, size); 189a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 190a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return NO_ERROR; 191a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian} 192a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 193a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian// --------------------------------------------------------------------------- 194a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 195a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopianenum { 196a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian ACQUIRE_BUFFER = IBinder::FIRST_CALL_TRANSACTION, 1979f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza DETACH_BUFFER, 1989f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza ATTACH_BUFFER, 199a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian RELEASE_BUFFER, 200a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian CONSUMER_CONNECT, 201a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian CONSUMER_DISCONNECT, 202a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian GET_RELEASED_BUFFERS, 203a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian SET_DEFAULT_BUFFER_SIZE, 204a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian SET_DEFAULT_MAX_BUFFER_COUNT, 205a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian DISABLE_ASYNC_BUFFER, 206a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian SET_MAX_ACQUIRED_BUFFER_COUNT, 207a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian SET_CONSUMER_NAME, 208a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian SET_DEFAULT_BUFFER_FORMAT, 209a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian SET_CONSUMER_USAGE_BITS, 210db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian SET_TRANSFORM_HINT, 211399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall GET_SIDEBAND_STREAM, 212db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian DUMP, 213a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian}; 214a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 215a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 216a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopianclass BpGraphicBufferConsumer : public BpInterface<IGraphicBufferConsumer> 217a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian{ 218a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopianpublic: 219a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian BpGraphicBufferConsumer(const sp<IBinder>& impl) 220a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian : BpInterface<IGraphicBufferConsumer>(impl) 221a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian { 222a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 223a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 224a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian virtual status_t acquireBuffer(BufferItem *buffer, nsecs_t presentWhen) { 225a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian Parcel data, reply; 226a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor()); 227a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian data.writeInt64(presentWhen); 228a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian status_t result = remote()->transact(ACQUIRE_BUFFER, data, &reply); 229a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian if (result != NO_ERROR) { 230a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return result; 231a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 232a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian result = reply.read(*buffer); 233a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian if (result != NO_ERROR) { 234a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return result; 235a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 236a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return reply.readInt32(); 237a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 238a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 2399f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza virtual status_t detachBuffer(int slot) { 2409f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza Parcel data, reply; 2419f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor()); 2429f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza data.writeInt32(slot); 2439f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza status_t result = remote()->transact(DETACH_BUFFER, data, &reply); 2449f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza if (result != NO_ERROR) { 2459f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza return result; 2469f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza } 2479f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza result = reply.readInt32(); 2489f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza return result; 2499f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza } 2509f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza 2519f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza virtual status_t attachBuffer(int* slot, const sp<GraphicBuffer>& buffer) { 2529f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza Parcel data, reply; 2539f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor()); 2549f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza data.write(*buffer.get()); 2559f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza status_t result = remote()->transact(ATTACH_BUFFER, data, &reply); 2569f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza if (result != NO_ERROR) { 2579f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza return result; 2589f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza } 2599f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza *slot = reply.readInt32(); 2609f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza result = reply.readInt32(); 2619f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza return result; 2629f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza } 2639f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza 264a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian virtual status_t releaseBuffer(int buf, uint64_t frameNumber, 2657d2d160cdc3cba9f4454f38433c94b68376cb843Igor Murashkin EGLDisplay display __attribute__((unused)), EGLSyncKHR fence __attribute__((unused)), 266a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian const sp<Fence>& releaseFence) { 267a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian Parcel data, reply; 268a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor()); 269a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian data.writeInt32(buf); 270a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian data.writeInt64(frameNumber); 271a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian data.write(*releaseFence); 272a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian status_t result = remote()->transact(RELEASE_BUFFER, data, &reply); 273a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian if (result != NO_ERROR) { 274a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return result; 275a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 276a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return reply.readInt32(); 277a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 278a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 279a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian virtual status_t consumerConnect(const sp<IConsumerListener>& consumer, bool controlledByApp) { 280a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian Parcel data, reply; 281a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor()); 282a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian data.writeStrongBinder(consumer->asBinder()); 283a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian data.writeInt32(controlledByApp); 284a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian status_t result = remote()->transact(CONSUMER_CONNECT, data, &reply); 285a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian if (result != NO_ERROR) { 286a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return result; 287a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 288a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return reply.readInt32(); 289a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 290a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 291a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian virtual status_t consumerDisconnect() { 292a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian Parcel data, reply; 293a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor()); 294a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian status_t result = remote()->transact(CONSUMER_DISCONNECT, data, &reply); 295a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian if (result != NO_ERROR) { 296a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return result; 297a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 298a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return reply.readInt32(); 299a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 300a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 301febd4f4f462444bfcb3f0618d07ac77e3fc1f6adDan Stoza virtual status_t getReleasedBuffers(uint64_t* slotMask) { 302a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian Parcel data, reply; 303febd4f4f462444bfcb3f0618d07ac77e3fc1f6adDan Stoza if (slotMask == NULL) { 304febd4f4f462444bfcb3f0618d07ac77e3fc1f6adDan Stoza ALOGE("getReleasedBuffers: slotMask must not be NULL"); 305febd4f4f462444bfcb3f0618d07ac77e3fc1f6adDan Stoza return BAD_VALUE; 306febd4f4f462444bfcb3f0618d07ac77e3fc1f6adDan Stoza } 307a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor()); 308a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian status_t result = remote()->transact(GET_RELEASED_BUFFERS, data, &reply); 309a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian if (result != NO_ERROR) { 310a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return result; 311a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 312febd4f4f462444bfcb3f0618d07ac77e3fc1f6adDan Stoza *slotMask = reply.readInt64(); 313a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return reply.readInt32(); 314a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 315a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 316a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian virtual status_t setDefaultBufferSize(uint32_t w, uint32_t h) { 317a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian Parcel data, reply; 318a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor()); 319a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian data.writeInt32(w); 320a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian data.writeInt32(h); 321a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian status_t result = remote()->transact(SET_DEFAULT_BUFFER_SIZE, data, &reply); 322a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian if (result != NO_ERROR) { 323a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return result; 324a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 325a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return reply.readInt32(); 326a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 327a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 328a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian virtual status_t setDefaultMaxBufferCount(int bufferCount) { 329a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian Parcel data, reply; 330a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor()); 331a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian data.writeInt32(bufferCount); 332a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian status_t result = remote()->transact(SET_DEFAULT_MAX_BUFFER_COUNT, data, &reply); 333a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian if (result != NO_ERROR) { 334a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return result; 335a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 336a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return reply.readInt32(); 337a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 338a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 339a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian virtual status_t disableAsyncBuffer() { 340a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian Parcel data, reply; 341a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor()); 342a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian status_t result = remote()->transact(DISABLE_ASYNC_BUFFER, data, &reply); 343a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian if (result != NO_ERROR) { 344a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return result; 345a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 346a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return reply.readInt32(); 347a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 348a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 349a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian virtual status_t setMaxAcquiredBufferCount(int maxAcquiredBuffers) { 350a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian Parcel data, reply; 351a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor()); 352a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian data.writeInt32(maxAcquiredBuffers); 353a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian status_t result = remote()->transact(SET_MAX_ACQUIRED_BUFFER_COUNT, data, &reply); 354a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian if (result != NO_ERROR) { 355a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return result; 356a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 357a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return reply.readInt32(); 358a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 359a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 360a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian virtual void setConsumerName(const String8& name) { 361a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian Parcel data, reply; 362a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor()); 363a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian data.writeString8(name); 364a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian remote()->transact(SET_CONSUMER_NAME, data, &reply); 365a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 366a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 367a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian virtual status_t setDefaultBufferFormat(uint32_t defaultFormat) { 368a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian Parcel data, reply; 369a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor()); 370a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian data.writeInt32(defaultFormat); 371a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian status_t result = remote()->transact(SET_DEFAULT_BUFFER_FORMAT, data, &reply); 372a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian if (result != NO_ERROR) { 373a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return result; 374a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 375a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return reply.readInt32(); 376a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 377a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 378a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian virtual status_t setConsumerUsageBits(uint32_t usage) { 379a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian Parcel data, reply; 380a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor()); 381a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian data.writeInt32(usage); 382a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian status_t result = remote()->transact(SET_CONSUMER_USAGE_BITS, data, &reply); 383a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian if (result != NO_ERROR) { 384a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return result; 385a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 386a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return reply.readInt32(); 387a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 388a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 389a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian virtual status_t setTransformHint(uint32_t hint) { 390a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian Parcel data, reply; 391a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor()); 392a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian data.writeInt32(hint); 393a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian status_t result = remote()->transact(SET_TRANSFORM_HINT, data, &reply); 394a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian if (result != NO_ERROR) { 395a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return result; 396a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 397a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return reply.readInt32(); 398a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 399db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian 400399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall virtual sp<NativeHandle> getSidebandStream() const { 401399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall Parcel data, reply; 402399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall status_t err; 403399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor()); 404399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall if ((err = remote()->transact(GET_SIDEBAND_STREAM, data, &reply)) != NO_ERROR) { 405399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall return NULL; 406399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall } 407399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall sp<NativeHandle> stream; 408399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall if (reply.readInt32()) { 4090ec54e156bed93d59900b742c8e9adcfaee90612Wonsik Kim stream = NativeHandle::create(reply.readNativeHandle(), true); 410399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall } 411399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall return stream; 412399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall } 413399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall 414db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian virtual void dump(String8& result, const char* prefix) const { 415db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian Parcel data, reply; 416db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor()); 417db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian data.writeString8(result); 418db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian data.writeString8(String8(prefix ? prefix : "")); 419db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian remote()->transact(DUMP, data, &reply); 420db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian reply.readString8(); 421db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian } 422a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian}; 423a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 424a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias AgopianIMPLEMENT_META_INTERFACE(GraphicBufferConsumer, "android.gui.IGraphicBufferConsumer"); 425a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 426a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian// ---------------------------------------------------------------------- 427a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 428a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopianstatus_t BnGraphicBufferConsumer::onTransact( 429a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 430a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian{ 431a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian switch(code) { 432a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian case ACQUIRE_BUFFER: { 433a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian CHECK_INTERFACE(IGraphicBufferConsumer, data, reply); 434a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian BufferItem item; 435a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian int64_t presentWhen = data.readInt64(); 436a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian status_t result = acquireBuffer(&item, presentWhen); 437a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian status_t err = reply->write(item); 438a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian if (err) return err; 439a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian reply->writeInt32(result); 440a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return NO_ERROR; 441a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } break; 4429f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza case DETACH_BUFFER: { 4439f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza CHECK_INTERFACE(IGraphicBufferConsumer, data, reply); 4449f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza int slot = data.readInt32(); 4459f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza int result = detachBuffer(slot); 4469f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza reply->writeInt32(result); 4479f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza return NO_ERROR; 4489f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza } break; 4499f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza case ATTACH_BUFFER: { 4509f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza CHECK_INTERFACE(IGraphicBufferConsumer, data, reply); 4519f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza sp<GraphicBuffer> buffer = new GraphicBuffer(); 4529f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza data.read(*buffer.get()); 4539f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza int slot; 4549f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza int result = attachBuffer(&slot, buffer); 4559f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza reply->writeInt32(slot); 4569f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza reply->writeInt32(result); 4579f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza return NO_ERROR; 4589f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza } break; 459a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian case RELEASE_BUFFER: { 460a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian CHECK_INTERFACE(IGraphicBufferConsumer, data, reply); 461a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian int buf = data.readInt32(); 462a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian uint64_t frameNumber = data.readInt64(); 463a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian sp<Fence> releaseFence = new Fence(); 464a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian status_t err = data.read(*releaseFence); 465a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian if (err) return err; 466a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian status_t result = releaseBuffer(buf, frameNumber, 467a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian EGL_NO_DISPLAY, EGL_NO_SYNC_KHR, releaseFence); 468a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian reply->writeInt32(result); 469a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return NO_ERROR; 470a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } break; 471a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian case CONSUMER_CONNECT: { 472a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian CHECK_INTERFACE(IGraphicBufferConsumer, data, reply); 473a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian sp<IConsumerListener> consumer = IConsumerListener::asInterface( data.readStrongBinder() ); 474a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian bool controlledByApp = data.readInt32(); 475a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian status_t result = consumerConnect(consumer, controlledByApp); 476a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian reply->writeInt32(result); 477a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return NO_ERROR; 478a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } break; 479a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian case CONSUMER_DISCONNECT: { 480a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian CHECK_INTERFACE(IGraphicBufferConsumer, data, reply); 481a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian status_t result = consumerDisconnect(); 482a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian reply->writeInt32(result); 483a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return NO_ERROR; 484a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } break; 485a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian case GET_RELEASED_BUFFERS: { 486a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian CHECK_INTERFACE(IGraphicBufferConsumer, data, reply); 487febd4f4f462444bfcb3f0618d07ac77e3fc1f6adDan Stoza uint64_t slotMask; 488a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian status_t result = getReleasedBuffers(&slotMask); 489febd4f4f462444bfcb3f0618d07ac77e3fc1f6adDan Stoza reply->writeInt64(slotMask); 490a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian reply->writeInt32(result); 491a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return NO_ERROR; 492a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } break; 493a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian case SET_DEFAULT_BUFFER_SIZE: { 494a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian CHECK_INTERFACE(IGraphicBufferConsumer, data, reply); 495a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian uint32_t w = data.readInt32(); 496a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian uint32_t h = data.readInt32(); 497a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian status_t result = setDefaultBufferSize(w, h); 498a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian reply->writeInt32(result); 499a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return NO_ERROR; 500a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } break; 501a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian case SET_DEFAULT_MAX_BUFFER_COUNT: { 502a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian CHECK_INTERFACE(IGraphicBufferConsumer, data, reply); 503a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian uint32_t bufferCount = data.readInt32(); 504a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian status_t result = setDefaultMaxBufferCount(bufferCount); 505a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian reply->writeInt32(result); 506a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return NO_ERROR; 507a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } break; 508a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian case DISABLE_ASYNC_BUFFER: { 509a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian CHECK_INTERFACE(IGraphicBufferConsumer, data, reply); 510a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian status_t result = disableAsyncBuffer(); 511a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian reply->writeInt32(result); 512a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return NO_ERROR; 513a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } break; 514a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian case SET_MAX_ACQUIRED_BUFFER_COUNT: { 515a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian CHECK_INTERFACE(IGraphicBufferConsumer, data, reply); 516a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian uint32_t maxAcquiredBuffers = data.readInt32(); 517a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian status_t result = setMaxAcquiredBufferCount(maxAcquiredBuffers); 518a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian reply->writeInt32(result); 519a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return NO_ERROR; 520a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } break; 521a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian case SET_CONSUMER_NAME: { 522a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian CHECK_INTERFACE(IGraphicBufferConsumer, data, reply); 523a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian setConsumerName( data.readString8() ); 524a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return NO_ERROR; 525a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } break; 526a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian case SET_DEFAULT_BUFFER_FORMAT: { 527a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian CHECK_INTERFACE(IGraphicBufferConsumer, data, reply); 528a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian uint32_t defaultFormat = data.readInt32(); 529a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian status_t result = setDefaultBufferFormat(defaultFormat); 530a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian reply->writeInt32(result); 531a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return NO_ERROR; 532a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } break; 533a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian case SET_CONSUMER_USAGE_BITS: { 534a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian CHECK_INTERFACE(IGraphicBufferConsumer, data, reply); 535a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian uint32_t usage = data.readInt32(); 536a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian status_t result = setConsumerUsageBits(usage); 537a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian reply->writeInt32(result); 538a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return NO_ERROR; 539a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } break; 540a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian case SET_TRANSFORM_HINT: { 541a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian CHECK_INTERFACE(IGraphicBufferConsumer, data, reply); 542a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian uint32_t hint = data.readInt32(); 543a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian status_t result = setTransformHint(hint); 544a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian reply->writeInt32(result); 545a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return NO_ERROR; 546a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } break; 547db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian case DUMP: { 548db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian CHECK_INTERFACE(IGraphicBufferConsumer, data, reply); 549db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian String8 result = data.readString8(); 550db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian String8 prefix = data.readString8(); 551db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian static_cast<IGraphicBufferConsumer*>(this)->dump(result, prefix); 552db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian reply->writeString8(result); 553db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian return NO_ERROR; 554db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian } 555a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian } 556a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian return BBinder::onTransact(code, data, reply, flags); 557a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian} 558a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian 559a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian}; // namespace android 560