16b091c53000c843211c218ce40287a7edca9bc63Daniel Lam/* 26b091c53000c843211c218ce40287a7edca9bc63Daniel Lam * Copyright (C) 2012 The Android Open Source Project 36b091c53000c843211c218ce40287a7edca9bc63Daniel Lam * 46b091c53000c843211c218ce40287a7edca9bc63Daniel Lam * Licensed under the Apache License, Version 2.0 (the "License"); 56b091c53000c843211c218ce40287a7edca9bc63Daniel Lam * you may not use this file except in compliance with the License. 66b091c53000c843211c218ce40287a7edca9bc63Daniel Lam * You may obtain a copy of the License at 76b091c53000c843211c218ce40287a7edca9bc63Daniel Lam * 86b091c53000c843211c218ce40287a7edca9bc63Daniel Lam * http://www.apache.org/licenses/LICENSE-2.0 96b091c53000c843211c218ce40287a7edca9bc63Daniel Lam * 106b091c53000c843211c218ce40287a7edca9bc63Daniel Lam * Unless required by applicable law or agreed to in writing, software 116b091c53000c843211c218ce40287a7edca9bc63Daniel Lam * distributed under the License is distributed on an "AS IS" BASIS, 126b091c53000c843211c218ce40287a7edca9bc63Daniel Lam * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136b091c53000c843211c218ce40287a7edca9bc63Daniel Lam * See the License for the specific language governing permissions and 146b091c53000c843211c218ce40287a7edca9bc63Daniel Lam * limitations under the License. 156b091c53000c843211c218ce40287a7edca9bc63Daniel Lam */ 166b091c53000c843211c218ce40287a7edca9bc63Daniel Lam 176b091c53000c843211c218ce40287a7edca9bc63Daniel Lam#define LOG_TAG "BufferQueue" 181c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis#define ATRACE_TAG ATRACE_TAG_GRAPHICS 19fa5b40ebb8923133df12dc70591bfe35b3f1c9b3Jamie Gennis//#define LOG_NDEBUG 0 206b091c53000c843211c218ce40287a7edca9bc63Daniel Lam 216b091c53000c843211c218ce40287a7edca9bc63Daniel Lam#include <gui/BufferQueue.h> 22e0d5862ad85f7bf4feb1eee9444bf3a5b49c5842Dan Stoza#include <gui/BufferQueueConsumer.h> 233e96f1982fda358424b0b75f394cbf7c1794a072Dan Stoza#include <gui/BufferQueueCore.h> 24e0d5862ad85f7bf4feb1eee9444bf3a5b49c5842Dan Stoza#include <gui/BufferQueueProducer.h> 256b091c53000c843211c218ce40287a7edca9bc63Daniel Lam 263e96f1982fda358424b0b75f394cbf7c1794a072Dan Stozanamespace android { 276b091c53000c843211c218ce40287a7edca9bc63Daniel Lam 283e96f1982fda358424b0b75f394cbf7c1794a072Dan StozaBufferQueue::ProxyConsumerListener::ProxyConsumerListener( 293e96f1982fda358424b0b75f394cbf7c1794a072Dan Stoza const wp<ConsumerListener>& consumerListener): 303e96f1982fda358424b0b75f394cbf7c1794a072Dan Stoza mConsumerListener(consumerListener) {} 31546ed2d7d98ce4f1415647913a231a6b4fc6ca66Mathias Agopian 323e96f1982fda358424b0b75f394cbf7c1794a072Dan StozaBufferQueue::ProxyConsumerListener::~ProxyConsumerListener() {} 336b091c53000c843211c218ce40287a7edca9bc63Daniel Lam 345ea5e5905170f32d5cf45ad35c552d64743892c3Brian Andersonvoid BufferQueue::ProxyConsumerListener::onDisconnect() { 355ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson sp<ConsumerListener> listener(mConsumerListener.promote()); 365ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson if (listener != NULL) { 375ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson listener->onDisconnect(); 385ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson } 395ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson} 405ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson 418dc55396fc9bc425b5e2c82e76a38080f2a655ffDan Stozavoid BufferQueue::ProxyConsumerListener::onFrameAvailable( 4254716317b5752010134edc64421a3f492bd608abDan Stoza const BufferItem& item) { 433e96f1982fda358424b0b75f394cbf7c1794a072Dan Stoza sp<ConsumerListener> listener(mConsumerListener.promote()); 443e96f1982fda358424b0b75f394cbf7c1794a072Dan Stoza if (listener != NULL) { 458dc55396fc9bc425b5e2c82e76a38080f2a655ffDan Stoza listener->onFrameAvailable(item); 463e96f1982fda358424b0b75f394cbf7c1794a072Dan Stoza } 476b091c53000c843211c218ce40287a7edca9bc63Daniel Lam} 486b091c53000c843211c218ce40287a7edca9bc63Daniel Lam 49dc13c5b85b099050c73297a19f1ef89308f7620bDan Stozavoid BufferQueue::ProxyConsumerListener::onFrameReplaced( 50dc13c5b85b099050c73297a19f1ef89308f7620bDan Stoza const BufferItem& item) { 51dc13c5b85b099050c73297a19f1ef89308f7620bDan Stoza sp<ConsumerListener> listener(mConsumerListener.promote()); 52dc13c5b85b099050c73297a19f1ef89308f7620bDan Stoza if (listener != NULL) { 53dc13c5b85b099050c73297a19f1ef89308f7620bDan Stoza listener->onFrameReplaced(item); 54dc13c5b85b099050c73297a19f1ef89308f7620bDan Stoza } 55dc13c5b85b099050c73297a19f1ef89308f7620bDan Stoza} 56dc13c5b85b099050c73297a19f1ef89308f7620bDan Stoza 573e96f1982fda358424b0b75f394cbf7c1794a072Dan Stozavoid BufferQueue::ProxyConsumerListener::onBuffersReleased() { 583e96f1982fda358424b0b75f394cbf7c1794a072Dan Stoza sp<ConsumerListener> listener(mConsumerListener.promote()); 593e96f1982fda358424b0b75f394cbf7c1794a072Dan Stoza if (listener != NULL) { 603e96f1982fda358424b0b75f394cbf7c1794a072Dan Stoza listener->onBuffersReleased(); 61cd1806e210f2633423f0fb14d39fa00d03974223Jamie Gennis } 62cd1806e210f2633423f0fb14d39fa00d03974223Jamie Gennis} 63cd1806e210f2633423f0fb14d39fa00d03974223Jamie Gennis 64e0d5862ad85f7bf4feb1eee9444bf3a5b49c5842Dan Stozavoid BufferQueue::ProxyConsumerListener::onSidebandStreamChanged() { 65e0d5862ad85f7bf4feb1eee9444bf3a5b49c5842Dan Stoza sp<ConsumerListener> listener(mConsumerListener.promote()); 66e0d5862ad85f7bf4feb1eee9444bf3a5b49c5842Dan Stoza if (listener != NULL) { 67e0d5862ad85f7bf4feb1eee9444bf3a5b49c5842Dan Stoza listener->onSidebandStreamChanged(); 68e0d5862ad85f7bf4feb1eee9444bf3a5b49c5842Dan Stoza } 69e0d5862ad85f7bf4feb1eee9444bf3a5b49c5842Dan Stoza} 70e0d5862ad85f7bf4feb1eee9444bf3a5b49c5842Dan Stoza 713890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonvoid BufferQueue::ProxyConsumerListener::addAndGetFrameTimestamps( 72d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson const NewFrameEventsEntry* newTimestamps, 733890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson FrameEventHistoryDelta* outDelta) { 74ce796e78a57018f186b062199c75d94545318acaPablo Ceballos sp<ConsumerListener> listener(mConsumerListener.promote()); 753890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson if (listener != nullptr) { 763890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson listener->addAndGetFrameTimestamps(newTimestamps, outDelta); 77ce796e78a57018f186b062199c75d94545318acaPablo Ceballos } 78ce796e78a57018f186b062199c75d94545318acaPablo Ceballos} 79ce796e78a57018f186b062199c75d94545318acaPablo Ceballos 80f522af7eb6048c2efae77d7b94960bc49c003e0eDan Stozavoid BufferQueue::createBufferQueue(sp<IGraphicBufferProducer>* outProducer, 8170982a5f95f68295244e5f6cc037c193713a5259Dan Stoza sp<IGraphicBufferConsumer>* outConsumer, 82468051e20be19130572231266db306396a56402bIrvel bool consumerIsSurfaceFlinger) { 83f522af7eb6048c2efae77d7b94960bc49c003e0eDan Stoza LOG_ALWAYS_FATAL_IF(outProducer == NULL, 84f522af7eb6048c2efae77d7b94960bc49c003e0eDan Stoza "BufferQueue: outProducer must not be NULL"); 85f522af7eb6048c2efae77d7b94960bc49c003e0eDan Stoza LOG_ALWAYS_FATAL_IF(outConsumer == NULL, 869f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza "BufferQueue: outConsumer must not be NULL"); 879f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza 880556d79eacbf0c9978080d87aa4075120533c7efMathias Agopian sp<BufferQueueCore> core(new BufferQueueCore()); 89b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza LOG_ALWAYS_FATAL_IF(core == NULL, 90b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza "BufferQueue: failed to create BufferQueueCore"); 91b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza 92468051e20be19130572231266db306396a56402bIrvel sp<IGraphicBufferProducer> producer(new BufferQueueProducer(core, consumerIsSurfaceFlinger)); 93b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza LOG_ALWAYS_FATAL_IF(producer == NULL, 94b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza "BufferQueue: failed to create BufferQueueProducer"); 95b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza 96b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza sp<IGraphicBufferConsumer> consumer(new BufferQueueConsumer(core)); 97b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza LOG_ALWAYS_FATAL_IF(consumer == NULL, 98b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza "BufferQueue: failed to create BufferQueueConsumer"); 99b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza 100b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza *outProducer = producer; 101b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza *outConsumer = consumer; 1029f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza} 1039f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza 1046b091c53000c843211c218ce40287a7edca9bc63Daniel Lam}; // namespace android 105