summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarsten Haitzler (Rasterman) <raster@rasterman.com>2013-06-11 18:12:07 +0900
committerCarsten Haitzler (Rasterman) <raster@rasterman.com>2013-06-11 18:12:07 +0900
commitfdabe06989b674daccfefb397c81b6184b2e4541 (patch)
tree58f2ba91b2ca0b046efa1bb2f2d51c6a07a54c8f
parent1f7ae48215168724d35e6c8076eba39eef47ee72 (diff)
downloadefl-fdabe06989b674daccfefb397c81b6184b2e4541.tar.gz
evas - partial rendering support now for qualcomm extn too.
-rw-r--r--ChangeLog4
-rw-r--r--NEWS1
-rw-r--r--src/modules/evas/engines/gl_common/evas_gl_common.h38
-rw-r--r--src/modules/evas/engines/gl_common/evas_gl_context.c70
-rw-r--r--src/modules/evas/engines/gl_x11/evas_engine.c3
5 files changed, 114 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index db4539192e..e2a081aff3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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
diff --git a/NEWS b/NEWS
index 5a1e7c5354..2de8052bce 100644
--- a/NEWS
+++ b/NEWS
@@ -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
diff --git a/src/modules/evas/engines/gl_common/evas_gl_common.h b/src/modules/evas/engines/gl_common/evas_gl_common.h
index 452ab2848d..f1515b6b57 100644
--- a/src/modules/evas/engines/gl_common/evas_gl_common.h
+++ b/src/modules/evas/engines/gl_common/evas_gl_common.h
@@ -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,
diff --git a/src/modules/evas/engines/gl_common/evas_gl_context.c b/src/modules/evas/engines/gl_common/evas_gl_context.c
index ae4f06a877..0308d90523 100644
--- a/src/modules/evas/engines/gl_common/evas_gl_context.c
+++ b/src/modules/evas/engines/gl_common/evas_gl_context.c
@@ -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));
@@ -1021,13 +1034,24 @@ 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)
+{
+ 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)
{
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;
@@ -2570,6 +2594,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)
{
int i, gw, gh, setclip, fbo = 0, done = 0;
@@ -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)))
{
diff --git a/src/modules/evas/engines/gl_x11/evas_engine.c b/src/modules/evas/engines/gl_x11/evas_engine.c
index 7312e11b0b..8939ded4ca 100644
--- a/src/modules/evas/engines/gl_x11/evas_engine.c
+++ b/src/modules/evas/engines/gl_x11/evas_engine.c
@@ -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)
{