Layer.cpp revision 93ffb86b909005bbee4993fc9053f017466311c7
1049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* 2049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 3049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project * 4049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project * you may not use this file except in compliance with the License. 6049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project * You may obtain a copy of the License at 7a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang * 8049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project * 10049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project * See the License for the specific language governing permissions and 14049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project * limitations under the License. 15049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project */ 16049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 17049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define ATRACE_TAG ATRACE_TAG_GRAPHICS 18049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 19049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include <stdlib.h> 20049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include <stdint.h> 21049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include <sys/types.h> 22049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include <math.h> 23049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 24049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include <cutils/compiler.h> 25049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include <cutils/native_handle.h> 26049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include <cutils/properties.h> 27049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 28049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include <utils/Errors.h> 29049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include <utils/Log.h> 30049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include <utils/StopWatch.h> 31049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include <utils/Trace.h> 32049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 33049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include <ui/GraphicBuffer.h> 34049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include <ui/PixelFormat.h> 35049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 360a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project#include <gui/Surface.h> 37049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 38049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "clz.h" 39049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "DisplayHardware/DisplayHardware.h" 40049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "DisplayHardware/HWComposer.h" 41049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "GLExtensions.h" 42049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "Layer.h" 43049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "SurfaceFlinger.h" 44049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "SurfaceTextureLayer.h" 45049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 46049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DEBUG_RESIZE 0 47049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 48049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectnamespace android { 49049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 508583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner// --------------------------------------------------------------------------- 51049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 52049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source ProjectLayer::Layer(SurfaceFlinger* flinger, 53049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DisplayID display, const sp<Client>& client) 54049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project : LayerBaseClient(flinger, display, client), 55049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mTextureName(-1U), 56049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mQueuedFrames(0), 57049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mCurrentTransform(0), 58049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mCurrentScalingMode(NATIVE_WINDOW_SCALING_MODE_FREEZE), 59049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mCurrentOpacity(true), 60049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mRefreshPending(false), 61049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mFrameLatencyNeeded(false), 62049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mFrameLatencyOffset(0), 63049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mFormat(PIXEL_FORMAT_NONE), 64049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mGLExtensions(GLExtensions::getInstance()), 65049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mOpaqueLayer(true), 66049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mNeedsDithering(false), 67049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mSecure(false), 68049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mProtectedByApp(false) 69049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project{ 70049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mCurrentCrop.makeInvalid(); 71049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project glGenTextures(1, &mTextureName); 72049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 73049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 74049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid Layer::onLayerDisplayed() { 75049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (mFrameLatencyNeeded) { 76049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const DisplayHardware& hw(graphicPlane(0).displayHardware()); 77049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mFrameStats[mFrameLatencyOffset].timestamp = mSurfaceTexture->getTimestamp(); 78049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mFrameStats[mFrameLatencyOffset].set = systemTime(); 79049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mFrameStats[mFrameLatencyOffset].vsync = hw.getRefreshTimestamp(); 80049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mFrameLatencyOffset = (mFrameLatencyOffset + 1) % 128; 81049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mFrameLatencyNeeded = false; 82049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 83049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 84049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 85049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid Layer::onFirstRef() 86049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project{ 87049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project LayerBaseClient::onFirstRef(); 88049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 89049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project struct FrameQueuedListener : public SurfaceTexture::FrameAvailableListener { 90049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FrameQueuedListener(Layer* layer) : mLayer(layer) { } 91049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project private: 92049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project wp<Layer> mLayer; 93049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project virtual void onFrameAvailable() { 94049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project sp<Layer> that(mLayer.promote()); 95049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (that != 0) { 96049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project that->onFrameQueued(); 97049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 98049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 99049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project }; 100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Creates a custom BufferQueue for SurfaceTexture to use 102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project sp<BufferQueue> bq = new SurfaceTextureLayer(); 103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mSurfaceTexture = new SurfaceTexture(mTextureName, true, 104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project GL_TEXTURE_EXTERNAL_OES, false, bq); 105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mSurfaceTexture->setConsumerUsageBits(getEffectiveUsage(0)); 107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mSurfaceTexture->setFrameAvailableListener(new FrameQueuedListener(this)); 108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mSurfaceTexture->setSynchronousMode(true); 109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TARGET_DISABLE_TRIPLE_BUFFERING 111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#warning "disabling triple buffering" 112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mSurfaceTexture->setBufferCountServer(2); 113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#else 114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mSurfaceTexture->setBufferCountServer(3); 115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source ProjectLayer::~Layer() 119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project{ 120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mFlinger->postMessageAsync( 121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project new SurfaceFlinger::MessageDestroyGLTexture(mTextureName) ); 122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid Layer::onFrameQueued() { 125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project android_atomic_inc(&mQueuedFrames); 126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mFlinger->signalLayerUpdate(); 127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project// called with SurfaceFlinger::mStateLock as soon as the layer is entered 130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project// in the purgatory list 131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid Layer::onRemoved() 132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project{ 133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mSurfaceTexture->abandon(); 134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 135049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid Layer::setName(const String8& name) { 137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project LayerBase::setName(name); 138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mSurfaceTexture->setName(name); 139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid Layer::validateVisibility(const Transform& globalTransform) { 142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project LayerBase::validateVisibility(globalTransform); 143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // This optimization allows the SurfaceTexture to bake in 145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // the rotation so hardware overlays can be used 146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mSurfaceTexture->setTransformHint(getTransformHint()); 147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectsp<ISurface> Layer::createSurface() 150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project{ 151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project class BSurface : public BnSurface, public LayerCleaner { 152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project wp<const Layer> mOwner; 153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project virtual sp<ISurfaceTexture> getSurfaceTexture() const { 154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project sp<ISurfaceTexture> res; 155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project sp<const Layer> that( mOwner.promote() ); 156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (that != NULL) { 157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project res = that->mSurfaceTexture->getBufferQueue(); 158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return res; 160049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project public: 162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project BSurface(const sp<SurfaceFlinger>& flinger, 163049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const sp<Layer>& layer) 164049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project : LayerCleaner(flinger, layer), mOwner(layer) { } 165049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project }; 166049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project sp<ISurface> sur(new BSurface(mFlinger, this)); 167049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return sur; 168049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectwp<IBinder> Layer::getSurfaceTextureBinder() const 171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project{ 172049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return mSurfaceTexture->getBufferQueue()->asBinder(); 173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 174049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 175049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectstatus_t Layer::setBuffers( uint32_t w, uint32_t h, 176049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project PixelFormat format, uint32_t flags) 177049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project{ 178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // this surfaces pixel format 179049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project PixelFormatInfo info; 180049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project status_t err = getPixelFormatInfo(format, &info); 181049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (err) { 182049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ALOGE("unsupported pixelformat %d", format); 183049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return err; 184049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 185049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 186049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // the display's pixel format 187049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const DisplayHardware& hw(graphicPlane(0).displayHardware()); 188049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project uint32_t const maxSurfaceDims = min( 189049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project hw.getMaxTextureSize(), hw.getMaxViewportDims()); 190049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 191049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // never allow a surface larger than what our underlying GL implementation 192049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // can handle. 193049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ((uint32_t(w)>maxSurfaceDims) || (uint32_t(h)>maxSurfaceDims)) { 194049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ALOGE("dimensions too large %u x %u", uint32_t(w), uint32_t(h)); 195049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return BAD_VALUE; 196049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 197049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 198049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project PixelFormatInfo displayInfo; 199049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project getPixelFormatInfo(hw.getFormat(), &displayInfo); 200049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const uint32_t hwFlags = hw.getFlags(); 201049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 202049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mFormat = format; 203049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 204049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mSecure = (flags & ISurfaceComposer::eSecure) ? true : false; 205049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mProtectedByApp = (flags & ISurfaceComposer::eProtectedByApp) ? true : false; 206049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mOpaqueLayer = (flags & ISurfaceComposer::eOpaque); 207049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mCurrentOpacity = getOpacityForFormat(format); 208049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 209049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mSurfaceTexture->setDefaultBufferSize(w, h); 210049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mSurfaceTexture->setDefaultBufferFormat(format); 211049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mSurfaceTexture->setConsumerUsageBits(getEffectiveUsage(0)); 212049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // we use the red index 214049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project int displayRedSize = displayInfo.getSize(PixelFormatInfo::INDEX_RED); 215049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project int layerRedsize = info.getSize(PixelFormatInfo::INDEX_RED); 216049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mNeedsDithering = layerRedsize > displayRedSize; 217049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 218049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return NO_ERROR; 219049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 220049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 221049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source ProjectRect Layer::computeBufferCrop() const { 222049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Start with the SurfaceTexture's buffer crop... 223049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Rect crop; 224049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!mCurrentCrop.isEmpty()) { 225049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project crop = mCurrentCrop; 226049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } else if (mActiveBuffer != NULL){ 227049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project crop = Rect(mActiveBuffer->getWidth(), mActiveBuffer->getHeight()); 228049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } else { 229049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project crop = Rect(mTransformedBounds.width(), mTransformedBounds.height()); 230049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 231049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 232049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // ... then reduce that in the same proportions as the window crop reduces 233049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // the window size. 234049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const State& s(drawingState()); 235049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!s.active.crop.isEmpty()) { 236049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Transform the window crop to match the buffer coordinate system, 237049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // which means using the inverse of the current transform set on the 238049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // SurfaceTexture. 239049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project uint32_t invTransform = mCurrentTransform; 240049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project int winWidth = s.active.w; 241049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project int winHeight = s.active.h; 242049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) { 243049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | 244049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project NATIVE_WINDOW_TRANSFORM_FLIP_H; 245049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project winWidth = s.active.h; 246049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project winHeight = s.active.w; 247049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 248049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Rect winCrop = s.active.crop.transform(invTransform, 249049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project s.active.w, s.active.h); 250049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 251049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project float xScale = float(crop.width()) / float(winWidth); 252049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project float yScale = float(crop.height()) / float(winHeight); 253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project crop.left += int(ceilf(float(winCrop.left) * xScale)); 254049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project crop.top += int(ceilf(float(winCrop.top) * yScale)); 255049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project crop.right -= int(ceilf(float(winWidth - winCrop.right) * xScale)); 256049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project crop.bottom -= int(ceilf(float(winHeight - winCrop.bottom) * yScale)); 257049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 258049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 259049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return crop; 260049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 261049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 262049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid Layer::setGeometry(hwc_layer_t* hwcl) 263049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project{ 264049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project LayerBaseClient::setGeometry(hwcl); 265049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 266049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project hwcl->flags &= ~HWC_SKIP_LAYER; 267049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 268049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // we can't do alpha-fade with the hwc HAL 269049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const State& s(drawingState()); 270049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (s.alpha < 0xFF) { 271049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project hwcl->flags = HWC_SKIP_LAYER; 272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 273049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* 275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project * Transformations are applied in this order: 276049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project * 1) buffer orientation/flip/mirror 277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project * 2) state transformation (window manager) 2788583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner * 3) layer orientation (screen orientation) 279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project * mTransform is already the composition of (2) and (3) 280049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project * (NOTE: the matrices are multiplied in reverse order) 281049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project */ 282049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 283049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const Transform bufferOrientation(mCurrentTransform); 284049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const Transform tr(mTransform * bufferOrientation); 285049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 286049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // this gives us only the "orientation" component of the transform 287049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const uint32_t finalTransform = tr.getOrientation(); 288049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 289049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // we can only handle simple transformation 290049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (finalTransform & Transform::ROT_INVALID) { 291049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project hwcl->flags = HWC_SKIP_LAYER; 292049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } else { 293049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project hwcl->transform = finalTransform; 294049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 295049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 296049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Rect crop = computeBufferCrop(); 297049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project hwcl->sourceCrop.left = crop.left; 298049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project hwcl->sourceCrop.top = crop.top; 299049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project hwcl->sourceCrop.right = crop.right; 300049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project hwcl->sourceCrop.bottom = crop.bottom; 301049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 302049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 303049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid Layer::setPerFrameData(hwc_layer_t* hwcl) { 304049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const sp<GraphicBuffer>& buffer(mActiveBuffer); 305049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (buffer == NULL) { 306049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // this can happen if the client never drew into this layer yet, 307049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // or if we ran out of memory. In that case, don't let 308049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // HWC handle it. 309049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project hwcl->flags |= HWC_SKIP_LAYER; 310049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project hwcl->handle = NULL; 311049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } else { 312049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project hwcl->handle = buffer->handle; 313049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 314049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 315049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 316049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid Layer::onDraw(const Region& clip) const 317049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project{ 318049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ATRACE_CALL(); 319049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 320049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (CC_UNLIKELY(mActiveBuffer == 0)) { 321049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // the texture has not been created yet, this Layer has 322049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // in fact never been drawn into. This happens frequently with 323049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // SurfaceView because the WindowManager can't know when the client 324049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // has drawn the first time. 325049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 326049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // If there is nothing under us, we paint the screen in black, otherwise 327049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // we just skip this update. 328049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 329049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // figure out if there is something below us 330049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Region under; 331049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const SurfaceFlinger::LayerVector& drawingLayers( 332049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mFlinger->mDrawingState.layersSortedByZ); 333049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const size_t count = drawingLayers.size(); 334049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for (size_t i=0 ; i<count ; ++i) { 335049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const sp<LayerBase>& layer(drawingLayers[i]); 336049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (layer.get() == static_cast<LayerBase const*>(this)) 337049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 338049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project under.orSelf(layer->visibleRegionScreen); 339049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 340049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // if not everything below us is covered, we plug the holes! 341049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Region holes(clip.subtract(under)); 342049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!holes.isEmpty()) { 343049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project clearWithOpenGL(holes, 0, 0, 0, 1); 344049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 345049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 346049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 347a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 348a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang if (!isProtected()) { 349049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // TODO: we could be more subtle with isFixedSize() 350049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const bool useFiltering = getFiltering() || needsFiltering() || isFixedSize(); 351049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 352049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Query the texture matrix given our current filtering mode. 353a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang float textureMatrix[16]; 354a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang mSurfaceTexture->setFilteringEnabled(useFiltering); 355049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mSurfaceTexture->getTransformMatrix(textureMatrix); 356a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 357049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Set things up for texturing. 358049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project glBindTexture(GL_TEXTURE_EXTERNAL_OES, mTextureName); 359a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang GLenum filter = GL_NEAREST; 360049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (useFiltering) { 361a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang filter = GL_LINEAR; 362a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang } 363049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project glTexParameterx(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, filter); 364a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang glTexParameterx(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, filter); 365049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project glMatrixMode(GL_TEXTURE); 366a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang glLoadMatrixf(textureMatrix); 367a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang glMatrixMode(GL_MODELVIEW); 368a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang glDisable(GL_TEXTURE_2D); 369a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang glEnable(GL_TEXTURE_EXTERNAL_OES); 370a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang } else { 371049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project glBindTexture(GL_TEXTURE_2D, mFlinger->getProtectedTexName()); 372a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang glMatrixMode(GL_TEXTURE); 373a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang glLoadIdentity(); 374049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project glMatrixMode(GL_MODELVIEW); 375a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang glDisable(GL_TEXTURE_EXTERNAL_OES); 376a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang glEnable(GL_TEXTURE_2D); 377049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 378a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 379a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang drawWithOpenGL(clip); 380049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 381a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang glDisable(GL_TEXTURE_EXTERNAL_OES); 382a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang glDisable(GL_TEXTURE_2D); 383049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 384a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 385a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang// As documented in libhardware header, formats in the range 386049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project// 0x100 - 0x1FF are specific to the HAL implementation, and 387a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang// are known to have no alpha channel 388a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang// TODO: move definition for device-specific range into 389049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project// hardware.h, instead of using hard-coded values here. 390a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#define HARDWARE_IS_DEVICE_FORMAT(f) ((f) >= 0x100 && (f) <= 0x1FF) 391a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 392049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectbool Layer::getOpacityForFormat(uint32_t format) 393a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang{ 394a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang if (HARDWARE_IS_DEVICE_FORMAT(format)) { 395a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return true; 396a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang } 397049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project PixelFormatInfo info; 398049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project status_t err = getPixelFormatInfo(PixelFormat(format), &info); 399a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang // in case of error (unknown format), we assume no blending 400a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return (err || info.h_alpha <= info.l_alpha); 401a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang} 402a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 403049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 404049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectbool Layer::isOpaque() const 405a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang{ 406a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang // if we don't have a buffer yet, we're translucent regardless of the 407a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang // layer's opaque flag. 408a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang if (mActiveBuffer == 0) { 409a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return false; 410a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang } 411a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 412049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // if the layer has the opaque flag, then we're always opaque, 413a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang // otherwise we use the current buffer's format. 414049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return mOpaqueLayer || mCurrentOpacity; 415a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang} 416a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 417a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wangbool Layer::isProtected() const 418a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang{ 419049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const sp<GraphicBuffer>& activeBuffer(mActiveBuffer); 420a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return (activeBuffer != 0) && 421049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project (activeBuffer->getUsage() & GRALLOC_USAGE_PROTECTED); 422049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 423049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 424049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectuint32_t Layer::doTransaction(uint32_t flags) 425049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project{ 426049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ATRACE_CALL(); 427049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4288583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner const Layer::State& front(drawingState()); 429049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const Layer::State& temp(currentState()); 430049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 431049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const bool sizeChanged = (front.requested.w != temp.requested.w) || 432049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project (front.requested.h != temp.requested.h); 433049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 434049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (sizeChanged) { 435049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // the size changed, we need to ask our client to request a new buffer 436049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ALOGD_IF(DEBUG_RESIZE, 437049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project "doTransaction: " 438049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project "resize (layer=%p), requested (%dx%d), drawing (%d,%d), " 439049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project "scalingMode=%d", 440049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project this, 441049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project int(temp.requested.w), int(temp.requested.h), 442049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project int(front.requested.w), int(front.requested.h), 443049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mCurrentScalingMode); 444049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 445049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!isFixedSize()) { 446049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // this will make sure LayerBase::doTransaction doesn't update 447049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // the drawing state's size 448049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Layer::State& editDraw(mDrawingState); 449049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project editDraw.requested.w = temp.requested.w; 450049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project editDraw.requested.h = temp.requested.h; 451049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 452049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 453049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // record the new size, form this point on, when the client request 454049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // a buffer, it'll get the new size. 455049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mSurfaceTexture->setDefaultBufferSize(temp.requested.w, 456049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project temp.requested.h); 457049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 458049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 459049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return LayerBase::doTransaction(flags); 460049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 461049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 462049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectbool Layer::isFixedSize() const { 463049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return mCurrentScalingMode != NATIVE_WINDOW_SCALING_MODE_FREEZE; 464049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 465049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 466049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectbool Layer::isCropped() const { 467049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return !mCurrentCrop.isEmpty(); 468049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 469049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 470049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project// ---------------------------------------------------------------------------- 471049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project// pageflip handling... 472049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project// ---------------------------------------------------------------------------- 473049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 474049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectbool Layer::onPreComposition() { 475049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mRefreshPending = false; 476049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return mQueuedFrames > 0; 477049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 478049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 479049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid Layer::lockPageFlip(bool& recomputeVisibleRegions) 480049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project{ 481049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ATRACE_CALL(); 482049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 483049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (mQueuedFrames > 0) { 484049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 485049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // if we've already called updateTexImage() without going through 486049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // a composition step, we have to skip this layer at this point 487049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // because we cannot call updateTeximage() without a corresponding 488049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // compositionComplete() call. 489049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // we'll trigger an update in onPreComposition(). 490049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (mRefreshPending) { 491049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mPostedDirtyRegion.clear(); 492049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 493049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 494049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mRefreshPending = true; 495049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 496049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Capture the old state of the layer for comparisons later 497049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const bool oldOpacity = isOpaque(); 498049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project sp<GraphicBuffer> oldActiveBuffer = mActiveBuffer; 499049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 500049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // signal another event if we have more frames pending 501049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (android_atomic_dec(&mQueuedFrames) > 1) { 502049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mFlinger->signalLayerUpdate(); 503049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 504049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 505049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (mSurfaceTexture->updateTexImage() < NO_ERROR) { 506049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // something happened! 507049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project recomputeVisibleRegions = true; 508049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 509049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 510049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 511049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // update the active buffer 512049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mActiveBuffer = mSurfaceTexture->getCurrentBuffer(); 513049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mFrameLatencyNeeded = true; 514049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 515049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (oldActiveBuffer == NULL && mActiveBuffer != NULL) { 516049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // the first time we receive a buffer, we need to trigger a 517049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // geometry invalidation. 518049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mFlinger->invalidateHwcGeometry(); 519049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 520049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 521049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Rect crop(mSurfaceTexture->getCurrentCrop()); 522049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const uint32_t transform(mSurfaceTexture->getCurrentTransform()); 523049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const uint32_t scalingMode(mSurfaceTexture->getCurrentScalingMode()); 524049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ((crop != mCurrentCrop) || 525049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project (transform != mCurrentTransform) || 526049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project (scalingMode != mCurrentScalingMode)) 527049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 528049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mCurrentCrop = crop; 529049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mCurrentTransform = transform; 530049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mCurrentScalingMode = scalingMode; 531049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mFlinger->invalidateHwcGeometry(); 532049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 533049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 534049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project uint32_t bufWidth = mActiveBuffer->getWidth(); 535049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project uint32_t bufHeight = mActiveBuffer->getHeight(); 536049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (oldActiveBuffer != NULL) { 537049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (bufWidth != uint32_t(oldActiveBuffer->width) || 538049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bufHeight != uint32_t(oldActiveBuffer->height)) { 539049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mFlinger->invalidateHwcGeometry(); 540049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 541049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 542049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 543049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mCurrentOpacity = getOpacityForFormat(mActiveBuffer->format); 544049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (oldOpacity != isOpaque()) { 545049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project recomputeVisibleRegions = true; 546049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 547049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 548049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project glTexParameterx(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 549049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project glTexParameterx(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 550049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 551049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // update the layer size if needed 552049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const Layer::State& front(drawingState()); 553049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 554049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // FIXME: mPostedDirtyRegion = dirty & bounds 555049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mPostedDirtyRegion.set(front.active.w, front.active.h); 556049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 557049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ((front.active.w != front.requested.w) || 558049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project (front.active.h != front.requested.h)) 559049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 560049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // check that we received a buffer of the right size 561049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // (Take the buffer's orientation into account) 562049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (mCurrentTransform & Transform::ROT_90) { 563049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project swap(bufWidth, bufHeight); 564049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 565049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 566049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (isFixedSize() || 567049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project (bufWidth == front.requested.w && 568049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bufHeight == front.requested.h)) 569049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 570049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Here we pretend the transaction happened by updating the 571049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // current and drawing states. Drawing state is only accessed 572049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // in this thread, no need to have it locked 573049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Layer::State& editDraw(mDrawingState); 574049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project editDraw.active.w = editDraw.requested.w; 575049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project editDraw.active.h = editDraw.requested.h; 576049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 577049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // We also need to update the current state so that we don't 578049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // end-up doing too much work during the next transaction. 579049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // NOTE: We actually don't need hold the transaction lock here 580049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // because State::w and State::h are only accessed from 581049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // this thread 582049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Layer::State& editTemp(currentState()); 583049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project editTemp.active.w = editDraw.active.w; 584049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project editTemp.active.h = editDraw.active.h; 585049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 586049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // recompute visible region 587049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project recomputeVisibleRegions = true; 588049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 589049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 590049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ALOGD_IF(DEBUG_RESIZE, 591049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project "lockPageFlip : " 592049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project " (layer=%p), buffer (%ux%u, tr=%02x), " 593049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project "requested (%dx%d)", 594049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project this, 595049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bufWidth, bufHeight, mCurrentTransform, 596049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project front.requested.w, front.requested.h); 597049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 598049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 599049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 600049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 601049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid Layer::unlockPageFlip( 602049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const Transform& planeTransform, Region& outDirtyRegion) 603049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project{ 604049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ATRACE_CALL(); 605049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 606049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Region postedRegion(mPostedDirtyRegion); 607049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!postedRegion.isEmpty()) { 608049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mPostedDirtyRegion.clear(); 609049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!visibleRegionScreen.isEmpty()) { 610049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // The dirty region is given in the layer's coordinate space 611049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // transform the dirty region by the surface's transformation 612049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // and the global transformation. 613049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const Layer::State& s(drawingState()); 614049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const Transform tr(planeTransform * s.transform); 615049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project postedRegion = tr.transform(postedRegion); 616049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 617049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // At this point, the dirty region is in screen space. 618049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Make sure it's constrained by the visible region (which 619049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // is in screen space as well). 620049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project postedRegion.andSelf(visibleRegionScreen); 621049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project outDirtyRegion.orSelf(postedRegion); 622049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 623049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 624049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 625049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 626049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid Layer::dump(String8& result, char* buffer, size_t SIZE) const 627049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project{ 628049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project LayerBaseClient::dump(result, buffer, SIZE); 629049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 630049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project sp<const GraphicBuffer> buf0(mActiveBuffer); 631049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project uint32_t w0=0, h0=0, s0=0, f0=0; 632049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (buf0 != 0) { 633049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project w0 = buf0->getWidth(); 634049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project h0 = buf0->getHeight(); 635049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project s0 = buf0->getStride(); 636049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project f0 = buf0->format; 637049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 638049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project snprintf(buffer, SIZE, 639049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project " " 640049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project "format=%2d, activeBuffer=[%4ux%4u:%4u,%3X]," 641049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project " transform-hint=0x%02x, queued-frames=%d, mRefreshPending=%d\n", 642049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mFormat, w0, h0, s0,f0, 643049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project getTransformHint(), mQueuedFrames, mRefreshPending); 644049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 645049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project result.append(buffer); 646049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 647049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (mSurfaceTexture != 0) { 648049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mSurfaceTexture->dump(result, " ", buffer, SIZE); 649049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 650049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 651049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 652049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid Layer::dumpStats(String8& result, char* buffer, size_t SIZE) const 653049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project{ 654049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project LayerBaseClient::dumpStats(result, buffer, SIZE); 655049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const size_t o = mFrameLatencyOffset; 656049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const DisplayHardware& hw(graphicPlane(0).displayHardware()); 657049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const nsecs_t period = hw.getRefreshPeriod(); 658049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project result.appendFormat("%lld\n", period); 659049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for (size_t i=0 ; i<128 ; i++) { 660049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const size_t index = (o+i) % 128; 661049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const nsecs_t time_app = mFrameStats[index].timestamp; 662049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const nsecs_t time_set = mFrameStats[index].set; 663049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const nsecs_t time_vsync = mFrameStats[index].vsync; 664049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project result.appendFormat("%lld\t%lld\t%lld\n", 665049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project time_app, 666049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project time_vsync, 667049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project time_set); 668049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 669049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project result.append("\n"); 670049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 671049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 672049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid Layer::clearStats() 673049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project{ 674049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project LayerBaseClient::clearStats(); 675049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project memset(mFrameStats, 0, sizeof(mFrameStats)); 676049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 677049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 678049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectuint32_t Layer::getEffectiveUsage(uint32_t usage) const 679049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project{ 680049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // TODO: should we do something special if mSecure is set? 681049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (mProtectedByApp) { 682049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // need a hardware-protected path to external video sink 683049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project usage |= GraphicBuffer::USAGE_PROTECTED; 684049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 685049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project usage |= GraphicBuffer::USAGE_HW_COMPOSER; 686049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return usage; 687049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 688049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 689049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectuint32_t Layer::getTransformHint() const { 690049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project uint32_t orientation = 0; 691049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!mFlinger->mDebugDisableTransformHint) { 692049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project orientation = getPlaneOrientation(); 693049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (orientation & Transform::ROT_INVALID) { 694049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project orientation = 0; 695049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 696049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 697049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return orientation; 698049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 699049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 700049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project// --------------------------------------------------------------------------- 701049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 702049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 703049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project}; // namespace android 704049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project