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