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