1 /* 2 * Copyright (C) 2007 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef ANDROID_LAYER_H 18 #define ANDROID_LAYER_H 19 20 #include <stdint.h> 21 #include <sys/types.h> 22 23 #include <ui/GraphicBuffer.h> 24 #include <ui/PixelFormat.h> 25 #include <pixelflinger/pixelflinger.h> 26 27 #include <EGL/egl.h> 28 #include <EGL/eglext.h> 29 #include <GLES/gl.h> 30 #include <GLES/glext.h> 31 32 #include "LayerBase.h" 33 #include "Transform.h" 34 35 namespace android { 36 37 // --------------------------------------------------------------------------- 38 39 class Client; 40 class FreezeLock; 41 42 // --------------------------------------------------------------------------- 43 44 const size_t NUM_BUFFERS = 2; 45 46 class Layer : public LayerBaseClient 47 { 48 public: 49 static const uint32_t typeInfo; 50 static const char* const typeID; getTypeID()51 virtual char const* getTypeID() const { return typeID; } getTypeInfo()52 virtual uint32_t getTypeInfo() const { return typeInfo; } 53 54 Layer(SurfaceFlinger* flinger, DisplayID display, 55 const sp<Client>& client, int32_t i); 56 57 virtual ~Layer(); 58 59 status_t setBuffers(uint32_t w, uint32_t h, 60 PixelFormat format, uint32_t flags=0); 61 62 void setDrawingSize(uint32_t w, uint32_t h); 63 64 virtual void onDraw(const Region& clip) const; 65 virtual uint32_t doTransaction(uint32_t transactionFlags); 66 virtual void lockPageFlip(bool& recomputeVisibleRegions); 67 virtual void unlockPageFlip(const Transform& planeTransform, Region& outDirtyRegion); 68 virtual void finishPageFlip(); needsBlending()69 virtual bool needsBlending() const { return mNeedsBlending; } needsDithering()70 virtual bool needsDithering() const { return mNeedsDithering; } isSecure()71 virtual bool isSecure() const { return mSecure; } 72 virtual sp<Surface> createSurface() const; 73 virtual status_t ditch(); 74 75 // only for debugging getBuffer(int i)76 inline sp<GraphicBuffer> getBuffer(int i) { return mBuffers[i]; } 77 // only for debugging getFreezeLock()78 inline const sp<FreezeLock>& getFreezeLock() const { return mFreezeLock; } 79 // only for debugging pixelFormat()80 inline PixelFormat pixelFormat() const { return mFormat; } 81 82 private: getFrontBufferLocked()83 inline sp<GraphicBuffer> getFrontBufferLocked() { 84 return mBuffers[mFrontBufferIndex]; 85 } 86 87 void reloadTexture(const Region& dirty); 88 89 uint32_t getEffectiveUsage(uint32_t usage) const; 90 91 sp<GraphicBuffer> requestBuffer(int index, int usage); 92 void destroy(); 93 94 class SurfaceLayer : public LayerBaseClient::Surface { 95 public: 96 SurfaceLayer(const sp<SurfaceFlinger>& flinger, 97 SurfaceID id, const sp<Layer>& owner); 98 ~SurfaceLayer(); 99 private: 100 virtual sp<GraphicBuffer> requestBuffer(int index, int usage); getOwner()101 sp<Layer> getOwner() const { 102 return static_cast<Layer*>(Surface::getOwner().get()); 103 } 104 }; 105 friend class SurfaceLayer; 106 107 sp<Surface> mSurface; 108 109 bool mSecure; 110 bool mNoEGLImageForSwBuffers; 111 int32_t mFrontBufferIndex; 112 bool mNeedsBlending; 113 bool mNeedsDithering; 114 Region mPostedDirtyRegion; 115 sp<FreezeLock> mFreezeLock; 116 PixelFormat mFormat; 117 118 // protected by mLock 119 sp<GraphicBuffer> mBuffers[NUM_BUFFERS]; 120 Texture mTextures[NUM_BUFFERS]; 121 sp<GraphicBuffer> mHybridBuffer; 122 uint32_t mWidth; 123 uint32_t mHeight; 124 125 mutable Mutex mLock; 126 }; 127 128 // --------------------------------------------------------------------------- 129 130 }; // namespace android 131 132 #endif // ANDROID_LAYER_H 133