rsGrallocConsumer.cpp revision 754746883bd46ec2fbdd23572cb6c90ab589346c
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#define ATRACE_TAG ATRACE_TAG_RS
18ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
19ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams#include "rsContext.h"
20ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams#include "rsAllocation.h"
21ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams#include "rs_hal.h"
22ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
23ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams#include <cutils/compiler.h>
24ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams#include <utils/Log.h>
25ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams#include "rsGrallocConsumer.h"
268265914da27f43c8be973cd3882ed2d8e772a7c9Dan Stoza#include <gui/BufferItem.h>
27ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams#include <ui/GraphicBuffer.h>
28ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
29ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
30ddceab9a001f07a3395226c5e06e3b420720af0fJason Samsnamespace android {
31ddceab9a001f07a3395226c5e06e3b420720af0fJason Samsnamespace renderscript {
32ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
33754746883bd46ec2fbdd23572cb6c90ab589346cMiao WangGrallocConsumer::GrallocConsumer(Allocation *a, const sp<IGraphicBufferConsumer>& bq, int flags, uint32_t numAlloc) :
34ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams    ConsumerBase(bq, true)
35ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams{
36754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    mAlloc = new Allocation *[numAlloc];
37754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    mAcquiredBuffer = new AcquiredBuffer[numAlloc];
38754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    isIdxUsed = new bool[numAlloc];
39754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang
40754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    mAlloc[0] = a;
41754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    isIdxUsed[0] = true;
42754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    mNumAlloc = numAlloc;
431c19f05bd67126598ae51f1cf4ef5e906039299fJason Sams    if (flags == 0) {
441c19f05bd67126598ae51f1cf4ef5e906039299fJason Sams        flags = GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_RENDERSCRIPT;
451c19f05bd67126598ae51f1cf4ef5e906039299fJason Sams    } else {
461c19f05bd67126598ae51f1cf4ef5e906039299fJason Sams        flags |= GRALLOC_USAGE_RENDERSCRIPT;
471c19f05bd67126598ae51f1cf4ef5e906039299fJason Sams    }
481c19f05bd67126598ae51f1cf4ef5e906039299fJason Sams    mConsumer->setConsumerUsageBits(flags);
49754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    mConsumer->setMaxAcquiredBufferCount(numAlloc + 1);
50ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
51ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams    uint32_t y = a->mHal.drvState.lod[0].dimY;
52ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams    if (y < 1) y = 1;
53ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams    mConsumer->setDefaultBufferSize(a->mHal.drvState.lod[0].dimX, y);
54ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
5561656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams    if (a->mHal.state.yuv) {
5661656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams        bq->setDefaultBufferFormat(a->mHal.state.yuv);
5761656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams    }
58754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    for (uint32_t i = 1; i < numAlloc; i++) {
59754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang        isIdxUsed[i] = false;
60754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    }
61ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams    //mBufferQueue->setConsumerName(name);
62ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams}
63ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
64ddceab9a001f07a3395226c5e06e3b420720af0fJason SamsGrallocConsumer::~GrallocConsumer() {
65754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    delete[] mAlloc;
66754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    delete[] mAcquiredBuffer;
67754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    delete[] isIdxUsed;
68ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams}
69ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
70ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
71ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
72754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wangstatus_t GrallocConsumer::lockNextBuffer(uint32_t idx) {
73ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams    Mutex::Autolock _l(mMutex);
74ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams    status_t err;
75ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
76754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    if (idx >= mNumAlloc) {
77754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang        ALOGE("Invalid buffer index: %d", idx);
78754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang        return BAD_VALUE;
79754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    }
80754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang
81754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    if (mAcquiredBuffer[idx].mSlot != BufferQueue::INVALID_BUFFER_SLOT) {
82754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang        err = releaseAcquiredBufferLocked(idx);
83ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams        if (err) {
84ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams            return err;
85ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams        }
86ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams    }
87ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
888265914da27f43c8be973cd3882ed2d8e772a7c9Dan Stoza    BufferItem b;
89ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
90ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams    err = acquireBufferLocked(&b, 0);
91ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams    if (err != OK) {
92ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams        if (err == BufferQueue::NO_BUFFER_AVAILABLE) {
93ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams            return BAD_VALUE;
94ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams        } else {
95ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams            ALOGE("Error acquiring buffer: %s (%d)", strerror(err), err);
96ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams            return err;
97ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams        }
98ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams    }
99ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
100ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams    int buf = b.mBuf;
101ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
102ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams    if (b.mFence.get()) {
103ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams        err = b.mFence->waitForever("GrallocConsumer::lockNextBuffer");
104ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams        if (err != OK) {
105ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams            ALOGE("Failed to wait for fence of acquired buffer: %s (%d)",
106ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams                    strerror(-err), err);
107ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams            return err;
108ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams        }
109ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams    }
110ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
11144bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    void *bufferPointer = nullptr;
112ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams    android_ycbcr ycbcr = android_ycbcr();
113ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
114ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams    if (mSlots[buf].mGraphicBuffer->getPixelFormat() ==
115ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams            HAL_PIXEL_FORMAT_YCbCr_420_888) {
116ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams        err = mSlots[buf].mGraphicBuffer->lockYCbCr(
117ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams            GraphicBuffer::USAGE_SW_READ_OFTEN,
118ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams            b.mCrop,
119ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams            &ycbcr);
120ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
121ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams        if (err != OK) {
122ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams            ALOGE("Unable to lock YCbCr buffer for CPU reading: %s (%d)",
123ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams                    strerror(-err), err);
124ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams            return err;
125ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams        }
126ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams        bufferPointer = ycbcr.y;
127ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams    } else {
128ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams        err = mSlots[buf].mGraphicBuffer->lock(
129ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams            GraphicBuffer::USAGE_SW_READ_OFTEN,
130ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams            b.mCrop,
131ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams            &bufferPointer);
132ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
133ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams        if (err != OK) {
134ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams            ALOGE("Unable to lock buffer for CPU reading: %s (%d)",
135ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams                    strerror(-err), err);
136ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams            return err;
137ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams        }
138ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams    }
139ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
140ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams    size_t lockedIdx = 0;
141754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    rsAssert(mAcquiredBuffer[idx].mSlot == BufferQueue::INVALID_BUFFER_SLOT);
142ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
143754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    mAcquiredBuffer[idx].mSlot = buf;
144754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    mAcquiredBuffer[idx].mBufferPointer = bufferPointer;
145754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    mAcquiredBuffer[idx].mGraphicBuffer = mSlots[buf].mGraphicBuffer;
146ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
147754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    mAlloc[idx]->mHal.drvState.lod[0].mallocPtr = reinterpret_cast<uint8_t*>(bufferPointer);
148754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    mAlloc[idx]->mHal.drvState.lod[0].stride = mSlots[buf].mGraphicBuffer->getStride() *
149754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang            mAlloc[idx]->mHal.state.type->getElementSizeBytes();
150754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    mAlloc[idx]->mHal.state.nativeBuffer = mAcquiredBuffer[idx].mGraphicBuffer->getNativeBuffer();
151754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    mAlloc[idx]->mHal.state.timestamp = b.mTimestamp;
152ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
153754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    rsAssert(mAlloc[idx]->mHal.drvState.lod[0].dimX ==
154a5f70350d9ac79c81590d12910cc87c2acb9c356David Gross             mSlots[buf].mGraphicBuffer->getWidth());
155754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    rsAssert(mAlloc[idx]->mHal.drvState.lod[0].dimY ==
156a5f70350d9ac79c81590d12910cc87c2acb9c356David Gross             mSlots[buf].mGraphicBuffer->getHeight());
157ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
158ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams    //mAlloc->format = mSlots[buf].mGraphicBuffer->getPixelFormat();
159ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
160ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams    //mAlloc->crop        = b.mCrop;
161ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams    //mAlloc->transform   = b.mTransform;
162ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams    //mAlloc->scalingMode = b.mScalingMode;
163ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams    //mAlloc->frameNumber = b.mFrameNumber;
164ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
165754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    if (mAlloc[idx]->mHal.state.yuv == HAL_PIXEL_FORMAT_YCbCr_420_888) {
166754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang        mAlloc[idx]->mHal.drvState.lod[1].mallocPtr = ycbcr.cb;
167754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang        mAlloc[idx]->mHal.drvState.lod[2].mallocPtr = ycbcr.cr;
168ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
169754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang        mAlloc[idx]->mHal.drvState.lod[0].stride = ycbcr.ystride;
170754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang        mAlloc[idx]->mHal.drvState.lod[1].stride = ycbcr.cstride;
171754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang        mAlloc[idx]->mHal.drvState.lod[2].stride = ycbcr.cstride;
17261656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams
173754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang        mAlloc[idx]->mHal.drvState.yuv.shift = 1;
174754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang        mAlloc[idx]->mHal.drvState.yuv.step = ycbcr.chroma_step;
175ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams    }
176ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
177ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams    return OK;
178ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams}
179ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
180754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wangstatus_t GrallocConsumer::unlockBuffer(uint32_t idx) {
181ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams    Mutex::Autolock _l(mMutex);
182754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    return releaseAcquiredBufferLocked(idx);
183ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams}
184ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
185754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wangstatus_t GrallocConsumer::releaseAcquiredBufferLocked(uint32_t idx) {
186ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams    status_t err;
187ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
188754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    if (idx >= mNumAlloc) {
189754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang        ALOGE("Invalid buffer index: %d", idx);
190754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang        return BAD_VALUE;
191754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    }
192754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    if (mAcquiredBuffer[idx].mGraphicBuffer == nullptr) {
193754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang       return OK;
194754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    }
195754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang
196754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    err = mAcquiredBuffer[idx].mGraphicBuffer->unlock();
197ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams    if (err != OK) {
198ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams        ALOGE("%s: Unable to unlock graphic buffer", __FUNCTION__);
199ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams        return err;
200ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams    }
201754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    int buf = mAcquiredBuffer[idx].mSlot;
202ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
203ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams    // release the buffer if it hasn't already been freed by the BufferQueue.
204ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams    // This can happen, for example, when the producer of this buffer
205ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams    // disconnected after this buffer was acquired.
206754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    if (CC_LIKELY(mAcquiredBuffer[idx].mGraphicBuffer ==
207ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams            mSlots[buf].mGraphicBuffer)) {
208ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams        releaseBufferLocked(
209754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang                buf, mAcquiredBuffer[idx].mGraphicBuffer,
210ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams                EGL_NO_DISPLAY, EGL_NO_SYNC_KHR);
211ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams    }
212ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
213754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    mAcquiredBuffer[idx].mSlot = BufferQueue::INVALID_BUFFER_SLOT;
214754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    mAcquiredBuffer[idx].mBufferPointer = nullptr;
215754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    mAcquiredBuffer[idx].mGraphicBuffer.clear();
216ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams    return OK;
217ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams}
218ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
219754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wanguint32_t GrallocConsumer::getNextAvailableIdx(Allocation *a) {
220754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    for (uint32_t i = 0; i < mNumAlloc; i++) {
221754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang        if (isIdxUsed[i] == false) {
222754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang            mAlloc[i] = a;
223754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang            isIdxUsed[i] = true;
224754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang            return i;
225754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang        }
226754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    }
227754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    return mNumAlloc;
228754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang}
229754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang
230754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wangbool GrallocConsumer::releaseIdx(uint32_t idx) {
231754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    if (idx >= mNumAlloc) {
232754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang        ALOGE("Invalid buffer index: %d", idx);
233754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang        return false;
234754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    }
235754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    if (isIdxUsed[idx] == false) {
236754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang        ALOGV("Buffer index already released: %d", idx);
237754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang        return true;
238754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    }
239754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    status_t err;
240754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    err = unlockBuffer(idx);
241754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    if (err != OK) {
242754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang        ALOGE("Unable to unlock graphic buffer");
243754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang        return false;
244754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    }
245754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    mAlloc[idx] = nullptr;
246754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    isIdxUsed[idx] = false;
247754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    return true;
248754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang}
249754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang
250ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams} // namespace renderscript
251ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams} // namespace android
252