evas/gl: Bind texture with external target for tbm surface

egl images created using tbm surface for native surface set use
GL_TEXTURE_EXTERNAL_OES as texture target, so we should bind to
this target when rendering.
Dynamic hint set using tbm surface also creates egl images, but
as we only use RGB* colorspace for this we can use GL_TEXTURE_2D.
So, keep track of texture target in shader array, and bind to the
appropriate one.
This also fixes the bug that image_data_get only worked when BOTH
sec_image_map and sec_tbm_surface extensions are supported.
This commit is contained in:
Dongyeon Kim 2015-11-12 13:56:17 +09:00
parent 16eb3942bb
commit 7db0e20661
5 changed files with 48 additions and 39 deletions

View File

@ -253,6 +253,7 @@ struct _Evas_Engine_GL_Context
struct { struct {
Evas_GL_Program *prog; Evas_GL_Program *prog;
GLuint cur_tex, cur_texu, cur_texv, cur_texa, cur_texm; GLuint cur_tex, cur_texu, cur_texv, cur_texa, cur_texm;
int tex_target;
int render_op; int render_op;
int cx, cy, cw, ch; int cx, cy, cw, ch;
int smooth; int smooth;
@ -282,6 +283,7 @@ struct _Evas_Engine_GL_Context
Evas_GL_Image *surface; Evas_GL_Image *surface;
GLuint cur_tex, cur_texu, cur_texv, cur_texa, cur_texm; GLuint cur_tex, cur_texu, cur_texv, cur_texa, cur_texm;
void *cur_tex_dyn, *cur_texu_dyn, *cur_texv_dyn; void *cur_tex_dyn, *cur_texu_dyn, *cur_texv_dyn;
int tex_target;
int render_op; int render_op;
int cx, cy, cw, ch; int cx, cy, cw, ch;
int smooth; int smooth;
@ -355,6 +357,7 @@ struct _Evas_GL_Texture_Pool
int w, h; int w, h;
int stride; int stride;
int checked_out; int checked_out;
int target;
} dyn; } dyn;
Eina_List *allocations; Eina_List *allocations;
Eina_Rectangle_Pool *eina_pool; Eina_Rectangle_Pool *eina_pool;

View File

@ -1071,6 +1071,7 @@ evas_gl_common_context_newframe(Evas_Engine_GL_Context *gc)
gc->state.current.cur_texv = 0; gc->state.current.cur_texv = 0;
gc->state.current.cur_texa = 0; gc->state.current.cur_texa = 0;
gc->state.current.cur_texm = 0; gc->state.current.cur_texm = 0;
gc->state.current.tex_target = GL_TEXTURE_2D;
gc->state.current.render_op = 0; gc->state.current.render_op = 0;
gc->state.current.smooth = 0; gc->state.current.smooth = 0;
gc->state.current.blend = 0; gc->state.current.blend = 0;
@ -1099,6 +1100,7 @@ evas_gl_common_context_newframe(Evas_Engine_GL_Context *gc)
gc->pipe[i].shader.cur_texv = 0; gc->pipe[i].shader.cur_texv = 0;
gc->pipe[i].shader.cur_texa = 0; gc->pipe[i].shader.cur_texa = 0;
gc->pipe[i].shader.cur_texm = 0; gc->pipe[i].shader.cur_texm = 0;
gc->pipe[i].shader.tex_target = GL_TEXTURE_2D;
gc->pipe[i].shader.render_op = EVAS_RENDER_BLEND; gc->pipe[i].shader.render_op = EVAS_RENDER_BLEND;
gc->pipe[i].shader.smooth = 0; gc->pipe[i].shader.smooth = 0;
gc->pipe[i].shader.blend = 0; gc->pipe[i].shader.blend = 0;
@ -1137,7 +1139,7 @@ evas_gl_common_context_newframe(Evas_Engine_GL_Context *gc)
glUseProgram(gc->state.current.prog->prog); glUseProgram(gc->state.current.prog->prog);
glActiveTexture(GL_TEXTURE0); glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, gc->pipe[0].shader.cur_tex); glBindTexture(gc->pipe[0].shader.tex_target, gc->pipe[0].shader.cur_tex);
_evas_gl_common_viewport_set(gc); _evas_gl_common_viewport_set(gc);
} }
@ -1222,6 +1224,7 @@ evas_gl_common_context_target_surface_set(Evas_Engine_GL_Context *gc,
gc->state.current.cur_texv = 0; gc->state.current.cur_texv = 0;
gc->state.current.cur_texa = 0; gc->state.current.cur_texa = 0;
gc->state.current.cur_texm = 0; gc->state.current.cur_texm = 0;
gc->state.current.tex_target = GL_TEXTURE_2D;
gc->state.current.render_op = -1; gc->state.current.render_op = -1;
gc->state.current.smooth = -1; gc->state.current.smooth = -1;
gc->state.current.blend = -1; gc->state.current.blend = -1;
@ -1917,9 +1920,15 @@ evas_gl_common_context_image_push(Evas_Engine_GL_Context *gc,
Shader_Sampling sam = 0, masksam = 0; Shader_Sampling sam = 0, masksam = 0;
int yinvert = 0; int yinvert = 0;
Shader_Type shd_in = SHD_IMAGE; Shader_Type shd_in = SHD_IMAGE;
int tex_target = GL_TEXTURE_2D;
if ((tex->im) && (tex->im->native.data)) if (tex->im)
shd_in = SHD_IMAGENATIVE; {
if (tex->im->native.data)
shd_in = SHD_IMAGENATIVE;
if (tex->im->native.target == GL_TEXTURE_EXTERNAL_OES)
tex_target = GL_TEXTURE_EXTERNAL_OES;
}
if (!!mtex) if (!!mtex)
{ {
@ -1968,6 +1977,7 @@ evas_gl_common_context_image_push(Evas_Engine_GL_Context *gc,
gc->pipe[pn].shader.prog = prog; gc->pipe[pn].shader.prog = prog;
gc->pipe[pn].shader.cur_tex = pt->texture; gc->pipe[pn].shader.cur_tex = pt->texture;
gc->pipe[pn].shader.cur_texm = mtex ? mtex->pt->texture : 0; gc->pipe[pn].shader.cur_texm = mtex ? mtex->pt->texture : 0;
gc->pipe[pn].shader.tex_target = tex_target;
gc->pipe[pn].shader.smooth = smooth; gc->pipe[pn].shader.smooth = smooth;
gc->pipe[pn].shader.mask_smooth = mask_smooth; gc->pipe[pn].shader.mask_smooth = mask_smooth;
gc->pipe[pn].shader.blend = blend; gc->pipe[pn].shader.blend = blend;
@ -2951,7 +2961,7 @@ shader_array_flush(Evas_Engine_GL_Context *gc)
} }
#endif #endif
glActiveTexture(GL_TEXTURE0); glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, gc->pipe[i].shader.cur_tex); glBindTexture(gc->pipe[i].shader.tex_target, gc->pipe[i].shader.cur_tex);
} }
if (gc->pipe[i].array.im) if (gc->pipe[i].array.im)
{ {
@ -2959,7 +2969,7 @@ shader_array_flush(Evas_Engine_GL_Context *gc)
if (gc->pipe[i].array.im->tex->pt->dyn.img) if (gc->pipe[i].array.im->tex->pt->dyn.img)
{ {
secsym_glEGLImageTargetTexture2DOES secsym_glEGLImageTargetTexture2DOES
(GL_TEXTURE_2D, gc->pipe[i].array.im->tex->pt->dyn.img); (gc->pipe[i].array.im->tex->pt->dyn.target, gc->pipe[i].array.im->tex->pt->dyn.img);
} }
else else
#endif #endif
@ -3524,6 +3534,7 @@ shader_array_flush(Evas_Engine_GL_Context *gc)
gc->state.current.cur_texa = gc->pipe[i].shader.cur_texa; gc->state.current.cur_texa = gc->pipe[i].shader.cur_texa;
gc->state.current.cur_texu = gc->pipe[i].shader.cur_texu; gc->state.current.cur_texu = gc->pipe[i].shader.cur_texu;
gc->state.current.cur_texv = gc->pipe[i].shader.cur_texv; gc->state.current.cur_texv = gc->pipe[i].shader.cur_texv;
gc->state.current.tex_target = gc->pipe[i].shader.tex_target;
gc->state.current.render_op = gc->pipe[i].shader.render_op; gc->state.current.render_op = gc->pipe[i].shader.render_op;
// gc->state.current.cx = gc->pipe[i].shader.cx; // gc->state.current.cx = gc->pipe[i].shader.cx;
// gc->state.current.cy = gc->pipe[i].shader.cy; // gc->state.current.cy = gc->pipe[i].shader.cy;

View File

@ -400,7 +400,7 @@ _pool_tex_new(Evas_Engine_GL_Context *gc, int w, int h, GLenum intformat, GLenum
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
ok = _tex_2d(gc, pt->intformat, w, h, pt->format, pt->dataformat); ok = _tex_2d(gc, pt->intformat, w, h, pt->format, pt->dataformat);
glBindTexture(GL_TEXTURE_2D, gc->state.current.cur_tex); glBindTexture(gc->state.current.tex_target, gc->state.current.cur_tex);
if (!ok) if (!ok)
{ {
glDeleteTextures(1, &(pt->texture)); glDeleteTextures(1, &(pt->texture));
@ -632,7 +632,7 @@ _pool_tex_render_new(Evas_Engine_GL_Context *gc, int w, int h, int intformat, in
} }
glsym_glBindFramebuffer(GL_FRAMEBUFFER, fnum); glsym_glBindFramebuffer(GL_FRAMEBUFFER, fnum);
glBindTexture(GL_TEXTURE_2D, gc->state.current.cur_tex); glBindTexture(gc->state.current.tex_target, gc->state.current.cur_tex);
if (!ok) if (!ok)
{ {
@ -700,7 +700,7 @@ _pool_tex_native_new(Evas_Engine_GL_Context *gc, int w, int h, int intformat, in
glTexParameteri(im->native.target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(im->native.target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(im->native.target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(im->native.target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glBindTexture(im->native.target, 0); glBindTexture(im->native.target, 0);
glBindTexture(im->native.target, gc->state.current.cur_tex); glBindTexture(gc->state.current.tex_target, gc->state.current.cur_tex);
texinfo.n.num++; texinfo.n.num++;
texinfo.n.pix += pt->w * pt->h; texinfo.n.pix += pt->w * pt->h;
@ -735,12 +735,14 @@ _pool_tex_dynamic_new(Evas_Engine_GL_Context *gc, int w, int h, int intformat, i
_print_tex_count(); _print_tex_count();
pt->dyn.target = GL_TEXTURE_2D;
glGenTextures(1, &(pt->texture)); glGenTextures(1, &(pt->texture));
glBindTexture(GL_TEXTURE_2D, pt->texture); glBindTexture(pt->dyn.target, pt->texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(pt->dyn.target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(pt->dyn.target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(pt->dyn.target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(pt->dyn.target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
egldisplay = pt->gc->egldisp; egldisplay = pt->gc->egldisp;
@ -748,11 +750,6 @@ _pool_tex_dynamic_new(Evas_Engine_GL_Context *gc, int w, int h, int intformat, i
{ {
tbm_format buffer_format = TBM_FORMAT_RGBA8888; tbm_format buffer_format = TBM_FORMAT_RGBA8888;
tbm_surface_info_s info; tbm_surface_info_s info;
int attr[] =
{
EGL_IMAGE_PRESERVED_KHR, EGL_TRUE,
EGL_NONE,
};
switch (intformat) switch (intformat)
{ {
@ -771,7 +768,7 @@ _pool_tex_dynamic_new(Evas_Engine_GL_Context *gc, int w, int h, int intformat, i
pt->dyn.img = secsym_eglCreateImage(egldisplay, pt->dyn.img = secsym_eglCreateImage(egldisplay,
EGL_NO_CONTEXT, EGL_NO_CONTEXT,
EGL_NATIVE_SURFACE_TIZEN, EGL_NATIVE_SURFACE_TIZEN,
pt->dyn.buffer, attr); pt->dyn.buffer, NULL);
if (!pt->dyn.img) if (!pt->dyn.img)
{ {
secsym_tbm_surface_destroy(pt->dyn.buffer); secsym_tbm_surface_destroy(pt->dyn.buffer);
@ -848,7 +845,7 @@ _pool_tex_dynamic_new(Evas_Engine_GL_Context *gc, int w, int h, int intformat, i
goto error; goto error;
} }
glBindTexture(GL_TEXTURE_2D, gc->state.current.cur_tex); glBindTexture(gc->state.current.tex_target, gc->state.current.cur_tex);
#else #else
if (gc + w + h + intformat + format) return pt; if (gc + w + h + intformat + format) return pt;
#endif #endif
@ -862,7 +859,7 @@ error:
secsym_eglDestroyImage(egldisplay, pt->dyn.img); secsym_eglDestroyImage(egldisplay, pt->dyn.img);
pt->dyn.img = NULL; pt->dyn.img = NULL;
} }
glBindTexture(GL_TEXTURE_2D, 0); glBindTexture(pt->dyn.target, 0);
glDeleteTextures(1, &(pt->texture)); glDeleteTextures(1, &(pt->texture));
if (pt->eina_pool) if (pt->eina_pool)
eina_rectangle_pool_free(pt->eina_pool); eina_rectangle_pool_free(pt->eina_pool);
@ -1171,7 +1168,7 @@ evas_gl_common_texture_upload(Evas_GL_Texture *tex, RGBA_Image *im, unsigned int
} }
//glPixelStorei(GL_UNPACK_ALIGNMENT, 4); //glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
if (tex->pt->texture != tex->gc->state.current.cur_tex) if (tex->pt->texture != tex->gc->state.current.cur_tex)
glBindTexture(GL_TEXTURE_2D, tex->gc->state.current.cur_tex); glBindTexture(tex->gc->state.current.tex_target, tex->gc->state.current.cur_tex);
} }
void void
@ -1271,7 +1268,7 @@ evas_gl_common_texture_update(Evas_GL_Texture *tex, RGBA_Image *im)
if (tex->pt->texture != tex->gc->state.current.cur_tex) if (tex->pt->texture != tex->gc->state.current.cur_tex)
{ {
glBindTexture(GL_TEXTURE_2D, tex->gc->state.current.cur_tex); glBindTexture(tex->gc->state.current.tex_target, tex->gc->state.current.cur_tex);
} }
return; return;
} }
@ -1391,7 +1388,7 @@ evas_gl_common_texture_update(Evas_GL_Texture *tex, RGBA_Image *im)
// Switch back to current texture // Switch back to current texture
if (tex->ptt->texture != tex->gc->state.current.cur_tex) if (tex->ptt->texture != tex->gc->state.current.cur_tex)
glBindTexture(GL_TEXTURE_2D, tex->gc->state.current.cur_tex); glBindTexture(tex->gc->state.current.tex_target, tex->gc->state.current.cur_tex);
// Now prepare uploading the main texture before returning; // Now prepare uploading the main texture before returning;
async = malloc(sizeof (Evas_GL_Texture_Async_Preload)); async = malloc(sizeof (Evas_GL_Texture_Async_Preload));
@ -1529,7 +1526,7 @@ evas_gl_common_texture_alpha_update(Evas_GL_Texture *tex, DATA8 *pixels,
_tex_sub_2d(tex->gc, tex->x, tex->y, w, h, tex->pt->format, _tex_sub_2d(tex->gc, tex->x, tex->y, w, h, tex->pt->format,
tex->pt->dataformat, pixels); tex->pt->dataformat, pixels);
if (tex->pt->texture != tex->gc->state.current.cur_tex) if (tex->pt->texture != tex->gc->state.current.cur_tex)
glBindTexture(GL_TEXTURE_2D, tex->gc->state.current.cur_tex); glBindTexture(tex->gc->state.current.tex_target, tex->gc->state.current.cur_tex);
} }
Evas_GL_Texture * Evas_GL_Texture *
@ -1703,7 +1700,7 @@ evas_gl_common_texture_rgb_a_pair_update(Evas_GL_Texture *tex,
} }
} }
on_error: on_error:
glBindTexture(GL_TEXTURE_2D, tex->gc->state.current.cur_tex); glBindTexture(tex->gc->state.current.tex_target, tex->gc->state.current.cur_tex);
} }
Evas_GL_Texture * Evas_GL_Texture *
@ -1886,7 +1883,7 @@ evas_gl_common_texture_yuv_update(Evas_GL_Texture *tex, DATA8 **rows, unsigned i
} }
} }
if (tex->pt->texture != tex->gc->state.current.cur_tex) if (tex->pt->texture != tex->gc->state.current.cur_tex)
glBindTexture(GL_TEXTURE_2D, tex->gc->state.current.cur_tex); glBindTexture(tex->gc->state.current.tex_target, tex->gc->state.current.cur_tex);
} }
static Evas_GL_Texture * static Evas_GL_Texture *
@ -2055,7 +2052,7 @@ evas_gl_common_texture_yuy2_update(Evas_GL_Texture *tex, DATA8 **rows, unsigned
} }
if (tex->pt->texture != tex->gc->state.current.cur_tex) if (tex->pt->texture != tex->gc->state.current.cur_tex)
glBindTexture(GL_TEXTURE_2D, tex->gc->state.current.cur_tex); glBindTexture(tex->gc->state.current.tex_target, tex->gc->state.current.cur_tex);
} }
void void
@ -2110,7 +2107,7 @@ evas_gl_common_texture_nv12_update(Evas_GL_Texture *tex, DATA8 **rows, unsigned
} }
} }
if (tex->pt->texture != tex->gc->state.current.cur_tex) if (tex->pt->texture != tex->gc->state.current.cur_tex)
glBindTexture(GL_TEXTURE_2D, tex->gc->state.current.cur_tex); glBindTexture(tex->gc->state.current.tex_target, tex->gc->state.current.cur_tex);
} }
void void

View File

@ -746,9 +746,7 @@ eng_image_data_get(void *data, void *image, int to_write, DATA32 **image_data, i
re->window_use(re->software.ob); re->window_use(re->software.ob);
if ((im->tex) && (im->tex->pt) && (im->tex->pt->dyn.img) && if ((im->tex) && (im->tex->pt) && (im->tex->pt->dyn.img) &&
(im->cs.space == EVAS_COLORSPACE_ARGB8888) && (im->cs.space == EVAS_COLORSPACE_ARGB8888))
secsym_tbm_surface_map &&
secsym_eglMapImageSEC)
{ {
if (im->tex->pt->dyn.checked_out > 0) if (im->tex->pt->dyn.checked_out > 0)
{ {
@ -756,7 +754,7 @@ eng_image_data_get(void *data, void *image, int to_write, DATA32 **image_data, i
*image_data = im->tex->pt->dyn.data; *image_data = im->tex->pt->dyn.data;
return im; return im;
} }
if (im->gc->shared->info.sec_tbm_surface) if ((im->gc->shared->info.sec_tbm_surface) && (secsym_tbm_surface_map))
{ {
tbm_surface_info_s info; tbm_surface_info_s info;
secsym_tbm_surface_map(im->tex->pt->dyn.buffer, secsym_tbm_surface_map(im->tex->pt->dyn.buffer,
@ -764,7 +762,7 @@ eng_image_data_get(void *data, void *image, int to_write, DATA32 **image_data, i
&info); &info);
*image_data = im->tex->pt->dyn.data = (DATA32 *) info.planes[0].ptr; *image_data = im->tex->pt->dyn.data = (DATA32 *) info.planes[0].ptr;
} }
else if (im->gc->shared->info.sec_image_map) else if ((im->gc->shared->info.sec_image_map) && (secsym_eglMapImageSEC))
{ {
void *disp = re->window_egl_display_get(re->software.ob); void *disp = re->window_egl_display_get(re->software.ob);
*image_data = im->tex->pt->dyn.data = secsym_eglMapImageSEC(disp, *image_data = im->tex->pt->dyn.data = secsym_eglMapImageSEC(disp,

View File

@ -2037,7 +2037,7 @@ _native_bind_cb(void *data EINA_UNUSED, void *image)
{ {
if (glsym_glEGLImageTargetTexture2DOES) if (glsym_glEGLImageTargetTexture2DOES)
{ {
glsym_glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, n->surface); glsym_glEGLImageTargetTexture2DOES(im->native.target, n->surface);
GLERRV("glsym_glEGLImageTargetTexture2DOES"); GLERRV("glsym_glEGLImageTargetTexture2DOES");
} }
else else
@ -2060,7 +2060,7 @@ _native_bind_cb(void *data EINA_UNUSED, void *image)
} }
else if (n->ns.type == EVAS_NATIVE_SURFACE_OPENGL) else if (n->ns.type == EVAS_NATIVE_SURFACE_OPENGL)
{ {
glBindTexture(GL_TEXTURE_2D, n->ns.data.opengl.texture_id); glBindTexture(im->native.target, n->ns.data.opengl.texture_id);
} }
else if (n->ns.type == EVAS_NATIVE_SURFACE_TBM) else if (n->ns.type == EVAS_NATIVE_SURFACE_TBM)
{ {
@ -2069,7 +2069,7 @@ _native_bind_cb(void *data EINA_UNUSED, void *image)
{ {
if (glsym_glEGLImageTargetTexture2DOES) if (glsym_glEGLImageTargetTexture2DOES)
{ {
glsym_glEGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES, n->surface); glsym_glEGLImageTargetTexture2DOES(im->native.target, n->surface);
GLERRV("glsym_glEGLImageTargetTexture2DOES"); GLERRV("glsym_glEGLImageTargetTexture2DOES");
} }
else else
@ -2088,7 +2088,7 @@ _native_bind_cb(void *data EINA_UNUSED, void *image)
#ifdef GL_GLES #ifdef GL_GLES
if (glsym_glEGLImageTargetTexture2DOES) if (glsym_glEGLImageTargetTexture2DOES)
{ {
glsym_glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, buffer); glsym_glEGLImageTargetTexture2DOES(im->native.target, buffer);
GLERRV("glsym_glEGLImageTargetTexture2DOES"); GLERRV("glsym_glEGLImageTargetTexture2DOES");
} }
else else
@ -2146,7 +2146,7 @@ _native_unbind_cb(void *data EINA_UNUSED, void *image)
} }
else if (n->ns.type == EVAS_NATIVE_SURFACE_OPENGL) else if (n->ns.type == EVAS_NATIVE_SURFACE_OPENGL)
{ {
glBindTexture(GL_TEXTURE_2D, 0); glBindTexture(im->native.target, 0);
} }
else if (n->ns.type == EVAS_NATIVE_SURFACE_TBM) else if (n->ns.type == EVAS_NATIVE_SURFACE_TBM)
{ {