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 135c57b15c9c8dfb31e3c1ffcadd0e1522bf76dedd2Mathias Agopianvoid LayerBuffer::validateVisibility(const Transform& globalTransform) 136c57b15c9c8dfb31e3c1ffcadd0e1522bf76dedd2Mathias Agopian{ 137c57b15c9c8dfb31e3c1ffcadd0e1522bf76dedd2Mathias Agopian sp<Source> source(getSource()); 138c57b15c9c8dfb31e3c1ffcadd0e1522bf76dedd2Mathias Agopian if (source != 0) 139c57b15c9c8dfb31e3c1ffcadd0e1522bf76dedd2Mathias Agopian source->onvalidateVisibility(globalTransform); 140c57b15c9c8dfb31e3c1ffcadd0e1522bf76dedd2Mathias Agopian LayerBase::validateVisibility(globalTransform); 141c57b15c9c8dfb31e3c1ffcadd0e1522bf76dedd2Mathias Agopian} 142c57b15c9c8dfb31e3c1ffcadd0e1522bf76dedd2Mathias Agopian 143597c7f67b5f2491c6098a1de241a3f0fd274688aMathias Agopianvoid LayerBuffer::drawForSreenShot() const 144597c7f67b5f2491c6098a1de241a3f0fd274688aMathias Agopian{ 145597c7f67b5f2491c6098a1de241a3f0fd274688aMathias Agopian const DisplayHardware& hw(graphicPlane(0).displayHardware()); 146597c7f67b5f2491c6098a1de241a3f0fd274688aMathias Agopian clearWithOpenGL( Region(hw.bounds()) ); 147597c7f67b5f2491c6098a1de241a3f0fd274688aMathias Agopian} 148597c7f67b5f2491c6098a1de241a3f0fd274688aMathias Agopian 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::onDraw(const Region& clip) const 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Source> source(getSource()); 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (LIKELY(source != 0)) { 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project source->onDraw(clip); 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clearWithOpenGL(clip); 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 159a280496bd2ce04d6beff4536f2115a9a4d7568e4Mathias Agopianvoid LayerBuffer::serverDestroy() 160a280496bd2ce04d6beff4536f2115a9a4d7568e4Mathias Agopian{ 161a280496bd2ce04d6beff4536f2115a9a4d7568e4Mathias Agopian sp<Source> source(clearSource()); 162a280496bd2ce04d6beff4536f2115a9a4d7568e4Mathias Agopian if (source != 0) { 163a280496bd2ce04d6beff4536f2115a9a4d7568e4Mathias Agopian source->destroy(); 164a280496bd2ce04d6beff4536f2115a9a4d7568e4Mathias Agopian } 165a280496bd2ce04d6beff4536f2115a9a4d7568e4Mathias Agopian} 166a280496bd2ce04d6beff4536f2115a9a4d7568e4Mathias Agopian 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This creates a "buffer" source for this surface 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t LayerBuffer::registerBuffers(const ISurface::BufferHeap& buffers) 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex::Autolock _l(mLock); 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mSource != 0) 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return INVALID_OPERATION; 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<BufferSource> source = new BufferSource(*this, buffers); 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t result = source->getStatus(); 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (result == NO_ERROR) { 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSource = source; 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This creates an "overlay" source for this surface 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 188e1ceec234c618729cc7bd35fecb11744b52c1cc8Chih-Chung Changsp<OverlayRef> LayerBuffer::createOverlay(uint32_t w, uint32_t h, int32_t f, 189e1ceec234c618729cc7bd35fecb11744b52c1cc8Chih-Chung Chang int32_t orientation) 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<OverlayRef> result; 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex::Autolock _l(mLock); 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mSource != 0) 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 196e1ceec234c618729cc7bd35fecb11744b52c1cc8Chih-Chung Chang sp<OverlaySource> source = new OverlaySource(*this, &result, w, h, f, orientation); 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (result != 0) { 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSource = source; 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsp<LayerBuffer::Source> LayerBuffer::getSource() const { 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex::Autolock _l(mLock); 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mSource; 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsp<LayerBuffer::Source> LayerBuffer::clearSource() { 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Source> source; 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex::Autolock _l(mLock); 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project source = mSource; 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSource.clear(); 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return source; 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ============================================================================ 2179779b221e999583ff89e0dfc40e56398737adbb3Mathias Agopian// LayerBuffer::SurfaceLayerBuffer 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ============================================================================ 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 220593c05ce7bcf7b6d94bd8c50da2b818cf05116b1Mathias AgopianLayerBuffer::SurfaceLayerBuffer::SurfaceLayerBuffer( 221593c05ce7bcf7b6d94bd8c50da2b818cf05116b1Mathias Agopian const sp<SurfaceFlinger>& flinger, const sp<LayerBuffer>& owner) 222593c05ce7bcf7b6d94bd8c50da2b818cf05116b1Mathias Agopian : LayerBaseClient::Surface(flinger, owner->getIdentity(), owner) 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2269779b221e999583ff89e0dfc40e56398737adbb3Mathias AgopianLayerBuffer::SurfaceLayerBuffer::~SurfaceLayerBuffer() 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unregisterBuffers(); 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2319779b221e999583ff89e0dfc40e56398737adbb3Mathias Agopianstatus_t LayerBuffer::SurfaceLayerBuffer::registerBuffers( 2321473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian const ISurface::BufferHeap& buffers) 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2341473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian sp<LayerBuffer> owner(getOwner()); 2351473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian if (owner != 0) 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return owner->registerBuffers(buffers); 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_INIT; 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2409779b221e999583ff89e0dfc40e56398737adbb3Mathias Agopianvoid LayerBuffer::SurfaceLayerBuffer::postBuffer(ssize_t offset) 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2421473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian sp<LayerBuffer> owner(getOwner()); 2431473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian if (owner != 0) 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner->postBuffer(offset); 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2479779b221e999583ff89e0dfc40e56398737adbb3Mathias Agopianvoid LayerBuffer::SurfaceLayerBuffer::unregisterBuffers() 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2491473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian sp<LayerBuffer> owner(getOwner()); 2501473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian if (owner != 0) 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner->unregisterBuffers(); 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2549779b221e999583ff89e0dfc40e56398737adbb3Mathias Agopiansp<OverlayRef> LayerBuffer::SurfaceLayerBuffer::createOverlay( 255e1ceec234c618729cc7bd35fecb11744b52c1cc8Chih-Chung Chang uint32_t w, uint32_t h, int32_t format, int32_t orientation) { 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<OverlayRef> result; 2571473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian sp<LayerBuffer> owner(getOwner()); 2581473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian if (owner != 0) 259e1ceec234c618729cc7bd35fecb11744b52c1cc8Chih-Chung Chang result = owner->createOverlay(w, h, format, orientation); 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ============================================================================ 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// LayerBuffer::Buffer 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ============================================================================ 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2671d211f8ee0b422a3a741c3f88246c7c72ce483b0Mathias AgopianLayerBuffer::Buffer::Buffer(const ISurface::BufferHeap& buffers, 2681d211f8ee0b422a3a741c3f88246c7c72ce483b0Mathias Agopian ssize_t offset, size_t bufferSize) 2697323e545c8778beb6736a09a5d2c9f81b451e13fMathias Agopian : mBufferHeap(buffers), mSupportsCopybit(false) 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NativeBuffer& src(mNativeBuffer); 272d86beb99a7c9625daad01c4aaa5eaf4ca3ac2194Mathias Agopian src.crop.l = 0; 273d86beb99a7c9625daad01c4aaa5eaf4ca3ac2194Mathias Agopian src.crop.t = 0; 274d86beb99a7c9625daad01c4aaa5eaf4ca3ac2194Mathias Agopian src.crop.r = buffers.w; 275d86beb99a7c9625daad01c4aaa5eaf4ca3ac2194Mathias Agopian src.crop.b = buffers.h; 276d86beb99a7c9625daad01c4aaa5eaf4ca3ac2194Mathias Agopian 277d86beb99a7c9625daad01c4aaa5eaf4ca3ac2194Mathias Agopian src.img.w = buffers.hor_stride ?: buffers.w; 278d86beb99a7c9625daad01c4aaa5eaf4ca3ac2194Mathias Agopian src.img.h = buffers.ver_stride ?: buffers.h; 279d86beb99a7c9625daad01c4aaa5eaf4ca3ac2194Mathias Agopian src.img.format = buffers.format; 280d86beb99a7c9625daad01c4aaa5eaf4ca3ac2194Mathias Agopian src.img.base = (void*)(intptr_t(buffers.heap->base()) + offset); 281d86beb99a7c9625daad01c4aaa5eaf4ca3ac2194Mathias Agopian src.img.handle = 0; 2820b0722f980f40e1ac0929a7f1a6e2df7af983478Mathias Agopian 2830b0722f980f40e1ac0929a7f1a6e2df7af983478Mathias Agopian gralloc_module_t const * module = LayerBuffer::getGrallocModule(); 2840b0722f980f40e1ac0929a7f1a6e2df7af983478Mathias Agopian if (module && module->perform) { 2850b0722f980f40e1ac0929a7f1a6e2df7af983478Mathias Agopian int err = module->perform(module, 2860b0722f980f40e1ac0929a7f1a6e2df7af983478Mathias Agopian GRALLOC_MODULE_PERFORM_CREATE_HANDLE_FROM_BUFFER, 2871d211f8ee0b422a3a741c3f88246c7c72ce483b0Mathias Agopian buffers.heap->heapID(), bufferSize, 2880b0722f980f40e1ac0929a7f1a6e2df7af983478Mathias Agopian offset, buffers.heap->base(), 2890b0722f980f40e1ac0929a7f1a6e2df7af983478Mathias Agopian &src.img.handle); 2900b0722f980f40e1ac0929a7f1a6e2df7af983478Mathias Agopian 2917323e545c8778beb6736a09a5d2c9f81b451e13fMathias Agopian // we can fail here is the passed buffer is purely software 2927323e545c8778beb6736a09a5d2c9f81b451e13fMathias Agopian mSupportsCopybit = (err == NO_ERROR); 2930b0722f980f40e1ac0929a7f1a6e2df7af983478Mathias Agopian } 294d86beb99a7c9625daad01c4aaa5eaf4ca3ac2194Mathias Agopian } 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLayerBuffer::Buffer::~Buffer() 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2982eab9d8d7034ef05cead1ee26667a75061b5f0aaMathias Agopian NativeBuffer& src(mNativeBuffer); 2990b0722f980f40e1ac0929a7f1a6e2df7af983478Mathias Agopian if (src.img.handle) { 3000b0722f980f40e1ac0929a7f1a6e2df7af983478Mathias Agopian native_handle_delete(src.img.handle); 3010b0722f980f40e1ac0929a7f1a6e2df7af983478Mathias Agopian } 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ============================================================================ 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// LayerBuffer::Source 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// LayerBuffer::BufferSource 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// LayerBuffer::OverlaySource 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ============================================================================ 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLayerBuffer::Source::Source(LayerBuffer& layer) 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : mLayer(layer) 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLayerBuffer::Source::~Source() { 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::Source::onDraw(const Region& clip) const { 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::Source::onTransaction(uint32_t flags) { 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::Source::onVisibilityResolved( 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const Transform& planeTransform) { 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::Source::postBuffer(ssize_t offset) { 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::Source::unregisterBuffers() { 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// --------------------------------------------------------------------------- 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLayerBuffer::BufferSource::BufferSource(LayerBuffer& layer, 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const ISurface::BufferHeap& buffers) 332781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian : Source(layer), mStatus(NO_ERROR), mBufferSize(0) 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (buffers.heap == NULL) { 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // this is allowed, but in this case, it is illegal to receive 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // postBuffer(). The surface just erases the framebuffer with 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // fully transparent pixels. 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBufferHeap = buffers; 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayer.setNeedsBlending(false); 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t err = (buffers.heap->heapID() >= 0) ? NO_ERROR : NO_INIT; 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("LayerBuffer::BufferSource: invalid heap (%s)", strerror(err)); 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStatus = err; 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PixelFormatInfo info; 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = getPixelFormatInfo(buffers.format, &info); 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("LayerBuffer::BufferSource: invalid format %d (%s)", 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffers.format, strerror(err)); 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStatus = err; 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (buffers.hor_stride<0 || buffers.ver_stride<0) { 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("LayerBuffer::BufferSource: invalid parameters " 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "(w=%d, h=%d, xs=%d, ys=%d)", 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffers.w, buffers.h, buffers.hor_stride, buffers.ver_stride); 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStatus = BAD_VALUE; 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBufferHeap = buffers; 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayer.setNeedsBlending((info.h_alpha - info.l_alpha) > 0); 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBufferSize = info.getScanlineSize(buffers.hor_stride)*buffers.ver_stride; 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayer.forceVisibilityTransaction(); 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLayerBuffer::BufferSource::~BufferSource() 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3752d41cb9433ef3845560a252a5cf8226e1d78209aMathias Agopian class MessageDestroyTexture : public MessageBase { 3762d41cb9433ef3845560a252a5cf8226e1d78209aMathias Agopian SurfaceFlinger* flinger; 3772d41cb9433ef3845560a252a5cf8226e1d78209aMathias Agopian GLuint name; 3782d41cb9433ef3845560a252a5cf8226e1d78209aMathias Agopian public: 3792d41cb9433ef3845560a252a5cf8226e1d78209aMathias Agopian MessageDestroyTexture( 3802d41cb9433ef3845560a252a5cf8226e1d78209aMathias Agopian SurfaceFlinger* flinger, GLuint name) 3812d41cb9433ef3845560a252a5cf8226e1d78209aMathias Agopian : flinger(flinger), name(name) { } 3822d41cb9433ef3845560a252a5cf8226e1d78209aMathias Agopian virtual bool handler() { 3832d41cb9433ef3845560a252a5cf8226e1d78209aMathias Agopian glDeleteTextures(1, &name); 3842d41cb9433ef3845560a252a5cf8226e1d78209aMathias Agopian return true; 3852d41cb9433ef3845560a252a5cf8226e1d78209aMathias Agopian } 3862d41cb9433ef3845560a252a5cf8226e1d78209aMathias Agopian }; 3872d41cb9433ef3845560a252a5cf8226e1d78209aMathias Agopian 388999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian if (mTexture.name != -1U) { 3892d41cb9433ef3845560a252a5cf8226e1d78209aMathias Agopian // GL textures can only be destroyed from the GL thread 390781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian getFlinger()->mEventQueue.postMessage( 391781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian new MessageDestroyTexture(getFlinger(), mTexture.name) ); 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3939042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian if (mTexture.image != EGL_NO_IMAGE_KHR) { 394781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian EGLDisplay dpy(getFlinger()->graphicPlane(0).getEGLDisplay()); 3959042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian eglDestroyImageKHR(dpy, mTexture.image); 39668eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian } 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::BufferSource::postBuffer(ssize_t offset) 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ISurface::BufferHeap buffers; 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { // scope for the lock 403b34d143bce3905c23aa5c1b2b147ec6df48cf9d7Mathias Agopian Mutex::Autolock _l(mBufferSourceLock); 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffers = mBufferHeap; 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (buffers.heap != 0) { 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const size_t memorySize = buffers.heap->getSize(); 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((size_t(offset) + mBufferSize) > memorySize) { 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("LayerBuffer::BufferSource::postBuffer() " 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "invalid buffer (offset=%d, size=%d, heap-size=%d", 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int(offset), int(mBufferSize), int(memorySize)); 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Buffer> buffer; 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (buffers.heap != 0) { 4181d211f8ee0b422a3a741c3f88246c7c72ce483b0Mathias Agopian buffer = new LayerBuffer::Buffer(buffers, offset, mBufferSize); 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (buffer->getStatus() != NO_ERROR) 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffer.clear(); 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setBuffer(buffer); 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayer.invalidate(); 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::BufferSource::unregisterBuffers() 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 428b34d143bce3905c23aa5c1b2b147ec6df48cf9d7Mathias Agopian Mutex::Autolock _l(mBufferSourceLock); 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBufferHeap.heap.clear(); 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBuffer.clear(); 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayer.invalidate(); 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsp<LayerBuffer::Buffer> LayerBuffer::BufferSource::getBuffer() const 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 436b34d143bce3905c23aa5c1b2b147ec6df48cf9d7Mathias Agopian Mutex::Autolock _l(mBufferSourceLock); 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mBuffer; 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::BufferSource::setBuffer(const sp<LayerBuffer::Buffer>& buffer) 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 442b34d143bce3905c23aa5c1b2b147ec6df48cf9d7Mathias Agopian Mutex::Autolock _l(mBufferSourceLock); 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBuffer = buffer; 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::BufferSource::onDraw(const Region& clip) const 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 448999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian sp<Buffer> ourBuffer(getBuffer()); 449999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian if (UNLIKELY(ourBuffer == 0)) { 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // nothing to do, we don't have a buffer 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayer.clearWithOpenGL(clip); 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 455cbc4c9f8d56317b2fe8964c15c9785ebeef98ca7Mathias Agopian status_t err = NO_ERROR; 456cbc4c9f8d56317b2fe8964c15c9785ebeef98ca7Mathias Agopian NativeBuffer src(ourBuffer->getBuffer()); 457a280496bd2ce04d6beff4536f2115a9a4d7568e4Mathias Agopian const Rect transformedBounds(mLayer.getTransformedBounds()); 4588f78faa1ef7e2436d11e4c04be67b5a95bf126b9Mathias Agopian 4599042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian#if defined(EGL_ANDROID_image_native_buffer) 460781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian if (GLExtensions::getInstance().haveDirectTexture()) { 461fcdd394f3b25e336a3ff55960b695bc0943d4d3dMathias Agopian err = INVALID_OPERATION; 462fcdd394f3b25e336a3ff55960b695bc0943d4d3dMathias Agopian if (ourBuffer->supportsCopybit()) { 463fcdd394f3b25e336a3ff55960b695bc0943d4d3dMathias Agopian copybit_device_t* copybit = mLayer.mBlitEngine; 464fcdd394f3b25e336a3ff55960b695bc0943d4d3dMathias Agopian if (copybit && err != NO_ERROR) { 465fcdd394f3b25e336a3ff55960b695bc0943d4d3dMathias Agopian // create our EGLImageKHR the first time 466fcdd394f3b25e336a3ff55960b695bc0943d4d3dMathias Agopian err = initTempBuffer(); 467fcdd394f3b25e336a3ff55960b695bc0943d4d3dMathias Agopian if (err == NO_ERROR) { 468fcdd394f3b25e336a3ff55960b695bc0943d4d3dMathias Agopian // NOTE: Assume the buffer is allocated with the proper USAGE flags 469fcdd394f3b25e336a3ff55960b695bc0943d4d3dMathias Agopian const NativeBuffer& dst(mTempBuffer); 470fcdd394f3b25e336a3ff55960b695bc0943d4d3dMathias Agopian region_iterator clip(Region(Rect(dst.crop.r, dst.crop.b))); 471fcdd394f3b25e336a3ff55960b695bc0943d4d3dMathias Agopian copybit->set_parameter(copybit, COPYBIT_TRANSFORM, 0); 472fcdd394f3b25e336a3ff55960b695bc0943d4d3dMathias Agopian copybit->set_parameter(copybit, COPYBIT_PLANE_ALPHA, 0xFF); 473fcdd394f3b25e336a3ff55960b695bc0943d4d3dMathias Agopian copybit->set_parameter(copybit, COPYBIT_DITHER, COPYBIT_ENABLE); 474fcdd394f3b25e336a3ff55960b695bc0943d4d3dMathias Agopian err = copybit->stretch(copybit, &dst.img, &src.img, 475fcdd394f3b25e336a3ff55960b695bc0943d4d3dMathias Agopian &dst.crop, &src.crop, &clip); 476fcdd394f3b25e336a3ff55960b695bc0943d4d3dMathias Agopian if (err != NO_ERROR) { 477fcdd394f3b25e336a3ff55960b695bc0943d4d3dMathias Agopian clearTempBufferImage(); 478fcdd394f3b25e336a3ff55960b695bc0943d4d3dMathias Agopian } 479d2832fb4154771e42f7a4fdb8286ac85827ebe9dMathias Agopian } 48090daccf3fd17553209b8951e4e80144f32ab7238Mathias Agopian } 48190daccf3fd17553209b8951e4e80144f32ab7238Mathias Agopian } 482cbc4c9f8d56317b2fe8964c15c9785ebeef98ca7Mathias Agopian } 48326c28b16f3464eeb98b091b915ccf494ac31c35fMathias Agopian#endif 4849042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian else { 4859042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian err = INVALID_OPERATION; 4869042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian } 4879042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian 4889042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian if (err != NO_ERROR) { 489f007a2faa1d765e9b53553a8214179b253e3cbbdMathias Agopian // slower fallback 490999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian GGLSurface t; 491999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian t.version = sizeof(GGLSurface); 492999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian t.width = src.crop.r; 493999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian t.height = src.crop.b; 494999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian t.stride = src.img.w; 495999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian t.vstride= src.img.h; 496999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian t.format = src.img.format; 4972eab9d8d7034ef05cead1ee26667a75061b5f0aaMathias Agopian t.data = (GGLubyte*)src.img.base; 498999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian const Region dirty(Rect(t.width, t.height)); 4999f2c4fd9a14ea79e4cbbd3ab8925794711a6411cMathias Agopian mTextureManager.loadTexture(&mTexture, dirty, t); 500dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian } 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 502e96aa3e859cb747e241dfa2999fcd142a688ed57Mathias Agopian mLayer.setBufferTransform(mBufferHeap.transform); 5039042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian mLayer.drawWithOpenGL(clip, mTexture); 5049042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian} 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 50676169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopianstatus_t LayerBuffer::BufferSource::initTempBuffer() const 50776169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian{ 50876169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian // figure out the size we need now 50976169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian const ISurface::BufferHeap& buffers(mBufferHeap); 51076169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian uint32_t w = mLayer.mTransformedBounds.width(); 51176169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian uint32_t h = mLayer.mTransformedBounds.height(); 51276169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian if (buffers.w * h != buffers.h * w) { 51376169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian int t = w; w = h; h = t; 51476169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian } 51576169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian 516d23fa27630c3756216dc64cbb8518af49c60ce34Mathias Agopian // we're in the copybit case, so make sure we can handle this blit 517d23fa27630c3756216dc64cbb8518af49c60ce34Mathias Agopian // we don't have to keep the aspect ratio here 518d23fa27630c3756216dc64cbb8518af49c60ce34Mathias Agopian copybit_device_t* copybit = mLayer.mBlitEngine; 519d23fa27630c3756216dc64cbb8518af49c60ce34Mathias Agopian const int down = copybit->get(copybit, COPYBIT_MINIFICATION_LIMIT); 520d23fa27630c3756216dc64cbb8518af49c60ce34Mathias Agopian const int up = copybit->get(copybit, COPYBIT_MAGNIFICATION_LIMIT); 521d23fa27630c3756216dc64cbb8518af49c60ce34Mathias Agopian if (buffers.w > w*down) w = buffers.w / down; 522d23fa27630c3756216dc64cbb8518af49c60ce34Mathias Agopian else if (w > buffers.w*up) w = buffers.w*up; 523d23fa27630c3756216dc64cbb8518af49c60ce34Mathias Agopian if (buffers.h > h*down) h = buffers.h / down; 524d23fa27630c3756216dc64cbb8518af49c60ce34Mathias Agopian else if (h > buffers.h*up) h = buffers.h*up; 525d23fa27630c3756216dc64cbb8518af49c60ce34Mathias Agopian 52676169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian if (mTexture.image != EGL_NO_IMAGE_KHR) { 52776169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian // we have an EGLImage, make sure the needed size didn't change 52876169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian if (w!=mTexture.width || h!= mTexture.height) { 52976169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian // delete the EGLImage and texture 530d2832fb4154771e42f7a4fdb8286ac85827ebe9dMathias Agopian clearTempBufferImage(); 53176169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian } else { 53276169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian // we're good, we have an EGLImageKHR and it's (still) the 53376169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian // right size 53476169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian return NO_ERROR; 53576169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian } 53676169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian } 53776169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian 53876169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian // figure out if we need linear filtering 53976169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian if (buffers.w * h == buffers.h * w) { 54076169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian // same pixel area, don't use filtering 541923770333574fd71674781a9a62f40e8acaf5ef1Mathias Agopian mLayer.mNeedsFiltering = false; 54276169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian } 54376169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian 54476169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian // Allocate a temporary buffer and create the corresponding EGLImageKHR 54508956f04c628bd4d15c26b06af5beecf167deefdMathias Agopian // once the EGLImage has been created we don't need the 54608956f04c628bd4d15c26b06af5beecf167deefdMathias Agopian // graphic buffer reference anymore. 54708956f04c628bd4d15c26b06af5beecf167deefdMathias Agopian sp<GraphicBuffer> buffer = new GraphicBuffer( 54876169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian w, h, HAL_PIXEL_FORMAT_RGB_565, 54976169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian GraphicBuffer::USAGE_HW_TEXTURE | 55076169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian GraphicBuffer::USAGE_HW_2D); 55176169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian 55208956f04c628bd4d15c26b06af5beecf167deefdMathias Agopian status_t err = buffer->initCheck(); 55376169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian if (err == NO_ERROR) { 55476169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian NativeBuffer& dst(mTempBuffer); 55508956f04c628bd4d15c26b06af5beecf167deefdMathias Agopian dst.img.w = buffer->getStride(); 55676169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian dst.img.h = h; 55708956f04c628bd4d15c26b06af5beecf167deefdMathias Agopian dst.img.format = buffer->getPixelFormat(); 55808956f04c628bd4d15c26b06af5beecf167deefdMathias Agopian dst.img.handle = (native_handle_t *)buffer->handle; 55976169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian dst.img.base = 0; 56076169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian dst.crop.l = 0; 56176169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian dst.crop.t = 0; 56276169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian dst.crop.r = w; 56376169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian dst.crop.b = h; 56476169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian 565781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian EGLDisplay dpy(getFlinger()->graphicPlane(0).getEGLDisplay()); 5669f2c4fd9a14ea79e4cbbd3ab8925794711a6411cMathias Agopian err = mTextureManager.initEglImage(&mTexture, dpy, buffer); 56776169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian } 56876169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian 56976169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian return err; 57076169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian} 57176169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian 572d2832fb4154771e42f7a4fdb8286ac85827ebe9dMathias Agopianvoid LayerBuffer::BufferSource::clearTempBufferImage() const 573d2832fb4154771e42f7a4fdb8286ac85827ebe9dMathias Agopian{ 574a1a1798599361f5f1db8fe612606323c801f4f6cMathias Agopian // delete the image 575781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian EGLDisplay dpy(getFlinger()->graphicPlane(0).getEGLDisplay()); 576d2832fb4154771e42f7a4fdb8286ac85827ebe9dMathias Agopian eglDestroyImageKHR(dpy, mTexture.image); 577a1a1798599361f5f1db8fe612606323c801f4f6cMathias Agopian 578a1a1798599361f5f1db8fe612606323c801f4f6cMathias Agopian // and the associated texture (recreate a name) 579a1a1798599361f5f1db8fe612606323c801f4f6cMathias Agopian glDeleteTextures(1, &mTexture.name); 580d2832fb4154771e42f7a4fdb8286ac85827ebe9dMathias Agopian Texture defaultTexture; 581d2832fb4154771e42f7a4fdb8286ac85827ebe9dMathias Agopian mTexture = defaultTexture; 582d2832fb4154771e42f7a4fdb8286ac85827ebe9dMathias Agopian} 583d2832fb4154771e42f7a4fdb8286ac85827ebe9dMathias Agopian 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// --------------------------------------------------------------------------- 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLayerBuffer::OverlaySource::OverlaySource(LayerBuffer& layer, 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<OverlayRef>* overlayRef, 588e1ceec234c618729cc7bd35fecb11744b52c1cc8Chih-Chung Chang uint32_t w, uint32_t h, int32_t format, int32_t orientation) 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : Source(layer), mVisibilityChanged(false), 590e1ceec234c618729cc7bd35fecb11744b52c1cc8Chih-Chung Chang mOverlay(0), mOverlayHandle(0), mOverlayDevice(0), mOrientation(orientation) 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 592781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian overlay_control_device_t* overlay_dev = getFlinger()->getOverlayEngine(); 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (overlay_dev == NULL) { 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // overlays not supported 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOverlayDevice = overlay_dev; 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project overlay_t* overlay = overlay_dev->createOverlay(overlay_dev, w, h, format); 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (overlay == NULL) { 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // couldn't create the overlay (no memory? no more overlays?) 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // enable dithering... 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project overlay_dev->setParameter(overlay_dev, overlay, 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project OVERLAY_DITHER, OVERLAY_ENABLE); 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOverlay = overlay; 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWidth = overlay->w; 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHeight = overlay->h; 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFormat = overlay->format; 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWidthStride = overlay->w_stride; 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHeightStride = overlay->h_stride; 61543ab76389ead0ef90e3d4fa883d5a58c34a6801bRebecca Schultz Zavin mInitialized = false; 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOverlayHandle = overlay->getHandleRef(overlay); 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 619a280496bd2ce04d6beff4536f2115a9a4d7568e4Mathias Agopian sp<OverlayChannel> channel = new OverlayChannel( &layer ); 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *overlayRef = new OverlayRef(mOverlayHandle, channel, 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWidth, mHeight, mFormat, mWidthStride, mHeightStride); 623781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian getFlinger()->signalEvent(); 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLayerBuffer::OverlaySource::~OverlaySource() 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOverlay && mOverlayDevice) { 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project overlay_control_device_t* overlay_dev = mOverlayDevice; 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project overlay_dev->destroyOverlay(overlay_dev, mOverlay); 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6347ac5e698b216a1b1af97405b43adf2ad5bc40e7dRebecca Schultz Zavinvoid LayerBuffer::OverlaySource::onDraw(const Region& clip) const 6357ac5e698b216a1b1af97405b43adf2ad5bc40e7dRebecca Schultz Zavin{ 6368ae0384a78ee2b66a91a13fe1c2a80f0642feacdMathias Agopian // this would be where the color-key would be set, should we need it. 6370d3c0063aa998bc32e7f22114e38a0f8df61ad65Mathias Agopian GLclampf red = 0; 6380d3c0063aa998bc32e7f22114e38a0f8df61ad65Mathias Agopian GLclampf green = 0; 6390d3c0063aa998bc32e7f22114e38a0f8df61ad65Mathias Agopian GLclampf blue = 0; 640c8546781ff6fa26b3a7f2d1483db363f299a3898Rebecca Schultz Zavin mLayer.clearWithOpenGL(clip, red, green, blue, 0); 6417ac5e698b216a1b1af97405b43adf2ad5bc40e7dRebecca Schultz Zavin} 6427ac5e698b216a1b1af97405b43adf2ad5bc40e7dRebecca Schultz Zavin 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::OverlaySource::onTransaction(uint32_t flags) 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const Layer::State& front(mLayer.drawingState()); 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const Layer::State& temp(mLayer.currentState()); 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (temp.sequence != front.sequence) { 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mVisibilityChanged = true; 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 652c57b15c9c8dfb31e3c1ffcadd0e1522bf76dedd2Mathias Agopianvoid LayerBuffer::OverlaySource::onvalidateVisibility(const Transform&) 653c57b15c9c8dfb31e3c1ffcadd0e1522bf76dedd2Mathias Agopian{ 654c57b15c9c8dfb31e3c1ffcadd0e1522bf76dedd2Mathias Agopian mVisibilityChanged = true; 655c57b15c9c8dfb31e3c1ffcadd0e1522bf76dedd2Mathias Agopian} 656c57b15c9c8dfb31e3c1ffcadd0e1522bf76dedd2Mathias Agopian 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::OverlaySource::onVisibilityResolved( 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const Transform& planeTransform) 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // this code-path must be as tight as possible, it's called each time 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the screen is composited. 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (UNLIKELY(mOverlay != 0)) { 66343ab76389ead0ef90e3d4fa883d5a58c34a6801bRebecca Schultz Zavin if (mVisibilityChanged || !mInitialized) { 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mVisibilityChanged = false; 66543ab76389ead0ef90e3d4fa883d5a58c34a6801bRebecca Schultz Zavin mInitialized = true; 666a280496bd2ce04d6beff4536f2115a9a4d7568e4Mathias Agopian const Rect bounds(mLayer.getTransformedBounds()); 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int x = bounds.left; 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int y = bounds.top; 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int w = bounds.width(); 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int h = bounds.height(); 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // we need a lock here to protect "destroy" 673b34d143bce3905c23aa5c1b2b147ec6df48cf9d7Mathias Agopian Mutex::Autolock _l(mOverlaySourceLock); 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOverlay) { 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project overlay_control_device_t* overlay_dev = mOverlayDevice; 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project overlay_dev->setPosition(overlay_dev, mOverlay, x,y,w,h); 677e1ceec234c618729cc7bd35fecb11744b52c1cc8Chih-Chung Chang // we need to combine the layer orientation and the 678e1ceec234c618729cc7bd35fecb11744b52c1cc8Chih-Chung Chang // user-requested orientation. 679e031ba8d20c39910a42ed58db06c3770bdf32eb7Mathias Agopian Transform finalTransform(Transform(mLayer.getOrientation()) * 680e031ba8d20c39910a42ed58db06c3770bdf32eb7Mathias Agopian Transform(mOrientation)); 68143ab76389ead0ef90e3d4fa883d5a58c34a6801bRebecca Schultz Zavin overlay_dev->setParameter(overlay_dev, mOverlay, 682e1ceec234c618729cc7bd35fecb11744b52c1cc8Chih-Chung Chang OVERLAY_TRANSFORM, finalTransform.getOrientation()); 6837ac5e698b216a1b1af97405b43adf2ad5bc40e7dRebecca Schultz Zavin overlay_dev->commit(overlay_dev, mOverlay); 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 689a280496bd2ce04d6beff4536f2115a9a4d7568e4Mathias Agopianvoid LayerBuffer::OverlaySource::destroy() 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // we need a lock here to protect "onVisibilityResolved" 692b34d143bce3905c23aa5c1b2b147ec6df48cf9d7Mathias Agopian Mutex::Autolock _l(mOverlaySourceLock); 693a280496bd2ce04d6beff4536f2115a9a4d7568e4Mathias Agopian if (mOverlay && mOverlayDevice) { 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project overlay_control_device_t* overlay_dev = mOverlayDevice; 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project overlay_dev->destroyOverlay(overlay_dev, mOverlay); 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOverlay = 0; 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// --------------------------------------------------------------------------- 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android 702