LayerBuffer.cpp revision 43ab76389ead0ef90e3d4fa883d5a58c34a6801b
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#include <stdlib.h> 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdint.h> 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <math.h> 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/types.h> 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Errors.h> 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Log.h> 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/StopWatch.h> 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <ui/PixelFormat.h> 27cbc4c9f8d56317b2fe8964c15c9785ebeef98ca7Mathias Agopian#include <ui/FramebufferNativeWindow.h> 28cbc4c9f8d56317b2fe8964c15c9785ebeef98ca7Mathias Agopian 29cbc4c9f8d56317b2fe8964c15c9785ebeef98ca7Mathias Agopian#include <hardware/copybit.h> 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "LayerBuffer.h" 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "SurfaceFlinger.h" 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "DisplayHardware/DisplayHardware.h" 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 352eab9d8d7034ef05cead1ee26667a75061b5f0aaMathias Agopian#include "gralloc_priv.h" // needed for msm / copybit 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// --------------------------------------------------------------------------- 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconst uint32_t LayerBuffer::typeInfo = LayerBaseClient::typeInfo | 0x20; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconst char* const LayerBuffer::typeID = "LayerBuffer"; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// --------------------------------------------------------------------------- 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLayerBuffer::LayerBuffer(SurfaceFlinger* flinger, DisplayID display, 476edf5af578c1ab1fcd44b7c08ca371456e4b7430Mathias Agopian const sp<Client>& client, int32_t i) 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : LayerBaseClient(flinger, display, client, i), 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNeedsBlending(false) 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLayerBuffer::~LayerBuffer() 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 576cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopianvoid LayerBuffer::onFirstRef() 586cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian{ 59c6603951d45fc9b0d1776fec9444b6f31af92840Mathias Agopian LayerBaseClient::onFirstRef(); 606cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian mSurface = new SurfaceBuffer(mFlinger, clientIndex(), 616cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian const_cast<LayerBuffer *>(this)); 626cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian} 636cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian 641473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopiansp<LayerBaseClient::Surface> LayerBuffer::createSurface() const 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 666cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian return mSurface; 676cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian} 686cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian 696cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopianstatus_t LayerBuffer::ditch() 706cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian{ 716cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian mSurface.clear(); 726cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian return NO_ERROR; 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool LayerBuffer::needsBlending() const { 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mNeedsBlending; 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::setNeedsBlending(bool blending) { 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNeedsBlending = blending; 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::postBuffer(ssize_t offset) 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Source> source(getSource()); 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (source != 0) 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project source->postBuffer(offset); 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::unregisterBuffers() 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Source> source(clearSource()); 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (source != 0) 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project source->unregisterBuffers(); 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectuint32_t LayerBuffer::doTransaction(uint32_t flags) 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Source> source(getSource()); 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (source != 0) 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project source->onTransaction(flags); 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return LayerBase::doTransaction(flags); 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::unlockPageFlip(const Transform& planeTransform, 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Region& outDirtyRegion) 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // this code-path must be as tight as possible, it's called each time 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the screen is composited. 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Source> source(getSource()); 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (source != 0) 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project source->onVisibilityResolved(planeTransform); 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LayerBase::unlockPageFlip(planeTransform, outDirtyRegion); 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::onDraw(const Region& clip) const 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Source> source(getSource()); 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (LIKELY(source != 0)) { 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project source->onDraw(clip); 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clearWithOpenGL(clip); 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool LayerBuffer::transformed() const 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Source> source(getSource()); 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (LIKELY(source != 0)) 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return source->transformed(); 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This creates a "buffer" source for this surface 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t LayerBuffer::registerBuffers(const ISurface::BufferHeap& buffers) 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex::Autolock _l(mLock); 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mSource != 0) 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return INVALID_OPERATION; 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<BufferSource> source = new BufferSource(*this, buffers); 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t result = source->getStatus(); 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (result == NO_ERROR) { 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSource = source; 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This creates an "overlay" source for this surface 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsp<OverlayRef> LayerBuffer::createOverlay(uint32_t w, uint32_t h, int32_t f) 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<OverlayRef> result; 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex::Autolock _l(mLock); 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mSource != 0) 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<OverlaySource> source = new OverlaySource(*this, &result, w, h, f); 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (result != 0) { 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSource = source; 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsp<LayerBuffer::Source> LayerBuffer::getSource() const { 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex::Autolock _l(mLock); 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mSource; 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsp<LayerBuffer::Source> LayerBuffer::clearSource() { 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Source> source; 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex::Autolock _l(mLock); 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project source = mSource; 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSource.clear(); 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return source; 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ============================================================================ 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// LayerBuffer::SurfaceBuffer 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ============================================================================ 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1866cf0db228ca275dfcda57d79c55e5fa306809632Mathias AgopianLayerBuffer::SurfaceBuffer::SurfaceBuffer(const sp<SurfaceFlinger>& flinger, 1876cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian SurfaceID id, const sp<LayerBuffer>& owner) 1886cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian : LayerBaseClient::Surface(flinger, id, owner->getIdentity(), owner) 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLayerBuffer::SurfaceBuffer::~SurfaceBuffer() 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unregisterBuffers(); 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1971473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopianstatus_t LayerBuffer::SurfaceBuffer::registerBuffers( 1981473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian const ISurface::BufferHeap& buffers) 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2001473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian sp<LayerBuffer> owner(getOwner()); 2011473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian if (owner != 0) 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return owner->registerBuffers(buffers); 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_INIT; 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::SurfaceBuffer::postBuffer(ssize_t offset) 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2081473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian sp<LayerBuffer> owner(getOwner()); 2091473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian if (owner != 0) 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner->postBuffer(offset); 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::SurfaceBuffer::unregisterBuffers() 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2151473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian sp<LayerBuffer> owner(getOwner()); 2161473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian if (owner != 0) 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner->unregisterBuffers(); 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsp<OverlayRef> LayerBuffer::SurfaceBuffer::createOverlay( 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t w, uint32_t h, int32_t format) { 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<OverlayRef> result; 2231473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian sp<LayerBuffer> owner(getOwner()); 2241473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian if (owner != 0) 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = owner->createOverlay(w, h, format); 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ============================================================================ 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// LayerBuffer::Buffer 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ============================================================================ 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLayerBuffer::Buffer::Buffer(const ISurface::BufferHeap& buffers, ssize_t offset) 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : mBufferHeap(buffers) 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NativeBuffer& src(mNativeBuffer); 2372eab9d8d7034ef05cead1ee26667a75061b5f0aaMathias Agopian 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project src.crop.l = 0; 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project src.crop.t = 0; 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project src.crop.r = buffers.w; 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project src.crop.b = buffers.h; 2422eab9d8d7034ef05cead1ee26667a75061b5f0aaMathias Agopian 2432eab9d8d7034ef05cead1ee26667a75061b5f0aaMathias Agopian src.img.w = buffers.hor_stride ?: buffers.w; 2442eab9d8d7034ef05cead1ee26667a75061b5f0aaMathias Agopian src.img.h = buffers.ver_stride ?: buffers.h; 2452eab9d8d7034ef05cead1ee26667a75061b5f0aaMathias Agopian src.img.format = buffers.format; 2462eab9d8d7034ef05cead1ee26667a75061b5f0aaMathias Agopian src.img.base = (void*)(intptr_t(buffers.heap->base()) + offset); 2472eab9d8d7034ef05cead1ee26667a75061b5f0aaMathias Agopian 2488f78faa1ef7e2436d11e4c04be67b5a95bf126b9Mathias Agopian // FIXME: gross hack, we should never access private_handle_t from here, 2498f78faa1ef7e2436d11e4c04be67b5a95bf126b9Mathias Agopian // but this is needed by msm drivers 2502eab9d8d7034ef05cead1ee26667a75061b5f0aaMathias Agopian private_handle_t* hnd = new private_handle_t( 2512eab9d8d7034ef05cead1ee26667a75061b5f0aaMathias Agopian buffers.heap->heapID(), buffers.heap->getSize(), 0); 2522eab9d8d7034ef05cead1ee26667a75061b5f0aaMathias Agopian hnd->offset = offset; 2532eab9d8d7034ef05cead1ee26667a75061b5f0aaMathias Agopian src.img.handle = hnd; 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLayerBuffer::Buffer::~Buffer() 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2582eab9d8d7034ef05cead1ee26667a75061b5f0aaMathias Agopian NativeBuffer& src(mNativeBuffer); 2592eab9d8d7034ef05cead1ee26667a75061b5f0aaMathias Agopian if (src.img.handle) 2602eab9d8d7034ef05cead1ee26667a75061b5f0aaMathias Agopian delete (private_handle_t*)src.img.handle; 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ============================================================================ 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// LayerBuffer::Source 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// LayerBuffer::BufferSource 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// LayerBuffer::OverlaySource 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ============================================================================ 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLayerBuffer::Source::Source(LayerBuffer& layer) 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : mLayer(layer) 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLayerBuffer::Source::~Source() { 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::Source::onDraw(const Region& clip) const { 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::Source::onTransaction(uint32_t flags) { 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::Source::onVisibilityResolved( 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const Transform& planeTransform) { 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::Source::postBuffer(ssize_t offset) { 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::Source::unregisterBuffers() { 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool LayerBuffer::Source::transformed() const { 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mLayer.mTransformed; 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// --------------------------------------------------------------------------- 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLayerBuffer::BufferSource::BufferSource(LayerBuffer& layer, 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const ISurface::BufferHeap& buffers) 294999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian : Source(layer), mStatus(NO_ERROR), mBufferSize(0) 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (buffers.heap == NULL) { 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // this is allowed, but in this case, it is illegal to receive 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // postBuffer(). The surface just erases the framebuffer with 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // fully transparent pixels. 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBufferHeap = buffers; 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayer.setNeedsBlending(false); 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t err = (buffers.heap->heapID() >= 0) ? NO_ERROR : NO_INIT; 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("LayerBuffer::BufferSource: invalid heap (%s)", strerror(err)); 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStatus = err; 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PixelFormatInfo info; 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = getPixelFormatInfo(buffers.format, &info); 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("LayerBuffer::BufferSource: invalid format %d (%s)", 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffers.format, strerror(err)); 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStatus = err; 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (buffers.hor_stride<0 || buffers.ver_stride<0) { 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("LayerBuffer::BufferSource: invalid parameters " 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "(w=%d, h=%d, xs=%d, ys=%d)", 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffers.w, buffers.h, buffers.hor_stride, buffers.ver_stride); 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStatus = BAD_VALUE; 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBufferHeap = buffers; 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayer.setNeedsBlending((info.h_alpha - info.l_alpha) > 0); 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBufferSize = info.getScanlineSize(buffers.hor_stride)*buffers.ver_stride; 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayer.forceVisibilityTransaction(); 333cbc4c9f8d56317b2fe8964c15c9785ebeef98ca7Mathias Agopian 334cbc4c9f8d56317b2fe8964c15c9785ebeef98ca7Mathias Agopian hw_module_t const* module; 335cbc4c9f8d56317b2fe8964c15c9785ebeef98ca7Mathias Agopian mBlitEngine = NULL; 336cbc4c9f8d56317b2fe8964c15c9785ebeef98ca7Mathias Agopian if (hw_get_module(COPYBIT_HARDWARE_MODULE_ID, &module) == 0) { 337cbc4c9f8d56317b2fe8964c15c9785ebeef98ca7Mathias Agopian copybit_open(module, &mBlitEngine); 338cbc4c9f8d56317b2fe8964c15c9785ebeef98ca7Mathias Agopian } 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLayerBuffer::BufferSource::~BufferSource() 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 343999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian if (mTexture.name != -1U) { 344999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian glDeleteTextures(1, &mTexture.name); 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34668eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian if (mBlitEngine) { 34768eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian copybit_close(mBlitEngine); 34868eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian } 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::BufferSource::postBuffer(ssize_t offset) 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ISurface::BufferHeap buffers; 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { // scope for the lock 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex::Autolock _l(mLock); 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffers = mBufferHeap; 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (buffers.heap != 0) { 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const size_t memorySize = buffers.heap->getSize(); 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((size_t(offset) + mBufferSize) > memorySize) { 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("LayerBuffer::BufferSource::postBuffer() " 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "invalid buffer (offset=%d, size=%d, heap-size=%d", 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int(offset), int(mBufferSize), int(memorySize)); 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Buffer> buffer; 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (buffers.heap != 0) { 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffer = new LayerBuffer::Buffer(buffers, offset); 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (buffer->getStatus() != NO_ERROR) 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffer.clear(); 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setBuffer(buffer); 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayer.invalidate(); 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::BufferSource::unregisterBuffers() 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex::Autolock _l(mLock); 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBufferHeap.heap.clear(); 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBuffer.clear(); 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayer.invalidate(); 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsp<LayerBuffer::Buffer> LayerBuffer::BufferSource::getBuffer() const 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex::Autolock _l(mLock); 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mBuffer; 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::BufferSource::setBuffer(const sp<LayerBuffer::Buffer>& buffer) 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex::Autolock _l(mLock); 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBuffer = buffer; 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool LayerBuffer::BufferSource::transformed() const 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mBufferHeap.transform ? true : Source::transformed(); 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::BufferSource::onDraw(const Region& clip) const 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 405999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian sp<Buffer> ourBuffer(getBuffer()); 406999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian if (UNLIKELY(ourBuffer == 0)) { 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // nothing to do, we don't have a buffer 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayer.clearWithOpenGL(clip); 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 412cbc4c9f8d56317b2fe8964c15c9785ebeef98ca7Mathias Agopian status_t err = NO_ERROR; 413cbc4c9f8d56317b2fe8964c15c9785ebeef98ca7Mathias Agopian NativeBuffer src(ourBuffer->getBuffer()); 414cbc4c9f8d56317b2fe8964c15c9785ebeef98ca7Mathias Agopian const Rect& transformedBounds = mLayer.getTransformedBounds(); 415cbc4c9f8d56317b2fe8964c15c9785ebeef98ca7Mathias Agopian copybit_device_t* copybit = mBlitEngine; 416cbc4c9f8d56317b2fe8964c15c9785ebeef98ca7Mathias Agopian 417cbc4c9f8d56317b2fe8964c15c9785ebeef98ca7Mathias Agopian if (copybit) { 418cbc4c9f8d56317b2fe8964c15c9785ebeef98ca7Mathias Agopian const int src_width = src.crop.r - src.crop.l; 419cbc4c9f8d56317b2fe8964c15c9785ebeef98ca7Mathias Agopian const int src_height = src.crop.b - src.crop.t; 420cbc4c9f8d56317b2fe8964c15c9785ebeef98ca7Mathias Agopian int W = transformedBounds.width(); 421cbc4c9f8d56317b2fe8964c15c9785ebeef98ca7Mathias Agopian int H = transformedBounds.height(); 422cbc4c9f8d56317b2fe8964c15c9785ebeef98ca7Mathias Agopian if (mLayer.getOrientation() & Transform::ROT_90) { 423cbc4c9f8d56317b2fe8964c15c9785ebeef98ca7Mathias Agopian int t(W); W=H; H=t; 424cbc4c9f8d56317b2fe8964c15c9785ebeef98ca7Mathias Agopian } 425cbc4c9f8d56317b2fe8964c15c9785ebeef98ca7Mathias Agopian 42626c28b16f3464eeb98b091b915ccf494ac31c35fMathias Agopian#ifdef EGL_ANDROID_get_render_buffer 42726c28b16f3464eeb98b091b915ccf494ac31c35fMathias Agopian EGLDisplay dpy = eglGetCurrentDisplay(); 42826c28b16f3464eeb98b091b915ccf494ac31c35fMathias Agopian EGLSurface draw = eglGetCurrentSurface(EGL_DRAW); 42926c28b16f3464eeb98b091b915ccf494ac31c35fMathias Agopian EGLClientBuffer clientBuf = eglGetRenderBufferANDROID(dpy, draw); 43026c28b16f3464eeb98b091b915ccf494ac31c35fMathias Agopian android_native_buffer_t* nb = (android_native_buffer_t*)clientBuf; 43126c28b16f3464eeb98b091b915ccf494ac31c35fMathias Agopian if (nb == 0) { 43226c28b16f3464eeb98b091b915ccf494ac31c35fMathias Agopian err = BAD_VALUE; 43326c28b16f3464eeb98b091b915ccf494ac31c35fMathias Agopian } else { 43426c28b16f3464eeb98b091b915ccf494ac31c35fMathias Agopian copybit_image_t dst; 43526c28b16f3464eeb98b091b915ccf494ac31c35fMathias Agopian dst.w = nb->width; 43626c28b16f3464eeb98b091b915ccf494ac31c35fMathias Agopian dst.h = nb->height; 43726c28b16f3464eeb98b091b915ccf494ac31c35fMathias Agopian dst.format = nb->format; 43826c28b16f3464eeb98b091b915ccf494ac31c35fMathias Agopian dst.base = NULL; // unused by copybit on msm7k 43926c28b16f3464eeb98b091b915ccf494ac31c35fMathias Agopian dst.handle = (native_handle_t *)nb->handle; 44026c28b16f3464eeb98b091b915ccf494ac31c35fMathias Agopian 4418f78faa1ef7e2436d11e4c04be67b5a95bf126b9Mathias Agopian /* With LayerBuffer, it is likely that we'll have to rescale the 4428f78faa1ef7e2436d11e4c04be67b5a95bf126b9Mathias Agopian * surface, because this is often used for video playback or 4438f78faa1ef7e2436d11e4c04be67b5a95bf126b9Mathias Agopian * camera-preview. Since we want these operation as fast as possible 4448f78faa1ef7e2436d11e4c04be67b5a95bf126b9Mathias Agopian * we make sure we can use the 2D H/W even if it doesn't support 4458f78faa1ef7e2436d11e4c04be67b5a95bf126b9Mathias Agopian * the requested scale factor, in which case we perform the scaling 4468f78faa1ef7e2436d11e4c04be67b5a95bf126b9Mathias Agopian * in several passes. */ 4478f78faa1ef7e2436d11e4c04be67b5a95bf126b9Mathias Agopian 4488f78faa1ef7e2436d11e4c04be67b5a95bf126b9Mathias Agopian const float min = copybit->get(copybit, COPYBIT_MINIFICATION_LIMIT); 4498f78faa1ef7e2436d11e4c04be67b5a95bf126b9Mathias Agopian const float mag = copybit->get(copybit, COPYBIT_MAGNIFICATION_LIMIT); 4508f78faa1ef7e2436d11e4c04be67b5a95bf126b9Mathias Agopian 4518f78faa1ef7e2436d11e4c04be67b5a95bf126b9Mathias Agopian float xscale = 1.0f; 4528f78faa1ef7e2436d11e4c04be67b5a95bf126b9Mathias Agopian if (src_width > W*min) xscale = 1.0f / min; 4538f78faa1ef7e2436d11e4c04be67b5a95bf126b9Mathias Agopian else if (src_width*mag < W) xscale = mag; 4548f78faa1ef7e2436d11e4c04be67b5a95bf126b9Mathias Agopian 4558f78faa1ef7e2436d11e4c04be67b5a95bf126b9Mathias Agopian float yscale = 1.0f; 4568f78faa1ef7e2436d11e4c04be67b5a95bf126b9Mathias Agopian if (src_height > H*min) yscale = 1.0f / min; 4578f78faa1ef7e2436d11e4c04be67b5a95bf126b9Mathias Agopian else if (src_height*mag < H) yscale = mag; 4588f78faa1ef7e2436d11e4c04be67b5a95bf126b9Mathias Agopian 4598f78faa1ef7e2436d11e4c04be67b5a95bf126b9Mathias Agopian if (UNLIKELY(xscale!=1.0f || yscale!=1.0f)) { 4608f78faa1ef7e2436d11e4c04be67b5a95bf126b9Mathias Agopian const int tmp_w = floorf(src_width * xscale); 4618f78faa1ef7e2436d11e4c04be67b5a95bf126b9Mathias Agopian const int tmp_h = floorf(src_height * yscale); 4628f78faa1ef7e2436d11e4c04be67b5a95bf126b9Mathias Agopian 4638f78faa1ef7e2436d11e4c04be67b5a95bf126b9Mathias Agopian if (mTempBitmap==0 || 4648f78faa1ef7e2436d11e4c04be67b5a95bf126b9Mathias Agopian mTempBitmap->getWidth() < tmp_w || 4658f78faa1ef7e2436d11e4c04be67b5a95bf126b9Mathias Agopian mTempBitmap->getHeight() < tmp_h) { 4668f78faa1ef7e2436d11e4c04be67b5a95bf126b9Mathias Agopian mTempBitmap.clear(); 4678f78faa1ef7e2436d11e4c04be67b5a95bf126b9Mathias Agopian mTempBitmap = new android::Buffer(tmp_w, tmp_h, src.img.format); 4688f78faa1ef7e2436d11e4c04be67b5a95bf126b9Mathias Agopian err = mTempBitmap->initCheck(); 4698f78faa1ef7e2436d11e4c04be67b5a95bf126b9Mathias Agopian } 4708f78faa1ef7e2436d11e4c04be67b5a95bf126b9Mathias Agopian 4718f78faa1ef7e2436d11e4c04be67b5a95bf126b9Mathias Agopian if (LIKELY(err == NO_ERROR)) { 4728f78faa1ef7e2436d11e4c04be67b5a95bf126b9Mathias Agopian NativeBuffer tmp; 4738f78faa1ef7e2436d11e4c04be67b5a95bf126b9Mathias Agopian tmp.img.w = tmp_w; 4748f78faa1ef7e2436d11e4c04be67b5a95bf126b9Mathias Agopian tmp.img.h = tmp_h; 4758f78faa1ef7e2436d11e4c04be67b5a95bf126b9Mathias Agopian tmp.img.format = src.img.format; 4768f78faa1ef7e2436d11e4c04be67b5a95bf126b9Mathias Agopian tmp.img.handle = (native_handle_t*)mTempBitmap->getNativeBuffer()->handle; 4778f78faa1ef7e2436d11e4c04be67b5a95bf126b9Mathias Agopian tmp.crop.l = 0; 4788f78faa1ef7e2436d11e4c04be67b5a95bf126b9Mathias Agopian tmp.crop.t = 0; 4798f78faa1ef7e2436d11e4c04be67b5a95bf126b9Mathias Agopian tmp.crop.r = tmp.img.w; 4808f78faa1ef7e2436d11e4c04be67b5a95bf126b9Mathias Agopian tmp.crop.b = tmp.img.h; 4818f78faa1ef7e2436d11e4c04be67b5a95bf126b9Mathias Agopian 4828f78faa1ef7e2436d11e4c04be67b5a95bf126b9Mathias Agopian region_iterator tmp_it(Region(Rect(tmp.crop.r, tmp.crop.b))); 4838f78faa1ef7e2436d11e4c04be67b5a95bf126b9Mathias Agopian copybit->set_parameter(copybit, COPYBIT_TRANSFORM, 0); 4848f78faa1ef7e2436d11e4c04be67b5a95bf126b9Mathias Agopian copybit->set_parameter(copybit, COPYBIT_PLANE_ALPHA, 0xFF); 4858f78faa1ef7e2436d11e4c04be67b5a95bf126b9Mathias Agopian copybit->set_parameter(copybit, COPYBIT_DITHER, COPYBIT_DISABLE); 4868f78faa1ef7e2436d11e4c04be67b5a95bf126b9Mathias Agopian err = copybit->stretch(copybit, 4878f78faa1ef7e2436d11e4c04be67b5a95bf126b9Mathias Agopian &tmp.img, &src.img, &tmp.crop, &src.crop, &tmp_it); 4888f78faa1ef7e2436d11e4c04be67b5a95bf126b9Mathias Agopian src = tmp; 4898f78faa1ef7e2436d11e4c04be67b5a95bf126b9Mathias Agopian } 4908f78faa1ef7e2436d11e4c04be67b5a95bf126b9Mathias Agopian } 4918f78faa1ef7e2436d11e4c04be67b5a95bf126b9Mathias Agopian 49226c28b16f3464eeb98b091b915ccf494ac31c35fMathias Agopian const Rect& transformedBounds = mLayer.getTransformedBounds(); 4938f78faa1ef7e2436d11e4c04be67b5a95bf126b9Mathias Agopian const copybit_rect_t& drect = 4948f78faa1ef7e2436d11e4c04be67b5a95bf126b9Mathias Agopian reinterpret_cast<const copybit_rect_t&>(transformedBounds); 49526c28b16f3464eeb98b091b915ccf494ac31c35fMathias Agopian const State& s(mLayer.drawingState()); 49626c28b16f3464eeb98b091b915ccf494ac31c35fMathias Agopian region_iterator it(clip); 49726c28b16f3464eeb98b091b915ccf494ac31c35fMathias Agopian 49826c28b16f3464eeb98b091b915ccf494ac31c35fMathias Agopian // pick the right orientation for this buffer 49926c28b16f3464eeb98b091b915ccf494ac31c35fMathias Agopian int orientation = mLayer.getOrientation(); 50026c28b16f3464eeb98b091b915ccf494ac31c35fMathias Agopian if (UNLIKELY(mBufferHeap.transform)) { 50126c28b16f3464eeb98b091b915ccf494ac31c35fMathias Agopian Transform rot90; 50226c28b16f3464eeb98b091b915ccf494ac31c35fMathias Agopian GraphicPlane::orientationToTransfrom( 50326c28b16f3464eeb98b091b915ccf494ac31c35fMathias Agopian ISurfaceComposer::eOrientation90, 0, 0, &rot90); 50426c28b16f3464eeb98b091b915ccf494ac31c35fMathias Agopian const Transform& planeTransform(mLayer.graphicPlane(0).transform()); 50526c28b16f3464eeb98b091b915ccf494ac31c35fMathias Agopian const Layer::State& s(mLayer.drawingState()); 50626c28b16f3464eeb98b091b915ccf494ac31c35fMathias Agopian Transform tr(planeTransform * s.transform * rot90); 50726c28b16f3464eeb98b091b915ccf494ac31c35fMathias Agopian orientation = tr.getOrientation(); 50826c28b16f3464eeb98b091b915ccf494ac31c35fMathias Agopian } 509cbc4c9f8d56317b2fe8964c15c9785ebeef98ca7Mathias Agopian 51026c28b16f3464eeb98b091b915ccf494ac31c35fMathias Agopian copybit->set_parameter(copybit, COPYBIT_TRANSFORM, orientation); 51126c28b16f3464eeb98b091b915ccf494ac31c35fMathias Agopian copybit->set_parameter(copybit, COPYBIT_PLANE_ALPHA, s.alpha); 51226c28b16f3464eeb98b091b915ccf494ac31c35fMathias Agopian copybit->set_parameter(copybit, COPYBIT_DITHER, COPYBIT_ENABLE); 513cbc4c9f8d56317b2fe8964c15c9785ebeef98ca7Mathias Agopian 51426c28b16f3464eeb98b091b915ccf494ac31c35fMathias Agopian err = copybit->stretch(copybit, 51526c28b16f3464eeb98b091b915ccf494ac31c35fMathias Agopian &dst, &src.img, &drect, &src.crop, &it); 51626c28b16f3464eeb98b091b915ccf494ac31c35fMathias Agopian if (err != NO_ERROR) { 51726c28b16f3464eeb98b091b915ccf494ac31c35fMathias Agopian LOGE("copybit failed (%s)", strerror(err)); 51826c28b16f3464eeb98b091b915ccf494ac31c35fMathias Agopian } 519cbc4c9f8d56317b2fe8964c15c9785ebeef98ca7Mathias Agopian } 520cbc4c9f8d56317b2fe8964c15c9785ebeef98ca7Mathias Agopian } 52126c28b16f3464eeb98b091b915ccf494ac31c35fMathias Agopian#endif 52226c28b16f3464eeb98b091b915ccf494ac31c35fMathias Agopian 523cbc4c9f8d56317b2fe8964c15c9785ebeef98ca7Mathias Agopian if (!copybit || err) 524999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian { 525999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian // OpenGL fall-back 526999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian if (UNLIKELY(mTexture.name == -1LU)) { 527999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian mTexture.name = mLayer.createTexture(); 528999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian } 529dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian GLuint w = 0; 530dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian GLuint h = 0; 531999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian GGLSurface t; 532999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian t.version = sizeof(GGLSurface); 533999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian t.width = src.crop.r; 534999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian t.height = src.crop.b; 535999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian t.stride = src.img.w; 536999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian t.vstride= src.img.h; 537999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian t.format = src.img.format; 5382eab9d8d7034ef05cead1ee26667a75061b5f0aaMathias Agopian t.data = (GGLubyte*)src.img.base; 539999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian const Region dirty(Rect(t.width, t.height)); 540999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian mLayer.loadTexture(&mTexture, mTexture.name, dirty, t); 541999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian mTexture.transform = mBufferHeap.transform; 542999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian mLayer.drawWithOpenGL(clip, mTexture); 543dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian } 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// --------------------------------------------------------------------------- 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLayerBuffer::OverlaySource::OverlaySource(LayerBuffer& layer, 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<OverlayRef>* overlayRef, 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t w, uint32_t h, int32_t format) 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : Source(layer), mVisibilityChanged(false), 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOverlay(0), mOverlayHandle(0), mOverlayDevice(0) 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project overlay_control_device_t* overlay_dev = mLayer.mFlinger->getOverlayEngine(); 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (overlay_dev == NULL) { 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // overlays not supported 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOverlayDevice = overlay_dev; 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project overlay_t* overlay = overlay_dev->createOverlay(overlay_dev, w, h, format); 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (overlay == NULL) { 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // couldn't create the overlay (no memory? no more overlays?) 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // enable dithering... 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project overlay_dev->setParameter(overlay_dev, overlay, 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project OVERLAY_DITHER, OVERLAY_ENABLE); 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOverlay = overlay; 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWidth = overlay->w; 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHeight = overlay->h; 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFormat = overlay->format; 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWidthStride = overlay->w_stride; 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHeightStride = overlay->h_stride; 57843ab76389ead0ef90e3d4fa883d5a58c34a6801bRebecca Schultz Zavin mInitialized = false; 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOverlayHandle = overlay->getHandleRef(overlay); 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // NOTE: here it's okay to acquire a reference to "this"m as long as 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the reference is not released before we leave the ctor. 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<OverlayChannel> channel = new OverlayChannel(this); 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *overlayRef = new OverlayRef(mOverlayHandle, channel, 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWidth, mHeight, mFormat, mWidthStride, mHeightStride); 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLayerBuffer::OverlaySource::~OverlaySource() 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOverlay && mOverlayDevice) { 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project overlay_control_device_t* overlay_dev = mOverlayDevice; 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project overlay_dev->destroyOverlay(overlay_dev, mOverlay); 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5987ac5e698b216a1b1af97405b43adf2ad5bc40e7dRebecca Schultz Zavinvoid LayerBuffer::OverlaySource::onDraw(const Region& clip) const 5997ac5e698b216a1b1af97405b43adf2ad5bc40e7dRebecca Schultz Zavin{ 6007ac5e698b216a1b1af97405b43adf2ad5bc40e7dRebecca Schultz Zavin mLayer.clearWithOpenGL(clip); 6017ac5e698b216a1b1af97405b43adf2ad5bc40e7dRebecca Schultz Zavin} 6027ac5e698b216a1b1af97405b43adf2ad5bc40e7dRebecca Schultz Zavin 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::OverlaySource::onTransaction(uint32_t flags) 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const Layer::State& front(mLayer.drawingState()); 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const Layer::State& temp(mLayer.currentState()); 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (temp.sequence != front.sequence) { 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mVisibilityChanged = true; 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::OverlaySource::onVisibilityResolved( 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const Transform& planeTransform) 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // this code-path must be as tight as possible, it's called each time 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the screen is composited. 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (UNLIKELY(mOverlay != 0)) { 61843ab76389ead0ef90e3d4fa883d5a58c34a6801bRebecca Schultz Zavin if (mVisibilityChanged || !mInitialized) { 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mVisibilityChanged = false; 62043ab76389ead0ef90e3d4fa883d5a58c34a6801bRebecca Schultz Zavin mInitialized = true; 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const Rect& bounds = mLayer.getTransformedBounds(); 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int x = bounds.left; 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int y = bounds.top; 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int w = bounds.width(); 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int h = bounds.height(); 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // we need a lock here to protect "destroy" 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex::Autolock _l(mLock); 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOverlay) { 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project overlay_control_device_t* overlay_dev = mOverlayDevice; 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project overlay_dev->setPosition(overlay_dev, mOverlay, x,y,w,h); 63243ab76389ead0ef90e3d4fa883d5a58c34a6801bRebecca Schultz Zavin overlay_dev->setParameter(overlay_dev, mOverlay, 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project OVERLAY_TRANSFORM, mLayer.getOrientation()); 6347ac5e698b216a1b1af97405b43adf2ad5bc40e7dRebecca Schultz Zavin overlay_dev->commit(overlay_dev, mOverlay); 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::OverlaySource::serverDestroy() 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayer.clearSource(); 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project destroyOverlay(); 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::OverlaySource::destroyOverlay() 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // we need a lock here to protect "onVisibilityResolved" 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex::Autolock _l(mLock); 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOverlay) { 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project overlay_control_device_t* overlay_dev = mOverlayDevice; 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project overlay_dev->destroyOverlay(overlay_dev, mOverlay); 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOverlay = 0; 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// --------------------------------------------------------------------------- 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android 659