1b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza/* 2b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza * Copyright 2014 The Android Open Source Project 3b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza * 4b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza * Licensed under the Apache License, Version 2.0 (the "License"); 5b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza * you may not use this file except in compliance with the License. 6b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza * You may obtain a copy of the License at 7b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza * 8b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza * http://www.apache.org/licenses/LICENSE-2.0 9b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza * 10b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza * Unless required by applicable law or agreed to in writing, software 11b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza * distributed under the License is distributed on an "AS IS" BASIS, 12b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza * See the License for the specific language governing permissions and 14b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza * limitations under the License. 15b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza */ 16b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza 17b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza#include "MessageQueue.h" 18b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza#include "MonitoredProducer.h" 19b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza#include "SurfaceFlinger.h" 20b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza 21b9b088375d33a87b201cdbe18be71802e2607717Dan Stozanamespace android { 22b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza 23b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan StozaMonitoredProducer::MonitoredProducer(const sp<IGraphicBufferProducer>& producer, 24b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza const sp<SurfaceFlinger>& flinger) : 25b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza mProducer(producer), 26b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza mFlinger(flinger) {} 27b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza 28b9b088375d33a87b201cdbe18be71802e2607717Dan StozaMonitoredProducer::~MonitoredProducer() { 29b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza // Remove ourselves from SurfaceFlinger's list. We do this asynchronously 30b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza // because we don't know where this destructor is called from. It could be 31b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza // called with the mStateLock held, leading to a dead-lock (it actually 32b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza // happens). 33b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza class MessageCleanUpList : public MessageBase { 34b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza public: 35b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza MessageCleanUpList(const sp<SurfaceFlinger>& flinger, 36b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza const wp<IBinder>& producer) 37b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza : mFlinger(flinger), mProducer(producer) {} 38b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza 39b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza virtual ~MessageCleanUpList() {} 40b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza 41b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza virtual bool handler() { 42b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza Mutex::Autolock _l(mFlinger->mStateLock); 43b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza mFlinger->mGraphicBufferProducerList.remove(mProducer); 44b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza return true; 45b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza } 46b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza 47b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza private: 48b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza sp<SurfaceFlinger> mFlinger; 49b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza wp<IBinder> mProducer; 50b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza }; 51b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza 52097ca275f4717a2c47a5d49f302ed2b72c8a1370Marco Nelissen mFlinger->postMessageAsync(new MessageCleanUpList(mFlinger, asBinder(this))); 53b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza} 54b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza 55b9b088375d33a87b201cdbe18be71802e2607717Dan Stozastatus_t MonitoredProducer::requestBuffer(int slot, sp<GraphicBuffer>* buf) { 56b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza return mProducer->requestBuffer(slot, buf); 57b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza} 58b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza 59b9b088375d33a87b201cdbe18be71802e2607717Dan Stozastatus_t MonitoredProducer::setBufferCount(int bufferCount) { 60b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza return mProducer->setBufferCount(bufferCount); 61b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza} 62b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza 63b9b088375d33a87b201cdbe18be71802e2607717Dan Stozastatus_t MonitoredProducer::dequeueBuffer(int* slot, sp<Fence>* fence, 643be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza bool async, uint32_t w, uint32_t h, PixelFormat format, uint32_t usage) { 65b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza return mProducer->dequeueBuffer(slot, fence, async, w, h, format, usage); 66b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza} 67b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza 68b9b088375d33a87b201cdbe18be71802e2607717Dan Stozastatus_t MonitoredProducer::detachBuffer(int slot) { 69b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza return mProducer->detachBuffer(slot); 70b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza} 71b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza 72d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stozastatus_t MonitoredProducer::detachNextBuffer(sp<GraphicBuffer>* outBuffer, 73d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza sp<Fence>* outFence) { 74d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza return mProducer->detachNextBuffer(outBuffer, outFence); 75d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza} 76d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza 77b9b088375d33a87b201cdbe18be71802e2607717Dan Stozastatus_t MonitoredProducer::attachBuffer(int* outSlot, 78b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza const sp<GraphicBuffer>& buffer) { 79b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza return mProducer->attachBuffer(outSlot, buffer); 80b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza} 81b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza 82b9b088375d33a87b201cdbe18be71802e2607717Dan Stozastatus_t MonitoredProducer::queueBuffer(int slot, const QueueBufferInput& input, 83b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza QueueBufferOutput* output) { 84b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza return mProducer->queueBuffer(slot, input, output); 85b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza} 86b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza 87b9b088375d33a87b201cdbe18be71802e2607717Dan Stozavoid MonitoredProducer::cancelBuffer(int slot, const sp<Fence>& fence) { 88b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza mProducer->cancelBuffer(slot, fence); 89b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza} 90b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza 91b9b088375d33a87b201cdbe18be71802e2607717Dan Stozaint MonitoredProducer::query(int what, int* value) { 92b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza return mProducer->query(what, value); 93b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza} 94b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza 95f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stozastatus_t MonitoredProducer::connect(const sp<IProducerListener>& listener, 96f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza int api, bool producerControlledByApp, QueueBufferOutput* output) { 97f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza return mProducer->connect(listener, api, producerControlledByApp, output); 98b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza} 99b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza 100b9b088375d33a87b201cdbe18be71802e2607717Dan Stozastatus_t MonitoredProducer::disconnect(int api) { 101b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza return mProducer->disconnect(api); 102b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza} 103b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza 104b9b088375d33a87b201cdbe18be71802e2607717Dan Stozastatus_t MonitoredProducer::setSidebandStream(const sp<NativeHandle>& stream) { 105b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza return mProducer->setSidebandStream(stream); 106b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza} 107b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza 10829a3e90879fd96404c971e7187cd0e05927bbce0Dan Stozavoid MonitoredProducer::allocateBuffers(bool async, uint32_t width, 1093be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza uint32_t height, PixelFormat format, uint32_t usage) { 11029a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza mProducer->allocateBuffers(async, width, height, format, usage); 11129a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza} 11229a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza 1139de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stozastatus_t MonitoredProducer::allowAllocation(bool allow) { 1149de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza return mProducer->allowAllocation(allow); 1159de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza} 1169de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza 117812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stozastatus_t MonitoredProducer::setGenerationNumber(uint32_t generationNumber) { 118812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza return mProducer->setGenerationNumber(generationNumber); 119812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza} 120812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza 121c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan StozaString8 MonitoredProducer::getConsumerName() const { 122c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza return mProducer->getConsumerName(); 123c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza} 124c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza 125b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan StozaIBinder* MonitoredProducer::onAsBinder() { 126097ca275f4717a2c47a5d49f302ed2b72c8a1370Marco Nelissen return IInterface::asBinder(mProducer).get(); 127b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza} 128b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza 129b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza// --------------------------------------------------------------------------- 130b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza}; // namespace android 131