1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License. 6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at 7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and 14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License. 15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifndef ANDROID_LAYER_BASE_H 18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define ANDROID_LAYER_BASE_H 19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdint.h> 21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h> 22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 231fed11c86a9d59d0f5282ae8ae25ceba2f802fddMathias Agopian#include <EGL/egl.h> 241fed11c86a9d59d0f5282ae8ae25ceba2f802fddMathias Agopian#include <EGL/eglext.h> 25eda65400f5ae301e26c5f52287d831f063069ec2Mathias Agopian#include <GLES/gl.h> 261fed11c86a9d59d0f5282ae8ae25ceba2f802fddMathias Agopian 27076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <utils/RefBase.h> 28076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/Region.h> 30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 3190ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/ISurfaceComposerClient.h> 329cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian 3390ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <private/gui/LayerState.h> 34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 35a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian#include <hardware/hwcomposer.h> 36a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian 375ec99b57c3b6e15a1e19a9888100de76278b7696Mathias Agopian#include "DisplayHardware/DisplayHardware.h" 38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "Transform.h" 39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass Client; 45a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopianclass DisplayHardware; 463330b203039dea366d4981db1408a460134b2d2cMathias Agopianclass GraphicBuffer; 473330b203039dea366d4981db1408a460134b2d2cMathias Agopianclass GraphicPlane; 48670a8990e822785da2a684f71f0035725022ced4Mathias Agopianclass Layer; 49b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopianclass LayerBaseClient; 503330b203039dea366d4981db1408a460134b2d2cMathias Agopianclass SurfaceFlinger; 51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 54076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianclass LayerBase : public RefBase 55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 56f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopian static int32_t sSequence; 57f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopian 58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic: 591b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian LayerBase(SurfaceFlinger* flinger, DisplayID display); 60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project DisplayID dpy; 62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mutable bool contentDirty; 63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Region visibleRegionScreen; 64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Region transparentRegionScreen; 65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Region coveredRegionScreen; 66f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopian int32_t sequence; 67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 6893ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian struct Geometry { 69b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian uint32_t w; 70b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian uint32_t h; 71b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian Rect crop; 72b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian inline bool operator == (const Geometry& rhs) const { 73b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian return (w==rhs.w && h==rhs.h && crop==rhs.crop); 74b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian } 75b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian inline bool operator != (const Geometry& rhs) const { 76b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian return !operator == (rhs); 77b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian } 7893ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian }; 7993ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian 8093ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian struct State { 8193ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian Geometry active; 8293ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian Geometry requested; 83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t z; 84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint8_t alpha; 85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint8_t flags; 86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint8_t reserved[2]; 87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t sequence; // changes when visible regions can change 88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Transform transform; 89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Region transparentRegion; 90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project }; 91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 92a249f2d11249ff37c48119020b797ad437ddef2cJamie Gennis virtual void setName(const String8& name); 93d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian String8 getName() const; 94d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian 95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // modify current state 9641b6aabf356d8a505da37b1d046bc9010028fe8bMathias Agopian bool setPosition(float x, float y); 97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bool setLayer(uint32_t z); 98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bool setSize(uint32_t w, uint32_t h); 99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bool setAlpha(uint8_t alpha); 100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bool setMatrix(const layer_state_t::matrix22_t& matrix); 101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bool setTransparentRegionHint(const Region& opaque); 102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bool setFlags(uint8_t flags, uint8_t mask); 103f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis bool setCrop(const Rect& crop); 104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 105ba6be54876a19444f0b214b4b3b0749df227b013Mathias Agopian void commitTransaction(); 106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bool requestTransaction(); 107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project void forceVisibilityTransaction(); 108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t getTransactionFlags(uint32_t flags); 110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t setTransactionFlags(uint32_t flags); 111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Rect visibleBounds() const; 113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 114b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian virtual sp<LayerBaseClient> getLayerBaseClient() const { return 0; } 115670a8990e822785da2a684f71f0035725022ced4Mathias Agopian virtual sp<Layer> getLayer() const { return 0; } 116b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian 1171b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian virtual const char* getTypeId() const { return "LayerBase"; } 1181b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian 119a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian virtual void setGeometry(hwc_layer_t* hwcl); 120a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian virtual void setPerFrameData(hwc_layer_t* hwcl); 121f384cc3008a25ad1b00403aca0cc001547f029c6Mathias Agopian 122a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian 123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project /** 124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * draw - performs some global clipping optimizations 125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * and calls onDraw(). 126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Typically this method is not overridden, instead implement onDraw() 127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * to perform the actual drawing. 128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual void draw(const Region& clip) const; 130a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian virtual void drawForSreenShot(); 131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project /** 133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * onDraw - draws the surface. 134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual void onDraw(const Region& clip) const = 0; 136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project /** 138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * initStates - called just after construction 139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual void initStates(uint32_t w, uint32_t h, uint32_t flags); 141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project /** 143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * doTransaction - process the transaction. This is a good place to figure 144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * out which attributes of the surface have changed. 145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual uint32_t doTransaction(uint32_t transactionFlags); 147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project /** 149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * setVisibleRegion - called to set the new visible region. This gives 150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * a chance to update the new visible region or record the fact it changed. 151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual void setVisibleRegion(const Region& visibleRegion); 153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project /** 155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * setCoveredRegion - called when the covered region changes. The covered 156ab02873e8f4e235b0db800521dd0c969ed38c0b9Mathias Agopian * region corresponds to any area of the surface that is covered 157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * (transparently or not) by another surface. 158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual void setCoveredRegion(const Region& coveredRegion); 160ab02873e8f4e235b0db800521dd0c969ed38c0b9Mathias Agopian 161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project /** 162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * validateVisibility - cache a bunch of things 163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual void validateVisibility(const Transform& globalTransform); 165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project /** 167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * lockPageFlip - called each time the screen is redrawn and returns whether 168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * the visible regions need to be recomputed (this is a fairly heavy 169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * operation, so this should be set only if needed). Typically this is used 170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * to figure out if the content or size of a surface has changed. 171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual void lockPageFlip(bool& recomputeVisibleRegions); 173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project /** 175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * unlockPageFlip - called each time the screen is redrawn. updates the 176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * final dirty region wrt the planeTransform. 177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * At this point, all visible regions, surface position and size, etc... are 178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * correct. 179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual void unlockPageFlip(const Transform& planeTransform, Region& outDirtyRegion); 181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project /** 183a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian * isOpaque - true if this surface is opaque 184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 185a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian virtual bool isOpaque() const { return true; } 186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project /** 188401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian * needsDithering - true if this surface needs dithering 189401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian */ 190401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian virtual bool needsDithering() const { return false; } 191401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian 192401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian /** 193a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian * needsLinearFiltering - true if this surface's state requires filtering 194a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian */ 195a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian virtual bool needsFiltering() const { return mNeedsFiltering; } 196a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian 197a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian /** 198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * isSecure - true if this surface is secure, that is if it prevents 1999a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian * screenshots or VNC servers. 200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual bool isSecure() const { return false; } 202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 20316f0453fee84c6aad59fe0d1c7d36f061d46cffcGlenn Kasten /** 2047a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis * isProtected - true if the layer may contain protected content in the 2057a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis * GRALLOC_USAGE_PROTECTED sense. 20616f0453fee84c6aad59fe0d1c7d36f061d46cffcGlenn Kasten */ 2077a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis virtual bool isProtected() const { return false; } 20816f0453fee84c6aad59fe0d1c7d36f061d46cffcGlenn Kasten 2090b3ad46a26dc3717260fa9347c77f673f3198606Mathias Agopian /** called with the state lock when the surface is removed from the 2100b3ad46a26dc3717260fa9347c77f673f3198606Mathias Agopian * current list */ 21199ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian virtual void onRemoved() { } 212e8696a40e09b24b634214684d18526187b316a2fJamie Gennis 21399ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian /** called after page-flip 21499ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian */ 21599ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian virtual void onLayerDisplayed() { } 21699ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian 21799ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian /** called before composition. 21899ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian * returns true if the layer has pending updates. 21999ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian */ 22099ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian virtual bool onPreComposition() { return false; } 221e8696a40e09b24b634214684d18526187b316a2fJamie Gennis 2221b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian /** always call base class first */ 2231b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian virtual void dump(String8& result, char* scratch, size_t size) const; 22448b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian virtual void shortDump(String8& result, char* scratch, size_t size) const; 22582d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian virtual void dumpStats(String8& result, char* buffer, size_t SIZE) const; 22625e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian virtual void clearStats(); 2271b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian 2281b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian 2299a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian enum { // flags for doTransaction() 23005cec9d1275fd939c2d1aec235dca2bdb8edef63Mathias Agopian eDontUpdateGeometryState = 0x00000001, 23105cec9d1275fd939c2d1aec235dca2bdb8edef63Mathias Agopian eVisibleRegion = 0x00000002, 2329a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian }; 233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project inline const State& drawingState() const { return mDrawingState; } 236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project inline const State& currentState() const { return mCurrentState; } 237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project inline State& currentState() { return mCurrentState; } 238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t getOrientation() const { return mOrientation; } 2408d91b425078083d0e4967dcd8d669d9f7196123aJamie Gennis int32_t getPlaneOrientation() const { return mPlaneOrientation; } 241a2f4e56fec0fb36c4a370eb23d6e9dc57f250b59Mathias Agopian 242a2f4e56fec0fb36c4a370eb23d6e9dc57f250b59Mathias Agopian void clearWithOpenGL(const Region& clip) const; 243a2f4e56fec0fb36c4a370eb23d6e9dc57f250b59Mathias Agopian 244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprotected: 245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GraphicPlane& graphicPlane(int dpy) const; 246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GraphicPlane& graphicPlane(int dpy); 247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 248010fccb0637f8a69a35ee1a7feb228d213f6d542Mathias Agopian void clearWithOpenGL(const Region& clip, GLclampf r, GLclampf g, 249010fccb0637f8a69a35ee1a7feb228d213f6d542Mathias Agopian GLclampf b, GLclampf alpha) const; 250a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian void drawWithOpenGL(const Region& clip) const; 251a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian 252a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian void setFiltering(bool filtering); 253a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian bool getFiltering() const; 254b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian 2559a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian sp<SurfaceFlinger> mFlinger; 256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t mFlags; 257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 258a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopianprivate: 259a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian // accessed only in the main thread 260a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian // Whether filtering is forced on or not 261a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian bool mFiltering; 262b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian 263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // cached during validateVisibility() 264a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian // Whether filtering is needed b/c of the drawingstate 265a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian bool mNeedsFiltering; 266a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian 267a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopianprotected: 268a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian // cached during validateVisibility() 269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t mOrientation; 2708d91b425078083d0e4967dcd8d669d9f7196123aJamie Gennis int32_t mPlaneOrientation; 271d992db3827016388e8069f5793b031153d423501Mathias Agopian Transform mTransform; 27278fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian GLfloat mVertices[4][2]; 273f74e8e0602100e048c13ea262f0c19c3b8738b6fMathias Agopian size_t mNumVertices; 274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Rect mTransformedBounds; 275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // these are protected by an external lock 277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project State mCurrentState; 278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project State mDrawingState; 279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project volatile int32_t mTransactionFlags; 280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // don't change, don't need a lock 282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bool mPremultipliedAlpha; 283d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian String8 mName; 284d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian mutable bool mDebug; 285d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian 286edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 287ca4d3602c07837d0b2ac6878685a8e327b5f30f0Mathias Agopianpublic: 288ca4d3602c07837d0b2ac6878685a8e327b5f30f0Mathias Agopian // called from class SurfaceFlinger 289076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian virtual ~LayerBase(); 290076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 291edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate: 292076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian LayerBase(const LayerBase& rhs); 293edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass LayerBaseClient : public LayerBase 299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic: 30196f0819f81293076e652792794a961543e6750d7Mathias Agopian LayerBaseClient(SurfaceFlinger* flinger, DisplayID display, 30296f0819f81293076e652792794a961543e6750d7Mathias Agopian const sp<Client>& client); 303edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 304a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian virtual ~LayerBaseClient(); 305a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian 306a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian sp<ISurface> getSurface(); 3070d1561275e80073807ac04728951782d943f8882Mathias Agopian wp<IBinder> getSurfaceBinder() const; 308582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis virtual wp<IBinder> getSurfaceTextureBinder() const; 309a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian 310b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian virtual sp<LayerBaseClient> getLayerBaseClient() const { 311b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian return const_cast<LayerBaseClient*>(this); } 312a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian 3131b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian virtual const char* getTypeId() const { return "LayerBaseClient"; } 314285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian 31596f0819f81293076e652792794a961543e6750d7Mathias Agopian uint32_t getIdentity() const { return mIdentity; } 31696f0819f81293076e652792794a961543e6750d7Mathias Agopian 3171b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopianprotected: 3181b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian virtual void dump(String8& result, char* scratch, size_t size) const; 31948b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian virtual void shortDump(String8& result, char* scratch, size_t size) const; 3201b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian 321a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian class LayerCleaner { 322a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian sp<SurfaceFlinger> mFlinger; 323a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian wp<LayerBaseClient> mLayer; 324a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian protected: 325a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian ~LayerCleaner(); 326a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian public: 327a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian LayerCleaner(const sp<SurfaceFlinger>& flinger, 328a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian const sp<LayerBaseClient>& layer); 329a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian }; 330a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian 331076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianprivate: 332a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian virtual sp<ISurface> createSurface(); 333a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian 33496f0819f81293076e652792794a961543e6750d7Mathias Agopian mutable Mutex mLock; 335a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian mutable bool mHasSurface; 3360d1561275e80073807ac04728951782d943f8882Mathias Agopian wp<IBinder> mClientSurfaceBinder; 337b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian const wp<Client> mClientRef; 3382e123245811a1f31c080a29728fcc1655045f011Mathias Agopian // only read 33996f0819f81293076e652792794a961543e6750d7Mathias Agopian const uint32_t mIdentity; 34096f0819f81293076e652792794a961543e6750d7Mathias Agopian static int32_t sIdentity; 341edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 342edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif // ANDROID_LAYER_BASE_H 348