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