VirtualDisplaySurface.cpp revision db89edc94bd2a78226b407f9f7261e202e7fa325
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 7438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hallstatus_t VirtualDisplaySurface::prepareFrame(CompositionType compositionType) { 7538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (mDisplayId < 0) 7638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return NO_ERROR; 7738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 7838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall VDS_LOGW_IF(mDbgState != DBG_STATE_IDLE, 7938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall "Unexpected prepareFrame() in %s state", dbgStateStr()); 8038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mDbgState = DBG_STATE_PREPARED; 8138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 8238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mCompositionType = compositionType; 8338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 8438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (mCompositionType != mDbgLastCompositionType) { 8538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall VDS_LOGV("prepareFrame: composition type changed to %s", 8638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall dbgCompositionTypeStr(mCompositionType)); 8738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mDbgLastCompositionType = mCompositionType; 8838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 8938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 9038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return NO_ERROR; 9199c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall} 9299c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall 9399c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hallstatus_t VirtualDisplaySurface::compositionComplete() { 9499c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall return NO_ERROR; 9599c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall} 9699c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall 9799c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hallstatus_t VirtualDisplaySurface::advanceFrame() { 9838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (mDisplayId < 0) 9938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return NO_ERROR; 10038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 10138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (mCompositionType == COMPOSITION_HWC) { 10238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall VDS_LOGW_IF(mDbgState != DBG_STATE_PREPARED, 10338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall "Unexpected advanceFrame() in %s state on HWC frame", 10438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall dbgStateStr()); 10538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } else { 10638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall VDS_LOGW_IF(mDbgState != DBG_STATE_GLES_DONE, 10738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall "Unexpected advanceFrame() in %s state on GLES/MIXED frame", 10838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall dbgStateStr()); 10938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 11038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mDbgState = DBG_STATE_HWC; 11138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 11238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall status_t result; 11338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall sp<Fence> outFence; 11438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (mCompositionType != COMPOSITION_GLES) { 11538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall // Dequeue an output buffer from the sink 11638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall uint32_t transformHint, numPendingBuffers; 11738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mQueueBufferOutput.deflate(&mSinkBufferWidth, &mSinkBufferHeight, 11838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall &transformHint, &numPendingBuffers); 11938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall int sslot; 1207cdd786fa80cf03551291ae8feca7b77583be1c5Mathias Agopian result = dequeueBuffer(SOURCE_SINK, 0, &sslot, &outFence, false); 12138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (result < 0) 12238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return result; 12338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mOutputProducerSlot = mapSource2ProducerSlot(SOURCE_SINK, sslot); 12438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 12538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 12638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (mCompositionType == COMPOSITION_HWC) { 12738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall // We just dequeued the output buffer, use it for FB as well 12838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mFbProducerSlot = mOutputProducerSlot; 12938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mFbFence = outFence; 13038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } else if (mCompositionType == COMPOSITION_GLES) { 13138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mOutputProducerSlot = mFbProducerSlot; 13238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall outFence = mFbFence; 13338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } else { 13438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall // mFbFence and mFbProducerSlot were set in queueBuffer, 13538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall // and mOutputProducerSlot and outFence were set above when dequeueing 13638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall // the sink buffer. 13738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 13838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 13938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (mFbProducerSlot < 0 || mOutputProducerSlot < 0) { 14038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall // Last chance bailout if something bad happened earlier. For example, 14138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall // in a GLES configuration, if the sink disappears then dequeueBuffer 14238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall // will fail, the GLES driver won't queue a buffer, but SurfaceFlinger 14338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall // will soldier on. So we end up here without a buffer. There should 14438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall // be lots of scary messages in the log just before this. 14538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall VDS_LOGE("advanceFrame: no buffer, bailing out"); 14638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return NO_MEMORY; 14738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 14838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 14938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall sp<GraphicBuffer> fbBuffer = mProducerBuffers[mFbProducerSlot]; 15038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall sp<GraphicBuffer> outBuffer = mProducerBuffers[mOutputProducerSlot]; 15138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall VDS_LOGV("advanceFrame: fb=%d(%p) out=%d(%p)", 15238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mFbProducerSlot, fbBuffer.get(), 15338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mOutputProducerSlot, outBuffer.get()); 15438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 15538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall result = mHwc.fbPost(mDisplayId, mFbFence, fbBuffer); 15638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (result == NO_ERROR) { 15738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall result = mHwc.setOutputBuffer(mDisplayId, outFence, outBuffer); 15838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 15938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 16038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return result; 16199c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall} 16299c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall 163851cfe834295224cd64bdd499872b95b19c4de8cJesse Hallvoid VirtualDisplaySurface::onFrameCommitted() { 16438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (mDisplayId < 0) 16538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return; 16638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 16738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall VDS_LOGW_IF(mDbgState != DBG_STATE_HWC, 16838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall "Unexpected onFrameCommitted() in %s state", dbgStateStr()); 16938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mDbgState = DBG_STATE_IDLE; 17038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 17138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall sp<Fence> fbFence = mHwc.getAndResetReleaseFence(mDisplayId); 17238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (mCompositionType == COMPOSITION_MIXED && mFbProducerSlot >= 0) { 17338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall // release the scratch buffer back to the pool 17438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall Mutex::Autolock lock(mMutex); 17538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall int sslot = mapProducer2SourceSlot(SOURCE_SCRATCH, mFbProducerSlot); 17638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall VDS_LOGV("onFrameCommitted: release scratch sslot=%d", sslot); 17738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall addReleaseFenceLocked(sslot, mProducerBuffers[mFbProducerSlot], fbFence); 17838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall releaseBufferLocked(sslot, mProducerBuffers[mFbProducerSlot], 17938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall EGL_NO_DISPLAY, EGL_NO_SYNC_KHR); 18038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 18138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 18238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (mOutputProducerSlot >= 0) { 18338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall int sslot = mapProducer2SourceSlot(SOURCE_SINK, mOutputProducerSlot); 18438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall QueueBufferOutput qbo; 18538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall sp<Fence> outFence = mHwc.getLastRetireFence(mDisplayId); 18638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall VDS_LOGV("onFrameCommitted: queue sink sslot=%d", sslot); 18738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall status_t result = mSource[SOURCE_SINK]->queueBuffer(sslot, 18838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall QueueBufferInput(systemTime(), 18938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall Rect(mSinkBufferWidth, mSinkBufferHeight), 1907cdd786fa80cf03551291ae8feca7b77583be1c5Mathias Agopian NATIVE_WINDOW_SCALING_MODE_FREEZE, 0, false, outFence), 19138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall &qbo); 19238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (result == NO_ERROR) { 19338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall updateQueueBufferOutput(qbo); 19438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 19538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 19638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 19738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall resetPerFrameState(); 19899c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall} 19999c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall 20099c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hallvoid VirtualDisplaySurface::dump(String8& result) const { 20199c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall} 20299c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall 20338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hallstatus_t VirtualDisplaySurface::requestBuffer(int pslot, 20438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall sp<GraphicBuffer>* outBuf) { 20538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall VDS_LOGW_IF(mDbgState != DBG_STATE_GLES, 20638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall "Unexpected requestBuffer pslot=%d in %s state", 20738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall pslot, dbgStateStr()); 20838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 20938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall *outBuf = mProducerBuffers[pslot]; 21038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return NO_ERROR; 21138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall} 21238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 21338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hallstatus_t VirtualDisplaySurface::setBufferCount(int bufferCount) { 21438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return mSource[SOURCE_SINK]->setBufferCount(bufferCount); 21538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall} 21638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 21738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hallstatus_t VirtualDisplaySurface::dequeueBuffer(Source source, 2187cdd786fa80cf03551291ae8feca7b77583be1c5Mathias Agopian uint32_t format, int* sslot, sp<Fence>* fence, bool async) { 2197cdd786fa80cf03551291ae8feca7b77583be1c5Mathias Agopian status_t result = mSource[source]->dequeueBuffer(sslot, fence, async, 22038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mSinkBufferWidth, mSinkBufferHeight, format, mProducerUsage); 22138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (result < 0) 22238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return result; 22338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall int pslot = mapSource2ProducerSlot(source, *sslot); 22438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall VDS_LOGV("dequeueBuffer(%s): sslot=%d pslot=%d result=%d", 22538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall dbgSourceStr(source), *sslot, pslot, result); 22638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall uint32_t sourceBit = static_cast<uint32_t>(source) << pslot; 22738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 22838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if ((mProducerSlotSource & (1u << pslot)) != sourceBit) { 22938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall // This slot was previously dequeued from the other source; must 23038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall // re-request the buffer. 23138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall result |= BUFFER_NEEDS_REALLOCATION; 23238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mProducerSlotSource &= ~(1u << pslot); 23338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mProducerSlotSource |= sourceBit; 23438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 23538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 23638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (result & RELEASE_ALL_BUFFERS) { 23738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall for (uint32_t i = 0; i < BufferQueue::NUM_BUFFER_SLOTS; i++) { 23838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if ((mProducerSlotSource & (1u << i)) == sourceBit) 23938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mProducerBuffers[i].clear(); 24038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 24138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 24238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (result & BUFFER_NEEDS_REALLOCATION) { 24338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mSource[source]->requestBuffer(*sslot, &mProducerBuffers[pslot]); 24438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall VDS_LOGV("dequeueBuffer(%s): buffers[%d]=%p", 24538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall dbgSourceStr(source), pslot, mProducerBuffers[pslot].get()); 24638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 24738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 24838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return result; 24938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall} 25038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 2517cdd786fa80cf03551291ae8feca7b77583be1c5Mathias Agopianstatus_t VirtualDisplaySurface::dequeueBuffer(int* pslot, sp<Fence>* fence, bool async, 25238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall uint32_t w, uint32_t h, uint32_t format, uint32_t usage) { 25338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall VDS_LOGW_IF(mDbgState != DBG_STATE_PREPARED, 25438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall "Unexpected dequeueBuffer() in %s state", dbgStateStr()); 25538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mDbgState = DBG_STATE_GLES; 25638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 25738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall VDS_LOGV("dequeueBuffer %dx%d fmt=%d usage=%#x", w, h, format, usage); 25838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 25938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mProducerUsage = usage | GRALLOC_USAGE_HW_COMPOSER; 26038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall Source source = fbSourceForCompositionType(mCompositionType); 26138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (source == SOURCE_SINK) { 26238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mSinkBufferWidth = w; 26338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mSinkBufferHeight = h; 26438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 26538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 26638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall int sslot; 2677cdd786fa80cf03551291ae8feca7b77583be1c5Mathias Agopian status_t result = dequeueBuffer(source, format, &sslot, fence, async); 26838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (result >= 0) { 26938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall *pslot = mapSource2ProducerSlot(source, sslot); 27038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 27138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return result; 27238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall} 27338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 27438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hallstatus_t VirtualDisplaySurface::queueBuffer(int pslot, 27538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall const QueueBufferInput& input, QueueBufferOutput* output) { 27638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall VDS_LOGW_IF(mDbgState != DBG_STATE_GLES, 27738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall "Unexpected queueBuffer(pslot=%d) in %s state", pslot, 27838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall dbgStateStr()); 27938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mDbgState = DBG_STATE_GLES_DONE; 28038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 28138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall VDS_LOGV("queueBuffer pslot=%d", pslot); 28238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 28338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall status_t result; 28438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (mCompositionType == COMPOSITION_MIXED) { 28538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall // Queue the buffer back into the scratch pool 28638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall QueueBufferOutput scratchQBO; 28738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall int sslot = mapProducer2SourceSlot(SOURCE_SCRATCH, pslot); 288db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian result = mSource[SOURCE_SCRATCH]->queueBuffer(sslot, input, &scratchQBO); 28938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (result != NO_ERROR) 29038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return result; 29138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 29238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall // Now acquire the buffer from the scratch pool -- should be the same 29338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall // slot and fence as we just queued. 29438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall Mutex::Autolock lock(mMutex); 29538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall BufferQueue::BufferItem item; 296bce7611e8e4514026bf12f96baaf9168f6d5894eJesse Hall result = acquireBufferLocked(&item, 0); 29738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (result != NO_ERROR) 29838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return result; 29938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall VDS_LOGW_IF(item.mBuf != sslot, 30038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall "queueBuffer: acquired sslot %d from SCRATCH after queueing sslot %d", 30138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall item.mBuf, sslot); 30238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mFbProducerSlot = mapSource2ProducerSlot(SOURCE_SCRATCH, item.mBuf); 30338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mFbFence = mSlots[item.mBuf].mFence; 30438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 30538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } else { 30638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall LOG_FATAL_IF(mCompositionType != COMPOSITION_GLES, 30738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall "Unexpected queueBuffer in state %s for compositionType %s", 30838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall dbgStateStr(), dbgCompositionTypeStr(mCompositionType)); 30938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 31038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall // Extract the GLES release fence for HWC to acquire 31138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall int64_t timestamp; 31238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall Rect crop; 31338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall int scalingMode; 31438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall uint32_t transform; 3157cdd786fa80cf03551291ae8feca7b77583be1c5Mathias Agopian bool async; 31638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall input.deflate(×tamp, &crop, &scalingMode, &transform, 3177cdd786fa80cf03551291ae8feca7b77583be1c5Mathias Agopian &async, &mFbFence); 31838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 31938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mFbProducerSlot = pslot; 32038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 32138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 32238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall *output = mQueueBufferOutput; 32338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return NO_ERROR; 32438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall} 32538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 32638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hallvoid VirtualDisplaySurface::cancelBuffer(int pslot, const sp<Fence>& fence) { 32738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall VDS_LOGW_IF(mDbgState != DBG_STATE_GLES, 32838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall "Unexpected cancelBuffer(pslot=%d) in %s state", pslot, 32938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall dbgStateStr()); 33038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall VDS_LOGV("cancelBuffer pslot=%d", pslot); 33138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall Source source = fbSourceForCompositionType(mCompositionType); 33238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return mSource[source]->cancelBuffer( 33338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mapProducer2SourceSlot(source, pslot), fence); 33438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall} 33538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 33638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hallint VirtualDisplaySurface::query(int what, int* value) { 33738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return mSource[SOURCE_SINK]->query(what, value); 33838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall} 33938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 340595264f1af12e25dce57d7c5b1d52ed86ac0d0c9Mathias Agopianstatus_t VirtualDisplaySurface::connect(int api, bool producerControlledByApp, 341595264f1af12e25dce57d7c5b1d52ed86ac0d0c9Mathias Agopian QueueBufferOutput* output) { 34238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall QueueBufferOutput qbo; 343595264f1af12e25dce57d7c5b1d52ed86ac0d0c9Mathias Agopian status_t result = mSource[SOURCE_SINK]->connect(api, producerControlledByApp, &qbo); 34438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (result == NO_ERROR) { 34538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall updateQueueBufferOutput(qbo); 34638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall *output = mQueueBufferOutput; 34738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 34838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return result; 34938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall} 35038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 35138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hallstatus_t VirtualDisplaySurface::disconnect(int api) { 35238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return mSource[SOURCE_SINK]->disconnect(api); 35338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall} 35438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 35538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hallvoid VirtualDisplaySurface::updateQueueBufferOutput( 35638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall const QueueBufferOutput& qbo) { 35738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall uint32_t w, h, transformHint, numPendingBuffers; 35838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall qbo.deflate(&w, &h, &transformHint, &numPendingBuffers); 35938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mQueueBufferOutput.inflate(w, h, 0, numPendingBuffers); 36038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall} 36138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 36238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hallvoid VirtualDisplaySurface::resetPerFrameState() { 36338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mCompositionType = COMPOSITION_UNKNOWN; 36438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mSinkBufferWidth = 0; 36538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mSinkBufferHeight = 0; 36638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mFbFence = Fence::NO_FENCE; 36738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mFbProducerSlot = -1; 36838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall mOutputProducerSlot = -1; 36938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall} 37038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 37138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall// This slot mapping function is its own inverse, so two copies are unnecessary. 37238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall// Both are kept to make the intent clear where the function is called, and for 37338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall// the (unlikely) chance that we switch to a different mapping function. 37438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hallint VirtualDisplaySurface::mapSource2ProducerSlot(Source source, int sslot) { 37538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (source == SOURCE_SCRATCH) { 37638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return BufferQueue::NUM_BUFFER_SLOTS - sslot - 1; 37738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } else { 37838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return sslot; 37938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 38038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall} 38138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hallint VirtualDisplaySurface::mapProducer2SourceSlot(Source source, int pslot) { 38238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return mapSource2ProducerSlot(source, pslot); 38338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall} 38438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 38538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse HallVirtualDisplaySurface::Source 38638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse HallVirtualDisplaySurface::fbSourceForCompositionType(CompositionType type) { 38738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return type == COMPOSITION_MIXED ? SOURCE_SCRATCH : SOURCE_SINK; 38838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall} 38938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 39038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hallconst char* VirtualDisplaySurface::dbgStateStr() const { 39138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall switch (mDbgState) { 39238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall case DBG_STATE_IDLE: return "IDLE"; 39338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall case DBG_STATE_PREPARED: return "PREPARED"; 39438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall case DBG_STATE_GLES: return "GLES"; 39538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall case DBG_STATE_GLES_DONE: return "GLES_DONE"; 39638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall case DBG_STATE_HWC: return "HWC"; 39738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall default: return "INVALID"; 39838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 39938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall} 40038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 40138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hallconst char* VirtualDisplaySurface::dbgSourceStr(Source s) { 40238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall switch (s) { 40338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall case SOURCE_SINK: return "SINK"; 40438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall case SOURCE_SCRATCH: return "SCRATCH"; 40538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall default: return "INVALID"; 40638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 40738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall} 40838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 40999c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall// --------------------------------------------------------------------------- 41099c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall} // namespace android 41199c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall// --------------------------------------------------------------------------- 412