LayerBuffer.cpp revision 7323e545c8778beb6736a09a5d2c9f81b451e13f
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 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconst uint32_t LayerBuffer::typeInfo = LayerBaseClient::typeInfo | 0x20; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconst char* const LayerBuffer::typeID = "LayerBuffer"; 440b0722f980f40e1ac0929a7f1a6e2df7af983478Mathias Agopiangralloc_module_t const* LayerBuffer::sGrallocModule = 0; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// --------------------------------------------------------------------------- 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLayerBuffer::LayerBuffer(SurfaceFlinger* flinger, DisplayID display, 496edf5af578c1ab1fcd44b7c08ca371456e4b7430Mathias Agopian const sp<Client>& client, int32_t i) 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : LayerBaseClient(flinger, display, client, i), 5190daccf3fd17553209b8951e4e80144f32ab7238Mathias Agopian mNeedsBlending(false), mBlitEngine(0) 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLayerBuffer::~LayerBuffer() 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 5790daccf3fd17553209b8951e4e80144f32ab7238Mathias Agopian if (mBlitEngine) { 5890daccf3fd17553209b8951e4e80144f32ab7238Mathias Agopian copybit_close(mBlitEngine); 5990daccf3fd17553209b8951e4e80144f32ab7238Mathias Agopian } 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 626cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopianvoid LayerBuffer::onFirstRef() 636cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian{ 64c6603951d45fc9b0d1776fec9444b6f31af92840Mathias Agopian LayerBaseClient::onFirstRef(); 659779b221e999583ff89e0dfc40e56398737adbb3Mathias Agopian mSurface = new SurfaceLayerBuffer(mFlinger, clientIndex(), 666cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian const_cast<LayerBuffer *>(this)); 670b0722f980f40e1ac0929a7f1a6e2df7af983478Mathias Agopian 680b0722f980f40e1ac0929a7f1a6e2df7af983478Mathias Agopian hw_module_t const* module = (hw_module_t const*)sGrallocModule; 690b0722f980f40e1ac0929a7f1a6e2df7af983478Mathias Agopian if (!module) { 700b0722f980f40e1ac0929a7f1a6e2df7af983478Mathias Agopian // NOTE: technically there is a race here, but it shouldn't 710b0722f980f40e1ac0929a7f1a6e2df7af983478Mathias Agopian // cause any problem since hw_get_module() always returns 720b0722f980f40e1ac0929a7f1a6e2df7af983478Mathias Agopian // the same value. 730b0722f980f40e1ac0929a7f1a6e2df7af983478Mathias Agopian if (hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &module) == 0) { 740b0722f980f40e1ac0929a7f1a6e2df7af983478Mathias Agopian sGrallocModule = (gralloc_module_t const *)module; 750b0722f980f40e1ac0929a7f1a6e2df7af983478Mathias Agopian } 760b0722f980f40e1ac0929a7f1a6e2df7af983478Mathias Agopian } 7790daccf3fd17553209b8951e4e80144f32ab7238Mathias Agopian 7890daccf3fd17553209b8951e4e80144f32ab7238Mathias Agopian if (hw_get_module(COPYBIT_HARDWARE_MODULE_ID, &module) == 0) { 7990daccf3fd17553209b8951e4e80144f32ab7238Mathias Agopian copybit_open(module, &mBlitEngine); 8090daccf3fd17553209b8951e4e80144f32ab7238Mathias Agopian } 816cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian} 826cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian 831473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopiansp<LayerBaseClient::Surface> LayerBuffer::createSurface() const 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 856cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian return mSurface; 866cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian} 876cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian 886cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopianstatus_t LayerBuffer::ditch() 896cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian{ 906cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian mSurface.clear(); 916cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian return NO_ERROR; 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool LayerBuffer::needsBlending() const { 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mNeedsBlending; 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::setNeedsBlending(bool blending) { 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNeedsBlending = blending; 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::postBuffer(ssize_t offset) 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Source> source(getSource()); 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (source != 0) 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project source->postBuffer(offset); 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::unregisterBuffers() 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Source> source(clearSource()); 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (source != 0) 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project source->unregisterBuffers(); 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectuint32_t LayerBuffer::doTransaction(uint32_t flags) 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Source> source(getSource()); 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (source != 0) 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project source->onTransaction(flags); 1214c29c9487e47c5f0a23790e670dc3dc7a215d04cMathias Agopian uint32_t res = LayerBase::doTransaction(flags); 1224c29c9487e47c5f0a23790e670dc3dc7a215d04cMathias Agopian // we always want filtering for these surfaces 123b548dbb22595edc843f1d78ce97bafab1e626a89Mathias Agopian mUseLinearFiltering = !(mFlags & DisplayHardware::SLOW_CONFIG); 1244c29c9487e47c5f0a23790e670dc3dc7a215d04cMathias Agopian return res; 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::unlockPageFlip(const Transform& planeTransform, 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Region& outDirtyRegion) 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // this code-path must be as tight as possible, it's called each time 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the screen is composited. 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Source> source(getSource()); 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (source != 0) 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project source->onVisibilityResolved(planeTransform); 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LayerBase::unlockPageFlip(planeTransform, outDirtyRegion); 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::onDraw(const Region& clip) const 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Source> source(getSource()); 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (LIKELY(source != 0)) { 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project source->onDraw(clip); 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clearWithOpenGL(clip); 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool LayerBuffer::transformed() const 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Source> source(getSource()); 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (LIKELY(source != 0)) 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return source->transformed(); 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 156a280496bd2ce04d6beff4536f2115a9a4d7568e4Mathias Agopianvoid LayerBuffer::serverDestroy() 157a280496bd2ce04d6beff4536f2115a9a4d7568e4Mathias Agopian{ 158a280496bd2ce04d6beff4536f2115a9a4d7568e4Mathias Agopian sp<Source> source(clearSource()); 159a280496bd2ce04d6beff4536f2115a9a4d7568e4Mathias Agopian if (source != 0) { 160a280496bd2ce04d6beff4536f2115a9a4d7568e4Mathias Agopian source->destroy(); 161a280496bd2ce04d6beff4536f2115a9a4d7568e4Mathias Agopian } 162a280496bd2ce04d6beff4536f2115a9a4d7568e4Mathias Agopian} 163a280496bd2ce04d6beff4536f2115a9a4d7568e4Mathias Agopian 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This creates a "buffer" source for this surface 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t LayerBuffer::registerBuffers(const ISurface::BufferHeap& buffers) 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex::Autolock _l(mLock); 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mSource != 0) 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return INVALID_OPERATION; 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<BufferSource> source = new BufferSource(*this, buffers); 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t result = source->getStatus(); 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (result == NO_ERROR) { 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSource = source; 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This creates an "overlay" source for this surface 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsp<OverlayRef> LayerBuffer::createOverlay(uint32_t w, uint32_t h, int32_t f) 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<OverlayRef> result; 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex::Autolock _l(mLock); 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mSource != 0) 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<OverlaySource> source = new OverlaySource(*this, &result, w, h, f); 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (result != 0) { 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSource = source; 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsp<LayerBuffer::Source> LayerBuffer::getSource() const { 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex::Autolock _l(mLock); 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mSource; 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsp<LayerBuffer::Source> LayerBuffer::clearSource() { 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Source> source; 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex::Autolock _l(mLock); 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project source = mSource; 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSource.clear(); 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return source; 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ============================================================================ 2139779b221e999583ff89e0dfc40e56398737adbb3Mathias Agopian// LayerBuffer::SurfaceLayerBuffer 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ============================================================================ 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2169779b221e999583ff89e0dfc40e56398737adbb3Mathias AgopianLayerBuffer::SurfaceLayerBuffer::SurfaceLayerBuffer(const sp<SurfaceFlinger>& flinger, 2176cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian SurfaceID id, const sp<LayerBuffer>& owner) 2186cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian : LayerBaseClient::Surface(flinger, id, owner->getIdentity(), owner) 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2229779b221e999583ff89e0dfc40e56398737adbb3Mathias AgopianLayerBuffer::SurfaceLayerBuffer::~SurfaceLayerBuffer() 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unregisterBuffers(); 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2279779b221e999583ff89e0dfc40e56398737adbb3Mathias Agopianstatus_t LayerBuffer::SurfaceLayerBuffer::registerBuffers( 2281473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian const ISurface::BufferHeap& buffers) 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2301473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian sp<LayerBuffer> owner(getOwner()); 2311473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian if (owner != 0) 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return owner->registerBuffers(buffers); 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_INIT; 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2369779b221e999583ff89e0dfc40e56398737adbb3Mathias Agopianvoid LayerBuffer::SurfaceLayerBuffer::postBuffer(ssize_t offset) 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2381473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian sp<LayerBuffer> owner(getOwner()); 2391473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian if (owner != 0) 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner->postBuffer(offset); 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2439779b221e999583ff89e0dfc40e56398737adbb3Mathias Agopianvoid LayerBuffer::SurfaceLayerBuffer::unregisterBuffers() 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2451473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian sp<LayerBuffer> owner(getOwner()); 2461473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian if (owner != 0) 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner->unregisterBuffers(); 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2509779b221e999583ff89e0dfc40e56398737adbb3Mathias Agopiansp<OverlayRef> LayerBuffer::SurfaceLayerBuffer::createOverlay( 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t w, uint32_t h, int32_t format) { 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<OverlayRef> result; 2531473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian sp<LayerBuffer> owner(getOwner()); 2541473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian if (owner != 0) 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = owner->createOverlay(w, h, format); 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ============================================================================ 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// LayerBuffer::Buffer 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ============================================================================ 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLayerBuffer::Buffer::Buffer(const ISurface::BufferHeap& buffers, ssize_t offset) 2647323e545c8778beb6736a09a5d2c9f81b451e13fMathias Agopian : mBufferHeap(buffers), mSupportsCopybit(false) 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NativeBuffer& src(mNativeBuffer); 267d86beb99a7c9625daad01c4aaa5eaf4ca3ac2194Mathias Agopian src.crop.l = 0; 268d86beb99a7c9625daad01c4aaa5eaf4ca3ac2194Mathias Agopian src.crop.t = 0; 269d86beb99a7c9625daad01c4aaa5eaf4ca3ac2194Mathias Agopian src.crop.r = buffers.w; 270d86beb99a7c9625daad01c4aaa5eaf4ca3ac2194Mathias Agopian src.crop.b = buffers.h; 271d86beb99a7c9625daad01c4aaa5eaf4ca3ac2194Mathias Agopian 272d86beb99a7c9625daad01c4aaa5eaf4ca3ac2194Mathias Agopian src.img.w = buffers.hor_stride ?: buffers.w; 273d86beb99a7c9625daad01c4aaa5eaf4ca3ac2194Mathias Agopian src.img.h = buffers.ver_stride ?: buffers.h; 274d86beb99a7c9625daad01c4aaa5eaf4ca3ac2194Mathias Agopian src.img.format = buffers.format; 275d86beb99a7c9625daad01c4aaa5eaf4ca3ac2194Mathias Agopian src.img.base = (void*)(intptr_t(buffers.heap->base()) + offset); 276d86beb99a7c9625daad01c4aaa5eaf4ca3ac2194Mathias Agopian src.img.handle = 0; 2770b0722f980f40e1ac0929a7f1a6e2df7af983478Mathias Agopian 2780b0722f980f40e1ac0929a7f1a6e2df7af983478Mathias Agopian gralloc_module_t const * module = LayerBuffer::getGrallocModule(); 2790b0722f980f40e1ac0929a7f1a6e2df7af983478Mathias Agopian if (module && module->perform) { 2800b0722f980f40e1ac0929a7f1a6e2df7af983478Mathias Agopian int err = module->perform(module, 2810b0722f980f40e1ac0929a7f1a6e2df7af983478Mathias Agopian GRALLOC_MODULE_PERFORM_CREATE_HANDLE_FROM_BUFFER, 2820b0722f980f40e1ac0929a7f1a6e2df7af983478Mathias Agopian buffers.heap->heapID(), buffers.heap->getSize(), 2830b0722f980f40e1ac0929a7f1a6e2df7af983478Mathias Agopian offset, buffers.heap->base(), 2840b0722f980f40e1ac0929a7f1a6e2df7af983478Mathias Agopian &src.img.handle); 2850b0722f980f40e1ac0929a7f1a6e2df7af983478Mathias Agopian 2867323e545c8778beb6736a09a5d2c9f81b451e13fMathias Agopian // we can fail here is the passed buffer is purely software 2877323e545c8778beb6736a09a5d2c9f81b451e13fMathias Agopian mSupportsCopybit = (err == NO_ERROR); 2880b0722f980f40e1ac0929a7f1a6e2df7af983478Mathias Agopian } 289d86beb99a7c9625daad01c4aaa5eaf4ca3ac2194Mathias Agopian } 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLayerBuffer::Buffer::~Buffer() 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2932eab9d8d7034ef05cead1ee26667a75061b5f0aaMathias Agopian NativeBuffer& src(mNativeBuffer); 2940b0722f980f40e1ac0929a7f1a6e2df7af983478Mathias Agopian if (src.img.handle) { 2950b0722f980f40e1ac0929a7f1a6e2df7af983478Mathias Agopian native_handle_delete(src.img.handle); 2960b0722f980f40e1ac0929a7f1a6e2df7af983478Mathias Agopian } 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ============================================================================ 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// LayerBuffer::Source 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// LayerBuffer::BufferSource 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// LayerBuffer::OverlaySource 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ============================================================================ 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLayerBuffer::Source::Source(LayerBuffer& layer) 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : mLayer(layer) 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLayerBuffer::Source::~Source() { 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::Source::onDraw(const Region& clip) const { 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::Source::onTransaction(uint32_t flags) { 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::Source::onVisibilityResolved( 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const Transform& planeTransform) { 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::Source::postBuffer(ssize_t offset) { 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::Source::unregisterBuffers() { 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool LayerBuffer::Source::transformed() const { 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mLayer.mTransformed; 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// --------------------------------------------------------------------------- 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLayerBuffer::BufferSource::BufferSource(LayerBuffer& layer, 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const ISurface::BufferHeap& buffers) 330999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian : Source(layer), mStatus(NO_ERROR), mBufferSize(0) 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (buffers.heap == NULL) { 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // this is allowed, but in this case, it is illegal to receive 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // postBuffer(). The surface just erases the framebuffer with 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // fully transparent pixels. 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBufferHeap = buffers; 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayer.setNeedsBlending(false); 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t err = (buffers.heap->heapID() >= 0) ? NO_ERROR : NO_INIT; 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("LayerBuffer::BufferSource: invalid heap (%s)", strerror(err)); 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStatus = err; 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PixelFormatInfo info; 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = getPixelFormatInfo(buffers.format, &info); 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("LayerBuffer::BufferSource: invalid format %d (%s)", 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffers.format, strerror(err)); 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStatus = err; 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (buffers.hor_stride<0 || buffers.ver_stride<0) { 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("LayerBuffer::BufferSource: invalid parameters " 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "(w=%d, h=%d, xs=%d, ys=%d)", 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffers.w, buffers.h, buffers.hor_stride, buffers.ver_stride); 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStatus = BAD_VALUE; 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBufferHeap = buffers; 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayer.setNeedsBlending((info.h_alpha - info.l_alpha) > 0); 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBufferSize = info.getScanlineSize(buffers.hor_stride)*buffers.ver_stride; 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayer.forceVisibilityTransaction(); 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLayerBuffer::BufferSource::~BufferSource() 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 373999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian if (mTexture.name != -1U) { 374999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian glDeleteTextures(1, &mTexture.name); 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3769042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian if (mTexture.image != EGL_NO_IMAGE_KHR) { 3779042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian EGLDisplay dpy(mLayer.mFlinger->graphicPlane(0).getEGLDisplay()); 3789042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian eglDestroyImageKHR(dpy, mTexture.image); 37968eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian } 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::BufferSource::postBuffer(ssize_t offset) 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ISurface::BufferHeap buffers; 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { // scope for the lock 386b34d143bce3905c23aa5c1b2b147ec6df48cf9d7Mathias Agopian Mutex::Autolock _l(mBufferSourceLock); 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffers = mBufferHeap; 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (buffers.heap != 0) { 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const size_t memorySize = buffers.heap->getSize(); 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((size_t(offset) + mBufferSize) > memorySize) { 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("LayerBuffer::BufferSource::postBuffer() " 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "invalid buffer (offset=%d, size=%d, heap-size=%d", 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int(offset), int(mBufferSize), int(memorySize)); 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Buffer> buffer; 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (buffers.heap != 0) { 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffer = new LayerBuffer::Buffer(buffers, offset); 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (buffer->getStatus() != NO_ERROR) 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffer.clear(); 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setBuffer(buffer); 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayer.invalidate(); 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::BufferSource::unregisterBuffers() 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 411b34d143bce3905c23aa5c1b2b147ec6df48cf9d7Mathias Agopian Mutex::Autolock _l(mBufferSourceLock); 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBufferHeap.heap.clear(); 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBuffer.clear(); 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayer.invalidate(); 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsp<LayerBuffer::Buffer> LayerBuffer::BufferSource::getBuffer() const 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 419b34d143bce3905c23aa5c1b2b147ec6df48cf9d7Mathias Agopian Mutex::Autolock _l(mBufferSourceLock); 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mBuffer; 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::BufferSource::setBuffer(const sp<LayerBuffer::Buffer>& buffer) 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 425b34d143bce3905c23aa5c1b2b147ec6df48cf9d7Mathias Agopian Mutex::Autolock _l(mBufferSourceLock); 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBuffer = buffer; 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool LayerBuffer::BufferSource::transformed() const 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mBufferHeap.transform ? true : Source::transformed(); 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::BufferSource::onDraw(const Region& clip) const 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 436999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian sp<Buffer> ourBuffer(getBuffer()); 437999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian if (UNLIKELY(ourBuffer == 0)) { 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // nothing to do, we don't have a buffer 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayer.clearWithOpenGL(clip); 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 443cbc4c9f8d56317b2fe8964c15c9785ebeef98ca7Mathias Agopian status_t err = NO_ERROR; 444cbc4c9f8d56317b2fe8964c15c9785ebeef98ca7Mathias Agopian NativeBuffer src(ourBuffer->getBuffer()); 445a280496bd2ce04d6beff4536f2115a9a4d7568e4Mathias Agopian const Rect transformedBounds(mLayer.getTransformedBounds()); 4468f78faa1ef7e2436d11e4c04be67b5a95bf126b9Mathias Agopian 4479042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian if (UNLIKELY(mTexture.name == -1LU)) { 4489042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian mTexture.name = mLayer.createTexture(); 4499042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian } 450cbc4c9f8d56317b2fe8964c15c9785ebeef98ca7Mathias Agopian 4519042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian#if defined(EGL_ANDROID_image_native_buffer) 4529042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian if (mLayer.mFlags & DisplayHardware::DIRECT_TEXTURE) { 45390daccf3fd17553209b8951e4e80144f32ab7238Mathias Agopian copybit_device_t* copybit = mLayer.mBlitEngine; 4547323e545c8778beb6736a09a5d2c9f81b451e13fMathias Agopian if (copybit && ourBuffer->supportsCopybit()) { 45590daccf3fd17553209b8951e4e80144f32ab7238Mathias Agopian // create our EGLImageKHR the first time 45676169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian err = initTempBuffer(); 45790daccf3fd17553209b8951e4e80144f32ab7238Mathias Agopian if (err == NO_ERROR) { 45890daccf3fd17553209b8951e4e80144f32ab7238Mathias Agopian // NOTE: Assume the buffer is allocated with the proper USAGE flags 45990daccf3fd17553209b8951e4e80144f32ab7238Mathias Agopian const NativeBuffer& dst(mTempBuffer); 46090daccf3fd17553209b8951e4e80144f32ab7238Mathias Agopian region_iterator clip(Region(Rect(dst.crop.r, dst.crop.b))); 46190daccf3fd17553209b8951e4e80144f32ab7238Mathias Agopian copybit->set_parameter(copybit, COPYBIT_TRANSFORM, 0); 46290daccf3fd17553209b8951e4e80144f32ab7238Mathias Agopian copybit->set_parameter(copybit, COPYBIT_PLANE_ALPHA, 0xFF); 46390daccf3fd17553209b8951e4e80144f32ab7238Mathias Agopian copybit->set_parameter(copybit, COPYBIT_DITHER, COPYBIT_ENABLE); 46490daccf3fd17553209b8951e4e80144f32ab7238Mathias Agopian err = copybit->stretch(copybit, &dst.img, &src.img, 46590daccf3fd17553209b8951e4e80144f32ab7238Mathias Agopian &dst.crop, &src.crop, &clip); 46636d0184e089831b74de6005f01da9e7b26679bb9Mathias Agopian 46790daccf3fd17553209b8951e4e80144f32ab7238Mathias Agopian } 46890daccf3fd17553209b8951e4e80144f32ab7238Mathias Agopian } else { 46990daccf3fd17553209b8951e4e80144f32ab7238Mathias Agopian err = INVALID_OPERATION; 47090daccf3fd17553209b8951e4e80144f32ab7238Mathias Agopian } 471cbc4c9f8d56317b2fe8964c15c9785ebeef98ca7Mathias Agopian } 47226c28b16f3464eeb98b091b915ccf494ac31c35fMathias Agopian#endif 4739042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian else { 4749042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian err = INVALID_OPERATION; 4759042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian } 4769042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian 4779042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian if (err != NO_ERROR) { 478f007a2faa1d765e9b53553a8214179b253e3cbbdMathias Agopian // slower fallback 479999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian GGLSurface t; 480999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian t.version = sizeof(GGLSurface); 481999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian t.width = src.crop.r; 482999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian t.height = src.crop.b; 483999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian t.stride = src.img.w; 484999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian t.vstride= src.img.h; 485999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian t.format = src.img.format; 4862eab9d8d7034ef05cead1ee26667a75061b5f0aaMathias Agopian t.data = (GGLubyte*)src.img.base; 487999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian const Region dirty(Rect(t.width, t.height)); 4886950e428feaccc8164b989ef64e771a99948797aMathias Agopian mLayer.loadTexture(&mTexture, dirty, t); 489dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian } 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4919042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian mTexture.transform = mBufferHeap.transform; 4929042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian mLayer.drawWithOpenGL(clip, mTexture); 4939042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian} 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 49576169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopianstatus_t LayerBuffer::BufferSource::initTempBuffer() const 49676169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian{ 49776169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian // figure out the size we need now 49876169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian const ISurface::BufferHeap& buffers(mBufferHeap); 49976169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian uint32_t w = mLayer.mTransformedBounds.width(); 50076169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian uint32_t h = mLayer.mTransformedBounds.height(); 50176169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian if (buffers.w * h != buffers.h * w) { 50276169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian int t = w; w = h; h = t; 50376169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian } 50476169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian 50576169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian if (mTexture.image != EGL_NO_IMAGE_KHR) { 50676169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian // we have an EGLImage, make sure the needed size didn't change 50776169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian if (w!=mTexture.width || h!= mTexture.height) { 50876169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian // delete the EGLImage and texture 50976169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian EGLDisplay dpy(mLayer.mFlinger->graphicPlane(0).getEGLDisplay()); 51076169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian glDeleteTextures(1, &mTexture.name); 51176169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian eglDestroyImageKHR(dpy, mTexture.image); 51276169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian Texture defaultTexture; 51376169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian mTexture = defaultTexture; 51476169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian mTempGraphicBuffer.clear(); 51576169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian } else { 51676169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian // we're good, we have an EGLImageKHR and it's (still) the 51776169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian // right size 51876169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian return NO_ERROR; 51976169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian } 52076169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian } 52176169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian 52276169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian // figure out if we need linear filtering 52376169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian if (buffers.w * h == buffers.h * w) { 52476169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian // same pixel area, don't use filtering 52576169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian mLayer.mUseLinearFiltering = false; 52676169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian } 52776169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian 52876169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian // Allocate a temporary buffer and create the corresponding EGLImageKHR 52976169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian 53076169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian status_t err; 53176169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian mTempGraphicBuffer.clear(); 53276169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian mTempGraphicBuffer = new GraphicBuffer( 53376169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian w, h, HAL_PIXEL_FORMAT_RGB_565, 53476169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian GraphicBuffer::USAGE_HW_TEXTURE | 53576169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian GraphicBuffer::USAGE_HW_2D); 53676169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian 53776169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian err = mTempGraphicBuffer->initCheck(); 53876169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian if (err == NO_ERROR) { 53976169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian NativeBuffer& dst(mTempBuffer); 54076169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian dst.img.w = mTempGraphicBuffer->getStride(); 54176169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian dst.img.h = h; 54276169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian dst.img.format = mTempGraphicBuffer->getPixelFormat(); 54376169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian dst.img.handle = (native_handle_t *)mTempGraphicBuffer->handle; 54476169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian dst.img.base = 0; 54576169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian dst.crop.l = 0; 54676169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian dst.crop.t = 0; 54776169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian dst.crop.r = w; 54876169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian dst.crop.b = h; 54976169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian 55076169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian err = mLayer.initializeEglImage( 55176169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian mTempGraphicBuffer, &mTexture); 55276169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian // once the EGLImage has been created (whether it fails 55376169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian // or not) we don't need the graphic buffer reference 55476169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian // anymore. 55576169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian mTempGraphicBuffer.clear(); 55676169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian } 55776169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian 55876169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian return err; 55976169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian} 56076169da0e84b0fcf621aeac6141af3ee85bc7c1eMathias Agopian 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// --------------------------------------------------------------------------- 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLayerBuffer::OverlaySource::OverlaySource(LayerBuffer& layer, 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<OverlayRef>* overlayRef, 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t w, uint32_t h, int32_t format) 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : Source(layer), mVisibilityChanged(false), 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOverlay(0), mOverlayHandle(0), mOverlayDevice(0) 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project overlay_control_device_t* overlay_dev = mLayer.mFlinger->getOverlayEngine(); 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (overlay_dev == NULL) { 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // overlays not supported 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOverlayDevice = overlay_dev; 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project overlay_t* overlay = overlay_dev->createOverlay(overlay_dev, w, h, format); 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (overlay == NULL) { 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // couldn't create the overlay (no memory? no more overlays?) 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // enable dithering... 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project overlay_dev->setParameter(overlay_dev, overlay, 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project OVERLAY_DITHER, OVERLAY_ENABLE); 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOverlay = overlay; 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWidth = overlay->w; 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHeight = overlay->h; 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFormat = overlay->format; 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWidthStride = overlay->w_stride; 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHeightStride = overlay->h_stride; 59243ab76389ead0ef90e3d4fa883d5a58c34a6801bRebecca Schultz Zavin mInitialized = false; 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOverlayHandle = overlay->getHandleRef(overlay); 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 596a280496bd2ce04d6beff4536f2115a9a4d7568e4Mathias Agopian sp<OverlayChannel> channel = new OverlayChannel( &layer ); 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *overlayRef = new OverlayRef(mOverlayHandle, channel, 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWidth, mHeight, mFormat, mWidthStride, mHeightStride); 600e38212a22f900468cc4a888b896bee99e1c29a1dBenny Wong mLayer.mFlinger->signalEvent(); 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLayerBuffer::OverlaySource::~OverlaySource() 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOverlay && mOverlayDevice) { 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project overlay_control_device_t* overlay_dev = mOverlayDevice; 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project overlay_dev->destroyOverlay(overlay_dev, mOverlay); 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6117ac5e698b216a1b1af97405b43adf2ad5bc40e7dRebecca Schultz Zavinvoid LayerBuffer::OverlaySource::onDraw(const Region& clip) const 6127ac5e698b216a1b1af97405b43adf2ad5bc40e7dRebecca Schultz Zavin{ 6138ae0384a78ee2b66a91a13fe1c2a80f0642feacdMathias Agopian // this would be where the color-key would be set, should we need it. 614c8546781ff6fa26b3a7f2d1483db363f299a3898Rebecca Schultz Zavin GLclampx red = 0; 615c8546781ff6fa26b3a7f2d1483db363f299a3898Rebecca Schultz Zavin GLclampx green = 0; 6168ae0384a78ee2b66a91a13fe1c2a80f0642feacdMathias Agopian GLclampx blue = 0; 617c8546781ff6fa26b3a7f2d1483db363f299a3898Rebecca Schultz Zavin mLayer.clearWithOpenGL(clip, red, green, blue, 0); 6187ac5e698b216a1b1af97405b43adf2ad5bc40e7dRebecca Schultz Zavin} 6197ac5e698b216a1b1af97405b43adf2ad5bc40e7dRebecca Schultz Zavin 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::OverlaySource::onTransaction(uint32_t flags) 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const Layer::State& front(mLayer.drawingState()); 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const Layer::State& temp(mLayer.currentState()); 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (temp.sequence != front.sequence) { 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mVisibilityChanged = true; 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::OverlaySource::onVisibilityResolved( 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const Transform& planeTransform) 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // this code-path must be as tight as possible, it's called each time 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the screen is composited. 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (UNLIKELY(mOverlay != 0)) { 63543ab76389ead0ef90e3d4fa883d5a58c34a6801bRebecca Schultz Zavin if (mVisibilityChanged || !mInitialized) { 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mVisibilityChanged = false; 63743ab76389ead0ef90e3d4fa883d5a58c34a6801bRebecca Schultz Zavin mInitialized = true; 638a280496bd2ce04d6beff4536f2115a9a4d7568e4Mathias Agopian const Rect bounds(mLayer.getTransformedBounds()); 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int x = bounds.left; 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int y = bounds.top; 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int w = bounds.width(); 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int h = bounds.height(); 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // we need a lock here to protect "destroy" 645b34d143bce3905c23aa5c1b2b147ec6df48cf9d7Mathias Agopian Mutex::Autolock _l(mOverlaySourceLock); 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOverlay) { 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project overlay_control_device_t* overlay_dev = mOverlayDevice; 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project overlay_dev->setPosition(overlay_dev, mOverlay, x,y,w,h); 64943ab76389ead0ef90e3d4fa883d5a58c34a6801bRebecca Schultz Zavin overlay_dev->setParameter(overlay_dev, mOverlay, 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project OVERLAY_TRANSFORM, mLayer.getOrientation()); 6517ac5e698b216a1b1af97405b43adf2ad5bc40e7dRebecca Schultz Zavin overlay_dev->commit(overlay_dev, mOverlay); 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 657a280496bd2ce04d6beff4536f2115a9a4d7568e4Mathias Agopianvoid LayerBuffer::OverlaySource::destroy() 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // we need a lock here to protect "onVisibilityResolved" 660b34d143bce3905c23aa5c1b2b147ec6df48cf9d7Mathias Agopian Mutex::Autolock _l(mOverlaySourceLock); 661a280496bd2ce04d6beff4536f2115a9a4d7568e4Mathias Agopian if (mOverlay && mOverlayDevice) { 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project overlay_control_device_t* overlay_dev = mOverlayDevice; 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project overlay_dev->destroyOverlay(overlay_dev, mOverlay); 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOverlay = 0; 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}; // namespace android 670