Fix wrong host texture binding 22/106922/1 accepted/tizen_common accepted/tizen_ivi accepted/tizen_mobile accepted/tizen_tv accepted/tizen_wearable accepted/tizen/common/20161227.192209 accepted/tizen/ivi/20161226.131617 accepted/tizen/mobile/20161226.131518 accepted/tizen/tv/20161226.131538 accepted/tizen/unified/20170309.031107 accepted/tizen/wearable/20161226.131557 submit/tizen/20161226.050229 submit/tizen_unified/20170308.100403
authorVasiliy Ulyanov <v.ulyanov@samsung.com>
Fri, 23 Dec 2016 17:14:20 +0000 (20:14 +0300)
committerVasiliy Ulyanov <v.ulyanov@samsung.com>
Fri, 23 Dec 2016 17:32:52 +0000 (20:32 +0300)
The call sequence like bellow was causing flickering:

    glBindTexture(GL_TEXTURE_EXTERNAL_OES, tex);
    glBindTexture(GL_TEXTURE_2D, 0);
    glEGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES, img);

Eventually zero texture was used on the host side since external
textures are currently handled as GL_TEXTURE_2D.

Change-Id: I9d8480df7dd5f44f49f31e170de6f478c663f8c3
Signed-off-by: Vasiliy Ulyanov <v.ulyanov@samsung.com>
GLES_common/yagl_gles_texture.c

index ff5f608710996da01d5a09017d767e5ca167f63b..19382f4b4bc9f810b580d35c02d4590733071828 100644 (file)
@@ -248,8 +248,18 @@ void yagl_gles_texture_set_image(struct yagl_gles_texture *texture,
         texture->binding = NULL;
     }
 
+    /*
+     * FIXME We still need to update the host binding when using external
+     * textures even if that same image is already set. E.g. consider the bellow
+     * scenario:
+     *      glBindTexture(GL_TEXTURE_EXTERNAL_OES, tex);
+     *      glBindTexture(GL_TEXTURE_2D, 0);
+     *      glEGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES, img);
+     * External textures are handled as GL_TEXTURE_2D thus the corresponding
+     * host binding will be zero in this case.
+     */
     if (texture->image == image) {
-        return;
+        goto bind;
     }
 
     yagl_gles_image_acquire(image);
@@ -263,6 +273,7 @@ void yagl_gles_texture_set_image(struct yagl_gles_texture *texture,
     texture->global_name = image->tex_global_name;
     texture->image = image;
 
+bind:
     yagl_host_glBindTexture(texture->target == GL_TEXTURE_EXTERNAL_OES ? GL_TEXTURE_2D : texture->target,
                             texture->global_name);
 }