VirtualDisplaySurface.cpp revision 7cdd786fa80cf03551291ae8feca7b77583be1c5
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, 4399c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall const sp<IGraphicBufferProducer>& sink, const String8& name) 44595264f1af12e25dce57d7c5b1d52ed86ac0d0c9Mathias Agopian: ConsumerBase(new BufferQueue()), 4538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mHwc(hwc), 4638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mDisplayId(dispId), 4738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mDisplayName(name), 4838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mProducerUsage(GRALLOC_USAGE_HW_COMPOSER), 4938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mProducerSlotSource(0), 5038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mDbgState(DBG_STATE_IDLE), 5138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mDbgLastCompositionType(COMPOSITION_UNKNOWN) 52ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall{ 5338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mSource[SOURCE_SINK] = sink; 5438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mSource[SOURCE_SCRATCH] = mBufferQueue; 5538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 5638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall resetPerFrameState(); 5738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 5838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall int sinkWidth, sinkHeight; 5938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mSource[SOURCE_SINK]->query(NATIVE_WINDOW_WIDTH, &sinkWidth); 6038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mSource[SOURCE_SINK]->query(NATIVE_WINDOW_HEIGHT, &sinkHeight); 6138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 6238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall ConsumerBase::mName = String8::format("VDS: %s", mDisplayName.string()); 6338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mBufferQueue->setConsumerName(ConsumerBase::mName); 6438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mBufferQueue->setConsumerUsageBits(GRALLOC_USAGE_HW_COMPOSER); 6538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mBufferQueue->setDefaultBufferSize(sinkWidth, sinkHeight); 6638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mBufferQueue->setDefaultMaxBufferCount(2); 67ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall} 6899c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall 6999c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse HallVirtualDisplaySurface::~VirtualDisplaySurface() { 7099c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall} 7199c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall 7299c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hallsp<IGraphicBufferProducer> VirtualDisplaySurface::getIGraphicBufferProducer() const { 7338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (mDisplayId >= 0) { 7438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return static_cast<IGraphicBufferProducer*>( 7538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall const_cast<VirtualDisplaySurface*>(this)); 7638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } else { 7738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall // There won't be any interaction with HWC for this virtual display, 7838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall // so the GLES driver can pass buffers directly to the sink. 7938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return mSource[SOURCE_SINK]; 8038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 8138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall} 8238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 8338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hallstatus_t VirtualDisplaySurface::prepareFrame(CompositionType compositionType) { 8438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (mDisplayId < 0) 8538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return NO_ERROR; 8638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 8738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall VDS_LOGW_IF(mDbgState != DBG_STATE_IDLE, 8838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall "Unexpected prepareFrame() in %s state", dbgStateStr()); 8938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mDbgState = DBG_STATE_PREPARED; 9038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 9138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mCompositionType = compositionType; 9238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 9338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (mCompositionType != mDbgLastCompositionType) { 9438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall VDS_LOGV("prepareFrame: composition type changed to %s", 9538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall dbgCompositionTypeStr(mCompositionType)); 9638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mDbgLastCompositionType = mCompositionType; 9738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 9838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 9938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return NO_ERROR; 10099c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall} 10199c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall 10299c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hallstatus_t VirtualDisplaySurface::compositionComplete() { 10399c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall return NO_ERROR; 10499c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall} 10599c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall 10699c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hallstatus_t VirtualDisplaySurface::advanceFrame() { 10738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (mDisplayId < 0) 10838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return NO_ERROR; 10938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 11038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (mCompositionType == COMPOSITION_HWC) { 11138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall VDS_LOGW_IF(mDbgState != DBG_STATE_PREPARED, 11238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall "Unexpected advanceFrame() in %s state on HWC frame", 11338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall dbgStateStr()); 11438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } else { 11538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall VDS_LOGW_IF(mDbgState != DBG_STATE_GLES_DONE, 11638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall "Unexpected advanceFrame() in %s state on GLES/MIXED frame", 11738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall dbgStateStr()); 11838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 11938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mDbgState = DBG_STATE_HWC; 12038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 12138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall status_t result; 12238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall sp<Fence> outFence; 12338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (mCompositionType != COMPOSITION_GLES) { 12438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall // Dequeue an output buffer from the sink 12538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall uint32_t transformHint, numPendingBuffers; 12638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mQueueBufferOutput.deflate(&mSinkBufferWidth, &mSinkBufferHeight, 12738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall &transformHint, &numPendingBuffers); 12838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall int sslot; 1297cdd786fa80cf03551291ae8feca7b77583be1c5Mathias Agopian result = dequeueBuffer(SOURCE_SINK, 0, &sslot, &outFence, false); 13038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (result < 0) 13138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return result; 13238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mOutputProducerSlot = mapSource2ProducerSlot(SOURCE_SINK, sslot); 13338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 13438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 13538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (mCompositionType == COMPOSITION_HWC) { 13638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall // We just dequeued the output buffer, use it for FB as well 13738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mFbProducerSlot = mOutputProducerSlot; 13838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mFbFence = outFence; 13938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } else if (mCompositionType == COMPOSITION_GLES) { 14038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mOutputProducerSlot = mFbProducerSlot; 14138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall outFence = mFbFence; 14238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } else { 14338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall // mFbFence and mFbProducerSlot were set in queueBuffer, 14438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall // and mOutputProducerSlot and outFence were set above when dequeueing 14538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall // the sink buffer. 14638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 14738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 14838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (mFbProducerSlot < 0 || mOutputProducerSlot < 0) { 14938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall // Last chance bailout if something bad happened earlier. For example, 15038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall // in a GLES configuration, if the sink disappears then dequeueBuffer 15138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall // will fail, the GLES driver won't queue a buffer, but SurfaceFlinger 15238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall // will soldier on. So we end up here without a buffer. There should 15338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall // be lots of scary messages in the log just before this. 15438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall VDS_LOGE("advanceFrame: no buffer, bailing out"); 15538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return NO_MEMORY; 15638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 15738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 15838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall sp<GraphicBuffer> fbBuffer = mProducerBuffers[mFbProducerSlot]; 15938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall sp<GraphicBuffer> outBuffer = mProducerBuffers[mOutputProducerSlot]; 16038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall VDS_LOGV("advanceFrame: fb=%d(%p) out=%d(%p)", 16138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mFbProducerSlot, fbBuffer.get(), 16238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mOutputProducerSlot, outBuffer.get()); 16338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 16438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall result = mHwc.fbPost(mDisplayId, mFbFence, fbBuffer); 16538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (result == NO_ERROR) { 16638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall result = mHwc.setOutputBuffer(mDisplayId, outFence, outBuffer); 16738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 16838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 16938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return result; 17099c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall} 17199c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall 172851cfe834295224cd64bdd499872b95b19c4de8cJesse Hallvoid VirtualDisplaySurface::onFrameCommitted() { 17338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (mDisplayId < 0) 17438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return; 17538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 17638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall VDS_LOGW_IF(mDbgState != DBG_STATE_HWC, 17738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall "Unexpected onFrameCommitted() in %s state", dbgStateStr()); 17838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mDbgState = DBG_STATE_IDLE; 17938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 18038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall sp<Fence> fbFence = mHwc.getAndResetReleaseFence(mDisplayId); 18138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (mCompositionType == COMPOSITION_MIXED && mFbProducerSlot >= 0) { 18238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall // release the scratch buffer back to the pool 18338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall Mutex::Autolock lock(mMutex); 18438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall int sslot = mapProducer2SourceSlot(SOURCE_SCRATCH, mFbProducerSlot); 18538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall VDS_LOGV("onFrameCommitted: release scratch sslot=%d", sslot); 18638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall addReleaseFenceLocked(sslot, mProducerBuffers[mFbProducerSlot], fbFence); 18738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall releaseBufferLocked(sslot, mProducerBuffers[mFbProducerSlot], 18838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall EGL_NO_DISPLAY, EGL_NO_SYNC_KHR); 18938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 19038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 19138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (mOutputProducerSlot >= 0) { 19238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall int sslot = mapProducer2SourceSlot(SOURCE_SINK, mOutputProducerSlot); 19338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall QueueBufferOutput qbo; 19438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall sp<Fence> outFence = mHwc.getLastRetireFence(mDisplayId); 19538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall VDS_LOGV("onFrameCommitted: queue sink sslot=%d", sslot); 19638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall status_t result = mSource[SOURCE_SINK]->queueBuffer(sslot, 19738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall QueueBufferInput(systemTime(), 19838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall Rect(mSinkBufferWidth, mSinkBufferHeight), 1997cdd786fa80cf03551291ae8feca7b77583be1c5Mathias Agopian NATIVE_WINDOW_SCALING_MODE_FREEZE, 0, false, outFence), 20038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall &qbo); 20138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (result == NO_ERROR) { 20238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall updateQueueBufferOutput(qbo); 20338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 20438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 20538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 20638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall resetPerFrameState(); 20799c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall} 20899c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall 20999c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hallvoid VirtualDisplaySurface::dump(String8& result) const { 21099c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall} 21199c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall 21238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hallstatus_t VirtualDisplaySurface::requestBuffer(int pslot, 21338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall sp<GraphicBuffer>* outBuf) { 21438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall VDS_LOGW_IF(mDbgState != DBG_STATE_GLES, 21538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall "Unexpected requestBuffer pslot=%d in %s state", 21638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall pslot, dbgStateStr()); 21738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 21838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall *outBuf = mProducerBuffers[pslot]; 21938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return NO_ERROR; 22038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall} 22138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 22238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hallstatus_t VirtualDisplaySurface::setBufferCount(int bufferCount) { 22338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return mSource[SOURCE_SINK]->setBufferCount(bufferCount); 22438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall} 22538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 22638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hallstatus_t VirtualDisplaySurface::dequeueBuffer(Source source, 2277cdd786fa80cf03551291ae8feca7b77583be1c5Mathias Agopian uint32_t format, int* sslot, sp<Fence>* fence, bool async) { 2287cdd786fa80cf03551291ae8feca7b77583be1c5Mathias Agopian status_t result = mSource[source]->dequeueBuffer(sslot, fence, async, 22938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mSinkBufferWidth, mSinkBufferHeight, format, mProducerUsage); 23038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (result < 0) 23138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return result; 23238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall int pslot = mapSource2ProducerSlot(source, *sslot); 23338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall VDS_LOGV("dequeueBuffer(%s): sslot=%d pslot=%d result=%d", 23438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall dbgSourceStr(source), *sslot, pslot, result); 23538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall uint32_t sourceBit = static_cast<uint32_t>(source) << pslot; 23638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 23738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if ((mProducerSlotSource & (1u << pslot)) != sourceBit) { 23838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall // This slot was previously dequeued from the other source; must 23938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall // re-request the buffer. 24038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall result |= BUFFER_NEEDS_REALLOCATION; 24138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mProducerSlotSource &= ~(1u << pslot); 24238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mProducerSlotSource |= sourceBit; 24338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 24438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 24538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (result & RELEASE_ALL_BUFFERS) { 24638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall for (uint32_t i = 0; i < BufferQueue::NUM_BUFFER_SLOTS; i++) { 24738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if ((mProducerSlotSource & (1u << i)) == sourceBit) 24838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mProducerBuffers[i].clear(); 24938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 25038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 25138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (result & BUFFER_NEEDS_REALLOCATION) { 25238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mSource[source]->requestBuffer(*sslot, &mProducerBuffers[pslot]); 25338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall VDS_LOGV("dequeueBuffer(%s): buffers[%d]=%p", 25438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall dbgSourceStr(source), pslot, mProducerBuffers[pslot].get()); 25538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 25638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 25738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return result; 25838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall} 25938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 2607cdd786fa80cf03551291ae8feca7b77583be1c5Mathias Agopianstatus_t VirtualDisplaySurface::dequeueBuffer(int* pslot, sp<Fence>* fence, bool async, 26138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall uint32_t w, uint32_t h, uint32_t format, uint32_t usage) { 26238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall VDS_LOGW_IF(mDbgState != DBG_STATE_PREPARED, 26338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall "Unexpected dequeueBuffer() in %s state", dbgStateStr()); 26438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mDbgState = DBG_STATE_GLES; 26538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 26638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall VDS_LOGV("dequeueBuffer %dx%d fmt=%d usage=%#x", w, h, format, usage); 26738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 26838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mProducerUsage = usage | GRALLOC_USAGE_HW_COMPOSER; 26938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall Source source = fbSourceForCompositionType(mCompositionType); 27038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (source == SOURCE_SINK) { 27138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mSinkBufferWidth = w; 27238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mSinkBufferHeight = h; 27338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 27438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 27538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall int sslot; 2767cdd786fa80cf03551291ae8feca7b77583be1c5Mathias Agopian status_t result = dequeueBuffer(source, format, &sslot, fence, async); 27738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (result >= 0) { 27838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall *pslot = mapSource2ProducerSlot(source, sslot); 27938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 28038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return result; 28138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall} 28238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 28338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hallstatus_t VirtualDisplaySurface::queueBuffer(int pslot, 28438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall const QueueBufferInput& input, QueueBufferOutput* output) { 28538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall VDS_LOGW_IF(mDbgState != DBG_STATE_GLES, 28638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall "Unexpected queueBuffer(pslot=%d) in %s state", pslot, 28738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall dbgStateStr()); 28838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mDbgState = DBG_STATE_GLES_DONE; 28938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 29038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall VDS_LOGV("queueBuffer pslot=%d", pslot); 29138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 29238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall status_t result; 29338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (mCompositionType == COMPOSITION_MIXED) { 29438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall // Queue the buffer back into the scratch pool 29538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall QueueBufferOutput scratchQBO; 29638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall int sslot = mapProducer2SourceSlot(SOURCE_SCRATCH, pslot); 29738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall result = mBufferQueue->queueBuffer(sslot, input, &scratchQBO); 29838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (result != NO_ERROR) 29938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return result; 30038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 30138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall // Now acquire the buffer from the scratch pool -- should be the same 30238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall // slot and fence as we just queued. 30338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall Mutex::Autolock lock(mMutex); 30438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall BufferQueue::BufferItem item; 305bce7611e8e4514026bf12f96baaf9168f6d5894eJesse Hall result = acquireBufferLocked(&item, 0); 30638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (result != NO_ERROR) 30738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return result; 30838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall VDS_LOGW_IF(item.mBuf != sslot, 30938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall "queueBuffer: acquired sslot %d from SCRATCH after queueing sslot %d", 31038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall item.mBuf, sslot); 31138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mFbProducerSlot = mapSource2ProducerSlot(SOURCE_SCRATCH, item.mBuf); 31238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mFbFence = mSlots[item.mBuf].mFence; 31338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 31438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } else { 31538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall LOG_FATAL_IF(mCompositionType != COMPOSITION_GLES, 31638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall "Unexpected queueBuffer in state %s for compositionType %s", 31738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall dbgStateStr(), dbgCompositionTypeStr(mCompositionType)); 31838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 31938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall // Extract the GLES release fence for HWC to acquire 32038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall int64_t timestamp; 32138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall Rect crop; 32238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall int scalingMode; 32338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall uint32_t transform; 3247cdd786fa80cf03551291ae8feca7b77583be1c5Mathias Agopian bool async; 32538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall input.deflate(×tamp, &crop, &scalingMode, &transform, 3267cdd786fa80cf03551291ae8feca7b77583be1c5Mathias Agopian &async, &mFbFence); 32738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 32838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mFbProducerSlot = pslot; 32938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 33038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 33138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall *output = mQueueBufferOutput; 33238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return NO_ERROR; 33338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall} 33438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 33538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hallvoid VirtualDisplaySurface::cancelBuffer(int pslot, const sp<Fence>& fence) { 33638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall VDS_LOGW_IF(mDbgState != DBG_STATE_GLES, 33738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall "Unexpected cancelBuffer(pslot=%d) in %s state", pslot, 33838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall dbgStateStr()); 33938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall VDS_LOGV("cancelBuffer pslot=%d", pslot); 34038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall Source source = fbSourceForCompositionType(mCompositionType); 34138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return mSource[source]->cancelBuffer( 34238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mapProducer2SourceSlot(source, pslot), fence); 34338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall} 34438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 34538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hallint VirtualDisplaySurface::query(int what, int* value) { 34638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return mSource[SOURCE_SINK]->query(what, value); 34738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall} 34838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 349595264f1af12e25dce57d7c5b1d52ed86ac0d0c9Mathias Agopianstatus_t VirtualDisplaySurface::connect(int api, bool producerControlledByApp, 350595264f1af12e25dce57d7c5b1d52ed86ac0d0c9Mathias Agopian QueueBufferOutput* output) { 35138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall QueueBufferOutput qbo; 352595264f1af12e25dce57d7c5b1d52ed86ac0d0c9Mathias Agopian status_t result = mSource[SOURCE_SINK]->connect(api, producerControlledByApp, &qbo); 35338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (result == NO_ERROR) { 35438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall updateQueueBufferOutput(qbo); 35538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall *output = mQueueBufferOutput; 35638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 35738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return result; 35838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall} 35938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 36038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hallstatus_t VirtualDisplaySurface::disconnect(int api) { 36138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return mSource[SOURCE_SINK]->disconnect(api); 36238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall} 36338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 36438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hallvoid VirtualDisplaySurface::updateQueueBufferOutput( 36538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall const QueueBufferOutput& qbo) { 36638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall uint32_t w, h, transformHint, numPendingBuffers; 36738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall qbo.deflate(&w, &h, &transformHint, &numPendingBuffers); 36838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mQueueBufferOutput.inflate(w, h, 0, numPendingBuffers); 36938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall} 37038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 37138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hallvoid VirtualDisplaySurface::resetPerFrameState() { 37238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mCompositionType = COMPOSITION_UNKNOWN; 37338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mSinkBufferWidth = 0; 37438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mSinkBufferHeight = 0; 37538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mFbFence = Fence::NO_FENCE; 37638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mFbProducerSlot = -1; 37738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mOutputProducerSlot = -1; 37838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall} 37938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 38038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall// This slot mapping function is its own inverse, so two copies are unnecessary. 38138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall// Both are kept to make the intent clear where the function is called, and for 38238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall// the (unlikely) chance that we switch to a different mapping function. 38338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hallint VirtualDisplaySurface::mapSource2ProducerSlot(Source source, int sslot) { 38438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (source == SOURCE_SCRATCH) { 38538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return BufferQueue::NUM_BUFFER_SLOTS - sslot - 1; 38638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } else { 38738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return sslot; 38838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 38938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall} 39038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hallint VirtualDisplaySurface::mapProducer2SourceSlot(Source source, int pslot) { 39138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return mapSource2ProducerSlot(source, pslot); 39238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall} 39338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 39438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse HallVirtualDisplaySurface::Source 39538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse HallVirtualDisplaySurface::fbSourceForCompositionType(CompositionType type) { 39638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return type == COMPOSITION_MIXED ? SOURCE_SCRATCH : SOURCE_SINK; 39738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall} 39838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 39938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hallconst char* VirtualDisplaySurface::dbgStateStr() const { 40038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall switch (mDbgState) { 40138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall case DBG_STATE_IDLE: return "IDLE"; 40238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall case DBG_STATE_PREPARED: return "PREPARED"; 40338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall case DBG_STATE_GLES: return "GLES"; 40438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall case DBG_STATE_GLES_DONE: return "GLES_DONE"; 40538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall case DBG_STATE_HWC: return "HWC"; 40638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall default: return "INVALID"; 40738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 40838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall} 40938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 41038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hallconst char* VirtualDisplaySurface::dbgSourceStr(Source s) { 41138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall switch (s) { 41238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall case SOURCE_SINK: return "SINK"; 41338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall case SOURCE_SCRATCH: return "SCRATCH"; 41438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall default: return "INVALID"; 41538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 41638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall} 41738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 41899c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall// --------------------------------------------------------------------------- 41999c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall} // namespace android 42099c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall// --------------------------------------------------------------------------- 421