emulator opengl: Small change to support more surface attributes

Change-Id: I14d630d50c8505dabcd065e6187bd6d6509c312b
diff --git a/tools/emulator/opengl/system/egl/egl.cpp b/tools/emulator/opengl/system/egl/egl.cpp
index 5427363..7ad1760 100644
--- a/tools/emulator/opengl/system/egl/egl.cpp
+++ b/tools/emulator/opengl/system/egl/egl.cpp
@@ -117,6 +117,7 @@
     EGLDisplay          dpy;
     EGLConfig           config;
 
+
     egl_surface_t(EGLDisplay dpy, EGLConfig config);
     virtual     ~egl_surface_t();
 
@@ -131,17 +132,39 @@
     uint32_t     getRcSurface(){ return rcSurface; }
 
     virtual     EGLBoolean    isValid(){ return valid; }
-    virtual     EGLint      getWidth() const = 0;
-    virtual     EGLint      getHeight() const = 0;
+
+    void        setWidth(EGLint w){ width = w; }
+    EGLint      getWidth(){ return width; }
+    void         setHeight(EGLint h){ height = h; }
+    EGLint      getHeight(){ return height; }
+    void        setTextureFormat(EGLint _texFormat){ texFormat = _texFormat; }
+    EGLint        getTextureFormat(){ return texFormat; }
+    void         setTextureTarget(EGLint _texTarget){ texTarget = _texTarget; }
+    EGLint        getTextureTarget(){ return texTarget; }
+
+private:
+    //
+    //Surface attributes
+    //
+    EGLint     width;
+    EGLint     height;
+    EGLint    texFormat;
+    EGLint    texTarget;
 
 protected:
     EGLBoolean    valid;
     uint32_t     rcSurface; //handle to surface created via remote control
+
+
 };
 
 egl_surface_t::egl_surface_t(EGLDisplay dpy, EGLConfig config)
     : dpy(dpy), config(config), valid(EGL_FALSE), rcSurface(0)
 {
+    width = 0;
+    height = 0;
+    texFormat = EGL_NO_TEXTURE;
+    texTarget = EGL_NO_TEXTURE;
 }
 
 egl_surface_t::~egl_surface_t()
@@ -166,14 +189,8 @@
     virtual     void        disconnect();
     virtual     EGLBoolean  swapBuffers();
 
-    virtual     EGLint      getWidth() const    { return width;  }
-    virtual     EGLint      getHeight() const   { return height; }
-
-
 private:
     ANativeWindow*     nativeWindow;
-    int width;
-    int height;
     android_native_buffer_t*   buffer;
 
 };
@@ -188,8 +205,11 @@
 {
     // keep a reference on the window
     nativeWindow->common.incRef(&nativeWindow->common);
-    nativeWindow->query(nativeWindow, NATIVE_WINDOW_WIDTH, &width);
-    nativeWindow->query(nativeWindow, NATIVE_WINDOW_HEIGHT, &height);
+    EGLint w,h;
+    nativeWindow->query(nativeWindow, NATIVE_WINDOW_WIDTH, &w);
+    setWidth(w);
+    nativeWindow->query(nativeWindow, NATIVE_WINDOW_HEIGHT, &h);
+    setHeight(h);
 }
 
 egl_window_surface_t::~egl_window_surface_t() {
@@ -271,13 +291,8 @@
 
 struct egl_pbuffer_surface_t : public egl_surface_t {
 
-    int width;
-    int height;
     GLenum    format;
 
-    virtual     EGLint      getWidth() const    { return width;  }
-    virtual     EGLint      getHeight() const   { return height; }
-
     egl_pbuffer_surface_t(
             EGLDisplay dpy, EGLConfig config,
             int32_t w, int32_t h, GLenum format);
@@ -297,9 +312,10 @@
 egl_pbuffer_surface_t::egl_pbuffer_surface_t(
         EGLDisplay dpy, EGLConfig config,
         int32_t w, int32_t h, GLenum pixelFormat)
-    : egl_surface_t(dpy, config),
-    width(w), height(h), format(pixelFormat)
+    : egl_surface_t(dpy, config), format(pixelFormat)
 {
+    setWidth(w);
+    setHeight(h);
 }
 
 egl_pbuffer_surface_t::~egl_pbuffer_surface_t()
@@ -539,11 +555,31 @@
 
     int32_t w = 0;
     int32_t h = 0;
+    EGLint texFormat = EGL_NO_TEXTURE;
+    EGLint texTarget = EGL_NO_TEXTURE;
     while (attrib_list[0]) {
-        if (attrib_list[0] == EGL_WIDTH)  w = attrib_list[1];
-        if (attrib_list[0] == EGL_HEIGHT) h = attrib_list[1];
+        switch (attrib_list[0]) {
+            case EGL_WIDTH:
+                w = attrib_list[1];
+                break;
+            case EGL_HEIGHT:
+                h = attrib_list[1];
+                break;
+            case EGL_TEXTURE_FORMAT:
+                texFormat = attrib_list[1];
+                break;
+            case EGL_TEXTURE_TARGET:
+                texTarget = attrib_list[1];
+                break;
+            default:
+                break;
+        };
         attrib_list+=2;
     }
+    if (((texFormat == EGL_NO_TEXTURE)&&(texTarget != EGL_NO_TEXTURE)) ||
+        ((texFormat != EGL_NO_TEXTURE)&&(texTarget == EGL_NO_TEXTURE))) {
+        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
+    }
     // TODO: check EGL_TEXTURE_FORMAT - need to support eglBindTexImage
 
     GLenum pixelFormat;
@@ -558,6 +594,10 @@
         return setError(EGL_BAD_ALLOC, EGL_NO_SURFACE);
     }
 
+    //setup attributes
+    surface->setTextureFormat(texFormat);
+    surface->setTextureTarget(texTarget);
+
     return surface;
 }
 
@@ -602,6 +642,12 @@
         case EGL_HEIGHT:
             *value = surface->getHeight();
             break;
+        case EGL_TEXTURE_FORMAT:
+            *value = surface->getTextureFormat();
+            break;
+        case EGL_TEXTURE_TARGET:
+            *value = surface->getTextureTarget();
+            break;
             //TODO: complete other attributes
         default:
             ret = setError(EGL_BAD_ATTRIBUTE, EGL_FALSE);