fix [2167050] glTexImage2D code path buggy in SurfaceFlinger

When EGLImage extension is not available, SurfaceFlinger will fallback to using
glTexImage2D and glTexSubImage2D instead, which requires 50% more memory and an
extra copy. However this code path has never been exercised and had some bugs
which this patch fix.

Mainly the scale factor wasn't computed right when falling back on glDrawElements.
We also fallback to this mode of operation if a buffer doesn't have the adequate
usage bits for EGLImage usage.

This changes only code that is currently not executed. Some refactoring was needed to
keep the change clean. This doesn't change anything functionaly.
diff --git a/libs/surfaceflinger/Layer.h b/libs/surfaceflinger/Layer.h
index f111840..e176cfc 100644
--- a/libs/surfaceflinger/Layer.h
+++ b/libs/surfaceflinger/Layer.h
@@ -20,6 +20,7 @@
 #include <stdint.h>
 #include <sys/types.h>
 
+#include <ui/GraphicBuffer.h>
 #include <ui/PixelFormat.h>
 #include <pixelflinger/pixelflinger.h>
 
@@ -28,7 +29,6 @@
 #include <GLES/gl.h>
 #include <GLES/glext.h>
 
-#include "Buffer.h"
 #include "LayerBase.h"
 #include "Transform.h"
 
@@ -38,7 +38,6 @@
 
 class Client;
 class FreezeLock;
-class Buffer;
 
 // ---------------------------------------------------------------------------
 
@@ -74,20 +73,22 @@
     virtual status_t ditch();
     
     // only for debugging
-    inline sp<Buffer> getBuffer(int i) { return mBuffers[i]; }
+    inline sp<GraphicBuffer> getBuffer(int i) { return mBuffers[i]; }
     // only for debugging
     inline const sp<FreezeLock>&  getFreezeLock() const { return mFreezeLock; }
     // only for debugging
     inline PixelFormat pixelFormat() const { return mFormat; }
 
 private:
-    inline sp<Buffer> getFrontBuffer() {
+    inline sp<GraphicBuffer> getFrontBuffer() {
         return mBuffers[mFrontBufferIndex];
     }
  
     void reloadTexture(const Region& dirty);
 
-    sp<SurfaceBuffer> requestBuffer(int index, int usage);
+    uint32_t getEffectiveUsage(uint32_t usage) const;
+
+    sp<GraphicBuffer> requestBuffer(int index, int usage);
     void destroy();
 
     class SurfaceLayer : public LayerBaseClient::Surface {
@@ -96,7 +97,7 @@
                 SurfaceID id, const sp<Layer>& owner);
         ~SurfaceLayer();
     private:
-        virtual sp<SurfaceBuffer> requestBuffer(int index, int usage);
+        virtual sp<GraphicBuffer> requestBuffer(int index, int usage);
         sp<Layer> getOwner() const {
             return static_cast<Layer*>(Surface::getOwner().get());
         }
@@ -112,10 +113,9 @@
             Region          mPostedDirtyRegion;
             sp<FreezeLock>  mFreezeLock;
             PixelFormat     mFormat;
-            uint32_t        mBufferFlags;
             
             // protected by mLock
-            sp<Buffer>      mBuffers[NUM_BUFFERS];
+            sp<GraphicBuffer> mBuffers[NUM_BUFFERS];
             Texture         mTextures[NUM_BUFFERS];
             uint32_t        mWidth;
             uint32_t        mHeight;