1cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala/* 2cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala * Copyright (C) 2012 The Android Open Source Project 3cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala * 4cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala * Licensed under the Apache License, Version 2.0 (the "License"); 5cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala * you may not use this file except in compliance with the License. 6cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala * You may obtain a copy of the License at 7cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala * 8cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala * http://www.apache.org/licenses/LICENSE-2.0 9cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala * 10cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala * Unless required by applicable law or agreed to in writing, software 11cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala * distributed under the License is distributed on an "AS IS" BASIS, 12cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala * See the License for the specific language governing permissions and 14cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala * limitations under the License. 15cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala */ 16cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 17cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala#ifndef ANDROID_GUI_CPUCONSUMER_H 18cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala#define ANDROID_GUI_CPUCONSUMER_H 19cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 20cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala#include <gui/ConsumerBase.h> 21cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 22cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala#include <ui/GraphicBuffer.h> 23cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 24cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala#include <utils/String8.h> 25cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala#include <utils/Vector.h> 26cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala#include <utils/threads.h> 27cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 28cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala#define ANDROID_GRAPHICS_CPUCONSUMER_JNI_ID "mCpuConsumer" 29cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 30cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalanamespace android { 31cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 32cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala/** 33cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala * CpuConsumer is a BufferQueue consumer endpoint that allows direct CPU 34cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala * access to the underlying gralloc buffers provided by BufferQueue. Multiple 35cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala * buffers may be acquired by it at once, to be used concurrently by the 36cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala * CpuConsumer owner. Sets gralloc usage flags to be software-read-only. 37cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala * This queue is synchronous by default. 38cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala */ 39cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 40cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalaclass CpuConsumer: public ConsumerBase 41cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala{ 42cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala public: 43cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala typedef ConsumerBase::FrameAvailableListener FrameAvailableListener; 44cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 45cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala struct LockedBuffer { 46cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala uint8_t *data; 47cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala uint32_t width; 48cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala uint32_t height; 49cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala PixelFormat format; 50cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala uint32_t stride; 51cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala Rect crop; 52cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala uint32_t transform; 53cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala uint32_t scalingMode; 54cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala int64_t timestamp; 55cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala uint64_t frameNumber; 56cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala }; 57cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 58cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala // Create a new CPU consumer. The maxLockedBuffers parameter specifies 59cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala // how many buffers can be locked for user access at the same time. 60cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala CpuConsumer(uint32_t maxLockedBuffers); 61cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 62cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala virtual ~CpuConsumer(); 63cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 64cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala // set the name of the CpuConsumer that will be used to identify it in 65cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala // log messages. 66cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala void setName(const String8& name); 67cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 68cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala // Gets the next graphics buffer from the producer and locks it for CPU use, 69cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala // filling out the passed-in locked buffer structure with the native pointer 70cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala // and metadata. Returns BAD_VALUE if no new buffer is available, and 71cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala // INVALID_OPERATION if the maximum number of buffers is already locked. 72cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala // 73cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala // Only a fixed number of buffers can be locked at a time, determined by the 74cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala // construction-time maxLockedBuffers parameter. If INVALID_OPERATION is 75cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala // returned by lockNextBuffer, then old buffers must be returned to the queue 76cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala // by calling unlockBuffer before more buffers can be acquired. 77cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala status_t lockNextBuffer(LockedBuffer *nativeBuffer); 78cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 79cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala // Returns a locked buffer to the queue, allowing it to be reused. Since 80cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala // only a fixed number of buffers may be locked at a time, old buffers must 81cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala // be released by calling unlockBuffer to ensure new buffers can be acquired by 82cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala // lockNextBuffer. 83cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala status_t unlockBuffer(const LockedBuffer &nativeBuffer); 84cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 85cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala sp<ISurfaceTexture> getProducerInterface() const { return getBufferQueue(); } 86cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 87cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala private: 88cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala // Maximum number of buffers that can be locked at a time 89cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala uint32_t mMaxLockedBuffers; 90cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 91cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala virtual void freeBufferLocked(int slotIndex); 92cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 93cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala // Array for tracking pointers passed to the consumer, matching the 94cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala // mSlots indexing 95cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala void *mBufferPointers[BufferQueue::NUM_BUFFER_SLOTS]; 96cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala // Count of currently locked buffers 97cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala uint32_t mCurrentLockedBuffers; 98cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 99cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}; 100cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 101cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} // namespace android 102cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 103cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala#endif // ANDROID_GUI_CPUCONSUMER_H 104cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala