evas - partial rendering support now for qualcomm extn too.

This commit is contained in:
Carsten Haitzler 2013-06-11 18:12:07 +09:00
parent 1f7ae48215
commit fdabe06989
5 changed files with 114 additions and 2 deletions

View File

@ -1,3 +1,7 @@
2013-06-11 Carsten Haitzler (The Rasterman)
* Support qualcomm begin/end tile extension for partial update
2013-06-06 ChunEon Park (Hermet)
* Edje: support edc map color set

1
NEWS
View File

@ -187,6 +187,7 @@ Improvements:
* Edje entry emtis signals on keydown/up for theme to use
* Turn on scissors always to abe able to to partual render on some GL implementations properly.
* Evas gl engine - dont map dri/drm buffer unless we are going to render.
* Partial rendering support in evas for several gl drivers.
Fixes:
* Fix a memory leak in ecore_con_dns when using ecore_con_server_connect

View File

@ -126,6 +126,42 @@
#define EGL_MAP_GL_TEXTURE_OPTION_WRITE_SEC (1<<1)
#endif
#ifndef GL_COLOR_BUFFER_BIT0_QCOM
// if GL_COLOR_BUFFER_BIT0_QCOM just assume the rest arent... saves fluff
#define GL_COLOR_BUFFER_BIT0_QCOM 0x00000001
#define GL_COLOR_BUFFER_BIT1_QCOM 0x00000002
#define GL_COLOR_BUFFER_BIT2_QCOM 0x00000004
#define GL_COLOR_BUFFER_BIT3_QCOM 0x00000008
#define GL_COLOR_BUFFER_BIT4_QCOM 0x00000010
#define GL_COLOR_BUFFER_BIT5_QCOM 0x00000020
#define GL_COLOR_BUFFER_BIT6_QCOM 0x00000040
#define GL_COLOR_BUFFER_BIT7_QCOM 0x00000080
#define GL_DEPTH_BUFFER_BIT0_QCOM 0x00000100
#define GL_DEPTH_BUFFER_BIT1_QCOM 0x00000200
#define GL_DEPTH_BUFFER_BIT2_QCOM 0x00000400
#define GL_DEPTH_BUFFER_BIT3_QCOM 0x00000800
#define GL_DEPTH_BUFFER_BIT4_QCOM 0x00001000
#define GL_DEPTH_BUFFER_BIT5_QCOM 0x00002000
#define GL_DEPTH_BUFFER_BIT6_QCOM 0x00004000
#define GL_DEPTH_BUFFER_BIT7_QCOM 0x00008000
#define GL_STENCIL_BUFFER_BIT0_QCOM 0x00010000
#define GL_STENCIL_BUFFER_BIT1_QCOM 0x00020000
#define GL_STENCIL_BUFFER_BIT2_QCOM 0x00040000
#define GL_STENCIL_BUFFER_BIT3_QCOM 0x00080000
#define GL_STENCIL_BUFFER_BIT4_QCOM 0x00100000
#define GL_STENCIL_BUFFER_BIT5_QCOM 0x00200000
#define GL_STENCIL_BUFFER_BIT6_QCOM 0x00400000
#define GL_STENCIL_BUFFER_BIT7_QCOM 0x00800000
#define GL_MULTISAMPLE_BUFFER_BIT0_QCOM 0x01000000
#define GL_MULTISAMPLE_BUFFER_BIT1_QCOM 0x02000000
#define GL_MULTISAMPLE_BUFFER_BIT2_QCOM 0x04000000
#define GL_MULTISAMPLE_BUFFER_BIT3_QCOM 0x08000000
#define GL_MULTISAMPLE_BUFFER_BIT4_QCOM 0x10000000
#define GL_MULTISAMPLE_BUFFER_BIT5_QCOM 0x20000000
#define GL_MULTISAMPLE_BUFFER_BIT6_QCOM 0x40000000
#define GL_MULTISAMPLE_BUFFER_BIT7_QCOM 0x80000000
#endif
#define SHAD_VERTEX 0
#define SHAD_COLOR 1
#define SHAD_TEXUV 2
@ -354,6 +390,7 @@ struct _Evas_Engine_GL_Context
struct {
int x, y, w, h;
Eina_Bool enabled : 1;
Eina_Bool used : 1;
} master_clip;
struct {
@ -558,6 +595,7 @@ void evas_gl_common_context_free(Evas_Engine_GL_Context *gc);
void evas_gl_common_context_use(Evas_Engine_GL_Context *gc);
void evas_gl_common_context_newframe(Evas_Engine_GL_Context *gc);
void evas_gl_common_context_resize(Evas_Engine_GL_Context *gc, int w, int h, int rot);
void evas_gl_common_context_done(Evas_Engine_GL_Context *gc);
void evas_gl_common_context_target_surface_set(Evas_Engine_GL_Context *gc, Evas_GL_Image *surface);
void evas_gl_common_context_line_push(Evas_Engine_GL_Context *gc,

View File

@ -27,6 +27,8 @@ void (*glsym_glProgramParameteri) (GLuint a, GLuint b, GLint d) = NULL;
void (*glsym_glReleaseShaderCompiler)(void) = NULL;
void *(*glsym_glMapBuffer) (GLenum a, GLenum b) = NULL;
GLboolean (*glsym_glUnmapBuffer) (GLenum a) = NULL;
void (*glsym_glStartTiling) (GLuint a, GLuint b, GLuint c, GLuint d, GLuint e) = NULL;
void (*glsym_glEndTiling) (GLuint a) = NULL;
#ifdef GL_GLES
// just used for finding symbols :)
@ -142,6 +144,12 @@ gl_symbols(void)
FINDSYM(glsym_glReleaseShaderCompiler, "glReleaseShaderCompilerARB", glsym_func_void);
FINDSYM(glsym_glReleaseShaderCompiler, "glReleaseShaderCompiler", glsym_func_void);
FINDSYM(glsym_glStartTiling, "glStartTilingQCOM", glsym_func_void);
FINDSYM(glsym_glStartTiling, "glStartTiling", glsym_func_void);
FINDSYM(glsym_glEndTiling, "glEndTilingQCOM", glsym_func_void);
FINDSYM(glsym_glEndTiling, "glEndTiling", glsym_func_void);
if (!getenv("EVAS_GL_MAPBUFFER_DISABLE"))
{
FINDSYM(glsym_glMapBuffer, "glMapBufferOES", glsym_func_void_ptr);
@ -618,6 +626,11 @@ evas_gl_common_context_new(void)
shared->info.sec_image_map = 1;
}
#endif
if (!strstr((char *)ext, "GL_QCOM_tiled_rendering"))
{
glsym_glStartTiling = NULL;
glsym_glEndTiling = NULL;
}
}
glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS,
&(shared->info.max_texture_units));
@ -1020,6 +1033,16 @@ evas_gl_common_context_resize(Evas_Engine_GL_Context *gc, int w, int h, int rot)
if (_evas_gl_common_context == gc) _evas_gl_common_viewport_set(gc);
}
void
evas_gl_common_context_done(Evas_Engine_GL_Context *gc)
{
if (gc->master_clip.used)
{
if (glsym_glEndTiling) glsym_glEndTiling(GL_COLOR_BUFFER_BIT0_QCOM);
gc->master_clip.used = EINA_FALSE;
}
}
void
evas_gl_common_context_target_surface_set(Evas_Engine_GL_Context *gc,
Evas_GL_Image *surface)
@ -1027,7 +1050,8 @@ evas_gl_common_context_target_surface_set(Evas_Engine_GL_Context *gc,
if (surface == gc->pipe[0].shader.surface) return;
evas_gl_common_context_flush(gc);
evas_gl_common_context_done(gc);
gc->state.current.cur_prog = PRG_INVALID;
gc->state.current.cur_tex = -1;
gc->state.current.cur_texu = -1;
@ -2569,6 +2593,32 @@ scissor_rot(Evas_Engine_GL_Context *gc EINA_UNUSED,
}
}
static void
start_tiling(Evas_Engine_GL_Context *gc EINA_UNUSED,
int rot, int gw, int gh, int cx, int cy, int cw, int ch,
int bitmask)
{
if (!glsym_glStartTiling) return;
switch (rot)
{
case 0: // UP this way: ^
glsym_glStartTiling(cx, cy, cw, ch, bitmask);
break;
case 90: // UP this way: <
glsym_glStartTiling(gh - (cy + ch), cx, ch, cw, bitmask);
break;
case 180: // UP this way: v
glsym_glStartTiling(gw - (cx + cw), gh - (cy + ch), cw, ch, bitmask);
break;
case 270: // UP this way: >
glsym_glStartTiling(cy, gw - (cx + cw), ch, cw, bitmask);
break;
default: // assume up is up
glsym_glStartTiling(cx, cy, cw, ch, bitmask);
break;
}
}
static void
shader_array_flush(Evas_Engine_GL_Context *gc)
{
@ -2742,6 +2792,24 @@ shader_array_flush(Evas_Engine_GL_Context *gc)
ch = gc->master_clip.h;
}
}
if ((glsym_glStartTiling) && (glsym_glEndTiling) &&
(gc->master_clip.enabled) &&
(gc->master_clip.w > 0) && (gc->master_clip.h > 0))
{
if (!gc->master_clip.used)
{
if (!fbo)
start_tiling(gc, gc->rot, gw, gh,
gc->master_clip.x,
gh - gc->master_clip.y - gc->master_clip.h,
gc->master_clip.w, gc->master_clip.h, 0);
else
start_tiling(gc, 0, gw, gh,
gc->master_clip.x, gc->master_clip.y,
gc->master_clip.w, gc->master_clip.h, 0);
gc->master_clip.used = EINA_TRUE;
}
}
if ((gc->pipe[i].shader.clip) ||
((gc->master_clip.enabled) && (!fbo)))
{

View File

@ -1430,7 +1430,8 @@ eng_output_flush(void *data, Evas_Render_Mode render_mode)
re->win->draw.drew = 0;
eng_window_use(re->win);
evas_gl_common_context_done(re->win->gl_context);
#ifdef GL_GLES
if (!re->vsync)
{