Index: ui/gl/gl_image_shm.cc |
diff --git a/ui/gl/gl_image_shm.cc b/ui/gl/gl_image_shm.cc |
index 156d0f20ad32ab934c89abb35b99e26da78fa48e..75ef453eade794fe846ed1548dbe90d7e56f6f3f 100644 |
--- a/ui/gl/gl_image_shm.cc |
+++ b/ui/gl/gl_image_shm.cc |
@@ -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()); |