LayerBuffer.cpp revision e96aa3e859cb747e241dfa2999fcd142a688ed57
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 266950e428feaccc8164b989ef64e771a99948797aMathias Agopian#include <ui/GraphicBuffer.h> 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <ui/PixelFormat.h> 28cbc4c9f8d56317b2fe8964c15c9785ebeef98ca7Mathias Agopian#include <ui/FramebufferNativeWindow.h> 2990daccf3fd17553209b8951e4e80144f32ab7238Mathias Agopian#include <ui/Rect.h> 3090daccf3fd17553209b8951e4e80144f32ab7238Mathias Agopian#include <ui/Region.h> 31cbc4c9f8d56317b2fe8964c15c9785ebeef98ca7Mathias Agopian 32cbc4c9f8d56317b2fe8964c15c9785ebeef98ca7Mathias Agopian#include <hardware/copybit.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 "DisplayHardware/DisplayHardware.h" 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// --------------------------------------------------------------------------- 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 420b0722f980f40e1ac0929a7f1a6e2df7af983478Mathias Agopiangralloc_module_t const* LayerBuffer::sGrallocModule = 0; 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, 47593c05ce7bcf7b6d94bd8c50da2b818cf05116b1Mathias Agopian const sp<Client>& client) 48593c05ce7bcf7b6d94bd8c50da2b818cf05116b1Mathias Agopian : LayerBaseClient(flinger, display, client), 4990daccf3fd17553209b8951e4e80144f32ab7238Mathias Agopian mNeedsBlending(false), mBlitEngine(0) 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{ 5590daccf3fd17553209b8951e4e80144f32ab7238Mathias Agopian if (mBlitEngine) { 5690daccf3fd17553209b8951e4e80144f32ab7238Mathias Agopian copybit_close(mBlitEngine); 5790daccf3fd17553209b8951e4e80144f32ab7238Mathias Agopian } 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 606cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopianvoid LayerBuffer::onFirstRef() 616cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian{ 62c6603951d45fc9b0d1776fec9444b6f31af92840Mathias Agopian LayerBaseClient::onFirstRef(); 63593c05ce7bcf7b6d94bd8c50da2b818cf05116b1Mathias Agopian mSurface = new SurfaceLayerBuffer(mFlinger, this); 640b0722f980f40e1ac0929a7f1a6e2df7af983478Mathias Agopian 650b0722f980f40e1ac0929a7f1a6e2df7af983478Mathias Agopian hw_module_t const* module = (hw_module_t const*)sGrallocModule; 660b0722f980f40e1ac0929a7f1a6e2df7af983478Mathias Agopian if (!module) { 670b0722f980f40e1ac0929a7f1a6e2df7af983478Mathias Agopian // NOTE: technically there is a race here, but it shouldn't 680b0722f980f40e1ac0929a7f1a6e2df7af983478Mathias Agopian // cause any problem since hw_get_module() always returns 690b0722f980f40e1ac0929a7f1a6e2df7af983478Mathias Agopian // the same value. 700b0722f980f40e1ac0929a7f1a6e2df7af983478Mathias Agopian if (hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &module) == 0) { 710b0722f980f40e1ac0929a7f1a6e2df7af983478Mathias Agopian sGrallocModule = (gralloc_module_t const *)module; 720b0722f980f40e1ac0929a7f1a6e2df7af983478Mathias Agopian } 730b0722f980f40e1ac0929a7f1a6e2df7af983478Mathias Agopian } 7490daccf3fd17553209b8951e4e80144f32ab7238Mathias Agopian 7590daccf3fd17553209b8951e4e80144f32ab7238Mathias Agopian if (hw_get_module(COPYBIT_HARDWARE_MODULE_ID, &module) == 0) { 7690daccf3fd17553209b8951e4e80144f32ab7238Mathias Agopian copybit_open(module, &mBlitEngine); 7790daccf3fd17553209b8951e4e80144f32ab7238Mathias Agopian } 786cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian} 796cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian 801473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopiansp<LayerBaseClient::Surface> LayerBuffer::createSurface() const 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 826cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian return mSurface; 836cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian} 846cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian 856cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopianstatus_t LayerBuffer::ditch() 866cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian{ 876cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian mSurface.clear(); 886cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian return NO_ERROR; 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool LayerBuffer::needsBlending() const { 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mNeedsBlending; 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::setNeedsBlending(bool blending) { 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNeedsBlending = blending; 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::postBuffer(ssize_t offset) 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Source> source(getSource()); 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (source != 0) 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project source->postBuffer(offset); 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::unregisterBuffers() 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Source> source(clearSource()); 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (source != 0) 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project source->unregisterBuffers(); 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectuint32_t LayerBuffer::doTransaction(uint32_t flags) 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Source> source(getSource()); 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (source != 0) 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project source->onTransaction(flags); 1184c29c9487e47c5f0a23790e670dc3dc7a215d04cMathias Agopian uint32_t res = LayerBase::doTransaction(flags); 1194c29c9487e47c5f0a23790e670dc3dc7a215d04cMathias Agopian // we always want filtering for these surfaces 120923770333574fd71674781a9a62f40e8acaf5ef1Mathias Agopian mNeedsFiltering = !(mFlags & DisplayHardware::SLOW_CONFIG); 1214c29c9487e47c5f0a23790e670dc3dc7a215d04cMathias Agopian return res; 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::unlockPageFlip(const Transform& planeTransform, 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Region& outDirtyRegion) 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // this code-path must be as tight as possible, it's called each time 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the screen is composited. 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Source> source(getSource()); 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (source != 0) 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project source->onVisibilityResolved(planeTransform); 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LayerBase::unlockPageFlip(planeTransform, outDirtyRegion); 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::onDraw(const Region& clip) 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 source->onDraw(clip); 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clearWithOpenGL(clip); 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 145a280496bd2ce04d6beff4536f2115a9a4d7568e4Mathias Agopianvoid LayerBuffer::serverDestroy() 146a280496bd2ce04d6beff4536f2115a9a4d7568e4Mathias Agopian{ 147a280496bd2ce04d6beff4536f2115a9a4d7568e4Mathias Agopian sp<Source> source(clearSource()); 148a280496bd2ce04d6beff4536f2115a9a4d7568e4Mathias Agopian if (source != 0) { 149a280496bd2ce04d6beff4536f2115a9a4d7568e4Mathias Agopian source->destroy(); 150a280496bd2ce04d6beff4536f2115a9a4d7568e4Mathias Agopian } 151a280496bd2ce04d6beff4536f2115a9a4d7568e4Mathias Agopian} 152a280496bd2ce04d6beff4536f2115a9a4d7568e4Mathias Agopian 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This creates a "buffer" source for this surface 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t LayerBuffer::registerBuffers(const ISurface::BufferHeap& buffers) 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex::Autolock _l(mLock); 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mSource != 0) 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return INVALID_OPERATION; 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<BufferSource> source = new BufferSource(*this, buffers); 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t result = source->getStatus(); 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (result == NO_ERROR) { 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSource = source; 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This creates an "overlay" source for this surface 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 174e1ceec234c618729cc7bd35fecb11744b52c1cc8Chih-Chung Changsp<OverlayRef> LayerBuffer::createOverlay(uint32_t w, uint32_t h, int32_t f, 175e1ceec234c618729cc7bd35fecb11744b52c1cc8Chih-Chung Chang int32_t orientation) 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<OverlayRef> result; 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex::Autolock _l(mLock); 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mSource != 0) 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 182e1ceec234c618729cc7bd35fecb11744b52c1cc8Chih-Chung Chang sp<OverlaySource> source = new OverlaySource(*this, &result, w, h, f, orientation); 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (result != 0) { 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSource = source; 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsp<LayerBuffer::Source> LayerBuffer::getSource() const { 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex::Autolock _l(mLock); 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mSource; 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsp<LayerBuffer::Source> LayerBuffer::clearSource() { 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Source> source; 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex::Autolock _l(mLock); 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project source = mSource; 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSource.clear(); 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return source; 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ============================================================================ 2039779b221e999583ff89e0dfc40e56398737adbb3Mathias Agopian// LayerBuffer::SurfaceLayerBuffer 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ============================================================================ 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 206593c05ce7bcf7b6d94bd8c50da2b818cf05116b1Mathias AgopianLayerBuffer::SurfaceLayerBuffer::SurfaceLayerBuffer( 207593c05ce7bcf7b6d94bd8c50da2b818cf05116b1Mathias Agopian const sp<SurfaceFlinger>& flinger, const sp<LayerBuffer>& owner) 208593c05ce7bcf7b6d94bd8c50da2b818cf05116b1Mathias Agopian : LayerBaseClient::Surface(flinger, owner->getIdentity(), owner) 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2129779b221e999583ff89e0dfc40e56398737adbb3Mathias AgopianLayerBuffer::SurfaceLayerBuffer::~SurfaceLayerBuffer() 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unregisterBuffers(); 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2179779b221e999583ff89e0dfc40e56398737adbb3Mathias Agopianstatus_t LayerBuffer::SurfaceLayerBuffer::registerBuffers( 2181473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian const ISurface::BufferHeap& buffers) 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2201473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian sp<LayerBuffer> owner(getOwner()); 2211473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian if (owner != 0) 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return owner->registerBuffers(buffers); 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_INIT; 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2269779b221e999583ff89e0dfc40e56398737adbb3Mathias Agopianvoid LayerBuffer::SurfaceLayerBuffer::postBuffer(ssize_t offset) 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2281473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian sp<LayerBuffer> owner(getOwner()); 2291473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian if (owner != 0) 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner->postBuffer(offset); 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2339779b221e999583ff89e0dfc40e56398737adbb3Mathias Agopianvoid LayerBuffer::SurfaceLayerBuffer::unregisterBuffers() 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2351473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian sp<LayerBuffer> owner(getOwner()); 2361473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian if (owner != 0) 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner->unregisterBuffers(); 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2409779b221e999583ff89e0dfc40e56398737adbb3Mathias Agopiansp<OverlayRef> LayerBuffer::SurfaceLayerBuffer::createOverlay( 241e1ceec234c618729cc7bd35fecb11744b52c1cc8Chih-Chung Chang uint32_t w, uint32_t h, int32_t format, int32_t orientation) { 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<OverlayRef> result; 2431473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian sp<LayerBuffer> owner(getOwner()); 2441473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian if (owner != 0) 245e1ceec234c618729cc7bd35fecb11744b52c1cc8Chih-Chung Chang result = owner->createOverlay(w, h, format, orientation); 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ============================================================================ 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// LayerBuffer::Buffer 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ============================================================================ 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2531d211f8ee0b422a3a741c3f88246c7c72ce483b0Mathias AgopianLayerBuffer::Buffer::Buffer(const ISurface::BufferHeap& buffers, 2541d211f8ee0b422a3a741c3f88246c7c72ce483b0Mathias Agopian ssize_t offset, size_t bufferSize) 2557323e545c8778beb6736a09a5d2c9f81b451e13fMathias Agopian : mBufferHeap(buffers), mSupportsCopybit(false) 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NativeBuffer& src(mNativeBuffer); 258d86beb99a7c9625daad01c4aaa5eaf4ca3ac2194Mathias Agopian src.crop.l = 0; 259d86beb99a7c9625daad01c4aaa5eaf4ca3ac2194Mathias Agopian src.crop.t = 0; 260d86beb99a7c9625daad01c4aaa5eaf4ca3ac2194Mathias Agopian src.crop.r = buffers.w; 261d86beb99a7c9625daad01c4aaa5eaf4ca3ac2194Mathias Agopian src.crop.b = buffers.h; 262d86beb99a7c9625daad01c4aaa5eaf4ca3ac2194Mathias Agopian 263d86beb99a7c9625daad01c4aaa5eaf4ca3ac2194Mathias Agopian src.img.w = buffers.hor_stride ?: buffers.w; 264d86beb99a7c9625daad01c4aaa5eaf4ca3ac2194Mathias Agopian src.img.h = buffers.ver_stride ?: buffers.h; 265d86beb99a7c9625daad01c4aaa5eaf4ca3ac2194Mathias Agopian src.img.format = buffers.format; 266d86beb99a7c9625daad01c4aaa5eaf4ca3ac2194Mathias Agopian src.img.base = (void*)(intptr_t(buffers.heap->base()) + offset); 267d86beb99a7c9625daad01c4aaa5eaf4ca3ac2194Mathias Agopian src.img.handle = 0; 2680b0722f980f40e1ac0929a7f1a6e2df7af983478Mathias Agopian 2690b0722f980f40e1ac0929a7f1a6e2df7af983478Mathias Agopian gralloc_module_t const * module = LayerBuffer::getGrallocModule(); 2700b0722f980f40e1ac0929a7f1a6e2df7af983478Mathias Agopian if (module && module->perform) { 2710b0722f980f40e1ac0929a7f1a6e2df7af983478Mathias Agopian int err = module->perform(module, 2720b0722f980f40e1ac0929a7f1a6e2df7af983478Mathias Agopian GRALLOC_MODULE_PERFORM_CREATE_HANDLE_FROM_BUFFER, 2731d211f8ee0b422a3a741c3f88246c7c72ce483b0Mathias Agopian buffers.heap->heapID(), bufferSize, 2740b0722f980f40e1ac0929a7f1a6e2df7af983478Mathias Agopian offset, buffers.heap->base(), 2750b0722f980f40e1ac0929a7f1a6e2df7af983478Mathias Agopian &src.img.handle); 2760b0722f980f40e1ac0929a7f1a6e2df7af983478Mathias Agopian 2777323e545c8778beb6736a09a5d2c9f81b451e13fMathias Agopian // we can fail here is the passed buffer is purely software 2787323e545c8778beb6736a09a5d2c9f81b451e13fMathias Agopian mSupportsCopybit = (err == NO_ERROR); 2790b0722f980f40e1ac0929a7f1a6e2df7af983478Mathias Agopian } 280d86beb99a7c9625daad01c4aaa5eaf4ca3ac2194Mathias Agopian } 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLayerBuffer::Buffer::~Buffer() 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2842eab9d8d7034ef05cead1ee26667a75061b5f0aaMathias Agopian NativeBuffer& src(mNativeBuffer); 2850b0722f980f40e1ac0929a7f1a6e2df7af983478Mathias Agopian if (src.img.handle) { 2860b0722f980f40e1ac0929a7f1a6e2df7af983478Mathias Agopian native_handle_delete(src.img.handle); 2870b0722f980f40e1ac0929a7f1a6e2df7af983478Mathias Agopian } 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ============================================================================ 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// LayerBuffer::Source 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// LayerBuffer::BufferSource 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// LayerBuffer::OverlaySource 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ============================================================================ 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLayerBuffer::Source::Source(LayerBuffer& layer) 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : mLayer(layer) 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLayerBuffer::Source::~Source() { 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::Source::onDraw(const Region& clip) const { 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::Source::onTransaction(uint32_t flags) { 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::Source::onVisibilityResolved( 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const Transform& planeTransform) { 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::Source::postBuffer(ssize_t offset) { 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::Source::unregisterBuffers() { 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// --------------------------------------------------------------------------- 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLayerBuffer::BufferSource::BufferSource(LayerBuffer& layer, 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const ISurface::BufferHeap& buffers) 318781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian : Source(layer), mStatus(NO_ERROR), mBufferSize(0) 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (buffers.heap == NULL) { 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // this is allowed, but in this case, it is illegal to receive 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // postBuffer(). The surface just erases the framebuffer with 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // fully transparent pixels. 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBufferHeap = buffers; 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayer.setNeedsBlending(false); 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t err = (buffers.heap->heapID() >= 0) ? NO_ERROR : NO_INIT; 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("LayerBuffer::BufferSource: invalid heap (%s)", strerror(err)); 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStatus = err; 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PixelFormatInfo info; 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = getPixelFormatInfo(buffers.format, &info); 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("LayerBuffer::BufferSource: invalid format %d (%s)", 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffers.format, 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 if (buffers.hor_stride<0 || buffers.ver_stride<0) { 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("LayerBuffer::BufferSource: invalid parameters " 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "(w=%d, h=%d, xs=%d, ys=%d)", 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffers.w, buffers.h, buffers.hor_stride, buffers.ver_stride); 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStatus = BAD_VALUE; 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBufferHeap = buffers; 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayer.setNeedsBlending((info.h_alpha - info.l_alpha) > 0); 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBufferSize = info.getScanlineSize(buffers.hor_stride)*buffers.ver_stride; 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayer.forceVisibilityTransaction(); 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLayerBuffer::BufferSource::~BufferSource() 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3612d41cb9433ef3845560a252a5cf8226e1d78209aMathias Agopian class MessageDestroyTexture : public MessageBase { 3622d41cb9433ef3845560a252a5cf8226e1d78209aMathias Agopian SurfaceFlinger* flinger; 3632d41cb9433ef3845560a252a5cf8226e1d78209aMathias Agopian GLuint name; 3642d41cb9433ef3845560a252a5cf8226e1d78209aMathias Agopian public: 3652d41cb9433ef3845560a252a5cf8226e1d78209aMathias Agopian MessageDestroyTexture( 3662d41cb9433ef3845560a252a5cf8226e1d78209aMathias Agopian SurfaceFlinger* flinger, GLuint name) 3672d41cb9433ef3845560a252a5cf8226e1d78209aMathias Agopian : flinger(flinger), name(name) { } 3682d41cb9433ef3845560a252a5cf8226e1d78209aMathias Agopian virtual bool handler() { 3692d41cb9433ef3845560a252a5cf8226e1d78209aMathias Agopian glDeleteTextures(1, &name); 3702d41cb9433ef3845560a252a5cf8226e1d78209aMathias Agopian return true; 3712d41cb9433ef3845560a252a5cf8226e1d78209aMathias Agopian } 3722d41cb9433ef3845560a252a5cf8226e1d78209aMathias Agopian }; 3732d41cb9433ef3845560a252a5cf8226e1d78209aMathias Agopian 374999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian if (mTexture.name != -1U) { 3752d41cb9433ef3845560a252a5cf8226e1d78209aMathias Agopian // GL textures can only be destroyed from the GL thread 376781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian getFlinger()->mEventQueue.postMessage( 377781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian new MessageDestroyTexture(getFlinger(), mTexture.name) ); 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3799042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian if (mTexture.image != EGL_NO_IMAGE_KHR) { 380781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian EGLDisplay dpy(getFlinger()->graphicPlane(0).getEGLDisplay()); 3819042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian eglDestroyImageKHR(dpy, mTexture.image); 38268eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian } 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::BufferSource::postBuffer(ssize_t offset) 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ISurface::BufferHeap buffers; 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { // scope for the lock 389b34d143bce3905c23aa5c1b2b147ec6df48cf9d7Mathias Agopian Mutex::Autolock _l(mBufferSourceLock); 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffers = mBufferHeap; 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (buffers.heap != 0) { 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const size_t memorySize = buffers.heap->getSize(); 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((size_t(offset) + mBufferSize) > memorySize) { 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("LayerBuffer::BufferSource::postBuffer() " 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "invalid buffer (offset=%d, size=%d, heap-size=%d", 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int(offset), int(mBufferSize), int(memorySize)); 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Buffer> buffer; 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (buffers.heap != 0) { 4041d211f8ee0b422a3a741c3f88246c7c72ce483b0Mathias Agopian buffer = new LayerBuffer::Buffer(buffers, offset, mBufferSize); 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (buffer->getStatus() != NO_ERROR) 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffer.clear(); 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setBuffer(buffer); 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayer.invalidate(); 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::BufferSource::unregisterBuffers() 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 414b34d143bce3905c23aa5c1b2b147ec6df48cf9d7Mathias Agopian Mutex::Autolock _l(mBufferSourceLock); 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBufferHeap.heap.clear(); 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBuffer.clear(); 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayer.invalidate(); 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsp<LayerBuffer::Buffer> LayerBuffer::BufferSource::getBuffer() const 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 422b34d143bce3905c23aa5c1b2b147ec6df48cf9d7Mathias Agopian Mutex::Autolock _l(mBufferSourceLock); 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mBuffer; 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::BufferSource::setBuffer(const sp<LayerBuffer::Buffer>& buffer) 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 428b34d143bce3905c23aa5c1b2b147ec6df48cf9d7Mathias Agopian Mutex::Autolock _l(mBufferSourceLock); 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBuffer = buffer; 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::BufferSource::onDraw(const Region& clip) const 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 434999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian sp<Buffer> ourBuffer(getBuffer()); 435999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian if (UNLIKELY(ourBuffer == 0)) { 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // nothing to do, we don't have a buffer 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayer.clearWithOpenGL(clip); 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 441cbc4c9f8d56317b2fe8964c15c9785ebeef98ca7Mathias Agopian status_t err = NO_ERROR; 442cbc4c9f8d56317b2fe8964c15c9785ebeef98ca7Mathias Agopian NativeBuffer src(ourBuffer->getBuffer()); 443a280496bd2ce04d6beff4536f2115a9a4d7568e4Mathias Agopian const Rect transformedBounds(mLayer.getTransformedBounds()); 4448f78faa1ef7e2436d11e4c04be67b5a95bf126b9Mathias Agopian 4459042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian#if defined(EGL_ANDROID_image_native_buffer) 446781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian if (GLExtensions::getInstance().haveDirectTexture()) { 447fcdd394f3b25e336a3ff55960b695bc0943d4d3dMathias Agopian err = INVALID_OPERATION; 448fcdd394f3b25e336a3ff55960b695bc0943d4d3dMathias Agopian if (ourBuffer->supportsCopybit()) { 449fcdd394f3b25e336a3ff55960b695bc0943d4d3dMathias Agopian copybit_device_t* copybit = mLayer.mBlitEngine; 450fcdd394f3b25e336a3ff55960b695bc0943d4d3dMathias Agopian if (copybit && err != NO_ERROR) { 451fcdd394f3b25e336a3ff55960b695bc0943d4d3dMathias Agopian // create our EGLImageKHR the first time 452fcdd394f3b25e336a3ff55960b695bc0943d4d3dMathias Agopian err = initTempBuffer(); 453fcdd394f3b25e336a3ff55960b695bc0943d4d3dMathias Agopian if (err == NO_ERROR) { 454fcdd394f3b25e336a3ff55960b695bc0943d4d3dMathias Agopian // NOTE: Assume the buffer is allocated with the proper USAGE flags 455fcdd394f3b25e336a3ff55960b695bc0943d4d3dMathias Agopian const NativeBuffer& dst(mTempBuffer); 456fcdd394f3b25e336a3ff55960b695bc0943d4d3dMathias Agopian region_iterator clip(Region(Rect(dst.crop.r, dst.crop.b))); 457fcdd394f3b25e336a3ff55960b695bc0943d4d3dMathias Agopian copybit->set_parameter(copybit, COPYBIT_TRANSFORM, 0); 458fcdd394f3b25e336a3ff55960b695bc0943d4d3dMathias Agopian copybit->set_parameter(copybit, COPYBIT_PLANE_ALPHA, 0xFF); 459fcdd394f3b25e336a3ff55960b695bc0943d4d3dMathias Agopian copybit->set_parameter(copybit, COPYBIT_DITHER, COPYBIT_ENABLE); 460fcdd394f3b25e336a3ff55960b695bc0943d4d3dMathias Agopian err = copybit->stretch(copybit, &dst.img, &src.img, 461fcdd394f3b25e336a3ff55960b695bc0943d4d3dMathias Agopian &dst.crop, &src.crop, &clip); 462fcdd394f3b25e336a3ff55960b695bc0943d4d3dMathias Agopian if (err != NO_ERROR) { 463fcdd394f3b25e336a3ff55960b695bc0943d4d3dMathias Agopian clearTempBufferImage(); 464fcdd394f3b25e336a3ff55960b695bc0943d4d3dMathias Agopian } 465d2832fb4154771e42f7a4fdb8286ac85827ebe9dMathias Agopian } 46690daccf3fd17553209b8951e4e80144f32ab7238Mathias Agopian } 46790daccf3fd17553209b8951e4e80144f32ab7238Mathias Agopian } 468cbc4c9f8d56317b2fe8964c15c9785ebeef98ca7Mathias Agopian } 46926c28b16f3464eeb98b091b915ccf494ac31c35fMathias Agopian#endif 4709042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian else { 4719042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian err = INVALID_OPERATION; 4729042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian } 4739042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian 4749042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian if (err != NO_ERROR) { 475f007a2faa1d765e9b53553a8214179b253e3cbbdMathias Agopian // slower fallback 476999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian GGLSurface t; 477999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian t.version = sizeof(GGLSurface); 478999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian t.width = src.crop.r; 479999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian t.height = src.crop.b; 480999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian t.stride = src.img.w; 481999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian t.vstride= src.img.h; 482999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian t.format = src.img.format; 4832eab9d8d7034ef05cead1ee26667a75061b5f0aaMathias Agopian t.data = (GGLubyte*)src.img.base; 484999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian const Region dirty(Rect(t.width, t.height)); 4859f2c4fd9a14ea79e4cbbd3ab8925794711a6411cMathias Agopian mTextureManager.loadTexture(&mTexture, dirty, t); 486dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian } 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 488e96aa3e859cb747e241dfa2999fcd142a688ed57Mathias Agopian mLayer.setBufferTransform(mBufferHeap.transform); 4899042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian mLayer.drawWithOpenGL(clip, mTexture); 4909042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian} 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 49276169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopianstatus_t LayerBuffer::BufferSource::initTempBuffer() const 49376169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian{ 49476169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian // figure out the size we need now 49576169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian const ISurface::BufferHeap& buffers(mBufferHeap); 49676169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian uint32_t w = mLayer.mTransformedBounds.width(); 49776169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian uint32_t h = mLayer.mTransformedBounds.height(); 49876169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian if (buffers.w * h != buffers.h * w) { 49976169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian int t = w; w = h; h = t; 50076169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian } 50176169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian 502d23fa27630c3756216dc64cbb8518af49c60ce34Mathias Agopian // we're in the copybit case, so make sure we can handle this blit 503d23fa27630c3756216dc64cbb8518af49c60ce34Mathias Agopian // we don't have to keep the aspect ratio here 504d23fa27630c3756216dc64cbb8518af49c60ce34Mathias Agopian copybit_device_t* copybit = mLayer.mBlitEngine; 505d23fa27630c3756216dc64cbb8518af49c60ce34Mathias Agopian const int down = copybit->get(copybit, COPYBIT_MINIFICATION_LIMIT); 506d23fa27630c3756216dc64cbb8518af49c60ce34Mathias Agopian const int up = copybit->get(copybit, COPYBIT_MAGNIFICATION_LIMIT); 507d23fa27630c3756216dc64cbb8518af49c60ce34Mathias Agopian if (buffers.w > w*down) w = buffers.w / down; 508d23fa27630c3756216dc64cbb8518af49c60ce34Mathias Agopian else if (w > buffers.w*up) w = buffers.w*up; 509d23fa27630c3756216dc64cbb8518af49c60ce34Mathias Agopian if (buffers.h > h*down) h = buffers.h / down; 510d23fa27630c3756216dc64cbb8518af49c60ce34Mathias Agopian else if (h > buffers.h*up) h = buffers.h*up; 511d23fa27630c3756216dc64cbb8518af49c60ce34Mathias Agopian 51276169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian if (mTexture.image != EGL_NO_IMAGE_KHR) { 51376169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian // we have an EGLImage, make sure the needed size didn't change 51476169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian if (w!=mTexture.width || h!= mTexture.height) { 51576169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian // delete the EGLImage and texture 516d2832fb4154771e42f7a4fdb8286ac85827ebe9dMathias Agopian clearTempBufferImage(); 51776169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian } else { 51876169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian // we're good, we have an EGLImageKHR and it's (still) the 51976169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian // right size 52076169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian return NO_ERROR; 52176169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian } 52276169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian } 52376169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian 52476169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian // figure out if we need linear filtering 52576169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian if (buffers.w * h == buffers.h * w) { 52676169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian // same pixel area, don't use filtering 527923770333574fd71674781a9a62f40e8acaf5ef1Mathias Agopian mLayer.mNeedsFiltering = false; 52876169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian } 52976169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian 53076169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian // Allocate a temporary buffer and create the corresponding EGLImageKHR 53108956f04c628bd4d15c26b06af5beecf167deefdMathias Agopian // once the EGLImage has been created we don't need the 53208956f04c628bd4d15c26b06af5beecf167deefdMathias Agopian // graphic buffer reference anymore. 53308956f04c628bd4d15c26b06af5beecf167deefdMathias Agopian sp<GraphicBuffer> buffer = new GraphicBuffer( 53476169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian w, h, HAL_PIXEL_FORMAT_RGB_565, 53576169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian GraphicBuffer::USAGE_HW_TEXTURE | 53676169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian GraphicBuffer::USAGE_HW_2D); 53776169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian 53808956f04c628bd4d15c26b06af5beecf167deefdMathias Agopian status_t err = buffer->initCheck(); 53976169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian if (err == NO_ERROR) { 54076169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian NativeBuffer& dst(mTempBuffer); 54108956f04c628bd4d15c26b06af5beecf167deefdMathias Agopian dst.img.w = buffer->getStride(); 54276169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian dst.img.h = h; 54308956f04c628bd4d15c26b06af5beecf167deefdMathias Agopian dst.img.format = buffer->getPixelFormat(); 54408956f04c628bd4d15c26b06af5beecf167deefdMathias Agopian dst.img.handle = (native_handle_t *)buffer->handle; 54576169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian dst.img.base = 0; 54676169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian dst.crop.l = 0; 54776169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian dst.crop.t = 0; 54876169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian dst.crop.r = w; 54976169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian dst.crop.b = h; 55076169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian 551781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian EGLDisplay dpy(getFlinger()->graphicPlane(0).getEGLDisplay()); 5529f2c4fd9a14ea79e4cbbd3ab8925794711a6411cMathias Agopian err = mTextureManager.initEglImage(&mTexture, dpy, buffer); 55376169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian } 55476169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian 55576169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian return err; 55676169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian} 55776169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian 558d2832fb4154771e42f7a4fdb8286ac85827ebe9dMathias Agopianvoid LayerBuffer::BufferSource::clearTempBufferImage() const 559d2832fb4154771e42f7a4fdb8286ac85827ebe9dMathias Agopian{ 560a1a1798599361f5f1db8fe612606323c801f4f6cMathias Agopian // delete the image 561781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian EGLDisplay dpy(getFlinger()->graphicPlane(0).getEGLDisplay()); 562d2832fb4154771e42f7a4fdb8286ac85827ebe9dMathias Agopian eglDestroyImageKHR(dpy, mTexture.image); 563a1a1798599361f5f1db8fe612606323c801f4f6cMathias Agopian 564a1a1798599361f5f1db8fe612606323c801f4f6cMathias Agopian // and the associated texture (recreate a name) 565a1a1798599361f5f1db8fe612606323c801f4f6cMathias Agopian glDeleteTextures(1, &mTexture.name); 566d2832fb4154771e42f7a4fdb8286ac85827ebe9dMathias Agopian Texture defaultTexture; 567d2832fb4154771e42f7a4fdb8286ac85827ebe9dMathias Agopian mTexture = defaultTexture; 568d2832fb4154771e42f7a4fdb8286ac85827ebe9dMathias Agopian} 569d2832fb4154771e42f7a4fdb8286ac85827ebe9dMathias Agopian 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// --------------------------------------------------------------------------- 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLayerBuffer::OverlaySource::OverlaySource(LayerBuffer& layer, 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<OverlayRef>* overlayRef, 574e1ceec234c618729cc7bd35fecb11744b52c1cc8Chih-Chung Chang uint32_t w, uint32_t h, int32_t format, int32_t orientation) 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : Source(layer), mVisibilityChanged(false), 576e1ceec234c618729cc7bd35fecb11744b52c1cc8Chih-Chung Chang mOverlay(0), mOverlayHandle(0), mOverlayDevice(0), mOrientation(orientation) 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 578781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian overlay_control_device_t* overlay_dev = getFlinger()->getOverlayEngine(); 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (overlay_dev == NULL) { 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // overlays not supported 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOverlayDevice = overlay_dev; 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project overlay_t* overlay = overlay_dev->createOverlay(overlay_dev, w, h, format); 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (overlay == NULL) { 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // couldn't create the overlay (no memory? no more overlays?) 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // enable dithering... 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project overlay_dev->setParameter(overlay_dev, overlay, 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project OVERLAY_DITHER, OVERLAY_ENABLE); 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOverlay = overlay; 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWidth = overlay->w; 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHeight = overlay->h; 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFormat = overlay->format; 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWidthStride = overlay->w_stride; 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHeightStride = overlay->h_stride; 60143ab76389ead0ef90e3d4fa883d5a58c34a6801bRebecca Schultz Zavin mInitialized = false; 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOverlayHandle = overlay->getHandleRef(overlay); 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 605a280496bd2ce04d6beff4536f2115a9a4d7568e4Mathias Agopian sp<OverlayChannel> channel = new OverlayChannel( &layer ); 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *overlayRef = new OverlayRef(mOverlayHandle, channel, 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWidth, mHeight, mFormat, mWidthStride, mHeightStride); 609781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian getFlinger()->signalEvent(); 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLayerBuffer::OverlaySource::~OverlaySource() 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOverlay && mOverlayDevice) { 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project overlay_control_device_t* overlay_dev = mOverlayDevice; 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project overlay_dev->destroyOverlay(overlay_dev, mOverlay); 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6207ac5e698b216a1b1af97405b43adf2ad5bc40e7dRebecca Schultz Zavinvoid LayerBuffer::OverlaySource::onDraw(const Region& clip) const 6217ac5e698b216a1b1af97405b43adf2ad5bc40e7dRebecca Schultz Zavin{ 6228ae0384a78ee2b66a91a13fe1c2a80f0642feacdMathias Agopian // this would be where the color-key would be set, should we need it. 6230d3c0063aa998bc32e7f22114e38a0f8df61ad65Mathias Agopian GLclampf red = 0; 6240d3c0063aa998bc32e7f22114e38a0f8df61ad65Mathias Agopian GLclampf green = 0; 6250d3c0063aa998bc32e7f22114e38a0f8df61ad65Mathias Agopian GLclampf blue = 0; 626c8546781ff6fa26b3a7f2d1483db363f299a3898Rebecca Schultz Zavin mLayer.clearWithOpenGL(clip, red, green, blue, 0); 6277ac5e698b216a1b1af97405b43adf2ad5bc40e7dRebecca Schultz Zavin} 6287ac5e698b216a1b1af97405b43adf2ad5bc40e7dRebecca Schultz Zavin 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::OverlaySource::onTransaction(uint32_t flags) 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const Layer::State& front(mLayer.drawingState()); 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const Layer::State& temp(mLayer.currentState()); 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (temp.sequence != front.sequence) { 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mVisibilityChanged = true; 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::OverlaySource::onVisibilityResolved( 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const Transform& planeTransform) 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // this code-path must be as tight as possible, it's called each time 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the screen is composited. 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (UNLIKELY(mOverlay != 0)) { 64443ab76389ead0ef90e3d4fa883d5a58c34a6801bRebecca Schultz Zavin if (mVisibilityChanged || !mInitialized) { 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mVisibilityChanged = false; 64643ab76389ead0ef90e3d4fa883d5a58c34a6801bRebecca Schultz Zavin mInitialized = true; 647a280496bd2ce04d6beff4536f2115a9a4d7568e4Mathias Agopian const Rect bounds(mLayer.getTransformedBounds()); 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int x = bounds.left; 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int y = bounds.top; 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int w = bounds.width(); 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int h = bounds.height(); 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // we need a lock here to protect "destroy" 654b34d143bce3905c23aa5c1b2b147ec6df48cf9d7Mathias Agopian Mutex::Autolock _l(mOverlaySourceLock); 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOverlay) { 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project overlay_control_device_t* overlay_dev = mOverlayDevice; 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project overlay_dev->setPosition(overlay_dev, mOverlay, x,y,w,h); 658e1ceec234c618729cc7bd35fecb11744b52c1cc8Chih-Chung Chang // we need to combine the layer orientation and the 659e1ceec234c618729cc7bd35fecb11744b52c1cc8Chih-Chung Chang // user-requested orientation. 660e1ceec234c618729cc7bd35fecb11744b52c1cc8Chih-Chung Chang Transform finalTransform = Transform(mOrientation) * 661e1ceec234c618729cc7bd35fecb11744b52c1cc8Chih-Chung Chang Transform(mLayer.getOrientation()); 66243ab76389ead0ef90e3d4fa883d5a58c34a6801bRebecca Schultz Zavin overlay_dev->setParameter(overlay_dev, mOverlay, 663e1ceec234c618729cc7bd35fecb11744b52c1cc8Chih-Chung Chang OVERLAY_TRANSFORM, finalTransform.getOrientation()); 6647ac5e698b216a1b1af97405b43adf2ad5bc40e7dRebecca Schultz Zavin overlay_dev->commit(overlay_dev, mOverlay); 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 670a280496bd2ce04d6beff4536f2115a9a4d7568e4Mathias Agopianvoid LayerBuffer::OverlaySource::destroy() 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // we need a lock here to protect "onVisibilityResolved" 673b34d143bce3905c23aa5c1b2b147ec6df48cf9d7Mathias Agopian Mutex::Autolock _l(mOverlaySourceLock); 674a280496bd2ce04d6beff4536f2115a9a4d7568e4Mathias Agopian if (mOverlay && mOverlayDevice) { 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project overlay_control_device_t* overlay_dev = mOverlayDevice; 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project overlay_dev->destroyOverlay(overlay_dev, mOverlay); 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOverlay = 0; 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// --------------------------------------------------------------------------- 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android 683