VirtualDisplaySurface.cpp revision 8db92553e9e6263cd41eaf1a1ebc9e3f88f92b5f
199c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall/* 299c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall * Copyright 2013 The Android Open Source Project 399c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall * 499c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall * Licensed under the Apache License, Version 2.0 (the "License"); 599c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall * you may not use this file except in compliance with the License. 699c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall * You may obtain a copy of the License at 799c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall * 899c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall * http://www.apache.org/licenses/LICENSE-2.0 999c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall * 1099c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall * Unless required by applicable law or agreed to in writing, software 1199c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall * distributed under the License is distributed on an "AS IS" BASIS, 1299c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1399c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall * See the License for the specific language governing permissions and 1499c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall * limitations under the License. 1599c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall */ 1699c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall 1738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall// #define LOG_NDEBUG 0 1899c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall#include "VirtualDisplaySurface.h" 1938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall#include "HWComposer.h" 2099c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall 2199c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall// --------------------------------------------------------------------------- 2299c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hallnamespace android { 2399c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall// --------------------------------------------------------------------------- 2499c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall 2538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall#define VDS_LOGE(msg, ...) ALOGE("[%s] "msg, \ 2638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mDisplayName.string(), ##__VA_ARGS__) 2738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall#define VDS_LOGW_IF(cond, msg, ...) ALOGW_IF(cond, "[%s] "msg, \ 2838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mDisplayName.string(), ##__VA_ARGS__) 2938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall#define VDS_LOGV(msg, ...) ALOGV("[%s] "msg, \ 3038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mDisplayName.string(), ##__VA_ARGS__) 3138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 3238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hallstatic const char* dbgCompositionTypeStr(DisplaySurface::CompositionType type) { 3338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall switch (type) { 3438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall case DisplaySurface::COMPOSITION_UNKNOWN: return "UNKNOWN"; 3538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall case DisplaySurface::COMPOSITION_GLES: return "GLES"; 3638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall case DisplaySurface::COMPOSITION_HWC: return "HWC"; 3738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall case DisplaySurface::COMPOSITION_MIXED: return "MIXED"; 3838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall default: return "<INVALID>"; 3938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 4038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall} 4138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 42ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse HallVirtualDisplaySurface::VirtualDisplaySurface(HWComposer& hwc, int32_t dispId, 43db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian const sp<IGraphicBufferProducer>& sink, 44db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian const sp<BufferQueue>& bq, 45db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian const String8& name) 46db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian: ConsumerBase(bq), 4738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mHwc(hwc), 4838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mDisplayId(dispId), 4938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mDisplayName(name), 5038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mProducerUsage(GRALLOC_USAGE_HW_COMPOSER), 5138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mProducerSlotSource(0), 5238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mDbgState(DBG_STATE_IDLE), 5338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mDbgLastCompositionType(COMPOSITION_UNKNOWN) 54ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall{ 5538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mSource[SOURCE_SINK] = sink; 56db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian mSource[SOURCE_SCRATCH] = bq; 5738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 5838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall resetPerFrameState(); 5938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 6038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall int sinkWidth, sinkHeight; 6138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mSource[SOURCE_SINK]->query(NATIVE_WINDOW_WIDTH, &sinkWidth); 6238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mSource[SOURCE_SINK]->query(NATIVE_WINDOW_HEIGHT, &sinkHeight); 6338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 6438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall ConsumerBase::mName = String8::format("VDS: %s", mDisplayName.string()); 65db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian mConsumer->setConsumerName(ConsumerBase::mName); 66db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian mConsumer->setConsumerUsageBits(GRALLOC_USAGE_HW_COMPOSER); 67db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian mConsumer->setDefaultBufferSize(sinkWidth, sinkHeight); 68db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian mConsumer->setDefaultMaxBufferCount(2); 69ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall} 7099c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall 7199c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse HallVirtualDisplaySurface::~VirtualDisplaySurface() { 7299c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall} 7399c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall 74028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hallstatus_t VirtualDisplaySurface::beginFrame() { 7538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (mDisplayId < 0) 7638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return NO_ERROR; 7738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 7838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall VDS_LOGW_IF(mDbgState != DBG_STATE_IDLE, 79028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall "Unexpected beginFrame() in %s state", dbgStateStr()); 80028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall mDbgState = DBG_STATE_BEGUN; 81028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall 82028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall uint32_t transformHint, numPendingBuffers; 83028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall mQueueBufferOutput.deflate(&mSinkBufferWidth, &mSinkBufferHeight, 84028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall &transformHint, &numPendingBuffers); 85028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall 86028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall return refreshOutputBuffer(); 87028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall} 88028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall 89028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hallstatus_t VirtualDisplaySurface::prepareFrame(CompositionType compositionType) { 90028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall if (mDisplayId < 0) 91028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall return NO_ERROR; 92028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall 93028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall VDS_LOGW_IF(mDbgState != DBG_STATE_BEGUN, 9438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall "Unexpected prepareFrame() in %s state", dbgStateStr()); 9538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mDbgState = DBG_STATE_PREPARED; 9638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 9738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mCompositionType = compositionType; 9838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 9938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (mCompositionType != mDbgLastCompositionType) { 10038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall VDS_LOGV("prepareFrame: composition type changed to %s", 10138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall dbgCompositionTypeStr(mCompositionType)); 10238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mDbgLastCompositionType = mCompositionType; 10338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 10438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 10538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return NO_ERROR; 10699c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall} 10799c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall 10899c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hallstatus_t VirtualDisplaySurface::compositionComplete() { 10999c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall return NO_ERROR; 11099c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall} 11199c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall 11299c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hallstatus_t VirtualDisplaySurface::advanceFrame() { 11338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (mDisplayId < 0) 11438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return NO_ERROR; 11538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 11638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (mCompositionType == COMPOSITION_HWC) { 11738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall VDS_LOGW_IF(mDbgState != DBG_STATE_PREPARED, 11838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall "Unexpected advanceFrame() in %s state on HWC frame", 11938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall dbgStateStr()); 12038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } else { 12138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall VDS_LOGW_IF(mDbgState != DBG_STATE_GLES_DONE, 12238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall "Unexpected advanceFrame() in %s state on GLES/MIXED frame", 12338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall dbgStateStr()); 12438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 12538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mDbgState = DBG_STATE_HWC; 12638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 12738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (mCompositionType == COMPOSITION_HWC) { 128028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall // Use the output buffer for the FB as well, though conceptually the 129028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall // FB is unused on this frame. 13038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mFbProducerSlot = mOutputProducerSlot; 131028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall mFbFence = mOutputFence; 13238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 13338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 13438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (mFbProducerSlot < 0 || mOutputProducerSlot < 0) { 13538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall // Last chance bailout if something bad happened earlier. For example, 13638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall // in a GLES configuration, if the sink disappears then dequeueBuffer 13738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall // will fail, the GLES driver won't queue a buffer, but SurfaceFlinger 13838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall // will soldier on. So we end up here without a buffer. There should 13938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall // be lots of scary messages in the log just before this. 14038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall VDS_LOGE("advanceFrame: no buffer, bailing out"); 14138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return NO_MEMORY; 14238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 14338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 14438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall sp<GraphicBuffer> fbBuffer = mProducerBuffers[mFbProducerSlot]; 14538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall sp<GraphicBuffer> outBuffer = mProducerBuffers[mOutputProducerSlot]; 14638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall VDS_LOGV("advanceFrame: fb=%d(%p) out=%d(%p)", 14738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mFbProducerSlot, fbBuffer.get(), 14838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mOutputProducerSlot, outBuffer.get()); 14938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 150028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall return mHwc.fbPost(mDisplayId, mFbFence, fbBuffer); 15199c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall} 15299c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall 153851cfe834295224cd64bdd499872b95b19c4de8cJesse Hallvoid VirtualDisplaySurface::onFrameCommitted() { 15438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (mDisplayId < 0) 15538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return; 15638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 15738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall VDS_LOGW_IF(mDbgState != DBG_STATE_HWC, 15838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall "Unexpected onFrameCommitted() in %s state", dbgStateStr()); 15938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mDbgState = DBG_STATE_IDLE; 16038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 16138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall sp<Fence> fbFence = mHwc.getAndResetReleaseFence(mDisplayId); 16238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (mCompositionType == COMPOSITION_MIXED && mFbProducerSlot >= 0) { 16338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall // release the scratch buffer back to the pool 16438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall Mutex::Autolock lock(mMutex); 16538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall int sslot = mapProducer2SourceSlot(SOURCE_SCRATCH, mFbProducerSlot); 16638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall VDS_LOGV("onFrameCommitted: release scratch sslot=%d", sslot); 16738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall addReleaseFenceLocked(sslot, mProducerBuffers[mFbProducerSlot], fbFence); 16838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall releaseBufferLocked(sslot, mProducerBuffers[mFbProducerSlot], 16938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall EGL_NO_DISPLAY, EGL_NO_SYNC_KHR); 17038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 17138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 17238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (mOutputProducerSlot >= 0) { 17338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall int sslot = mapProducer2SourceSlot(SOURCE_SINK, mOutputProducerSlot); 17438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall QueueBufferOutput qbo; 17538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall sp<Fence> outFence = mHwc.getLastRetireFence(mDisplayId); 17638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall VDS_LOGV("onFrameCommitted: queue sink sslot=%d", sslot); 17738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall status_t result = mSource[SOURCE_SINK]->queueBuffer(sslot, 1788db92553e9e6263cd41eaf1a1ebc9e3f88f92b5fJesse Hall QueueBufferInput( 1798db92553e9e6263cd41eaf1a1ebc9e3f88f92b5fJesse Hall systemTime(), false /* isAutoTimestamp */, 18038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall Rect(mSinkBufferWidth, mSinkBufferHeight), 1818db92553e9e6263cd41eaf1a1ebc9e3f88f92b5fJesse Hall NATIVE_WINDOW_SCALING_MODE_FREEZE, 0 /* transform */, 1828db92553e9e6263cd41eaf1a1ebc9e3f88f92b5fJesse Hall true /* async*/, 1838db92553e9e6263cd41eaf1a1ebc9e3f88f92b5fJesse Hall outFence), 18438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall &qbo); 18538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (result == NO_ERROR) { 18638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall updateQueueBufferOutput(qbo); 18738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 18838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 18938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 19038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall resetPerFrameState(); 19199c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall} 19299c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall 19399c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hallvoid VirtualDisplaySurface::dump(String8& result) const { 19499c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall} 19599c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall 19638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hallstatus_t VirtualDisplaySurface::requestBuffer(int pslot, 19738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall sp<GraphicBuffer>* outBuf) { 19838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall VDS_LOGW_IF(mDbgState != DBG_STATE_GLES, 19938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall "Unexpected requestBuffer pslot=%d in %s state", 20038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall pslot, dbgStateStr()); 20138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 20238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall *outBuf = mProducerBuffers[pslot]; 20338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return NO_ERROR; 20438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall} 20538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 20638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hallstatus_t VirtualDisplaySurface::setBufferCount(int bufferCount) { 20738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return mSource[SOURCE_SINK]->setBufferCount(bufferCount); 20838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall} 20938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 21038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hallstatus_t VirtualDisplaySurface::dequeueBuffer(Source source, 2118db92553e9e6263cd41eaf1a1ebc9e3f88f92b5fJesse Hall uint32_t format, int* sslot, sp<Fence>* fence) { 2128db92553e9e6263cd41eaf1a1ebc9e3f88f92b5fJesse Hall // Don't let a slow consumer block us 2138db92553e9e6263cd41eaf1a1ebc9e3f88f92b5fJesse Hall bool async = (source == SOURCE_SINK); 2148db92553e9e6263cd41eaf1a1ebc9e3f88f92b5fJesse Hall 2157cdd786fa80cf03551291ae8feca7b77583be1c5Mathias Agopian status_t result = mSource[source]->dequeueBuffer(sslot, fence, async, 21638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mSinkBufferWidth, mSinkBufferHeight, format, mProducerUsage); 21738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (result < 0) 21838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return result; 21938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall int pslot = mapSource2ProducerSlot(source, *sslot); 22038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall VDS_LOGV("dequeueBuffer(%s): sslot=%d pslot=%d result=%d", 22138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall dbgSourceStr(source), *sslot, pslot, result); 22238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall uint32_t sourceBit = static_cast<uint32_t>(source) << pslot; 22338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 22438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if ((mProducerSlotSource & (1u << pslot)) != sourceBit) { 22538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall // This slot was previously dequeued from the other source; must 22638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall // re-request the buffer. 22738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall result |= BUFFER_NEEDS_REALLOCATION; 22838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mProducerSlotSource &= ~(1u << pslot); 22938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mProducerSlotSource |= sourceBit; 23038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 23138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 23238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (result & RELEASE_ALL_BUFFERS) { 23338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall for (uint32_t i = 0; i < BufferQueue::NUM_BUFFER_SLOTS; i++) { 23438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if ((mProducerSlotSource & (1u << i)) == sourceBit) 23538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mProducerBuffers[i].clear(); 23638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 23738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 23838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (result & BUFFER_NEEDS_REALLOCATION) { 23938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mSource[source]->requestBuffer(*sslot, &mProducerBuffers[pslot]); 24038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall VDS_LOGV("dequeueBuffer(%s): buffers[%d]=%p", 24138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall dbgSourceStr(source), pslot, mProducerBuffers[pslot].get()); 24238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 24338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 24438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return result; 24538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall} 24638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 2477cdd786fa80cf03551291ae8feca7b77583be1c5Mathias Agopianstatus_t VirtualDisplaySurface::dequeueBuffer(int* pslot, sp<Fence>* fence, bool async, 24838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall uint32_t w, uint32_t h, uint32_t format, uint32_t usage) { 24938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall VDS_LOGW_IF(mDbgState != DBG_STATE_PREPARED, 25038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall "Unexpected dequeueBuffer() in %s state", dbgStateStr()); 25138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mDbgState = DBG_STATE_GLES; 25238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 2538db92553e9e6263cd41eaf1a1ebc9e3f88f92b5fJesse Hall VDS_LOGW_IF(!async, "EGL called dequeueBuffer with !async despite eglSwapInterval(0)"); 25438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall VDS_LOGV("dequeueBuffer %dx%d fmt=%d usage=%#x", w, h, format, usage); 25538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 256028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall status_t result = NO_ERROR; 25738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mProducerUsage = usage | GRALLOC_USAGE_HW_COMPOSER; 25838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall Source source = fbSourceForCompositionType(mCompositionType); 259028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall 26038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (source == SOURCE_SINK) { 261028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall // We already dequeued the output buffer. If the GLES driver wants 262028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall // something incompatible, we have to cancel and get a new one. This 263028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall // will mean that HWC will see a different output buffer between 264028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall // prepare and set, but since we're in GLES-only mode already it 265028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall // shouldn't matter. 266028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall 267028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall const sp<GraphicBuffer>& buf = mProducerBuffers[mOutputProducerSlot]; 268028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall if ((mProducerUsage & ~buf->getUsage()) != 0 || 269028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall (format != 0 && format != (uint32_t)buf->getPixelFormat()) || 270028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall (w != 0 && w != mSinkBufferWidth) || 271028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall (h != 0 && h != mSinkBufferHeight)) { 272028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall VDS_LOGV("dequeueBuffer: output buffer doesn't satisfy GLES " 273028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall "request, getting a new buffer"); 274028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall result = refreshOutputBuffer(); 275028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall if (result < 0) 276028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall return result; 277028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall } 27838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 27938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 280028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall if (source == SOURCE_SINK) { 281028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall *pslot = mOutputProducerSlot; 282028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall *fence = mOutputFence; 283028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall } else { 284028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall int sslot; 2858db92553e9e6263cd41eaf1a1ebc9e3f88f92b5fJesse Hall result = dequeueBuffer(source, format, &sslot, fence); 286028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall if (result >= 0) { 287028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall *pslot = mapSource2ProducerSlot(source, sslot); 288028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall } 28938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 29038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return result; 29138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall} 29238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 29338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hallstatus_t VirtualDisplaySurface::queueBuffer(int pslot, 29438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall const QueueBufferInput& input, QueueBufferOutput* output) { 29538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall VDS_LOGW_IF(mDbgState != DBG_STATE_GLES, 29638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall "Unexpected queueBuffer(pslot=%d) in %s state", pslot, 29738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall dbgStateStr()); 29838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mDbgState = DBG_STATE_GLES_DONE; 29938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 30038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall VDS_LOGV("queueBuffer pslot=%d", pslot); 30138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 30238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall status_t result; 30338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (mCompositionType == COMPOSITION_MIXED) { 30438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall // Queue the buffer back into the scratch pool 30538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall QueueBufferOutput scratchQBO; 30638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall int sslot = mapProducer2SourceSlot(SOURCE_SCRATCH, pslot); 307db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian result = mSource[SOURCE_SCRATCH]->queueBuffer(sslot, input, &scratchQBO); 30838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (result != NO_ERROR) 30938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return result; 31038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 31138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall // Now acquire the buffer from the scratch pool -- should be the same 31238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall // slot and fence as we just queued. 31338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall Mutex::Autolock lock(mMutex); 31438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall BufferQueue::BufferItem item; 315bce7611e8e4514026bf12f96baaf9168f6d5894eJesse Hall result = acquireBufferLocked(&item, 0); 31638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (result != NO_ERROR) 31738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return result; 31838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall VDS_LOGW_IF(item.mBuf != sslot, 31938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall "queueBuffer: acquired sslot %d from SCRATCH after queueing sslot %d", 32038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall item.mBuf, sslot); 32138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mFbProducerSlot = mapSource2ProducerSlot(SOURCE_SCRATCH, item.mBuf); 32238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mFbFence = mSlots[item.mBuf].mFence; 32338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 32438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } else { 32538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall LOG_FATAL_IF(mCompositionType != COMPOSITION_GLES, 32638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall "Unexpected queueBuffer in state %s for compositionType %s", 32738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall dbgStateStr(), dbgCompositionTypeStr(mCompositionType)); 32838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 32938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall // Extract the GLES release fence for HWC to acquire 33038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall int64_t timestamp; 3313c25621ad7d13f64d3ab95a27fa970fbc9998f73Andy McFadden bool isAutoTimestamp; 33238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall Rect crop; 33338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall int scalingMode; 33438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall uint32_t transform; 3357cdd786fa80cf03551291ae8feca7b77583be1c5Mathias Agopian bool async; 3363c25621ad7d13f64d3ab95a27fa970fbc9998f73Andy McFadden input.deflate(×tamp, &isAutoTimestamp, &crop, &scalingMode, 3373c25621ad7d13f64d3ab95a27fa970fbc9998f73Andy McFadden &transform, &async, &mFbFence); 33838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 33938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mFbProducerSlot = pslot; 340028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall mOutputFence = mFbFence; 34138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 34238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 34338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall *output = mQueueBufferOutput; 34438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return NO_ERROR; 34538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall} 34638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 34738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hallvoid VirtualDisplaySurface::cancelBuffer(int pslot, const sp<Fence>& fence) { 34838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall VDS_LOGW_IF(mDbgState != DBG_STATE_GLES, 34938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall "Unexpected cancelBuffer(pslot=%d) in %s state", pslot, 35038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall dbgStateStr()); 35138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall VDS_LOGV("cancelBuffer pslot=%d", pslot); 35238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall Source source = fbSourceForCompositionType(mCompositionType); 35338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return mSource[source]->cancelBuffer( 35438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mapProducer2SourceSlot(source, pslot), fence); 35538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall} 35638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 35738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hallint VirtualDisplaySurface::query(int what, int* value) { 35838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return mSource[SOURCE_SINK]->query(what, value); 35938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall} 36038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 361595264f1af12e25dce57d7c5b1d52ed86ac0d0c9Mathias Agopianstatus_t VirtualDisplaySurface::connect(int api, bool producerControlledByApp, 362595264f1af12e25dce57d7c5b1d52ed86ac0d0c9Mathias Agopian QueueBufferOutput* output) { 36338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall QueueBufferOutput qbo; 364595264f1af12e25dce57d7c5b1d52ed86ac0d0c9Mathias Agopian status_t result = mSource[SOURCE_SINK]->connect(api, producerControlledByApp, &qbo); 36538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (result == NO_ERROR) { 36638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall updateQueueBufferOutput(qbo); 36738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall *output = mQueueBufferOutput; 36838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 36938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return result; 37038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall} 37138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 37238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hallstatus_t VirtualDisplaySurface::disconnect(int api) { 37338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return mSource[SOURCE_SINK]->disconnect(api); 37438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall} 37538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 37638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hallvoid VirtualDisplaySurface::updateQueueBufferOutput( 37738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall const QueueBufferOutput& qbo) { 37838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall uint32_t w, h, transformHint, numPendingBuffers; 37938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall qbo.deflate(&w, &h, &transformHint, &numPendingBuffers); 38038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mQueueBufferOutput.inflate(w, h, 0, numPendingBuffers); 38138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall} 38238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 38338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hallvoid VirtualDisplaySurface::resetPerFrameState() { 38438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mCompositionType = COMPOSITION_UNKNOWN; 38538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mSinkBufferWidth = 0; 38638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mSinkBufferHeight = 0; 38738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mFbFence = Fence::NO_FENCE; 388028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall mOutputFence = Fence::NO_FENCE; 38938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mFbProducerSlot = -1; 39038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mOutputProducerSlot = -1; 39138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall} 39238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 393028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hallstatus_t VirtualDisplaySurface::refreshOutputBuffer() { 394028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall if (mOutputProducerSlot >= 0) { 395028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall mSource[SOURCE_SINK]->cancelBuffer( 396028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall mapProducer2SourceSlot(SOURCE_SINK, mOutputProducerSlot), 397028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall mOutputFence); 398028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall } 399028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall 400028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall int sslot; 4018db92553e9e6263cd41eaf1a1ebc9e3f88f92b5fJesse Hall status_t result = dequeueBuffer(SOURCE_SINK, 0, &sslot, &mOutputFence); 402028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall if (result < 0) 403028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall return result; 404028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall mOutputProducerSlot = mapSource2ProducerSlot(SOURCE_SINK, sslot); 405028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall 406028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall result = mHwc.setOutputBuffer(mDisplayId, mOutputFence, 407028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall mProducerBuffers[mOutputProducerSlot]); 408028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall 409028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall return result; 410028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall} 411028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall 41238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall// This slot mapping function is its own inverse, so two copies are unnecessary. 41338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall// Both are kept to make the intent clear where the function is called, and for 41438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall// the (unlikely) chance that we switch to a different mapping function. 41538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hallint VirtualDisplaySurface::mapSource2ProducerSlot(Source source, int sslot) { 41638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (source == SOURCE_SCRATCH) { 41738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return BufferQueue::NUM_BUFFER_SLOTS - sslot - 1; 41838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } else { 41938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return sslot; 42038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 42138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall} 42238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hallint VirtualDisplaySurface::mapProducer2SourceSlot(Source source, int pslot) { 42338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return mapSource2ProducerSlot(source, pslot); 42438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall} 42538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 42638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse HallVirtualDisplaySurface::Source 42738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse HallVirtualDisplaySurface::fbSourceForCompositionType(CompositionType type) { 42838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return type == COMPOSITION_MIXED ? SOURCE_SCRATCH : SOURCE_SINK; 42938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall} 43038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 43138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hallconst char* VirtualDisplaySurface::dbgStateStr() const { 43238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall switch (mDbgState) { 43338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall case DBG_STATE_IDLE: return "IDLE"; 43438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall case DBG_STATE_PREPARED: return "PREPARED"; 43538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall case DBG_STATE_GLES: return "GLES"; 43638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall case DBG_STATE_GLES_DONE: return "GLES_DONE"; 43738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall case DBG_STATE_HWC: return "HWC"; 43838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall default: return "INVALID"; 43938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 44038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall} 44138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 44238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hallconst char* VirtualDisplaySurface::dbgSourceStr(Source s) { 44338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall switch (s) { 44438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall case SOURCE_SINK: return "SINK"; 44538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall case SOURCE_SCRATCH: return "SCRATCH"; 44638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall default: return "INVALID"; 44738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 44838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall} 44938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 45099c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall// --------------------------------------------------------------------------- 45199c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall} // namespace android 45299c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall// --------------------------------------------------------------------------- 453