opengles emulator: code cleanup removing dead code

This change removes the 'blitFromPbuffer' path in the renderer
which uses binding pbuffer to texture. This path does not work
on all platforms and is not relavent any more. It simplifies
a lot the FBConfig filtering code.

Also, added a check to fail the renderer initialization if
the translator plugin does not support EGL_KHR_gl_texture_2d_image
and GL_OES_EGL_IMAGE (by both GLES implementations [1 and 2])
since our implementation requires it.

Change-Id: Ifd4c66943a8da56308cfb7e38914c962b4f5befe
diff --git a/tools/emulator/opengl/host/libs/libOpenglRender/FBConfig.cpp b/tools/emulator/opengl/host/libs/libOpenglRender/FBConfig.cpp
index 4622161..089f1da 100644
--- a/tools/emulator/opengl/host/libs/libOpenglRender/FBConfig.cpp
+++ b/tools/emulator/opengl/host/libs/libOpenglRender/FBConfig.cpp
@@ -87,88 +87,22 @@
     s_egl.eglGetConfigs(dpy, configs, nConfigs, &nConfigs);
 
     //
-    // Find number of usable configs which support pbuffer rendering
-    // for each ES and ES2 as well as number of configs supporting
-    // EGL_BIND_TO_TEXTURE_RGBA for each of ES and ES2.
+    // copy the config attributes, filter out
+    // configs we do not want to support.
     //
-    const int GL = 0;
-    const int GL1 = 1;
-    const int GL2 = 2;
-    int numPbuf[3] = {0, 0, 0};
-    int numBindToTexture[3] = {0, 0, 0};
-    for (int i=0; i<nConfigs; i++) {
-        GLint depthSize, stencilSize;
-        GLint renderType, surfaceType;
-        GLint bindToTexture;
-
-        s_egl.eglGetConfigAttrib(dpy, configs[i], EGL_DEPTH_SIZE, &depthSize);
-        s_egl.eglGetConfigAttrib(dpy, configs[i], EGL_STENCIL_SIZE, &stencilSize);
-        s_egl.eglGetConfigAttrib(dpy, configs[i], EGL_RENDERABLE_TYPE, &renderType);
-        s_egl.eglGetConfigAttrib(dpy, configs[i], EGL_SURFACE_TYPE, &surfaceType);
-        if (depthSize > 0 && stencilSize > 0 &&
-            (surfaceType & EGL_PBUFFER_BIT) != 0) {
-
-            numPbuf[GL]++;
-
-            if ((renderType & EGL_OPENGL_ES_BIT) != 0) {
-                numPbuf[GL1]++;
-            }
-
-            if ((renderType & EGL_OPENGL_ES2_BIT) != 0) {
-                numPbuf[GL2]++;
-            }
-
-            s_egl.eglGetConfigAttrib(dpy, configs[i],
-                                     EGL_BIND_TO_TEXTURE_RGBA, &bindToTexture);
-            if (bindToTexture) {
-                numBindToTexture[GL]++;
-                if ((renderType & EGL_OPENGL_ES_BIT) != 0) {
-                    numBindToTexture[GL1]++;
-                }
-
-                if ((renderType & EGL_OPENGL_ES2_BIT) != 0) {
-                    numBindToTexture[GL2]++;
-                }
-            }
-        }
-    }
-
-    bool useOnlyPbuf = false;
-    bool useOnlyBindToTexture = false;
-    int numConfigs = nConfigs;
-    if ( numPbuf[GL1] > 0 &&
-        (!caps.hasGL2 || numPbuf[GL2] > 0)) {
-        useOnlyPbuf = true;
-        numConfigs = numPbuf[GL];
-    }
-    if (useOnlyPbuf &&
-        !(caps.has_eglimage_texture_2d &&
-          caps.has_eglimage_renderbuffer) &&
-        numBindToTexture[GL1] > 0 &&
-        (!caps.hasGL2 || numBindToTexture[GL2] > 0)) {
-        useOnlyBindToTexture = true;
-        numConfigs = numBindToTexture[GL];
-        ret = INIT_CONFIG_HAS_BIND_TO_TEXTURE;
-    }
-    else {
-        ret = INIT_CONFIG_PASSED;
-    }
-
     int j = 0;
     s_fbConfigs = new FBConfig*[nConfigs];
     for (int i=0; i<nConfigs; i++) {
-        if (useOnlyBindToTexture) {
-            EGLint bindToTexture;
-            s_egl.eglGetConfigAttrib(dpy, configs[i],
-                                     EGL_BIND_TO_TEXTURE_RGBA, &bindToTexture);
-            if (!bindToTexture) continue;
-        }
-        else if (useOnlyPbuf) {
-            EGLint surfaceType;
-            s_egl.eglGetConfigAttrib(dpy, configs[i],
-                                     EGL_SURFACE_TYPE, &surfaceType);
-            if (!(surfaceType & EGL_PBUFFER_BIT)) continue;
-        }
+
+        //
+        // filter out configs which does not support pbuffers.
+        // we only support pbuffer configs since we use a pbuffer
+        // handle to bind a guest created window object.
+        //
+        EGLint surfaceType;
+        s_egl.eglGetConfigAttrib(dpy, configs[i],
+                                 EGL_SURFACE_TYPE, &surfaceType);
+        if (!(surfaceType & EGL_PBUFFER_BIT)) continue;
 
         //
         // Filter out not RGB configs
@@ -184,7 +118,8 @@
     s_numConfigs = j;
 
     delete[] configs;
-    return ret;
+
+    return s_numConfigs > 0 ? INIT_CONFIG_PASSED : INIT_CONFIG_FAILED;
 }
 
 const FBConfig *FBConfig::get(int p_config)
diff --git a/tools/emulator/opengl/host/libs/libOpenglRender/FBConfig.h b/tools/emulator/opengl/host/libs/libOpenglRender/FBConfig.h
index 8e0356a..6388549 100644
--- a/tools/emulator/opengl/host/libs/libOpenglRender/FBConfig.h
+++ b/tools/emulator/opengl/host/libs/libOpenglRender/FBConfig.h
@@ -23,8 +23,7 @@
 
 enum InitConfigStatus {
     INIT_CONFIG_FAILED = 0,
-    INIT_CONFIG_PASSED = 1,
-    INIT_CONFIG_HAS_BIND_TO_TEXTURE = 2
+    INIT_CONFIG_PASSED = 1
 };
 
 class FBConfig
diff --git a/tools/emulator/opengl/host/libs/libOpenglRender/FrameBuffer.cpp b/tools/emulator/opengl/host/libs/libOpenglRender/FrameBuffer.cpp
index 516ae20..3609a77 100644
--- a/tools/emulator/opengl/host/libs/libOpenglRender/FrameBuffer.cpp
+++ b/tools/emulator/opengl/host/libs/libOpenglRender/FrameBuffer.cpp
@@ -276,6 +276,18 @@
     }
 
     //
+    // Fail initialization if not all of the following extensions
+    // exist:
+    //     EGL_KHR_gl_texture_2d_image
+    //     GL_OES_EGL_IMAGE (by both GLES implementations [1 and 2])
+    //
+    if (!fb->m_caps.has_eglimage_texture_2d) {
+        ERR("Failed: Missing egl_image related extension(s)\n");
+        delete fb;
+        return false;
+    }
+
+    //
     // Initialize set of configs
     //
     InitConfigStatus configStatus = FBConfig::initConfigList(fb);
@@ -317,13 +329,6 @@
     }
 
     //
-    // update Pbuffer bind to texture capability based on configs
-    //
-    fb->m_caps.has_BindToTexture =
-        (configStatus == INIT_CONFIG_HAS_BIND_TO_TEXTURE);
-
-
-    //
     // Initialize some GL state
     //
     s_gl.glMatrixMode(GL_PROJECTION);
diff --git a/tools/emulator/opengl/host/libs/libOpenglRender/FrameBuffer.h b/tools/emulator/opengl/host/libs/libOpenglRender/FrameBuffer.h
index 2a3eb5c..b415efe 100644
--- a/tools/emulator/opengl/host/libs/libOpenglRender/FrameBuffer.h
+++ b/tools/emulator/opengl/host/libs/libOpenglRender/FrameBuffer.h
@@ -35,7 +35,6 @@
     bool hasGL2;
     bool has_eglimage_texture_2d;
     bool has_eglimage_renderbuffer;
-    bool has_BindToTexture;
     EGLint eglMajor;
     EGLint eglMinor;
 };
diff --git a/tools/emulator/opengl/host/libs/libOpenglRender/WindowSurface.cpp b/tools/emulator/opengl/host/libs/libOpenglRender/WindowSurface.cpp
index 14f38be..b8d1bd2 100644
--- a/tools/emulator/opengl/host/libs/libOpenglRender/WindowSurface.cpp
+++ b/tools/emulator/opengl/host/libs/libOpenglRender/WindowSurface.cpp
@@ -35,9 +35,7 @@
     m_width(0),
     m_height(0),
     m_pbufWidth(0),
-    m_pbufHeight(0),
-    m_useEGLImage(false),
-    m_useBindToTexture(false)
+    m_pbufHeight(0)
 {
 }
 
@@ -64,31 +62,10 @@
     const FrameBufferCaps &caps = fb->getCaps();
 
     //
-    // We can use eglimage and prevent copies if:
-    //     GL_KHR_gl_texture_2D_image is present.
-    //     and either there is no need for depth or stencil buffer
-    //     or GL_KHR_gl_renderbuffer_image present.
+    // Create a pbuffer to be used as the egl surface
+    // for that window.
     //
-#if 0
-    //XXX: This path should be implemented
-    win->m_useEGLImage =
-         (caps.has_eglimage_texture_2d &&
-          (caps.has_eglimage_renderbuffer ||
-           (fbconf->getDepthSize() + fbconf->getStencilSize() == 0)) );
-#else
-    win->m_useEGLImage = false;
-#endif
-
-    if (win->m_useEGLImage) {
-    }
-    else if (0 != (fbconf->getSurfaceType() & EGL_PBUFFER_BIT)) {
-        if (!win->resizePbuffer(p_width, p_height)) {
-            delete win;
-            return NULL;
-        }
-    }
-    else {
-        // no EGLImage support and not Pbuffer support - fail
+    if (!win->resizePbuffer(p_width, p_height)) {
         delete win;
         return NULL;
     }
@@ -108,20 +85,8 @@
 {
     if (m_attachedColorBuffer.Ptr() != NULL) {
 
-        if (!m_useEGLImage) {
-            bool copied = false;
-            if (m_useBindToTexture) {
-                copied = m_attachedColorBuffer->blitFromPbuffer(m_eglSurface);
-            }
-
-            if (!copied) {
-                //copyToColorBuffer();
-                blitToColorBuffer();
-            }
-        }
-        else {
-            //TODO: EGLImage
-        }
+        //copyToColorBuffer();
+        blitToColorBuffer();
     }
 }
 
@@ -175,9 +140,6 @@
         return;  // bad param
     }
 
-    if (m_useEGLImage) {
-        // XXX: should be implemented
-    }
 }
 
 void WindowSurface::copyToColorBuffer()
@@ -323,27 +285,14 @@
     const FrameBufferCaps &caps = fb->getCaps();
 
     //
-    // Create pbuffer surface, if possible
-    // set it such that it will be able to be bound to a texture
-    // later to prevent readback.
+    // Create pbuffer surface.
     //
-    EGLint pbufAttribs[12];
+    EGLint pbufAttribs[5];
     pbufAttribs[0] = EGL_WIDTH;
     pbufAttribs[1] = p_width;
     pbufAttribs[2] = EGL_HEIGHT;
     pbufAttribs[3] = p_height;
-
-    if (caps.has_BindToTexture) {
-        pbufAttribs[4] = EGL_TEXTURE_FORMAT;
-        pbufAttribs[5] = EGL_TEXTURE_RGBA;
-        pbufAttribs[6] = EGL_TEXTURE_TARGET;
-        pbufAttribs[7] = EGL_TEXTURE_2D;
-        pbufAttribs[8] = EGL_NONE;
-        m_useBindToTexture = true;
-    }
-    else {
-        pbufAttribs[4] = EGL_NONE;
-    }
+    pbufAttribs[4] = EGL_NONE;
 
     m_eglSurface = s_egl.eglCreatePbufferSurface(fb->getDisplay(),
                                                  m_fbconf->getEGLConfig(),