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
21f5f36c75527b1924ef8cb5cb66eb745dd27a0fc6Jiwen 'Steve' Cai#ifndef NO_BUFFERHUB
2222029508934659a51c6345b6c01da386f6006ec2Jiwen 'Steve' Cai#include <gui/BufferHubConsumer.h>
2322029508934659a51c6345b6c01da386f6006ec2Jiwen 'Steve' Cai#include <gui/BufferHubProducer.h>
24f5f36c75527b1924ef8cb5cb66eb745dd27a0fc6Jiwen 'Steve' Cai#endif
25f5f36c75527b1924ef8cb5cb66eb745dd27a0fc6Jiwen 'Steve' Cai
266b091c53000c843211c218ce40287a7edca9bc63Daniel Lam#include <gui/BufferQueue.h>
27e0d5862ad85f7bf4feb1eee9444bf3a5b49c5842Dan Stoza#include <gui/BufferQueueConsumer.h>
283e96f1982fda358424b0b75f394cbf7c1794a072Dan Stoza#include <gui/BufferQueueCore.h>
29e0d5862ad85f7bf4feb1eee9444bf3a5b49c5842Dan Stoza#include <gui/BufferQueueProducer.h>
306b091c53000c843211c218ce40287a7edca9bc63Daniel Lam
313e96f1982fda358424b0b75f394cbf7c1794a072Dan Stozanamespace android {
326b091c53000c843211c218ce40287a7edca9bc63Daniel Lam
333e96f1982fda358424b0b75f394cbf7c1794a072Dan StozaBufferQueue::ProxyConsumerListener::ProxyConsumerListener(
343e96f1982fda358424b0b75f394cbf7c1794a072Dan Stoza        const wp<ConsumerListener>& consumerListener):
353e96f1982fda358424b0b75f394cbf7c1794a072Dan Stoza        mConsumerListener(consumerListener) {}
36546ed2d7d98ce4f1415647913a231a6b4fc6ca66Mathias Agopian
373e96f1982fda358424b0b75f394cbf7c1794a072Dan StozaBufferQueue::ProxyConsumerListener::~ProxyConsumerListener() {}
386b091c53000c843211c218ce40287a7edca9bc63Daniel Lam
395ea5e5905170f32d5cf45ad35c552d64743892c3Brian Andersonvoid BufferQueue::ProxyConsumerListener::onDisconnect() {
405ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson    sp<ConsumerListener> listener(mConsumerListener.promote());
415ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson    if (listener != NULL) {
425ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson        listener->onDisconnect();
435ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson    }
445ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson}
455ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson
468dc55396fc9bc425b5e2c82e76a38080f2a655ffDan Stozavoid BufferQueue::ProxyConsumerListener::onFrameAvailable(
4754716317b5752010134edc64421a3f492bd608abDan Stoza        const BufferItem& item) {
483e96f1982fda358424b0b75f394cbf7c1794a072Dan Stoza    sp<ConsumerListener> listener(mConsumerListener.promote());
493e96f1982fda358424b0b75f394cbf7c1794a072Dan Stoza    if (listener != NULL) {
508dc55396fc9bc425b5e2c82e76a38080f2a655ffDan Stoza        listener->onFrameAvailable(item);
513e96f1982fda358424b0b75f394cbf7c1794a072Dan Stoza    }
526b091c53000c843211c218ce40287a7edca9bc63Daniel Lam}
536b091c53000c843211c218ce40287a7edca9bc63Daniel Lam
54dc13c5b85b099050c73297a19f1ef89308f7620bDan Stozavoid BufferQueue::ProxyConsumerListener::onFrameReplaced(
55dc13c5b85b099050c73297a19f1ef89308f7620bDan Stoza        const BufferItem& item) {
56dc13c5b85b099050c73297a19f1ef89308f7620bDan Stoza    sp<ConsumerListener> listener(mConsumerListener.promote());
57dc13c5b85b099050c73297a19f1ef89308f7620bDan Stoza    if (listener != NULL) {
58dc13c5b85b099050c73297a19f1ef89308f7620bDan Stoza        listener->onFrameReplaced(item);
59dc13c5b85b099050c73297a19f1ef89308f7620bDan Stoza    }
60dc13c5b85b099050c73297a19f1ef89308f7620bDan Stoza}
61dc13c5b85b099050c73297a19f1ef89308f7620bDan Stoza
623e96f1982fda358424b0b75f394cbf7c1794a072Dan Stozavoid BufferQueue::ProxyConsumerListener::onBuffersReleased() {
633e96f1982fda358424b0b75f394cbf7c1794a072Dan Stoza    sp<ConsumerListener> listener(mConsumerListener.promote());
643e96f1982fda358424b0b75f394cbf7c1794a072Dan Stoza    if (listener != NULL) {
653e96f1982fda358424b0b75f394cbf7c1794a072Dan Stoza        listener->onBuffersReleased();
66cd1806e210f2633423f0fb14d39fa00d03974223Jamie Gennis    }
67cd1806e210f2633423f0fb14d39fa00d03974223Jamie Gennis}
68cd1806e210f2633423f0fb14d39fa00d03974223Jamie Gennis
69e0d5862ad85f7bf4feb1eee9444bf3a5b49c5842Dan Stozavoid BufferQueue::ProxyConsumerListener::onSidebandStreamChanged() {
70e0d5862ad85f7bf4feb1eee9444bf3a5b49c5842Dan Stoza    sp<ConsumerListener> listener(mConsumerListener.promote());
71e0d5862ad85f7bf4feb1eee9444bf3a5b49c5842Dan Stoza    if (listener != NULL) {
72e0d5862ad85f7bf4feb1eee9444bf3a5b49c5842Dan Stoza        listener->onSidebandStreamChanged();
73e0d5862ad85f7bf4feb1eee9444bf3a5b49c5842Dan Stoza    }
74e0d5862ad85f7bf4feb1eee9444bf3a5b49c5842Dan Stoza}
75e0d5862ad85f7bf4feb1eee9444bf3a5b49c5842Dan Stoza
763890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonvoid BufferQueue::ProxyConsumerListener::addAndGetFrameTimestamps(
77d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson        const NewFrameEventsEntry* newTimestamps,
783890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson        FrameEventHistoryDelta* outDelta) {
79ce796e78a57018f186b062199c75d94545318acaPablo Ceballos    sp<ConsumerListener> listener(mConsumerListener.promote());
803890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    if (listener != nullptr) {
813890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson        listener->addAndGetFrameTimestamps(newTimestamps, outDelta);
82ce796e78a57018f186b062199c75d94545318acaPablo Ceballos    }
83ce796e78a57018f186b062199c75d94545318acaPablo Ceballos}
84ce796e78a57018f186b062199c75d94545318acaPablo Ceballos
85f522af7eb6048c2efae77d7b94960bc49c003e0eDan Stozavoid BufferQueue::createBufferQueue(sp<IGraphicBufferProducer>* outProducer,
8670982a5f95f68295244e5f6cc037c193713a5259Dan Stoza        sp<IGraphicBufferConsumer>* outConsumer,
87468051e20be19130572231266db306396a56402bIrvel        bool consumerIsSurfaceFlinger) {
88f522af7eb6048c2efae77d7b94960bc49c003e0eDan Stoza    LOG_ALWAYS_FATAL_IF(outProducer == NULL,
89f522af7eb6048c2efae77d7b94960bc49c003e0eDan Stoza            "BufferQueue: outProducer must not be NULL");
90f522af7eb6048c2efae77d7b94960bc49c003e0eDan Stoza    LOG_ALWAYS_FATAL_IF(outConsumer == NULL,
919f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza            "BufferQueue: outConsumer must not be NULL");
929f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
930556d79eacbf0c9978080d87aa4075120533c7efMathias Agopian    sp<BufferQueueCore> core(new BufferQueueCore());
94b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza    LOG_ALWAYS_FATAL_IF(core == NULL,
95b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza            "BufferQueue: failed to create BufferQueueCore");
96b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza
97468051e20be19130572231266db306396a56402bIrvel    sp<IGraphicBufferProducer> producer(new BufferQueueProducer(core, consumerIsSurfaceFlinger));
98b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza    LOG_ALWAYS_FATAL_IF(producer == NULL,
99b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza            "BufferQueue: failed to create BufferQueueProducer");
100b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza
101b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza    sp<IGraphicBufferConsumer> consumer(new BufferQueueConsumer(core));
102b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza    LOG_ALWAYS_FATAL_IF(consumer == NULL,
103b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza            "BufferQueue: failed to create BufferQueueConsumer");
104b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza
105b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza    *outProducer = producer;
106b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza    *outConsumer = consumer;
1079f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza}
1089f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
109f5f36c75527b1924ef8cb5cb66eb745dd27a0fc6Jiwen 'Steve' Cai#ifndef NO_BUFFERHUB
11022029508934659a51c6345b6c01da386f6006ec2Jiwen 'Steve' Caivoid BufferQueue::createBufferHubQueue(sp<IGraphicBufferProducer>* outProducer,
11122029508934659a51c6345b6c01da386f6006ec2Jiwen 'Steve' Cai                                       sp<IGraphicBufferConsumer>* outConsumer) {
11222029508934659a51c6345b6c01da386f6006ec2Jiwen 'Steve' Cai    LOG_ALWAYS_FATAL_IF(outProducer == NULL, "BufferQueue: outProducer must not be NULL");
11322029508934659a51c6345b6c01da386f6006ec2Jiwen 'Steve' Cai    LOG_ALWAYS_FATAL_IF(outConsumer == NULL, "BufferQueue: outConsumer must not be NULL");
11422029508934659a51c6345b6c01da386f6006ec2Jiwen 'Steve' Cai
11522029508934659a51c6345b6c01da386f6006ec2Jiwen 'Steve' Cai    sp<IGraphicBufferProducer> producer;
11622029508934659a51c6345b6c01da386f6006ec2Jiwen 'Steve' Cai    sp<IGraphicBufferConsumer> consumer;
11722029508934659a51c6345b6c01da386f6006ec2Jiwen 'Steve' Cai
11822029508934659a51c6345b6c01da386f6006ec2Jiwen 'Steve' Cai    dvr::ProducerQueueConfigBuilder configBuilder;
11922029508934659a51c6345b6c01da386f6006ec2Jiwen 'Steve' Cai    std::shared_ptr<dvr::ProducerQueue> producerQueue =
120639d479b8a432771f7fa5ae4b93f677d2c8eb125Jiwen 'Steve' Cai            dvr::ProducerQueue::Create(configBuilder.Build(), dvr::UsagePolicy{});
12122029508934659a51c6345b6c01da386f6006ec2Jiwen 'Steve' Cai    LOG_ALWAYS_FATAL_IF(producerQueue == NULL, "BufferQueue: failed to create ProducerQueue.");
12222029508934659a51c6345b6c01da386f6006ec2Jiwen 'Steve' Cai
12322029508934659a51c6345b6c01da386f6006ec2Jiwen 'Steve' Cai    std::shared_ptr<dvr::ConsumerQueue> consumerQueue = producerQueue->CreateConsumerQueue();
12422029508934659a51c6345b6c01da386f6006ec2Jiwen 'Steve' Cai    LOG_ALWAYS_FATAL_IF(consumerQueue == NULL, "BufferQueue: failed to create ConsumerQueue.");
12522029508934659a51c6345b6c01da386f6006ec2Jiwen 'Steve' Cai
12622029508934659a51c6345b6c01da386f6006ec2Jiwen 'Steve' Cai    producer = BufferHubProducer::Create(producerQueue);
12722029508934659a51c6345b6c01da386f6006ec2Jiwen 'Steve' Cai    consumer = BufferHubConsumer::Create(consumerQueue);
12822029508934659a51c6345b6c01da386f6006ec2Jiwen 'Steve' Cai
12922029508934659a51c6345b6c01da386f6006ec2Jiwen 'Steve' Cai    LOG_ALWAYS_FATAL_IF(producer == NULL, "BufferQueue: failed to create BufferQueueProducer");
13022029508934659a51c6345b6c01da386f6006ec2Jiwen 'Steve' Cai    LOG_ALWAYS_FATAL_IF(consumer == NULL, "BufferQueue: failed to create BufferQueueConsumer");
13122029508934659a51c6345b6c01da386f6006ec2Jiwen 'Steve' Cai
13222029508934659a51c6345b6c01da386f6006ec2Jiwen 'Steve' Cai    *outProducer = producer;
13322029508934659a51c6345b6c01da386f6006ec2Jiwen 'Steve' Cai    *outConsumer = consumer;
13422029508934659a51c6345b6c01da386f6006ec2Jiwen 'Steve' Cai}
135f5f36c75527b1924ef8cb5cb66eb745dd27a0fc6Jiwen 'Steve' Cai#endif
13622029508934659a51c6345b6c01da386f6006ec2Jiwen 'Steve' Cai
1376b091c53000c843211c218ce40287a7edca9bc63Daniel Lam}; // namespace android
138