1ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams/*
2ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams * Copyright (C) 2013 The Android Open Source Project
3ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams *
4ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams * Licensed under the Apache License, Version 2.0 (the "License");
5ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams * you may not use this file except in compliance with the License.
6ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams * You may obtain a copy of the License at
7ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams *
8ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams *      http://www.apache.org/licenses/LICENSE-2.0
9ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams *
10ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams * Unless required by applicable law or agreed to in writing, software
11ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams * distributed under the License is distributed on an "AS IS" BASIS,
12ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams * See the License for the specific language governing permissions and
14ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams * limitations under the License.
15ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams */
16ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
17ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams#ifndef ANDROID_RS_GRALLOC_CONSUMER_H
18ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams#define ANDROID_RS_GRALLOC_CONSUMER_H
19ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
20ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams#include <gui/ConsumerBase.h>
21ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
22ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams#include <ui/GraphicBuffer.h>
23ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
24ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams#include <utils/String8.h>
25ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams#include <utils/Vector.h>
26ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams#include <utils/threads.h>
27ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
28ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
29ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams// ---------------------------------------------------------------------------
30ddceab9a001f07a3395226c5e06e3b420720af0fJason Samsnamespace android {
31ddceab9a001f07a3395226c5e06e3b420720af0fJason Samsnamespace renderscript {
32ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
33ddceab9a001f07a3395226c5e06e3b420720af0fJason Samsclass Allocation;
34ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
35ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams/**
36ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams * CpuConsumer is a BufferQueue consumer endpoint that allows direct CPU
37ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams * access to the underlying gralloc buffers provided by BufferQueue. Multiple
38ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams * buffers may be acquired by it at once, to be used concurrently by the
39ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams * CpuConsumer owner. Sets gralloc usage flags to be software-read-only.
40ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams * This queue is synchronous by default.
41ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams */
42ddceab9a001f07a3395226c5e06e3b420720af0fJason Samsclass GrallocConsumer : public ConsumerBase
43ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams{
44ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams  public:
45ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams    typedef ConsumerBase::FrameAvailableListener FrameAvailableListener;
46ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
47e49da13c33086cf23fb750568348d114c4a10ff8Jason Sams    GrallocConsumer(Allocation *, const sp<IGraphicBufferConsumer>& bq, int flags);
48ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
49ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams    virtual ~GrallocConsumer();
50ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams    status_t lockNextBuffer();
51ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams    status_t unlockBuffer();
52ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
53ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams  private:
54ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams    status_t releaseAcquiredBufferLocked();
55ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams    Allocation *mAlloc;
56ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
57ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams    // Tracking for buffers acquired by the user
58ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams    struct AcquiredBuffer {
59ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams        // Need to track the original mSlot index and the buffer itself because
60ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams        // the mSlot entry may be freed/reused before the acquired buffer is
61ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams        // released.
62ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams        int mSlot;
63ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams        sp<GraphicBuffer> mGraphicBuffer;
64ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams        void *mBufferPointer;
65ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
66ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams        AcquiredBuffer() :
67ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams                mSlot(BufferQueue::INVALID_BUFFER_SLOT),
68ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams                mBufferPointer(NULL) {
69ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams        }
70ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams    };
71ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams    AcquiredBuffer mAcquiredBuffer;
72ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams};
73ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
74ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams} // namespace renderscript
75ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams} // namespace android
76ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
77ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams#endif // ANDROID_RS_GRALLOC_CONSUMER_H
78ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
79