LayerBuffer.cpp revision 9042b4564de5477b18e680c7dce13b587a681dd9
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> 29cbc4c9f8d56317b2fe8964c15c9785ebeef98ca7Mathias Agopian 30cbc4c9f8d56317b2fe8964c15c9785ebeef98ca7Mathias Agopian#include <hardware/copybit.h> 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "LayerBuffer.h" 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "SurfaceFlinger.h" 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "DisplayHardware/DisplayHardware.h" 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 362eab9d8d7034ef05cead1ee26667a75061b5f0aaMathias Agopian#include "gralloc_priv.h" // needed for msm / copybit 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"; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// --------------------------------------------------------------------------- 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLayerBuffer::LayerBuffer(SurfaceFlinger* flinger, DisplayID display, 486edf5af578c1ab1fcd44b7c08ca371456e4b7430Mathias Agopian const sp<Client>& client, int32_t i) 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : LayerBaseClient(flinger, display, client, i), 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNeedsBlending(false) 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLayerBuffer::~LayerBuffer() 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 586cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopianvoid LayerBuffer::onFirstRef() 596cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian{ 60c6603951d45fc9b0d1776fec9444b6f31af92840Mathias Agopian LayerBaseClient::onFirstRef(); 619779b221e999583ff89e0dfc40e56398737adbb3Mathias Agopian mSurface = new SurfaceLayerBuffer(mFlinger, clientIndex(), 626cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian const_cast<LayerBuffer *>(this)); 636cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian} 646cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian 651473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopiansp<LayerBaseClient::Surface> LayerBuffer::createSurface() const 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 676cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian return mSurface; 686cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian} 696cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian 706cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopianstatus_t LayerBuffer::ditch() 716cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian{ 726cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian mSurface.clear(); 736cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian return NO_ERROR; 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool LayerBuffer::needsBlending() const { 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mNeedsBlending; 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::setNeedsBlending(bool blending) { 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNeedsBlending = blending; 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::postBuffer(ssize_t offset) 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Source> source(getSource()); 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (source != 0) 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project source->postBuffer(offset); 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::unregisterBuffers() 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Source> source(clearSource()); 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (source != 0) 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project source->unregisterBuffers(); 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectuint32_t LayerBuffer::doTransaction(uint32_t flags) 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Source> source(getSource()); 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (source != 0) 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project source->onTransaction(flags); 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return LayerBase::doTransaction(flags); 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::unlockPageFlip(const Transform& planeTransform, 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Region& outDirtyRegion) 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // this code-path must be as tight as possible, it's called each time 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the screen is composited. 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Source> source(getSource()); 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (source != 0) 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project source->onVisibilityResolved(planeTransform); 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LayerBase::unlockPageFlip(planeTransform, outDirtyRegion); 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::onDraw(const Region& clip) const 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Source> source(getSource()); 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (LIKELY(source != 0)) { 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project source->onDraw(clip); 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clearWithOpenGL(clip); 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool LayerBuffer::transformed() const 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Source> source(getSource()); 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (LIKELY(source != 0)) 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return source->transformed(); 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 135a280496bd2ce04d6beff4536f2115a9a4d7568e4Mathias Agopianvoid LayerBuffer::serverDestroy() 136a280496bd2ce04d6beff4536f2115a9a4d7568e4Mathias Agopian{ 137a280496bd2ce04d6beff4536f2115a9a4d7568e4Mathias Agopian sp<Source> source(clearSource()); 138a280496bd2ce04d6beff4536f2115a9a4d7568e4Mathias Agopian if (source != 0) { 139a280496bd2ce04d6beff4536f2115a9a4d7568e4Mathias Agopian source->destroy(); 140a280496bd2ce04d6beff4536f2115a9a4d7568e4Mathias Agopian } 141a280496bd2ce04d6beff4536f2115a9a4d7568e4Mathias Agopian} 142a280496bd2ce04d6beff4536f2115a9a4d7568e4Mathias Agopian 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This creates a "buffer" source for this surface 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t LayerBuffer::registerBuffers(const ISurface::BufferHeap& buffers) 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex::Autolock _l(mLock); 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mSource != 0) 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return INVALID_OPERATION; 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<BufferSource> source = new BufferSource(*this, buffers); 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t result = source->getStatus(); 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (result == NO_ERROR) { 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSource = source; 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This creates an "overlay" source for this surface 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsp<OverlayRef> LayerBuffer::createOverlay(uint32_t w, uint32_t h, int32_t f) 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<OverlayRef> result; 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex::Autolock _l(mLock); 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mSource != 0) 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<OverlaySource> source = new OverlaySource(*this, &result, w, h, f); 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (result != 0) { 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSource = source; 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsp<LayerBuffer::Source> LayerBuffer::getSource() const { 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex::Autolock _l(mLock); 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mSource; 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsp<LayerBuffer::Source> LayerBuffer::clearSource() { 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Source> source; 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex::Autolock _l(mLock); 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project source = mSource; 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSource.clear(); 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return source; 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ============================================================================ 1929779b221e999583ff89e0dfc40e56398737adbb3Mathias Agopian// LayerBuffer::SurfaceLayerBuffer 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ============================================================================ 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1959779b221e999583ff89e0dfc40e56398737adbb3Mathias AgopianLayerBuffer::SurfaceLayerBuffer::SurfaceLayerBuffer(const sp<SurfaceFlinger>& flinger, 1966cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian SurfaceID id, const sp<LayerBuffer>& owner) 1976cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian : LayerBaseClient::Surface(flinger, id, owner->getIdentity(), owner) 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2019779b221e999583ff89e0dfc40e56398737adbb3Mathias AgopianLayerBuffer::SurfaceLayerBuffer::~SurfaceLayerBuffer() 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unregisterBuffers(); 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2069779b221e999583ff89e0dfc40e56398737adbb3Mathias Agopianstatus_t LayerBuffer::SurfaceLayerBuffer::registerBuffers( 2071473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian const ISurface::BufferHeap& buffers) 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2091473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian sp<LayerBuffer> owner(getOwner()); 2101473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian if (owner != 0) 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return owner->registerBuffers(buffers); 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_INIT; 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2159779b221e999583ff89e0dfc40e56398737adbb3Mathias Agopianvoid LayerBuffer::SurfaceLayerBuffer::postBuffer(ssize_t offset) 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2171473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian sp<LayerBuffer> owner(getOwner()); 2181473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian if (owner != 0) 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner->postBuffer(offset); 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2229779b221e999583ff89e0dfc40e56398737adbb3Mathias Agopianvoid LayerBuffer::SurfaceLayerBuffer::unregisterBuffers() 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2241473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian sp<LayerBuffer> owner(getOwner()); 2251473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian if (owner != 0) 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner->unregisterBuffers(); 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2299779b221e999583ff89e0dfc40e56398737adbb3Mathias Agopiansp<OverlayRef> LayerBuffer::SurfaceLayerBuffer::createOverlay( 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t w, uint32_t h, int32_t format) { 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<OverlayRef> result; 2321473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian sp<LayerBuffer> owner(getOwner()); 2331473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian if (owner != 0) 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = owner->createOverlay(w, h, format); 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ============================================================================ 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// LayerBuffer::Buffer 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ============================================================================ 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLayerBuffer::Buffer::Buffer(const ISurface::BufferHeap& buffers, ssize_t offset) 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : mBufferHeap(buffers) 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NativeBuffer& src(mNativeBuffer); 2462eab9d8d7034ef05cead1ee26667a75061b5f0aaMathias Agopian 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project src.crop.l = 0; 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project src.crop.t = 0; 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project src.crop.r = buffers.w; 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project src.crop.b = buffers.h; 2512eab9d8d7034ef05cead1ee26667a75061b5f0aaMathias Agopian 2522eab9d8d7034ef05cead1ee26667a75061b5f0aaMathias Agopian src.img.w = buffers.hor_stride ?: buffers.w; 2532eab9d8d7034ef05cead1ee26667a75061b5f0aaMathias Agopian src.img.h = buffers.ver_stride ?: buffers.h; 2542eab9d8d7034ef05cead1ee26667a75061b5f0aaMathias Agopian src.img.format = buffers.format; 2552eab9d8d7034ef05cead1ee26667a75061b5f0aaMathias Agopian src.img.base = (void*)(intptr_t(buffers.heap->base()) + offset); 2562eab9d8d7034ef05cead1ee26667a75061b5f0aaMathias Agopian 2578f78faa1ef7e2436d11e4c04be67b5a95bf126b9Mathias Agopian // FIXME: gross hack, we should never access private_handle_t from here, 2588f78faa1ef7e2436d11e4c04be67b5a95bf126b9Mathias Agopian // but this is needed by msm drivers 2592eab9d8d7034ef05cead1ee26667a75061b5f0aaMathias Agopian private_handle_t* hnd = new private_handle_t( 2602eab9d8d7034ef05cead1ee26667a75061b5f0aaMathias Agopian buffers.heap->heapID(), buffers.heap->getSize(), 0); 2612eab9d8d7034ef05cead1ee26667a75061b5f0aaMathias Agopian hnd->offset = offset; 2622eab9d8d7034ef05cead1ee26667a75061b5f0aaMathias Agopian src.img.handle = hnd; 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLayerBuffer::Buffer::~Buffer() 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2672eab9d8d7034ef05cead1ee26667a75061b5f0aaMathias Agopian NativeBuffer& src(mNativeBuffer); 2682eab9d8d7034ef05cead1ee26667a75061b5f0aaMathias Agopian if (src.img.handle) 2692eab9d8d7034ef05cead1ee26667a75061b5f0aaMathias Agopian delete (private_handle_t*)src.img.handle; 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ============================================================================ 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// LayerBuffer::Source 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// LayerBuffer::BufferSource 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// LayerBuffer::OverlaySource 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ============================================================================ 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLayerBuffer::Source::Source(LayerBuffer& layer) 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : mLayer(layer) 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLayerBuffer::Source::~Source() { 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::Source::onDraw(const Region& clip) const { 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::Source::onTransaction(uint32_t flags) { 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::Source::onVisibilityResolved( 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const Transform& planeTransform) { 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::Source::postBuffer(ssize_t offset) { 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::Source::unregisterBuffers() { 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool LayerBuffer::Source::transformed() const { 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mLayer.mTransformed; 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// --------------------------------------------------------------------------- 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLayerBuffer::BufferSource::BufferSource(LayerBuffer& layer, 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const ISurface::BufferHeap& buffers) 303999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian : Source(layer), mStatus(NO_ERROR), mBufferSize(0) 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (buffers.heap == NULL) { 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // this is allowed, but in this case, it is illegal to receive 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // postBuffer(). The surface just erases the framebuffer with 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // fully transparent pixels. 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBufferHeap = buffers; 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayer.setNeedsBlending(false); 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t err = (buffers.heap->heapID() >= 0) ? NO_ERROR : NO_INIT; 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("LayerBuffer::BufferSource: invalid heap (%s)", strerror(err)); 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStatus = err; 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PixelFormatInfo info; 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = getPixelFormatInfo(buffers.format, &info); 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("LayerBuffer::BufferSource: invalid format %d (%s)", 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffers.format, strerror(err)); 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStatus = err; 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (buffers.hor_stride<0 || buffers.ver_stride<0) { 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("LayerBuffer::BufferSource: invalid parameters " 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "(w=%d, h=%d, xs=%d, ys=%d)", 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffers.w, buffers.h, buffers.hor_stride, buffers.ver_stride); 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStatus = BAD_VALUE; 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBufferHeap = buffers; 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayer.setNeedsBlending((info.h_alpha - info.l_alpha) > 0); 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBufferSize = info.getScanlineSize(buffers.hor_stride)*buffers.ver_stride; 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayer.forceVisibilityTransaction(); 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLayerBuffer::BufferSource::~BufferSource() 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 346999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian if (mTexture.name != -1U) { 347999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian glDeleteTextures(1, &mTexture.name); 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3499042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian if (mTexture.image != EGL_NO_IMAGE_KHR) { 3509042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian EGLDisplay dpy(mLayer.mFlinger->graphicPlane(0).getEGLDisplay()); 3519042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian eglDestroyImageKHR(dpy, mTexture.image); 35268eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian } 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::BufferSource::postBuffer(ssize_t offset) 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ISurface::BufferHeap buffers; 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { // scope for the lock 359b34d143bce3905c23aa5c1b2b147ec6df48cf9d7Mathias Agopian Mutex::Autolock _l(mBufferSourceLock); 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffers = mBufferHeap; 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (buffers.heap != 0) { 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const size_t memorySize = buffers.heap->getSize(); 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((size_t(offset) + mBufferSize) > memorySize) { 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("LayerBuffer::BufferSource::postBuffer() " 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "invalid buffer (offset=%d, size=%d, heap-size=%d", 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int(offset), int(mBufferSize), int(memorySize)); 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Buffer> buffer; 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (buffers.heap != 0) { 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffer = new LayerBuffer::Buffer(buffers, offset); 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (buffer->getStatus() != NO_ERROR) 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffer.clear(); 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setBuffer(buffer); 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayer.invalidate(); 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::BufferSource::unregisterBuffers() 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 384b34d143bce3905c23aa5c1b2b147ec6df48cf9d7Mathias Agopian Mutex::Autolock _l(mBufferSourceLock); 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBufferHeap.heap.clear(); 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBuffer.clear(); 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayer.invalidate(); 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsp<LayerBuffer::Buffer> LayerBuffer::BufferSource::getBuffer() const 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 392b34d143bce3905c23aa5c1b2b147ec6df48cf9d7Mathias Agopian Mutex::Autolock _l(mBufferSourceLock); 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mBuffer; 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::BufferSource::setBuffer(const sp<LayerBuffer::Buffer>& buffer) 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 398b34d143bce3905c23aa5c1b2b147ec6df48cf9d7Mathias Agopian Mutex::Autolock _l(mBufferSourceLock); 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBuffer = buffer; 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool LayerBuffer::BufferSource::transformed() const 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mBufferHeap.transform ? true : Source::transformed(); 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::BufferSource::onDraw(const Region& clip) const 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 409999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian sp<Buffer> ourBuffer(getBuffer()); 410999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian if (UNLIKELY(ourBuffer == 0)) { 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // nothing to do, we don't have a buffer 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayer.clearWithOpenGL(clip); 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 416cbc4c9f8d56317b2fe8964c15c9785ebeef98ca7Mathias Agopian status_t err = NO_ERROR; 417cbc4c9f8d56317b2fe8964c15c9785ebeef98ca7Mathias Agopian NativeBuffer src(ourBuffer->getBuffer()); 418a280496bd2ce04d6beff4536f2115a9a4d7568e4Mathias Agopian const Rect transformedBounds(mLayer.getTransformedBounds()); 4198f78faa1ef7e2436d11e4c04be67b5a95bf126b9Mathias Agopian 4209042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian if (UNLIKELY(mTexture.name == -1LU)) { 4219042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian mTexture.name = mLayer.createTexture(); 4229042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian } 423cbc4c9f8d56317b2fe8964c15c9785ebeef98ca7Mathias Agopian 4249042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian#if defined(EGL_ANDROID_image_native_buffer) 4259042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian if (mLayer.mFlags & DisplayHardware::DIRECT_TEXTURE) { 4269042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian // NOTE: Assume the buffer is allocated with the proper USAGE flags 4279042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian sp<GraphicBuffer> graphicBuffer = new GraphicBuffer( 4289042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian src.crop.r, src.crop.b, src.img.format, 4299042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian GraphicBuffer::USAGE_HW_TEXTURE, 4309042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian src.img.w, src.img.handle, false); 431cbc4c9f8d56317b2fe8964c15c9785ebeef98ca7Mathias Agopian 4329042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian err = mLayer.initializeEglImage(graphicBuffer, &mTexture); 433cbc4c9f8d56317b2fe8964c15c9785ebeef98ca7Mathias Agopian } 43426c28b16f3464eeb98b091b915ccf494ac31c35fMathias Agopian#endif 4359042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian else { 4369042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian err = INVALID_OPERATION; 4379042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian } 4389042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian 4399042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian if (err != NO_ERROR) { 440999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian // OpenGL fall-back 441dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian GLuint w = 0; 442dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian GLuint h = 0; 443999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian GGLSurface t; 444999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian t.version = sizeof(GGLSurface); 445999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian t.width = src.crop.r; 446999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian t.height = src.crop.b; 447999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian t.stride = src.img.w; 448999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian t.vstride= src.img.h; 449999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian t.format = src.img.format; 4502eab9d8d7034ef05cead1ee26667a75061b5f0aaMathias Agopian t.data = (GGLubyte*)src.img.base; 451999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian const Region dirty(Rect(t.width, t.height)); 4526950e428feaccc8164b989ef64e771a99948797aMathias Agopian mLayer.loadTexture(&mTexture, dirty, t); 453dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian } 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4559042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian mTexture.transform = mBufferHeap.transform; 4569042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian mLayer.drawWithOpenGL(clip, mTexture); 4579042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian} 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// --------------------------------------------------------------------------- 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLayerBuffer::OverlaySource::OverlaySource(LayerBuffer& layer, 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<OverlayRef>* overlayRef, 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t w, uint32_t h, int32_t format) 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : Source(layer), mVisibilityChanged(false), 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOverlay(0), mOverlayHandle(0), mOverlayDevice(0) 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project overlay_control_device_t* overlay_dev = mLayer.mFlinger->getOverlayEngine(); 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (overlay_dev == NULL) { 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // overlays not supported 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOverlayDevice = overlay_dev; 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project overlay_t* overlay = overlay_dev->createOverlay(overlay_dev, w, h, format); 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (overlay == NULL) { 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // couldn't create the overlay (no memory? no more overlays?) 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // enable dithering... 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project overlay_dev->setParameter(overlay_dev, overlay, 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project OVERLAY_DITHER, OVERLAY_ENABLE); 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOverlay = overlay; 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWidth = overlay->w; 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHeight = overlay->h; 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFormat = overlay->format; 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWidthStride = overlay->w_stride; 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHeightStride = overlay->h_stride; 49043ab76389ead0ef90e3d4fa883d5a58c34a6801bRebecca Schultz Zavin mInitialized = false; 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOverlayHandle = overlay->getHandleRef(overlay); 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 494a280496bd2ce04d6beff4536f2115a9a4d7568e4Mathias Agopian sp<OverlayChannel> channel = new OverlayChannel( &layer ); 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *overlayRef = new OverlayRef(mOverlayHandle, channel, 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWidth, mHeight, mFormat, mWidthStride, mHeightStride); 498e38212a22f900468cc4a888b896bee99e1c29a1dBenny Wong mLayer.mFlinger->signalEvent(); 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLayerBuffer::OverlaySource::~OverlaySource() 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOverlay && mOverlayDevice) { 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project overlay_control_device_t* overlay_dev = mOverlayDevice; 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project overlay_dev->destroyOverlay(overlay_dev, mOverlay); 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5097ac5e698b216a1b1af97405b43adf2ad5bc40e7dRebecca Schultz Zavinvoid LayerBuffer::OverlaySource::onDraw(const Region& clip) const 5107ac5e698b216a1b1af97405b43adf2ad5bc40e7dRebecca Schultz Zavin{ 5118ae0384a78ee2b66a91a13fe1c2a80f0642feacdMathias Agopian // this would be where the color-key would be set, should we need it. 512c8546781ff6fa26b3a7f2d1483db363f299a3898Rebecca Schultz Zavin GLclampx red = 0; 513c8546781ff6fa26b3a7f2d1483db363f299a3898Rebecca Schultz Zavin GLclampx green = 0; 5148ae0384a78ee2b66a91a13fe1c2a80f0642feacdMathias Agopian GLclampx blue = 0; 515c8546781ff6fa26b3a7f2d1483db363f299a3898Rebecca Schultz Zavin mLayer.clearWithOpenGL(clip, red, green, blue, 0); 5167ac5e698b216a1b1af97405b43adf2ad5bc40e7dRebecca Schultz Zavin} 5177ac5e698b216a1b1af97405b43adf2ad5bc40e7dRebecca Schultz Zavin 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::OverlaySource::onTransaction(uint32_t flags) 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const Layer::State& front(mLayer.drawingState()); 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const Layer::State& temp(mLayer.currentState()); 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (temp.sequence != front.sequence) { 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mVisibilityChanged = true; 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBuffer::OverlaySource::onVisibilityResolved( 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const Transform& planeTransform) 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // this code-path must be as tight as possible, it's called each time 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the screen is composited. 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (UNLIKELY(mOverlay != 0)) { 53343ab76389ead0ef90e3d4fa883d5a58c34a6801bRebecca Schultz Zavin if (mVisibilityChanged || !mInitialized) { 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mVisibilityChanged = false; 53543ab76389ead0ef90e3d4fa883d5a58c34a6801bRebecca Schultz Zavin mInitialized = true; 536a280496bd2ce04d6beff4536f2115a9a4d7568e4Mathias Agopian const Rect bounds(mLayer.getTransformedBounds()); 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int x = bounds.left; 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int y = bounds.top; 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int w = bounds.width(); 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int h = bounds.height(); 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // we need a lock here to protect "destroy" 543b34d143bce3905c23aa5c1b2b147ec6df48cf9d7Mathias Agopian Mutex::Autolock _l(mOverlaySourceLock); 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOverlay) { 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project overlay_control_device_t* overlay_dev = mOverlayDevice; 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project overlay_dev->setPosition(overlay_dev, mOverlay, x,y,w,h); 54743ab76389ead0ef90e3d4fa883d5a58c34a6801bRebecca Schultz Zavin overlay_dev->setParameter(overlay_dev, mOverlay, 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project OVERLAY_TRANSFORM, mLayer.getOrientation()); 5497ac5e698b216a1b1af97405b43adf2ad5bc40e7dRebecca Schultz Zavin overlay_dev->commit(overlay_dev, mOverlay); 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 555a280496bd2ce04d6beff4536f2115a9a4d7568e4Mathias Agopianvoid LayerBuffer::OverlaySource::destroy() 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // we need a lock here to protect "onVisibilityResolved" 558b34d143bce3905c23aa5c1b2b147ec6df48cf9d7Mathias Agopian Mutex::Autolock _l(mOverlaySourceLock); 559a280496bd2ce04d6beff4536f2115a9a4d7568e4Mathias Agopian if (mOverlay && mOverlayDevice) { 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project overlay_control_device_t* overlay_dev = mOverlayDevice; 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project overlay_dev->destroyOverlay(overlay_dev, mOverlay); 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOverlay = 0; 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// --------------------------------------------------------------------------- 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android 568