Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / ui / gl / gl_image_shm.cc
index 156d0f2..75ef453 100644 (file)
@@ -139,40 +139,51 @@ bool GLImageShm::BindTexImage(unsigned target) {
 #if defined(OS_WIN) || defined(USE_X11) || defined(OS_ANDROID) || \
     defined(USE_OZONE)
   if (target == GL_TEXTURE_EXTERNAL_OES) {
-    if (egl_image_ != EGL_NO_IMAGE_KHR)
-      eglDestroyImageKHR(GLSurfaceEGL::GetHardwareDisplay(), egl_image_);
-
-    if (!egl_texture_id_)
+    if (egl_image_ == EGL_NO_IMAGE_KHR) {
+      DCHECK_EQ(0u, egl_texture_id_);
       glGenTextures(1, &egl_texture_id_);
 
-    {
+      {
+        ScopedTextureBinder texture_binder(GL_TEXTURE_2D, egl_texture_id_);
+
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+        glTexImage2D(GL_TEXTURE_2D,
+                     0,  // mip level
+                     TextureFormat(internalformat_),
+                     size_.width(),
+                     size_.height(),
+                     0,  // border
+                     DataFormat(internalformat_),
+                     DataType(internalformat_),
+                     shared_memory_->memory());
+      }
+
+      EGLint attrs[] = {EGL_IMAGE_PRESERVED_KHR, EGL_TRUE, EGL_NONE};
+      // Need to pass current EGL rendering context to eglCreateImageKHR for
+      // target type EGL_GL_TEXTURE_2D_KHR.
+      egl_image_ =
+          eglCreateImageKHR(GLSurfaceEGL::GetHardwareDisplay(),
+                            eglGetCurrentContext(),
+                            EGL_GL_TEXTURE_2D_KHR,
+                            reinterpret_cast<EGLClientBuffer>(egl_texture_id_),
+                            attrs);
+      DCHECK_NE(EGL_NO_IMAGE_KHR, egl_image_)
+          << "Error creating EGLImage: " << eglGetError();
+    } else {
       ScopedTextureBinder texture_binder(GL_TEXTURE_2D, egl_texture_id_);
-      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-
-      glTexImage2D(GL_TEXTURE_2D,
-                   0,  // mip level
-                   TextureFormat(internalformat_),
-                   size_.width(),
-                   size_.height(),
-                   0,  // border
-                   DataFormat(internalformat_),
-                   DataType(internalformat_),
-                   shared_memory_->memory());
-    }
 
-    EGLint attrs[] = {EGL_IMAGE_PRESERVED_KHR, EGL_TRUE, EGL_NONE};
-    // Need to pass current EGL rendering context to eglCreateImageKHR for
-    // target type EGL_GL_TEXTURE_2D_KHR.
-    egl_image_ =
-        eglCreateImageKHR(GLSurfaceEGL::GetHardwareDisplay(),
-                          eglGetCurrentContext(),
-                          EGL_GL_TEXTURE_2D_KHR,
-                          reinterpret_cast<EGLClientBuffer>(egl_texture_id_),
-                          attrs);
-    DCHECK_NE(EGL_NO_IMAGE_KHR, egl_image_)
-        << "Error creating EGLImage: " << eglGetError();
+      glTexSubImage2D(GL_TEXTURE_2D,
+                      0,  // mip level
+                      0,  // x-offset
+                      0,  // y-offset
+                      size_.width(),
+                      size_.height(),
+                      DataFormat(internalformat_),
+                      DataType(internalformat_),
+                      shared_memory_->memory());
+    }
 
     glEGLImageTargetTexture2DOES(target, egl_image_);
     DCHECK_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError());