CpuConsumer.h revision 042ecee2abf8584585f1f22f661ac6be9689edf4
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 20f57e7540d4cf799f18fe87d3536c55f1e0064931Eino-Ville Talvala#include <gui/ConsumerBase.h> 21e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 22e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala#include <ui/GraphicBuffer.h> 23e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 24e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala#include <utils/String8.h> 25e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala#include <utils/Vector.h> 26e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala#include <utils/threads.h> 27e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 28e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala#define ANDROID_GRAPHICS_CPUCONSUMER_JNI_ID "mCpuConsumer" 29e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 30e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvalanamespace android { 31e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 32e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala/** 33e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala * CpuConsumer is a BufferQueue consumer endpoint that allows direct CPU 34e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala * access to the underlying gralloc buffers provided by BufferQueue. Multiple 35e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala * buffers may be acquired by it at once, to be used concurrently by the 36e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala * CpuConsumer owner. Sets gralloc usage flags to be software-read-only. 37e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala * This queue is synchronous by default. 38e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala */ 39e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 40042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvalaclass CpuConsumer : public ConsumerBase 41e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala{ 42e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala public: 43f57e7540d4cf799f18fe87d3536c55f1e0064931Eino-Ville Talvala typedef ConsumerBase::FrameAvailableListener FrameAvailableListener; 44e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 45e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala struct LockedBuffer { 46e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala uint8_t *data; 47e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala uint32_t width; 48e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala uint32_t height; 49e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala PixelFormat format; 50e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala uint32_t stride; 51e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala Rect crop; 52e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala uint32_t transform; 53e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala uint32_t scalingMode; 54e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala int64_t timestamp; 55e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala uint64_t frameNumber; 56e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala }; 57e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 58e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala // Create a new CPU consumer. The maxLockedBuffers parameter specifies 59e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala // how many buffers can be locked for user access at the same time. 60eb0d12963d271052c24abb025d698504df9e7573Eino-Ville Talvala CpuConsumer(uint32_t maxLockedBuffers, bool synchronousMode = true); 61e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 62e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala virtual ~CpuConsumer(); 63e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala 64e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala // set the name of the CpuConsumer that will be used to identify it in 65e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala // log messages. 66e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala void setName(const String8& name); 67e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 68e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala // Gets the next graphics buffer from the producer and locks it for CPU use, 69e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala // filling out the passed-in locked buffer structure with the native pointer 70e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala // and metadata. Returns BAD_VALUE if no new buffer is available, and 71e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala // INVALID_OPERATION if the maximum number of buffers is already locked. 72e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala // 73e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala // Only a fixed number of buffers can be locked at a time, determined by the 74e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala // construction-time maxLockedBuffers parameter. If INVALID_OPERATION is 75e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala // returned by lockNextBuffer, then old buffers must be returned to the queue 76e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala // by calling unlockBuffer before more buffers can be acquired. 77e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala status_t lockNextBuffer(LockedBuffer *nativeBuffer); 78e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 79e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala // Returns a locked buffer to the queue, allowing it to be reused. Since 80e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala // only a fixed number of buffers may be locked at a time, old buffers must 81e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala // be released by calling unlockBuffer to ensure new buffers can be acquired by 82e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala // lockNextBuffer. 83e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala status_t unlockBuffer(const LockedBuffer &nativeBuffer); 84e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 852adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden sp<IGraphicBufferProducer> getProducerInterface() const { return getBufferQueue(); } 86e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 87e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala private: 88e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala // Maximum number of buffers that can be locked at a time 89e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala uint32_t mMaxLockedBuffers; 90e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 91042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala status_t releaseAcquiredBufferLocked(int lockedIdx); 92042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala 93e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala virtual void freeBufferLocked(int slotIndex); 94e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 95042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala // Tracking for buffers acquired by the user 96042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala struct AcquiredBuffer { 97042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala // Need to track the original mSlot index and the buffer itself because 98042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala // the mSlot entry may be freed/reused before the acquired buffer is 99042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala // released. 100042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala int mSlot; 10164d8b1903e4b5f2838818eedcf4fef748b38709cEino-Ville Talvala sp<GraphicBuffer> mGraphicBuffer; 10264d8b1903e4b5f2838818eedcf4fef748b38709cEino-Ville Talvala void *mBufferPointer; 103042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala 104042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala AcquiredBuffer() : 105042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala mSlot(BufferQueue::INVALID_BUFFER_SLOT), 106042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala mBufferPointer(NULL) { 107042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala } 108042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala }; 109042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala Vector<AcquiredBuffer> mAcquiredBuffers; 11064d8b1903e4b5f2838818eedcf4fef748b38709cEino-Ville Talvala 111e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala // Count of currently locked buffers 112e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala uint32_t mCurrentLockedBuffers; 113e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 114e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala}; 115e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 116e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala} // namespace android 117e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 118e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala#endif // ANDROID_GUI_CPUCONSUMER_H 119