CpuConsumer.h revision 64d8b1903e4b5f2838818eedcf4fef748b38709c
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 40f57e7540d4cf799f18fe87d3536c55f1e0064931Eino-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. 60e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala CpuConsumer(uint32_t maxLockedBuffers); 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 91e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala virtual void freeBufferLocked(int slotIndex); 92e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 93e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala // Array for tracking pointers passed to the consumer, matching the 94f57e7540d4cf799f18fe87d3536c55f1e0064931Eino-Ville Talvala // mSlots indexing 9564d8b1903e4b5f2838818eedcf4fef748b38709cEino-Ville Talvala struct LockedSlot { 9664d8b1903e4b5f2838818eedcf4fef748b38709cEino-Ville Talvala sp<GraphicBuffer> mGraphicBuffer; 9764d8b1903e4b5f2838818eedcf4fef748b38709cEino-Ville Talvala void *mBufferPointer; 9864d8b1903e4b5f2838818eedcf4fef748b38709cEino-Ville Talvala } mLockedSlots[BufferQueue::NUM_BUFFER_SLOTS]; 9964d8b1903e4b5f2838818eedcf4fef748b38709cEino-Ville Talvala 100e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala // Count of currently locked buffers 101e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala uint32_t mCurrentLockedBuffers; 102e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 103e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala}; 104e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 105e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala} // namespace android 106e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 107e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala#endif // ANDROID_GUI_CPUCONSUMER_H 108