rsGrallocConsumer.cpp revision 7314cca8575544195e475ecc53d995311ac269c0
1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2013 The Android Open Source Project 3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License. 6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at 7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and 14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License. 15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define ATRACE_TAG ATRACE_TAG_RS 18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "rsContext.h" 209a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley#include "rsAllocation.h" 21451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin#include "rsAdapter.h" 22451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin#include "rs_hal.h" 2383e6b989c0cbea66e98becd60611c7d1e58e1001Christopher Wiley 24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <cutils/compiler.h> 25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Log.h> 26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "rsGrallocConsumer.h" 27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/GraphicBuffer.h> 28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 298683fca395d01734ec7946e9f0595ec5d7b754c6Mathias Agopian 300170cd016c8c649da3a3d845276e6c5ffa350481Christopher Ferrisnamespace android { 31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace renderscript { 32f0c13772d95486d98f034361883b2415bb26a614Casey Dahlin 3397f048d19e51da4ea6ff98d8a9daf38f2577f182Christopher WileyGrallocConsumer::GrallocConsumer(Allocation *a, const sp<IGraphicBufferConsumer>& bq, int flags) : 34f0c13772d95486d98f034361883b2415bb26a614Casey Dahlin ConsumerBase(bq, true) 35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mAlloc = a; 37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (flags == 0) { 38e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian flags = GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_RENDERSCRIPT; 398683fca395d01734ec7946e9f0595ec5d7b754c6Mathias Agopian } else { 40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project flags |= GRALLOC_USAGE_RENDERSCRIPT; 4170081a1511955f53bd0ed7f2aec9a1bf09f0f379Brad Fitzpatrick } 42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mConsumer->setConsumerUsageBits(flags); 43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mConsumer->setMaxAcquiredBufferCount(2); 44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t y = a->mHal.drvState.lod[0].dimY; 46e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian if (y < 1) y = 1; 47f683e0163a84d93448b9388126902242367cd961Serban Constantinescu mConsumer->setDefaultBufferSize(a->mHal.drvState.lod[0].dimX, y); 48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 495707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown if (a->mHal.state.yuv) { 505707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown bq->setDefaultBufferFormat(a->mHal.state.yuv); 515707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown } 52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //mBufferQueue->setConsumerName(name); 53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectGrallocConsumer::~GrallocConsumer() { 56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // ConsumerBase destructor does all the work. 57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 608938ed2c8e906fc332301b64787728d4d34da571Dianne Hackborn 61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t GrallocConsumer::lockNextBuffer() { 62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Mutex::Autolock _l(mMutex); 63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project status_t err; 64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mAcquiredBuffer.mSlot != BufferQueue::INVALID_BUFFER_SLOT) { 66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project err = releaseAcquiredBufferLocked(); 6751faf46e2958c57dab46d9420e585319125c7c42Andreas Huber if (err) { 6851faf46e2958c57dab46d9420e585319125c7c42Andreas Huber return err; 69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 7013b1604018968408bcc5553e1fa5ea9df3e4e009Jeff Brown } 717746cc318829358bb2c4dc0a03d40a7856a6d13eDianne Hackborn 727746cc318829358bb2c4dc0a03d40a7856a6d13eDianne Hackborn BufferQueue::BufferItem b; 738938ed2c8e906fc332301b64787728d4d34da571Dianne Hackborn 74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project err = acquireBufferLocked(&b, 0); 75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (err != OK) { 76702ea9d42f52fc145090c0f0bfbe64993e4b8b33Brad Fitzpatrick if (err == BufferQueue::NO_BUFFER_AVAILABLE) { 77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return BAD_VALUE; 78a877cd85b5a026384542e3271fc310d6a8fe24c6Brad Fitzpatrick } else { 79702ea9d42f52fc145090c0f0bfbe64993e4b8b33Brad Fitzpatrick ALOGE("Error acquiring buffer: %s (%d)", strerror(err), err); 80702ea9d42f52fc145090c0f0bfbe64993e4b8b33Brad Fitzpatrick return err; 8170081a1511955f53bd0ed7f2aec9a1bf09f0f379Brad Fitzpatrick } 8270081a1511955f53bd0ed7f2aec9a1bf09f0f379Brad Fitzpatrick } 8370081a1511955f53bd0ed7f2aec9a1bf09f0f379Brad Fitzpatrick 8470081a1511955f53bd0ed7f2aec9a1bf09f0f379Brad Fitzpatrick int buf = b.mBuf; 8570081a1511955f53bd0ed7f2aec9a1bf09f0f379Brad Fitzpatrick 86a877cd85b5a026384542e3271fc310d6a8fe24c6Brad Fitzpatrick if (b.mFence.get()) { 8770081a1511955f53bd0ed7f2aec9a1bf09f0f379Brad Fitzpatrick err = b.mFence->waitForever("GrallocConsumer::lockNextBuffer"); 88702ea9d42f52fc145090c0f0bfbe64993e4b8b33Brad Fitzpatrick if (err != OK) { 8983c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian ALOGE("Failed to wait for fence of acquired buffer: %s (%d)", 90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project strerror(-err), err); 91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return err; 9284e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg } 9384e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg } 9484e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg 9584e625ac1e01f5a9c3ed16664da6498212ed662bArve Hjønnevåg void *bufferPointer = nullptr; 96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project android_ycbcr ycbcr = android_ycbcr(); 97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mSlots[buf].mGraphicBuffer->getPixelFormat() == 99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project HAL_PIXEL_FORMAT_YCbCr_420_888) { 100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project err = mSlots[buf].mGraphicBuffer->lockYCbCr( 101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GraphicBuffer::USAGE_SW_READ_OFTEN, 102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project b.mCrop, 103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project &ycbcr); 104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 10541a0f2f86c0ca7d2fef50aef6215987f445a7231Dan Stoza if (err != OK) { 106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ALOGE("Unable to lock YCbCr buffer for CPU reading: %s (%d)", 1072d13afdfa1f43973bf3cb917c7d6496a38baa446Ronghua Wu strerror(-err), err); 108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return err; 109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bufferPointer = ycbcr.y; 111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project err = mSlots[buf].mGraphicBuffer->lock( 113b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin GraphicBuffer::USAGE_SW_READ_OFTEN, 114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project b.mCrop, 115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project &bufferPointer); 116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1175c0106e134366312206702f1b072347e20c90374Marco Nelissen if (err != OK) { 118f0190bff38b6c29abbfc4a877442f71fc3d7dad8Marco Nelissen ALOGE("Unable to lock buffer for CPU reading: %s (%d)", 119d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlin strerror(-err), err); 120d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlin return err; 121d6848f52e60be17b7f0992be7827dcae4ea2efb1Casey Dahlin } 122e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian } 1239a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley 1249a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley size_t lockedIdx = 0; 1259a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley assert(mAcquiredBuffer.mSlot == BufferQueue::INVALID_BUFFER_SLOT); 1269a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley 127b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin mAcquiredBuffer.mSlot = buf; 128451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin mAcquiredBuffer.mBufferPointer = bufferPointer; 129185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlin mAcquiredBuffer.mGraphicBuffer = mSlots[buf].mGraphicBuffer; 130185d3447d8a62d4d93d19125b82dbc3f9e12dda2Casey Dahlin 131b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin mAlloc->mHal.drvState.lod[0].mallocPtr = reinterpret_cast<uint8_t*>(bufferPointer); 132451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin mAlloc->mHal.drvState.lod[0].stride = mSlots[buf].mGraphicBuffer->getStride() * 133b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin mAlloc->mHal.state.type->getElementSizeBytes(); 134451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin mAlloc->mHal.state.nativeBuffer = mAcquiredBuffer.mGraphicBuffer->getNativeBuffer(); 135b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin mAlloc->mHal.state.timestamp = b.mTimestamp; 136451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin 137b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin assert(mAlloc->mHal.drvState.lod[0].dimX == 138451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin mSlots[buf].mGraphicBuffer->getWidth()); 139b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin assert(mAlloc->mHal.drvState.lod[0].dimY == 140451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin mSlots[buf].mGraphicBuffer->getHeight()); 141b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin 142451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin //mAlloc->format = mSlots[buf].mGraphicBuffer->getPixelFormat(); 143b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin 144b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin //mAlloc->crop = b.mCrop; 145451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin //mAlloc->transform = b.mTransform; 1469a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley //mAlloc->scalingMode = b.mScalingMode; 1479a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley //mAlloc->frameNumber = b.mFrameNumber; 1489a5e32f141fdb43edc1bb31ceacec781b35281b3Christopher Wiley 149451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin if (mAlloc->mHal.state.yuv == HAL_PIXEL_FORMAT_YCbCr_420_888) { 150b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin mAlloc->mHal.drvState.lod[1].mallocPtr = ycbcr.cb; 151eb8e15f9bb29f8794f8be819530631c358fd6a15Casey Dahlin mAlloc->mHal.drvState.lod[2].mallocPtr = ycbcr.cr; 152eb8e15f9bb29f8794f8be819530631c358fd6a15Casey Dahlin 153e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian mAlloc->mHal.drvState.lod[0].stride = ycbcr.ystride; 154b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin mAlloc->mHal.drvState.lod[1].stride = ycbcr.cstride; 155b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin mAlloc->mHal.drvState.lod[2].stride = ycbcr.cstride; 15697f048d19e51da4ea6ff98d8a9daf38f2577f182Christopher Wiley 157b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin mAlloc->mHal.drvState.yuv.shift = 1; 158b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin mAlloc->mHal.drvState.yuv.step = ycbcr.chroma_step; 159b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin } 160b9872623ca0f2366c348d6d40a8ba45ee0e87710Casey Dahlin 16197f048d19e51da4ea6ff98d8a9daf38f2577f182Christopher Wiley return OK; 16297f048d19e51da4ea6ff98d8a9daf38f2577f182Christopher Wiley} 16397f048d19e51da4ea6ff98d8a9daf38f2577f182Christopher Wiley 164e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopianstatus_t GrallocConsumer::unlockBuffer() { 165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Mutex::Autolock _l(mMutex); 1668683fca395d01734ec7946e9f0595ec5d7b754c6Mathias Agopian return releaseAcquiredBufferLocked(); 1678683fca395d01734ec7946e9f0595ec5d7b754c6Mathias Agopian} 1688683fca395d01734ec7946e9f0595ec5d7b754c6Mathias Agopian 16931c1beb1d8de373f7734a54e25ad80b01024adb0Christopher Wileystatus_t GrallocConsumer::releaseAcquiredBufferLocked() { 17031c1beb1d8de373f7734a54e25ad80b01024adb0Christopher Wiley status_t err; 17131c1beb1d8de373f7734a54e25ad80b01024adb0Christopher Wiley 17231c1beb1d8de373f7734a54e25ad80b01024adb0Christopher Wiley err = mAcquiredBuffer.mGraphicBuffer->unlock(); 1738683fca395d01734ec7946e9f0595ec5d7b754c6Mathias Agopian if (err != OK) { 174a47f02afb1e1f2c4abd9379c13903a5dde89d354Mathias Agopian ALOGE("%s: Unable to unlock graphic buffer", __FUNCTION__); 175a47f02afb1e1f2c4abd9379c13903a5dde89d354Mathias Agopian return err; 176451ff582d730e27f4e22d9f158f8ee24d1bc2729Casey Dahlin } 177a47f02afb1e1f2c4abd9379c13903a5dde89d354Mathias Agopian int buf = mAcquiredBuffer.mSlot; 178a47f02afb1e1f2c4abd9379c13903a5dde89d354Mathias Agopian 179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // release the buffer if it hasn't already been freed by the BufferQueue. 180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // This can happen, for example, when the producer of this buffer 181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // disconnected after this buffer was acquired. 18293ff1f985e233fe04412a65041e977c9f0c21f5bJeff Brown if (CC_LIKELY(mAcquiredBuffer.mGraphicBuffer == 18393ff1f985e233fe04412a65041e977c9f0c21f5bJeff Brown mSlots[buf].mGraphicBuffer)) { 184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project releaseBufferLocked( 185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buf, mAcquiredBuffer.mGraphicBuffer, 186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGL_NO_DISPLAY, EGL_NO_SYNC_KHR); 187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1885707dbf15d0b44c88fbaa6dd271097f2d42932e0Jeff Brown 18906673e38983baad380e818c5493b7faccf3b2393Casey Dahlin mAcquiredBuffer.mSlot = BufferQueue::INVALID_BUFFER_SLOT; 19006673e38983baad380e818c5493b7faccf3b2393Casey Dahlin mAcquiredBuffer.mBufferPointer = nullptr; 19106673e38983baad380e818c5493b7faccf3b2393Casey Dahlin mAcquiredBuffer.mGraphicBuffer.clear(); 19206673e38983baad380e818c5493b7faccf3b2393Casey Dahlin return OK; 1932cf1995d3d1cdca8e0ba2d8fab9a322c4096f809Christopher Wiley} 19406673e38983baad380e818c5493b7faccf3b2393Casey Dahlin 19506673e38983baad380e818c5493b7faccf3b2393Casey Dahlin} // namespace renderscript 19606673e38983baad380e818c5493b7faccf3b2393Casey Dahlin} // namespace android 19706673e38983baad380e818c5493b7faccf3b2393Casey Dahlin 1982cf1995d3d1cdca8e0ba2d8fab9a322c4096f809Christopher Wiley