1e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala/*
2e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala * Copyright (C) 2012 The Android Open Source Project
3e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala *
4e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala * Licensed under the Apache License, Version 2.0 (the "License");
5e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala * you may not use this file except in compliance with the License.
6e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala * You may obtain a copy of the License at
7e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala *
8e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala *      http://www.apache.org/licenses/LICENSE-2.0
9e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala *
10e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala * Unless required by applicable law or agreed to in writing, software
11e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala * distributed under the License is distributed on an "AS IS" BASIS,
12e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala * See the License for the specific language governing permissions and
14e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala * limitations under the License.
15e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala */
16e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
17e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala#ifndef ANDROID_GUI_CPUCONSUMER_H
18e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala#define ANDROID_GUI_CPUCONSUMER_H
19e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
20a9347647eca3101c014be902b713772de3977d87Mathias Agopian#include <system/window.h>
21e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
22a9347647eca3101c014be902b713772de3977d87Mathias Agopian#include <gui/ConsumerBase.h>
23a9347647eca3101c014be902b713772de3977d87Mathias Agopian#include <gui/BufferQueue.h>
24e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
25e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala#include <utils/Vector.h>
26e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
27e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
28e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvalanamespace android {
29e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
308f938a53385a3c6d1c6aa24b3f38437bb2cc47aeMathias Agopianclass BufferQueue;
31a9347647eca3101c014be902b713772de3977d87Mathias Agopianclass GraphicBuffer;
32a9347647eca3101c014be902b713772de3977d87Mathias Agopianclass String8;
338f938a53385a3c6d1c6aa24b3f38437bb2cc47aeMathias Agopian
34e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala/**
35e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala * CpuConsumer is a BufferQueue consumer endpoint that allows direct CPU
36e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala * access to the underlying gralloc buffers provided by BufferQueue. Multiple
37e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala * buffers may be acquired by it at once, to be used concurrently by the
38e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala * CpuConsumer owner. Sets gralloc usage flags to be software-read-only.
39e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala * This queue is synchronous by default.
40e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala */
41e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
42042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvalaclass CpuConsumer : public ConsumerBase
43e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala{
44e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala  public:
45f57e7540d4cf799f18fe87d3536c55f1e0064931Eino-Ville Talvala    typedef ConsumerBase::FrameAvailableListener FrameAvailableListener;
46e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
47e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    struct LockedBuffer {
48e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        uint8_t    *data;
49e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        uint32_t    width;
50e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        uint32_t    height;
51e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        PixelFormat format;
52e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        uint32_t    stride;
53e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        Rect        crop;
54e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        uint32_t    transform;
55e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        uint32_t    scalingMode;
56e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        int64_t     timestamp;
575b75a513e431c097ae704cba2f7affa6bfaecec9Eino-Ville Talvala        android_dataspace dataSpace;
58e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        uint64_t    frameNumber;
596a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar        // this is the same as format, except for formats that are compatible with
606a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar        // a flexible format (e.g. HAL_PIXEL_FORMAT_YCbCr_420_888). In the latter
616a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar        // case this contains that flexible format
626a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar        PixelFormat flexFormat;
636a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar        // Values below are only valid when using HAL_PIXEL_FORMAT_YCbCr_420_888
646a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar        // or compatible format, in which case LockedBuffer::data
65c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala        // contains the Y channel, and stride is the Y channel stride. For other
66c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala        // formats, these will all be 0.
67c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala        uint8_t    *dataCb;
68c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala        uint8_t    *dataCr;
69c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala        uint32_t    chromaStride;
70c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala        uint32_t    chromaStep;
7160d6922a011fe18c111b8d30fb6ef1f655b6b15ePablo Ceballos
7260d6922a011fe18c111b8d30fb6ef1f655b6b15ePablo Ceballos        LockedBuffer() :
7360d6922a011fe18c111b8d30fb6ef1f655b6b15ePablo Ceballos            data(NULL),
7460d6922a011fe18c111b8d30fb6ef1f655b6b15ePablo Ceballos            width(0),
7560d6922a011fe18c111b8d30fb6ef1f655b6b15ePablo Ceballos            height(0),
7660d6922a011fe18c111b8d30fb6ef1f655b6b15ePablo Ceballos            format(PIXEL_FORMAT_NONE),
7760d6922a011fe18c111b8d30fb6ef1f655b6b15ePablo Ceballos            stride(0),
783b0d488e87bf602998749e27ad5b555122895a90Pablo Ceballos            crop(Rect::EMPTY_RECT),
7960d6922a011fe18c111b8d30fb6ef1f655b6b15ePablo Ceballos            transform(0),
8060d6922a011fe18c111b8d30fb6ef1f655b6b15ePablo Ceballos            scalingMode(NATIVE_WINDOW_SCALING_MODE_FREEZE),
8160d6922a011fe18c111b8d30fb6ef1f655b6b15ePablo Ceballos            timestamp(0),
8260d6922a011fe18c111b8d30fb6ef1f655b6b15ePablo Ceballos            dataSpace(HAL_DATASPACE_UNKNOWN),
8360d6922a011fe18c111b8d30fb6ef1f655b6b15ePablo Ceballos            frameNumber(0),
8460d6922a011fe18c111b8d30fb6ef1f655b6b15ePablo Ceballos            flexFormat(PIXEL_FORMAT_NONE),
8560d6922a011fe18c111b8d30fb6ef1f655b6b15ePablo Ceballos            dataCb(NULL),
8660d6922a011fe18c111b8d30fb6ef1f655b6b15ePablo Ceballos            dataCr(NULL),
8760d6922a011fe18c111b8d30fb6ef1f655b6b15ePablo Ceballos            chromaStride(0),
8860d6922a011fe18c111b8d30fb6ef1f655b6b15ePablo Ceballos            chromaStep(0)
8960d6922a011fe18c111b8d30fb6ef1f655b6b15ePablo Ceballos        {}
90e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    };
91e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
92e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    // Create a new CPU consumer. The maxLockedBuffers parameter specifies
93e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    // how many buffers can be locked for user access at the same time.
94db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian    CpuConsumer(const sp<IGraphicBufferConsumer>& bq,
95d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            size_t maxLockedBuffers, bool controlledByApp = false);
96e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
97e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    // Gets the next graphics buffer from the producer and locks it for CPU use,
98e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    // filling out the passed-in locked buffer structure with the native pointer
99e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    // and metadata. Returns BAD_VALUE if no new buffer is available, and
100a5b7513711555c8681eb9391cfafe30fb7d6dd3dIgor Murashkin    // NOT_ENOUGH_DATA if the maximum number of buffers is already locked.
101e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    //
102e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    // Only a fixed number of buffers can be locked at a time, determined by the
103e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    // construction-time maxLockedBuffers parameter. If INVALID_OPERATION is
104e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    // returned by lockNextBuffer, then old buffers must be returned to the queue
105e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    // by calling unlockBuffer before more buffers can be acquired.
106e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    status_t lockNextBuffer(LockedBuffer *nativeBuffer);
107e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
108e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    // Returns a locked buffer to the queue, allowing it to be reused. Since
109e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    // only a fixed number of buffers may be locked at a time, old buffers must
110e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    // be released by calling unlockBuffer to ensure new buffers can be acquired by
111e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    // lockNextBuffer.
112e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    status_t unlockBuffer(const LockedBuffer &nativeBuffer);
113e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
114e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala  private:
115e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    // Maximum number of buffers that can be locked at a time
11696ad8222f300c4dd918a15192a8a9c1c4c6fd834Chia-I Wu    const size_t mMaxLockedBuffers;
117e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
118042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala    // Tracking for buffers acquired by the user
119042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala    struct AcquiredBuffer {
120cacfcc669e978964cc8c4cd42ada3677c54b74c3Chia-I Wu        static constexpr uintptr_t kUnusedId = 0;
121cacfcc669e978964cc8c4cd42ada3677c54b74c3Chia-I Wu
122042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala        // Need to track the original mSlot index and the buffer itself because
123042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala        // the mSlot entry may be freed/reused before the acquired buffer is
124042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala        // released.
125042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala        int mSlot;
12664d8b1903e4b5f2838818eedcf4fef748b38709cEino-Ville Talvala        sp<GraphicBuffer> mGraphicBuffer;
127cacfcc669e978964cc8c4cd42ada3677c54b74c3Chia-I Wu        uintptr_t mLockedBufferId;
128042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala
129042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala        AcquiredBuffer() :
130042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala                mSlot(BufferQueue::INVALID_BUFFER_SLOT),
131cacfcc669e978964cc8c4cd42ada3677c54b74c3Chia-I Wu                mLockedBufferId(kUnusedId) {
132cacfcc669e978964cc8c4cd42ada3677c54b74c3Chia-I Wu        }
133cacfcc669e978964cc8c4cd42ada3677c54b74c3Chia-I Wu
134cacfcc669e978964cc8c4cd42ada3677c54b74c3Chia-I Wu        void reset() {
135cacfcc669e978964cc8c4cd42ada3677c54b74c3Chia-I Wu            mSlot = BufferQueue::INVALID_BUFFER_SLOT;
136cacfcc669e978964cc8c4cd42ada3677c54b74c3Chia-I Wu            mGraphicBuffer.clear();
137cacfcc669e978964cc8c4cd42ada3677c54b74c3Chia-I Wu            mLockedBufferId = kUnusedId;
138042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala        }
139042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala    };
140cacfcc669e978964cc8c4cd42ada3677c54b74c3Chia-I Wu
141cacfcc669e978964cc8c4cd42ada3677c54b74c3Chia-I Wu    size_t findAcquiredBufferLocked(uintptr_t id) const;
142cacfcc669e978964cc8c4cd42ada3677c54b74c3Chia-I Wu
1437e7256ee0955cb3b93fe40efd4e7627e5a549210Chia-I Wu    status_t lockBufferItem(const BufferItem& item, LockedBuffer* outBuffer) const;
1447e7256ee0955cb3b93fe40efd4e7627e5a549210Chia-I Wu
145042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala    Vector<AcquiredBuffer> mAcquiredBuffers;
14664d8b1903e4b5f2838818eedcf4fef748b38709cEino-Ville Talvala
147e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    // Count of currently locked buffers
148d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza    size_t mCurrentLockedBuffers;
149e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala};
150e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
151e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala} // namespace android
152e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
153e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala#endif // ANDROID_GUI_CPUCONSUMER_H
154