LayerBuffer.cpp revision 9066cfe9886ac131c34d59ed0e2d287b0e3c0087
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define LOG_TAG "SurfaceFlinger" 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdlib.h> 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdint.h> 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <math.h> 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/types.h> 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Errors.h> 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Log.h> 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/StopWatch.h> 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/IPCThreadState.h> 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/IServiceManager.h> 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <ui/PixelFormat.h> 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <ui/EGLDisplaySurface.h> 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "LayerBuffer.h" 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "SurfaceFlinger.h" 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "VRamHeap.h" 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "DisplayHardware/DisplayHardware.h" 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// --------------------------------------------------------------------------- 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconst uint32_t LayerBuffer::typeInfo = LayerBaseClient::typeInfo | 0x20; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconst char* const LayerBuffer::typeID = "LayerBuffer"; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// --------------------------------------------------------------------------- 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLayerBuffer::LayerBuffer(SurfaceFlinger* flinger, DisplayID display, 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Client* client, int32_t i) 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : LayerBaseClient(flinger, display, client, i), 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNeedsBlending(false) 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLayerBuffer::~LayerBuffer() 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<SurfaceBuffer> s(getClientSurface()); 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (s != 0) { 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s->disown(); 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mClientSurface.clear(); 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsp<LayerBuffer::SurfaceBuffer> LayerBuffer::getClientSurface() const 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex::Autolock _l(mLock); 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mClientSurface.promote(); 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsp<LayerBaseClient::Surface> LayerBuffer::getSurface() const 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<SurfaceBuffer> s; 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex::Autolock _l(mLock); 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s = mClientSurface.promote(); 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (s == 0) { 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s = new SurfaceBuffer(clientIndex(), 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const_cast<LayerBuffer *>(this)); 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mClientSurface = s; 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return s; 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool LayerBuffer::needsBlending() const { 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mNeedsBlending; 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::setNeedsBlending(bool blending) { 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNeedsBlending = blending; 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::postBuffer(ssize_t offset) 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Source> source(getSource()); 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (source != 0) 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project source->postBuffer(offset); 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::unregisterBuffers() 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Source> source(clearSource()); 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (source != 0) 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project source->unregisterBuffers(); 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectuint32_t LayerBuffer::doTransaction(uint32_t flags) 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Source> source(getSource()); 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (source != 0) 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project source->onTransaction(flags); 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return LayerBase::doTransaction(flags); 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::unlockPageFlip(const Transform& planeTransform, 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Region& outDirtyRegion) 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // this code-path must be as tight as possible, it's called each time 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the screen is composited. 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Source> source(getSource()); 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (source != 0) 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project source->onVisibilityResolved(planeTransform); 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LayerBase::unlockPageFlip(planeTransform, outDirtyRegion); 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::onDraw(const Region& clip) const 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Source> source(getSource()); 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (LIKELY(source != 0)) { 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project source->onDraw(clip); 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clearWithOpenGL(clip); 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool LayerBuffer::transformed() const 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Source> source(getSource()); 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (LIKELY(source != 0)) 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return source->transformed(); 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This creates a "buffer" source for this surface 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t LayerBuffer::registerBuffers(const ISurface::BufferHeap& buffers) 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex::Autolock _l(mLock); 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mSource != 0) 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return INVALID_OPERATION; 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<BufferSource> source = new BufferSource(*this, buffers); 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t result = source->getStatus(); 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (result == NO_ERROR) { 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSource = source; 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This creates an "overlay" source for this surface 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsp<OverlayRef> LayerBuffer::createOverlay(uint32_t w, uint32_t h, int32_t f) 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<OverlayRef> result; 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex::Autolock _l(mLock); 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mSource != 0) 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<OverlaySource> source = new OverlaySource(*this, &result, w, h, f); 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (result != 0) { 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSource = source; 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsp<LayerBuffer::Source> LayerBuffer::getSource() const { 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex::Autolock _l(mLock); 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mSource; 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsp<LayerBuffer::Source> LayerBuffer::clearSource() { 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Source> source; 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex::Autolock _l(mLock); 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project source = mSource; 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSource.clear(); 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return source; 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ============================================================================ 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// LayerBuffer::SurfaceBuffer 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ============================================================================ 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLayerBuffer::SurfaceBuffer::SurfaceBuffer(SurfaceID id, LayerBuffer* owner) 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project: LayerBaseClient::Surface(id, owner->getIdentity()), mOwner(owner) 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLayerBuffer::SurfaceBuffer::~SurfaceBuffer() 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unregisterBuffers(); 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOwner = 0; 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t LayerBuffer::SurfaceBuffer::onTransact( 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (code) { 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case REGISTER_BUFFERS: 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case UNREGISTER_BUFFERS: 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case CREATE_OVERLAY: 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // codes that require permission check 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IPCThreadState* ipc = IPCThreadState::self(); 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const int pid = ipc->getCallingPid(); 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const int self_pid = getpid(); 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (LIKELY(pid != self_pid)) { 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // we're called from a different process, do the real check 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission( 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String16("android.permission.ACCESS_SURFACE_FLINGER"))) 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const int uid = ipc->getCallingUid(); 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("Permission Denial: " 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid); 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return PERMISSION_DENIED; 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return LayerBaseClient::Surface::onTransact(code, data, reply, flags); 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t LayerBuffer::SurfaceBuffer::registerBuffers(const ISurface::BufferHeap& buffers) 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LayerBuffer* owner(getOwner()); 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (owner) 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return owner->registerBuffers(buffers); 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_INIT; 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::SurfaceBuffer::postBuffer(ssize_t offset) 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LayerBuffer* owner(getOwner()); 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (owner) 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner->postBuffer(offset); 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::SurfaceBuffer::unregisterBuffers() 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LayerBuffer* owner(getOwner()); 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (owner) 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner->unregisterBuffers(); 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsp<OverlayRef> LayerBuffer::SurfaceBuffer::createOverlay( 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t w, uint32_t h, int32_t format) { 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<OverlayRef> result; 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LayerBuffer* owner(getOwner()); 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (owner) 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = owner->createOverlay(w, h, format); 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::SurfaceBuffer::disown() 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex::Autolock _l(mLock); 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOwner = 0; 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ============================================================================ 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// LayerBuffer::Buffer 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ============================================================================ 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLayerBuffer::Buffer::Buffer(const ISurface::BufferHeap& buffers, ssize_t offset) 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : mBufferHeap(buffers) 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NativeBuffer& src(mNativeBuffer); 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project src.crop.l = 0; 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project src.crop.t = 0; 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project src.crop.r = buffers.w; 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project src.crop.b = buffers.h; 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project src.img.w = buffers.hor_stride ?: buffers.w; 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project src.img.h = buffers.ver_stride ?: buffers.h; 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project src.img.format = buffers.format; 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project src.img.offset = offset; 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project src.img.base = buffers.heap->base(); 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project src.img.fd = buffers.heap->heapID(); 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLayerBuffer::Buffer::~Buffer() 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ============================================================================ 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// LayerBuffer::Source 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// LayerBuffer::BufferSource 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// LayerBuffer::OverlaySource 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ============================================================================ 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLayerBuffer::Source::Source(LayerBuffer& layer) 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : mLayer(layer) 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLayerBuffer::Source::~Source() { 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::Source::onDraw(const Region& clip) const { 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::Source::onTransaction(uint32_t flags) { 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::Source::onVisibilityResolved( 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const Transform& planeTransform) { 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::Source::postBuffer(ssize_t offset) { 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::Source::unregisterBuffers() { 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool LayerBuffer::Source::transformed() const { 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mLayer.mTransformed; 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// --------------------------------------------------------------------------- 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLayerBuffer::BufferSource::BufferSource(LayerBuffer& layer, 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const ISurface::BufferHeap& buffers) 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : Source(layer), mStatus(NO_ERROR), 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBufferSize(0), mTextureName(-1U) 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (buffers.heap == NULL) { 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // this is allowed, but in this case, it is illegal to receive 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // postBuffer(). The surface just erases the framebuffer with 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // fully transparent pixels. 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBufferHeap = buffers; 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayer.setNeedsBlending(false); 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t err = (buffers.heap->heapID() >= 0) ? NO_ERROR : NO_INIT; 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("LayerBuffer::BufferSource: invalid heap (%s)", strerror(err)); 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStatus = err; 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PixelFormatInfo info; 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = getPixelFormatInfo(buffers.format, &info); 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("LayerBuffer::BufferSource: invalid format %d (%s)", 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffers.format, strerror(err)); 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStatus = err; 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (buffers.hor_stride<0 || buffers.ver_stride<0) { 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("LayerBuffer::BufferSource: invalid parameters " 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "(w=%d, h=%d, xs=%d, ys=%d)", 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffers.w, buffers.h, buffers.hor_stride, buffers.ver_stride); 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStatus = BAD_VALUE; 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBufferHeap = buffers; 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayer.setNeedsBlending((info.h_alpha - info.l_alpha) > 0); 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBufferSize = info.getScanlineSize(buffers.hor_stride)*buffers.ver_stride; 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayer.forceVisibilityTransaction(); 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLayerBuffer::BufferSource::~BufferSource() 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mTextureName != -1U) { 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LayerBase::deletedTextures.add(mTextureName); 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::BufferSource::postBuffer(ssize_t offset) 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ISurface::BufferHeap buffers; 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { // scope for the lock 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex::Autolock _l(mLock); 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffers = mBufferHeap; 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (buffers.heap != 0) { 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const size_t memorySize = buffers.heap->getSize(); 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((size_t(offset) + mBufferSize) > memorySize) { 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("LayerBuffer::BufferSource::postBuffer() " 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "invalid buffer (offset=%d, size=%d, heap-size=%d", 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int(offset), int(mBufferSize), int(memorySize)); 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Buffer> buffer; 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (buffers.heap != 0) { 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffer = new LayerBuffer::Buffer(buffers, offset); 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (buffer->getStatus() != NO_ERROR) 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffer.clear(); 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setBuffer(buffer); 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayer.invalidate(); 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::BufferSource::unregisterBuffers() 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex::Autolock _l(mLock); 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBufferHeap.heap.clear(); 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBuffer.clear(); 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayer.invalidate(); 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsp<LayerBuffer::Buffer> LayerBuffer::BufferSource::getBuffer() const 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex::Autolock _l(mLock); 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mBuffer; 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::BufferSource::setBuffer(const sp<LayerBuffer::Buffer>& buffer) 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex::Autolock _l(mLock); 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBuffer = buffer; 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool LayerBuffer::BufferSource::transformed() const 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mBufferHeap.transform ? true : Source::transformed(); 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::BufferSource::onDraw(const Region& clip) const 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Buffer> buffer(getBuffer()); 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (UNLIKELY(buffer == 0)) { 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // nothing to do, we don't have a buffer 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayer.clearWithOpenGL(clip); 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t err = NO_ERROR; 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NativeBuffer src(buffer->getBuffer()); 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const Rect& transformedBounds = mLayer.getTransformedBounds(); 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const int can_use_copybit = mLayer.canUseCopybit(); 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (can_use_copybit) { 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const int src_width = src.crop.r - src.crop.l; 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const int src_height = src.crop.b - src.crop.t; 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int W = transformedBounds.width(); 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int H = transformedBounds.height(); 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mLayer.getOrientation() & Transform::ROT_90) { 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int t(W); W=H; H=t; 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* With LayerBuffer, it is likely that we'll have to rescale the 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * surface, because this is often used for video playback or 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * camera-preview. Since we want these operation as fast as possible 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * we make sure we can use the 2D H/W even if it doesn't support 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the requested scale factor, in which case we perform the scaling 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in several passes. */ 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project copybit_device_t* copybit = mLayer.mFlinger->getBlitEngine(); 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const float min = copybit->get(copybit, COPYBIT_MINIFICATION_LIMIT); 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const float mag = copybit->get(copybit, COPYBIT_MAGNIFICATION_LIMIT); 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float xscale = 1.0f; 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (src_width > W*min) xscale = 1.0f / min; 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else if (src_width*mag < W) xscale = mag; 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float yscale = 1.0f; 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (src_height > H*min) yscale = 1.0f / min; 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else if (src_height*mag < H) yscale = mag; 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (UNLIKELY(xscale!=1.0f || yscale!=1.0f)) { 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (UNLIKELY(mTemporaryDealer == 0)) { 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // allocate a memory-dealer for this the first time 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTemporaryDealer = mLayer.mFlinger->getSurfaceHeapManager() 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ->createHeap(ISurfaceComposer::eHardware); 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTempBitmap.init(mTemporaryDealer); 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const int tmp_w = floorf(src_width * xscale); 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const int tmp_h = floorf(src_height * yscale); 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = mTempBitmap.setBits(tmp_w, tmp_h, 1, src.img.format); 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (LIKELY(err == NO_ERROR)) { 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NativeBuffer tmp; 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTempBitmap.getBitmapSurface(&tmp.img); 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tmp.crop.l = 0; 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tmp.crop.t = 0; 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tmp.crop.r = tmp.img.w; 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tmp.crop.b = tmp.img.h; 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project region_iterator tmp_it(Region(Rect(tmp.crop.r, tmp.crop.b))); 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project copybit->set_parameter(copybit, COPYBIT_TRANSFORM, 0); 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project copybit->set_parameter(copybit, COPYBIT_PLANE_ALPHA, 0xFF); 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project copybit->set_parameter(copybit, COPYBIT_DITHER, COPYBIT_DISABLE); 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = copybit->stretch(copybit, 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project &tmp.img, &src.img, &tmp.crop, &src.crop, &tmp_it); 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project src = tmp; 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const DisplayHardware& hw(mLayer.graphicPlane(0).displayHardware()); 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project copybit_image_t dst; 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hw.getDisplaySurface(&dst); 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const copybit_rect_t& drect 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = reinterpret_cast<const copybit_rect_t&>(transformedBounds); 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const State& s(mLayer.drawingState()); 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project region_iterator it(clip); 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // pick the right orientation for this buffer 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int orientation = mLayer.getOrientation(); 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (UNLIKELY(mBufferHeap.transform)) { 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Transform rot90; 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GraphicPlane::orientationToTransfrom( 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ISurfaceComposer::eOrientation90, 0, 0, &rot90); 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const Transform& planeTransform(mLayer.graphicPlane(0).transform()); 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const Layer::State& s(mLayer.drawingState()); 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Transform tr(planeTransform * s.transform * rot90); 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project orientation = tr.getOrientation(); 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project copybit->set_parameter(copybit, COPYBIT_TRANSFORM, orientation); 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project copybit->set_parameter(copybit, COPYBIT_PLANE_ALPHA, s.alpha); 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project copybit->set_parameter(copybit, COPYBIT_DITHER, COPYBIT_ENABLE); 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = copybit->stretch(copybit, 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project &dst, &src.img, &drect, &src.crop, &it); 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("copybit failed (%s)", strerror(err)); 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!can_use_copybit || err) { 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (UNLIKELY(mTextureName == -1LU)) { 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTextureName = mLayer.createTexture(); 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GLuint w = 0; 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GLuint h = 0; 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GGLSurface t; 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.version = sizeof(GGLSurface); 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.width = src.crop.r; 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.height = src.crop.b; 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.stride = src.img.w; 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.vstride= src.img.h; 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.format = src.img.format; 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.data = (GGLubyte*)(intptr_t(src.img.base) + src.img.offset); 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const Region dirty(Rect(t.width, t.height)); 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayer.loadTexture(dirty, mTextureName, t, w, h); 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayer.drawWithOpenGL(clip, mTextureName, t, mBufferHeap.transform); 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// --------------------------------------------------------------------------- 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLayerBuffer::OverlaySource::OverlaySource(LayerBuffer& layer, 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<OverlayRef>* overlayRef, 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t w, uint32_t h, int32_t format) 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : Source(layer), mVisibilityChanged(false), 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOverlay(0), mOverlayHandle(0), mOverlayDevice(0) 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project overlay_control_device_t* overlay_dev = mLayer.mFlinger->getOverlayEngine(); 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (overlay_dev == NULL) { 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // overlays not supported 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOverlayDevice = overlay_dev; 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project overlay_t* overlay = overlay_dev->createOverlay(overlay_dev, w, h, format); 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (overlay == NULL) { 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // couldn't create the overlay (no memory? no more overlays?) 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // enable dithering... 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project overlay_dev->setParameter(overlay_dev, overlay, 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project OVERLAY_DITHER, OVERLAY_ENABLE); 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOverlay = overlay; 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWidth = overlay->w; 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHeight = overlay->h; 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFormat = overlay->format; 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWidthStride = overlay->w_stride; 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHeightStride = overlay->h_stride; 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOverlayHandle = overlay->getHandleRef(overlay); 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // NOTE: here it's okay to acquire a reference to "this"m as long as 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the reference is not released before we leave the ctor. 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<OverlayChannel> channel = new OverlayChannel(this); 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *overlayRef = new OverlayRef(mOverlayHandle, channel, 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWidth, mHeight, mFormat, mWidthStride, mHeightStride); 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLayerBuffer::OverlaySource::~OverlaySource() 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOverlay && mOverlayDevice) { 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project overlay_control_device_t* overlay_dev = mOverlayDevice; 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project overlay_dev->destroyOverlay(overlay_dev, mOverlay); 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::OverlaySource::onTransaction(uint32_t flags) 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const Layer::State& front(mLayer.drawingState()); 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const Layer::State& temp(mLayer.currentState()); 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (temp.sequence != front.sequence) { 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mVisibilityChanged = true; 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::OverlaySource::onVisibilityResolved( 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const Transform& planeTransform) 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // this code-path must be as tight as possible, it's called each time 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the screen is composited. 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (UNLIKELY(mOverlay != 0)) { 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mVisibilityChanged) { 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mVisibilityChanged = false; 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const Rect& bounds = mLayer.getTransformedBounds(); 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int x = bounds.left; 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int y = bounds.top; 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int w = bounds.width(); 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int h = bounds.height(); 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // we need a lock here to protect "destroy" 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex::Autolock _l(mLock); 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOverlay) { 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project overlay_control_device_t* overlay_dev = mOverlayDevice; 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project overlay_dev->setPosition(overlay_dev, mOverlay, x,y,w,h); 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project overlay_dev->setParameter(overlay_dev, mOverlay, 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project OVERLAY_TRANSFORM, mLayer.getOrientation()); 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::OverlaySource::serverDestroy() 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayer.clearSource(); 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project destroyOverlay(); 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::OverlaySource::destroyOverlay() 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // we need a lock here to protect "onVisibilityResolved" 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex::Autolock _l(mLock); 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOverlay) { 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project overlay_control_device_t* overlay_dev = mOverlayDevice; 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project overlay_dev->destroyOverlay(overlay_dev, mOverlay); 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOverlay = 0; 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// --------------------------------------------------------------------------- 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android 656