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