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