Layer.cpp revision 888c822c4cb6976aab9256c58bae9e17e3e55c5c
1b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang/* 2b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Copyright (C) 2007 The Android Open Source Project 3b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 4b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Licensed under the Apache License, Version 2.0 (the "License"); 5b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * you may not use this file except in compliance with the License. 6b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * You may obtain a copy of the License at 7b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 8b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * http://www.apache.org/licenses/LICENSE-2.0 9b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * 10b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Unless required by applicable law or agreed to in writing, software 11b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * distributed under the License is distributed on an "AS IS" BASIS, 12b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * See the License for the specific language governing permissions and 14b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * limitations under the License. 15b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang */ 16b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 17b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang#define ATRACE_TAG ATRACE_TAG_GRAPHICS 18b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 19b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato#include <stdlib.h> 20b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato#include <stdint.h> 21b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato#include <sys/types.h> 22b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato#include <math.h> 23b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 24b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato#include <cutils/compiler.h> 25b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato#include <cutils/native_handle.h> 26b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang#include <cutils/properties.h> 27b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 28b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang#include <utils/Errors.h> 29b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang#include <utils/Log.h> 30b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang#include <utils/StopWatch.h> 31b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang#include <utils/Trace.h> 32b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 33b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang#include <ui/GraphicBuffer.h> 34b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang#include <ui/PixelFormat.h> 35b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 36b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang#include <gui/Surface.h> 37b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 38b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang#include "clz.h" 39b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang#include "DisplayDevice.h" 40b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang#include "GLExtensions.h" 41b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang#include "Layer.h" 42b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang#include "SurfaceFlinger.h" 43b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang#include "SurfaceTextureLayer.h" 44b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 45b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang#include "DisplayHardware/HWComposer.h" 46b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 47b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang#define DEBUG_RESIZE 0 48b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 49b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangnamespace android { 50b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 51b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang// --------------------------------------------------------------------------- 52b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 53b9cc48a43ed984587c939d02fba5316bf5c0df6eYing WangLayer::Layer(SurfaceFlinger* flinger, 54b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang DisplayID display, const sp<Client>& client) 55b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang : LayerBaseClient(flinger, display, client), 56b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang mTextureName(-1U), 57b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang mQueuedFrames(0), 58b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang mCurrentTransform(0), 59b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang mCurrentScalingMode(NATIVE_WINDOW_SCALING_MODE_FREEZE), 60b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang mCurrentOpacity(true), 61b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang mRefreshPending(false), 62b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang mFrameLatencyNeeded(false), 63b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang mFrameLatencyOffset(0), 64b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang mFormat(PIXEL_FORMAT_NONE), 65b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato mGLExtensions(GLExtensions::getInstance()), 66b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato mOpaqueLayer(true), 67b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato mSecure(false), 68b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato mProtectedByApp(false) 69b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato{ 70b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang mCurrentCrop.makeInvalid(); 71b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang glGenTextures(1, &mTextureName); 72b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang} 73b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 74b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangvoid Layer::onLayerDisplayed(const DisplayDevice& hw, 75b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato HWComposer::HWCLayerInterface* layer) { 76b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang if (layer) { 77b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato mSurfaceTexture->setReleaseFence(layer->getAndResetReleaseFenceFd()); 78b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 79b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang} 80b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 81b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratovoid Layer::onFirstRef() 82b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang{ 83b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang LayerBaseClient::onFirstRef(); 84b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 85b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang struct FrameQueuedListener : public SurfaceTexture::FrameAvailableListener { 86b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato FrameQueuedListener(Layer* layer) : mLayer(layer) { } 87b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang private: 88b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato wp<Layer> mLayer; 89b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato virtual void onFrameAvailable() { 90b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato sp<Layer> that(mLayer.promote()); 91b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (that != 0) { 92b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang that->onFrameQueued(); 93b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 94b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 95b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang }; 96b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 97b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Creates a custom BufferQueue for SurfaceTexture to use 98b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato sp<BufferQueue> bq = new SurfaceTextureLayer(); 99b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato mSurfaceTexture = new SurfaceTexture(mTextureName, true, 100b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato GL_TEXTURE_EXTERNAL_OES, false, bq); 101b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 102b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang mSurfaceTexture->setConsumerUsageBits(getEffectiveUsage(0)); 103b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang mSurfaceTexture->setFrameAvailableListener(new FrameQueuedListener(this)); 104b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato mSurfaceTexture->setSynchronousMode(true); 105b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 106b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato#ifdef TARGET_DISABLE_TRIPLE_BUFFERING 107b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato#warning "disabling triple buffering" 108b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato mSurfaceTexture->setBufferCountServer(2); 109b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato#else 110b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato mSurfaceTexture->setBufferCountServer(3); 111b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato#endif 112b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato} 113b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 114b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe OnoratoLayer::~Layer() 115b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato{ 116b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato mFlinger->deleteTextureAsync(mTextureName); 117b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato} 118b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 119b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratovoid Layer::onFrameQueued() { 120b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato android_atomic_inc(&mQueuedFrames); 121b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato mFlinger->signalLayerUpdate(); 122b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato} 123b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 124b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato// called with SurfaceFlinger::mStateLock as soon as the layer is entered 125b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang// in the purgatory list 126b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangvoid Layer::onRemoved() 127b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang{ 128b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato mSurfaceTexture->abandon(); 129b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato} 130b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 131b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratovoid Layer::setName(const String8& name) { 132b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato LayerBase::setName(name); 133b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato mSurfaceTexture->setName(name); 134b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato} 135b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 136b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratosp<ISurface> Layer::createSurface() 137b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato{ 138b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato class BSurface : public BnSurface, public LayerCleaner { 139b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato wp<const Layer> mOwner; 140b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato virtual sp<ISurfaceTexture> getSurfaceTexture() const { 141b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato sp<ISurfaceTexture> res; 142b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato sp<const Layer> that( mOwner.promote() ); 143b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (that != NULL) { 144b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato res = that->mSurfaceTexture->getBufferQueue(); 145b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 146b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return res; 147b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 148b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public: 149b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato BSurface(const sp<SurfaceFlinger>& flinger, 150b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang const sp<Layer>& layer) 151b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang : LayerCleaner(flinger, layer), mOwner(layer) { } 152b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato }; 153b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato sp<ISurface> sur(new BSurface(mFlinger, this)); 154b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return sur; 155b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato} 156b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 157b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangwp<IBinder> Layer::getSurfaceTextureBinder() const 158b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang{ 159b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return mSurfaceTexture->getBufferQueue()->asBinder(); 160b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato} 161b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 162b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratostatus_t Layer::setBuffers( uint32_t w, uint32_t h, 163b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato PixelFormat format, uint32_t flags) 164b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato{ 165b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // this surfaces pixel format 166b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato PixelFormatInfo info; 167b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato status_t err = getPixelFormatInfo(format, &info); 168b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (err) { 169b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ALOGE("unsupported pixelformat %d", format); 170b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return err; 171b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 172b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 173b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato uint32_t const maxSurfaceDims = min( 174b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato mFlinger->getMaxTextureSize(), mFlinger->getMaxViewportDims()); 175b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 176b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // never allow a surface larger than what our underlying GL implementation 177b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // can handle. 178b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if ((uint32_t(w)>maxSurfaceDims) || (uint32_t(h)>maxSurfaceDims)) { 179b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ALOGE("dimensions too large %u x %u", uint32_t(w), uint32_t(h)); 180b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return BAD_VALUE; 181b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 182b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 183b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato mFormat = format; 184b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 185b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato mSecure = (flags & ISurfaceComposer::eSecure) ? true : false; 186b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato mProtectedByApp = (flags & ISurfaceComposer::eProtectedByApp) ? true : false; 187b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato mOpaqueLayer = (flags & ISurfaceComposer::eOpaque); 188b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato mCurrentOpacity = getOpacityForFormat(format); 189b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 190b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato mSurfaceTexture->setDefaultBufferSize(w, h); 191b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato mSurfaceTexture->setDefaultBufferFormat(format); 192b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato mSurfaceTexture->setConsumerUsageBits(getEffectiveUsage(0)); 193b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 194b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return NO_ERROR; 195b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato} 196b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 197b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe OnoratoRect Layer::computeBufferCrop() const { 198b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Start with the SurfaceTexture's buffer crop... 199b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato Rect crop; 200b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (!mCurrentCrop.isEmpty()) { 201b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato crop = mCurrentCrop; 202b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } else if (mActiveBuffer != NULL){ 203b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato crop = Rect(mActiveBuffer->getWidth(), mActiveBuffer->getHeight()); 204b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } else { 205b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato crop.makeInvalid(); 206b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return crop; 207b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 208b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 209b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // ... then reduce that in the same proportions as the window crop reduces 210b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // the window size. 211b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato const State& s(drawingState()); 212b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (!s.active.crop.isEmpty()) { 213b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // Transform the window crop to match the buffer coordinate system, 214b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // which means using the inverse of the current transform set on the 215b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // SurfaceTexture. 216b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato uint32_t invTransform = mCurrentTransform; 217b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato int winWidth = s.active.w; 218b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato int winHeight = s.active.h; 219b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) { 220b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | 221b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato NATIVE_WINDOW_TRANSFORM_FLIP_H; 222b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato winWidth = s.active.h; 223b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato winHeight = s.active.w; 224b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 225b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato Rect winCrop = s.active.crop.transform(invTransform, 226b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato s.active.w, s.active.h); 227b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 228b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato float xScale = float(crop.width()) / float(winWidth); 229b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato float yScale = float(crop.height()) / float(winHeight); 230b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato crop.left += int(ceilf(float(winCrop.left) * xScale)); 231b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato crop.top += int(ceilf(float(winCrop.top) * yScale)); 232b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato crop.right -= int(ceilf(float(winWidth - winCrop.right) * xScale)); 233b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang crop.bottom -= int(ceilf(float(winHeight - winCrop.bottom) * yScale)); 234b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 235b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 236b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return crop; 237b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato} 238b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 239b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangvoid Layer::setGeometry( 240b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang const DisplayDevice& hw, 241b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang HWComposer::HWCLayerInterface& layer) 242b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang{ 243b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato LayerBaseClient::setGeometry(hw, layer); 244b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 245b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // enable this layer 246b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato layer.setSkip(false); 247b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 248b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // we can't do alpha-fade with the hwc HAL 249b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato const State& s(drawingState()); 250b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang if (s.alpha < 0xFF) { 251b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang layer.setSkip(true); 252b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 253b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 254b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /* 255b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Transformations are applied in this order: 256b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 1) buffer orientation/flip/mirror 257b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 2) state transformation (window manager) 258b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 3) layer orientation (screen orientation) 259b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * (NOTE: the matrices are multiplied in reverse order) 260b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang */ 261b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 262b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato const Transform bufferOrientation(mCurrentTransform); 263b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato const Transform tr(hw.getTransform() * s.transform * bufferOrientation); 264b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 265b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // this gives us only the "orientation" component of the transform 266b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang const uint32_t finalTransform = tr.getOrientation(); 267b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 268b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // we can only handle simple transformation 269b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang if (finalTransform & Transform::ROT_INVALID) { 270b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang layer.setSkip(true); 271b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } else { 272b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang layer.setTransform(finalTransform); 273b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 274b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang layer.setCrop(computeBufferCrop()); 275b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang} 276b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 277b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangvoid Layer::setPerFrameData(const DisplayDevice& hw, 278b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang HWComposer::HWCLayerInterface& layer) { 279b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang const sp<GraphicBuffer>& buffer(mActiveBuffer); 280b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // NOTE: buffer can be NULL if the client never drew into this 281b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // layer yet, or if we ran out of memory 282b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang layer.setBuffer(buffer); 283b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang} 284b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 285b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangvoid Layer::setAcquireFence(const DisplayDevice& hw, 286b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang HWComposer::HWCLayerInterface& layer) { 287b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang int fenceFd = -1; 288b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 289b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // TODO: there is a possible optimization here: we only need to set the 290b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // acquire fence the first time a new buffer is acquired on EACH display. 291b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 292b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang if (layer.getCompositionType() == HWC_OVERLAY) { 293b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang sp<Fence> fence = mSurfaceTexture->getCurrentFence(); 294b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang if (fence.get()) { 295b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang fenceFd = fence->dup(); 296b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang if (fenceFd == -1) { 297b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang ALOGW("failed to dup layer fence, skipping sync: %d", errno); 298b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 299b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 300b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 301b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang layer.setAcquireFenceFd(fenceFd); 302b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang} 303b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 304b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangvoid Layer::onDraw(const DisplayDevice& hw, const Region& clip) const 305b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang{ 306b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang ATRACE_CALL(); 307b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 308b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang if (CC_UNLIKELY(mActiveBuffer == 0)) { 309b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // the texture has not been created yet, this Layer has 310b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // in fact never been drawn into. This happens frequently with 311b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // SurfaceView because the WindowManager can't know when the client 312b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // has drawn the first time. 313b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 314b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // If there is nothing under us, we paint the screen in black, otherwise 315b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // we just skip this update. 316b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 317b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // figure out if there is something below us 318b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang Region under; 319b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang const SurfaceFlinger::LayerVector& drawingLayers( 320b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang mFlinger->mDrawingState.layersSortedByZ); 321b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang const size_t count = drawingLayers.size(); 322b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang for (size_t i=0 ; i<count ; ++i) { 323b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang const sp<LayerBase>& layer(drawingLayers[i]); 324b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang if (layer.get() == static_cast<LayerBase const*>(this)) 325b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang break; 326b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang under.orSelf( hw.getTransform().transform(layer->visibleRegion) ); 327b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 328b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // if not everything below us is covered, we plug the holes! 329b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang Region holes(clip.subtract(under)); 330b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang if (!holes.isEmpty()) { 331b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang clearWithOpenGL(hw, holes, 0, 0, 0, 1); 332b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 333b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return; 334b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 335b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 336b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // TODO: replace this with a server-side wait 337b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang sp<Fence> fence = mSurfaceTexture->getCurrentFence(); 338b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang if (fence.get()) { 339b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang status_t err = fence->wait(Fence::TIMEOUT_NEVER); 340b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang ALOGW_IF(err != OK, "Layer::onDraw: failed waiting for fence: %d", err); 341b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // Go ahead and draw the buffer anyway; no matter what we do the screen 342b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // is probably going to have something visibly wrong. 343b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 344b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 345b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang if (!isProtected()) { 346b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // TODO: we could be more subtle with isFixedSize() 347b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang const bool useFiltering = getFiltering() || needsFiltering() || isFixedSize(); 348b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 349b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // Query the texture matrix given our current filtering mode. 350b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang float textureMatrix[16]; 351b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang mSurfaceTexture->setFilteringEnabled(useFiltering); 352b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang mSurfaceTexture->getTransformMatrix(textureMatrix); 353b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 354b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // Set things up for texturing. 355b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang glBindTexture(GL_TEXTURE_EXTERNAL_OES, mTextureName); 356b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang GLenum filter = GL_NEAREST; 357b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang if (useFiltering) { 358b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang filter = GL_LINEAR; 359b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 360b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang glTexParameterx(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, filter); 361b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang glTexParameterx(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, filter); 362b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang glMatrixMode(GL_TEXTURE); 363b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang glLoadMatrixf(textureMatrix); 364b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang glMatrixMode(GL_MODELVIEW); 365b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang glDisable(GL_TEXTURE_2D); 366b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang glEnable(GL_TEXTURE_EXTERNAL_OES); 367b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } else { 368b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang glBindTexture(GL_TEXTURE_2D, mFlinger->getProtectedTexName()); 369b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang glMatrixMode(GL_TEXTURE); 370b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang glLoadIdentity(); 371b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang glMatrixMode(GL_MODELVIEW); 372b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang glDisable(GL_TEXTURE_EXTERNAL_OES); 373b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang glEnable(GL_TEXTURE_2D); 374b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 375b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 376b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang drawWithOpenGL(hw, clip); 377b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 378b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang glDisable(GL_TEXTURE_EXTERNAL_OES); 379b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang glDisable(GL_TEXTURE_2D); 380b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang} 381b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 382b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang// As documented in libhardware header, formats in the range 383b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang// 0x100 - 0x1FF are specific to the HAL implementation, and 384b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang// are known to have no alpha channel 385b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang// TODO: move definition for device-specific range into 386b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang// hardware.h, instead of using hard-coded values here. 387b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang#define HARDWARE_IS_DEVICE_FORMAT(f) ((f) >= 0x100 && (f) <= 0x1FF) 388b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 389b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangbool Layer::getOpacityForFormat(uint32_t format) 390b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang{ 391b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang if (HARDWARE_IS_DEVICE_FORMAT(format)) { 392b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return true; 393b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 394b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang PixelFormatInfo info; 395b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang status_t err = getPixelFormatInfo(PixelFormat(format), &info); 396b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // in case of error (unknown format), we assume no blending 397b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return (err || info.h_alpha <= info.l_alpha); 398b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang} 399b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 400b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 401b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangbool Layer::isOpaque() const 402b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang{ 403b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // if we don't have a buffer yet, we're translucent regardless of the 404b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // layer's opaque flag. 405b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang if (mActiveBuffer == 0) { 406b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return false; 407b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 408b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 409b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // if the layer has the opaque flag, then we're always opaque, 410b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // otherwise we use the current buffer's format. 411b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return mOpaqueLayer || mCurrentOpacity; 412b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato} 413b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 414b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratobool Layer::isProtected() const 415b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang{ 416b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang const sp<GraphicBuffer>& activeBuffer(mActiveBuffer); 417b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return (activeBuffer != 0) && 418b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato (activeBuffer->getUsage() & GRALLOC_USAGE_PROTECTED); 419b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato} 420b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 421b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratouint32_t Layer::doTransaction(uint32_t flags) 422b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato{ 423b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang ATRACE_CALL(); 424b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 425b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato const Layer::State& front(drawingState()); 426b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato const Layer::State& temp(currentState()); 427b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 428b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato const bool sizeChanged = (temp.requested.w != front.requested.w) || 429b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato (temp.requested.h != front.requested.h); 430b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 431b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (sizeChanged) { 432b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // the size changed, we need to ask our client to request a new buffer 433b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ALOGD_IF(DEBUG_RESIZE, 434b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato "doTransaction: geometry (layer=%p), scalingMode=%d\n" 435b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato " current={ active ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n" 436b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato " requested={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }}\n" 437b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato " drawing={ active ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n" 438b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato " requested={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }}\n", 439b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this, mCurrentScalingMode, 440b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato temp.active.w, temp.active.h, 441b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato temp.active.crop.left, 442b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato temp.active.crop.top, 443b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato temp.active.crop.right, 444b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato temp.active.crop.bottom, 445b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato temp.active.crop.getWidth(), 446b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato temp.active.crop.getHeight(), 447b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato temp.requested.w, temp.requested.h, 448b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang temp.requested.crop.left, 449b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato temp.requested.crop.top, 450b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato temp.requested.crop.right, 451b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato temp.requested.crop.bottom, 452b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato temp.requested.crop.getWidth(), 453b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato temp.requested.crop.getHeight(), 454b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato front.active.w, front.active.h, 455b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato front.active.crop.left, 456b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato front.active.crop.top, 457b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato front.active.crop.right, 458b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato front.active.crop.bottom, 459b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato front.active.crop.getWidth(), 460b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato front.active.crop.getHeight(), 461b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato front.requested.w, front.requested.h, 462b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato front.requested.crop.left, 463b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato front.requested.crop.top, 464b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato front.requested.crop.right, 465b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang front.requested.crop.bottom, 466b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang front.requested.crop.getWidth(), 467b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang front.requested.crop.getHeight()); 468b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 469b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // record the new size, form this point on, when the client request 470b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // a buffer, it'll get the new size. 471b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato mSurfaceTexture->setDefaultBufferSize( 472b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato temp.requested.w, temp.requested.h); 473b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 474b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 475b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (!isFixedSize()) { 476b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 477b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato const bool resizePending = (temp.requested.w != temp.active.w) || 478b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato (temp.requested.h != temp.active.h); 479b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 480b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (resizePending) { 481b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // don't let LayerBase::doTransaction update the drawing state 482b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // if we have a pending resize, unless we are in fixed-size mode. 483b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // the drawing state will be updated only once we receive a buffer 484b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // with the correct size. 485b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // 486b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // in particular, we want to make sure the clip (which is part 487b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // of the geometry state) is latched together with the size but is 488b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // latched immediately when no resizing is involved. 489b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 490b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato flags |= eDontUpdateGeometryState; 491b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 492b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 493b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 494b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return LayerBase::doTransaction(flags); 495b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato} 496b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 497b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangbool Layer::isFixedSize() const { 498b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return mCurrentScalingMode != NATIVE_WINDOW_SCALING_MODE_FREEZE; 499b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato} 500b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 501b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratobool Layer::isCropped() const { 502b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return !mCurrentCrop.isEmpty(); 503b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato} 504b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 505b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato// ---------------------------------------------------------------------------- 506b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato// pageflip handling... 507b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato// ---------------------------------------------------------------------------- 508b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 509b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratobool Layer::onPreComposition() { 510b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato mRefreshPending = false; 511b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return mQueuedFrames > 0; 512b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato} 513b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 514b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratovoid Layer::onPostComposition() { 515b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (mFrameLatencyNeeded) { 516b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato const HWComposer& hwc = mFlinger->getHwComposer(); 517b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato const size_t offset = mFrameLatencyOffset; 518b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato mFrameStats[offset].timestamp = mSurfaceTexture->getTimestamp(); 519b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato mFrameStats[offset].set = systemTime(); 520b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato mFrameStats[offset].vsync = hwc.getRefreshTimestamp(); 521b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato mFrameLatencyOffset = (mFrameLatencyOffset + 1) % 128; 522b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato mFrameLatencyNeeded = false; 523b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 524b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato} 525b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 526b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe OnoratoRegion Layer::latchBuffer(bool& recomputeVisibleRegions) 527b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato{ 528b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang ATRACE_CALL(); 529b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 530b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato Region outDirtyRegion; 531b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (mQueuedFrames > 0) { 532b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 533b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // if we've already called updateTexImage() without going through 534b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // a composition step, we have to skip this layer at this point 535b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // because we cannot call updateTeximage() without a corresponding 536b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // compositionComplete() call. 537b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // we'll trigger an update in onPreComposition(). 538b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (mRefreshPending) { 539b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return outDirtyRegion; 540b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 541b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 542b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Capture the old state of the layer for comparisons later 543b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato const bool oldOpacity = isOpaque(); 544b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato sp<GraphicBuffer> oldActiveBuffer = mActiveBuffer; 545b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 546b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // signal another event if we have more frames pending 547b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (android_atomic_dec(&mQueuedFrames) > 1) { 548b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato mFlinger->signalLayerUpdate(); 549b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 550b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 551b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato struct Reject : public SurfaceTexture::BufferRejecter { 552b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato Layer::State& front; 553b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang Layer::State& current; 554b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang bool& recomputeVisibleRegions; 555b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato Reject(Layer::State& front, Layer::State& current, 556b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato bool& recomputeVisibleRegions) 557b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato : front(front), current(current), 558b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato recomputeVisibleRegions(recomputeVisibleRegions) { 559b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 560b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 561b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang virtual bool reject(const sp<GraphicBuffer>& buf, 562b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato const BufferQueue::BufferItem& item) { 563b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (buf == NULL) { 564b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return false; 565b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 566b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 567b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato uint32_t bufWidth = buf->getWidth(); 568b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato uint32_t bufHeight = buf->getHeight(); 569b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 570b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // check that we received a buffer of the right size 571b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // (Take the buffer's orientation into account) 572b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (item.mTransform & Transform::ROT_90) { 573b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato swap(bufWidth, bufHeight); 574b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 575b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 576b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 577b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato bool isFixedSize = item.mScalingMode != NATIVE_WINDOW_SCALING_MODE_FREEZE; 578b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (front.active != front.requested) { 579b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 580b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (isFixedSize || 581b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato (bufWidth == front.requested.w && 582b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato bufHeight == front.requested.h)) 583b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 584b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Here we pretend the transaction happened by updating the 585b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // current and drawing states. Drawing state is only accessed 586b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // in this thread, no need to have it locked 587b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato front.active = front.requested; 588b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 589b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // We also need to update the current state so that 590b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // we don't end-up overwriting the drawing state with 591b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // this stale current state during the next transaction 592b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // 593b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // NOTE: We don't need to hold the transaction lock here 594b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // because State::active is only accessed from this thread. 595b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato current.active = front.active; 596b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 597b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // recompute visible region 598b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato recomputeVisibleRegions = true; 599b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 600b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 601b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ALOGD_IF(DEBUG_RESIZE, 602b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato "lockPageFlip: (layer=%p), buffer (%ux%u, tr=%02x), scalingMode=%d\n" 603b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato " drawing={ active ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n" 604b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato " requested={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }}\n", 605b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this, bufWidth, bufHeight, item.mTransform, item.mScalingMode, 606b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato front.active.w, front.active.h, 607b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato front.active.crop.left, 608b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato front.active.crop.top, 609b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato front.active.crop.right, 610b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato front.active.crop.bottom, 611b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato front.active.crop.getWidth(), 612b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato front.active.crop.getHeight(), 613b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato front.requested.w, front.requested.h, 614b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato front.requested.crop.left, 615b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato front.requested.crop.top, 616b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang front.requested.crop.right, 617b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang front.requested.crop.bottom, 618b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato front.requested.crop.getWidth(), 619b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato front.requested.crop.getHeight()); 620b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 621b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 622b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (!isFixedSize) { 623b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (front.active.w != bufWidth || 624b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato front.active.h != bufHeight) { 625b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // reject this buffer 626b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return true; 627b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 628b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 629b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return false; 630b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 631b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato }; 632b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 633b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 634b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato Reject r(mDrawingState, currentState(), recomputeVisibleRegions); 635b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 636b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // XXX: not sure if setTransformHint belongs here 637b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // it should only be needed when the main screen orientation changes 638b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato mSurfaceTexture->setTransformHint(getTransformHint()); 639b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 6409f606f95f03a75961498803e24bee6799a7c0885Ying Wang if (mSurfaceTexture->updateTexImage(&r) < NO_ERROR) { 641b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // something happened! 642b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato recomputeVisibleRegions = true; 643b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return outDirtyRegion; 644b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 645b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 646b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // update the active buffer 647b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato mActiveBuffer = mSurfaceTexture->getCurrentBuffer(); 648b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (mActiveBuffer == NULL) { 649b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // this can only happen if the very first buffer was rejected. 650b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return outDirtyRegion; 651b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 652b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 653b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato mRefreshPending = true; 654b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato mFrameLatencyNeeded = true; 655b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (oldActiveBuffer == NULL) { 656b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // the first time we receive a buffer, we need to trigger a 657b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // geometry invalidation. 658b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato mFlinger->invalidateHwcGeometry(); 659b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 660b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 661b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato Rect crop(mSurfaceTexture->getCurrentCrop()); 662b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato const uint32_t transform(mSurfaceTexture->getCurrentTransform()); 663b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato const uint32_t scalingMode(mSurfaceTexture->getCurrentScalingMode()); 664b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if ((crop != mCurrentCrop) || 665b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato (transform != mCurrentTransform) || 666b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato (scalingMode != mCurrentScalingMode)) 667b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 668b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato mCurrentCrop = crop; 669b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato mCurrentTransform = transform; 670b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato mCurrentScalingMode = scalingMode; 671b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato mFlinger->invalidateHwcGeometry(); 672b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 673b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 674b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang if (oldActiveBuffer != NULL) { 675b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang uint32_t bufWidth = mActiveBuffer->getWidth(); 676b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang uint32_t bufHeight = mActiveBuffer->getHeight(); 677b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang if (bufWidth != uint32_t(oldActiveBuffer->width) || 678b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang bufHeight != uint32_t(oldActiveBuffer->height)) { 679b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang mFlinger->invalidateHwcGeometry(); 680b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 681b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 682b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 683b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang mCurrentOpacity = getOpacityForFormat(mActiveBuffer->format); 684b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang if (oldOpacity != isOpaque()) { 685b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang recomputeVisibleRegions = true; 686b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 687b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 688b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang glTexParameterx(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 689b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang glTexParameterx(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 690b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 691b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // FIXME: postedRegion should be dirty & bounds 692b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang const Layer::State& front(drawingState()); 693b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang Region dirtyRegion(Rect(front.active.w, front.active.h)); 694b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 695b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // transform the dirty region to window-manager space 696b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang outDirtyRegion = (front.transform.transform(dirtyRegion)); 697b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 698b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return outDirtyRegion; 699b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang} 700b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 701b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangvoid Layer::dump(String8& result, char* buffer, size_t SIZE) const 702b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang{ 703b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang LayerBaseClient::dump(result, buffer, SIZE); 704b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 705b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang sp<const GraphicBuffer> buf0(mActiveBuffer); 706b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang uint32_t w0=0, h0=0, s0=0, f0=0; 707b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang if (buf0 != 0) { 708b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang w0 = buf0->getWidth(); 709b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang h0 = buf0->getHeight(); 710b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang s0 = buf0->getStride(); 711b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang f0 = buf0->format; 712b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 713b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang snprintf(buffer, SIZE, 714b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang " " 715b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang "format=%2d, activeBuffer=[%4ux%4u:%4u,%3X]," 716b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang " transform-hint=0x%02x, queued-frames=%d, mRefreshPending=%d\n", 717b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang mFormat, w0, h0, s0,f0, 718b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang getTransformHint(), mQueuedFrames, mRefreshPending); 719b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 720b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang result.append(buffer); 721b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 722b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang if (mSurfaceTexture != 0) { 723b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang mSurfaceTexture->dump(result, " ", buffer, SIZE); 724b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 725b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang} 726b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 727b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangvoid Layer::dumpStats(String8& result, char* buffer, size_t SIZE) const 728b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang{ 729b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang LayerBaseClient::dumpStats(result, buffer, SIZE); 730b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang const size_t o = mFrameLatencyOffset; 731b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang const DisplayDevice& hw(mFlinger->getDefaultDisplayDevice()); 732b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang const nsecs_t period = mFlinger->getHwComposer().getRefreshPeriod(); 733b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang result.appendFormat("%lld\n", period); 734b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang for (size_t i=0 ; i<128 ; i++) { 735b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang const size_t index = (o+i) % 128; 736b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang const nsecs_t time_app = mFrameStats[index].timestamp; 737b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang const nsecs_t time_set = mFrameStats[index].set; 738b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang const nsecs_t time_vsync = mFrameStats[index].vsync; 739b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang result.appendFormat("%lld\t%lld\t%lld\n", 740b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang time_app, 741b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang time_vsync, 742b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang time_set); 743b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 744b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato result.append("\n"); 745b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato} 746b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 747b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratovoid Layer::clearStats() 748b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato{ 749b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato LayerBaseClient::clearStats(); 750b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato memset(mFrameStats, 0, sizeof(mFrameStats)); 751b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato} 752b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 753b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratouint32_t Layer::getEffectiveUsage(uint32_t usage) const 754b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato{ 755b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // TODO: should we do something special if mSecure is set? 756b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (mProtectedByApp) { 757b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // need a hardware-protected path to external video sink 758b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato usage |= GraphicBuffer::USAGE_PROTECTED; 759b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 760b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato usage |= GraphicBuffer::USAGE_HW_COMPOSER; 761b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return usage; 762b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato} 763b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 764b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wanguint32_t Layer::getTransformHint() const { 765b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato uint32_t orientation = 0; 766b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (!mFlinger->mDebugDisableTransformHint) { 767b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // The transform hint is used to improve performance on the main 768b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // display -- we can only have a single transform hint, it cannot 769b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // apply to all displays. 770b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // This is why we use the default display here. This is not an 771b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // oversight. 772b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato const DisplayDevice& hw(mFlinger->getDefaultDisplayDevice()); 773b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato const Transform& planeTransform(hw.getTransform()); 774b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato orientation = planeTransform.getOrientation(); 775b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (orientation & Transform::ROT_INVALID) { 776b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato orientation = 0; 777b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 778b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 779b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return orientation; 780b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang} 781b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 782b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato// --------------------------------------------------------------------------- 783b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 784b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 785b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato}; // namespace android 786b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato