[Glamor] [PATCH 3/4] glamor: don't reset the GLSL program

Grigori Goronzy greg at chown.ath.cx
Fri Jun 6 12:20:58 PDT 2014


From: Markus Wick <markus at selfnet.de>

We don't use fixed function rendering, so there is no need to reset
the program at all.  This lets the driver avoid checking for state
changes between draw calls when we rebind the same program.

Improves xephyr x11perf -f8text performance by 6.03062% +/- 1.64928%
(n=20)

Signed-off-by: Eric Anholt <eric at anholt.net>
Reviewed-by: Eric Anholt <eric at anholt.net>
---
 src/glamor_copyarea.c  | 1 -
 src/glamor_core.c      | 2 --
 src/glamor_fill.c      | 1 -
 src/glamor_glyphblt.c  | 2 --
 src/glamor_gradient.c  | 8 --------
 src/glamor_pixmap.c    | 2 --
 src/glamor_render.c    | 1 -
 src/glamor_tile.c      | 2 --
 src/glamor_trapezoid.c | 4 ----
 src/glamor_xv.c        | 1 -
 10 files changed, 24 deletions(-)

diff --git a/src/glamor_copyarea.c b/src/glamor_copyarea.c
index d52a74c..5ff8c1b 100644
--- a/src/glamor_copyarea.c
+++ b/src/glamor_copyarea.c
@@ -276,7 +276,6 @@ glamor_copy_n_to_n_textured(DrawablePtr src,
 
 	dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_POS);
 	dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
-	dispatch->glUseProgram(0);
 	/* The source texture is bound to a fbo, we have to flush it here. */
 	glamor_put_dispatch(glamor_priv);
 	glamor_priv->state = RENDER_STATE;
diff --git a/src/glamor_core.c b/src/glamor_core.c
index 3b68603..7866bee 100644
--- a/src/glamor_core.c
+++ b/src/glamor_core.c
@@ -293,7 +293,6 @@ glamor_init_finish_access_shaders(ScreenPtr screen)
 	dispatch->glUniform1i(sampler_uniform_location, 0);
 	dispatch->glUniform1i(glamor_priv->finish_access_revert[0], 0);
 	dispatch->glUniform1i(glamor_priv->finish_access_swap_rb[0], 0);
-	dispatch->glUseProgram(0);
 
 	glamor_priv->finish_access_revert[1] =
 	    dispatch->
@@ -311,7 +310,6 @@ glamor_init_finish_access_shaders(ScreenPtr screen)
 	dispatch->glUniform1i(glamor_priv->finish_access_revert[1], 0);
 	dispatch->glUniform1i(sampler_uniform_location, 0);
 	dispatch->glUniform1i(glamor_priv->finish_access_swap_rb[1], 0);
-	dispatch->glUseProgram(0);
 	glamor_put_dispatch(glamor_priv);
 }
 
diff --git a/src/glamor_fill.c b/src/glamor_fill.c
index e65c909..c54b6fd 100644
--- a/src/glamor_fill.c
+++ b/src/glamor_fill.c
@@ -259,7 +259,6 @@ _glamor_solid_boxes(PixmapPtr pixmap, BoxPtr box, int nbox, float *color)
 
 	dispatch->glBindBuffer(GL_ARRAY_BUFFER, 0);
 	dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_POS);
-	dispatch->glUseProgram(0);
 	glamor_put_dispatch(glamor_priv);
 	glamor_priv->state = RENDER_STATE;
 	glamor_priv->render_idle_cnt = 0;
diff --git a/src/glamor_glyphblt.c b/src/glamor_glyphblt.c
index ca92100..6ddfa4b 100644
--- a/src/glamor_glyphblt.c
+++ b/src/glamor_glyphblt.c
@@ -158,7 +158,6 @@ glamor_poly_glyph_blt_pixels(DrawablePtr drawable, GCPtr gc,
 
 	dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_POS);
 	dispatch->glBindBuffer(GL_ARRAY_BUFFER, 0);
-	dispatch->glUseProgram(0);
 
 	glamor_put_dispatch(glamor_priv);
 
@@ -330,7 +329,6 @@ glamor_push_pixels_points(GCPtr gc, PixmapPtr bitmap,
 
 	dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_POS);
 	dispatch->glBindBuffer(GL_ARRAY_BUFFER, 0);
-	dispatch->glUseProgram(0);
 
 	glamor_put_dispatch(glamor_priv);
 
diff --git a/src/glamor_gradient.c b/src/glamor_gradient.c
index 4802745..25f2732 100644
--- a/src/glamor_gradient.c
+++ b/src/glamor_gradient.c
@@ -367,8 +367,6 @@ _glamor_create_radial_gradient_program(ScreenPtr screen, int stops_count, int dy
 
 	glamor_link_glsl_prog(dispatch, gradient_prog);
 
-	dispatch->glUseProgram(0);
-
 	if (dyn_gen) {
 		index = 2;
 		glamor_priv->radial_max_nstops = stops_count;
@@ -558,8 +556,6 @@ _glamor_create_linear_gradient_program(ScreenPtr screen, int stops_count, int dy
 
 	glamor_link_glsl_prog(dispatch, gradient_prog);
 
-	dispatch->glUseProgram(0);
-
 	if (dyn_gen) {
 		index = 2;
 		glamor_priv->linear_max_nstops = stops_count;
@@ -1120,7 +1116,6 @@ glamor_generate_radial_gradient_picture(ScreenPtr screen,
 
 	dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_POS);
 	dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
-	dispatch->glUseProgram(0);
 
 	glamor_put_dispatch(glamor_priv);
 	return dst_picture;
@@ -1142,7 +1137,6 @@ GRADIENT_FAIL:
 
 	dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_POS);
 	dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
-	dispatch->glUseProgram(0);
 	glamor_put_dispatch(glamor_priv);
 	return NULL;
 }
@@ -1458,7 +1452,6 @@ glamor_generate_linear_gradient_picture(ScreenPtr screen,
 
 	dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_POS);
 	dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
-	dispatch->glUseProgram(0);
 
 	glamor_put_dispatch(glamor_priv);
 	return dst_picture;
@@ -1480,7 +1473,6 @@ GRADIENT_FAIL:
 
 	dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_POS);
 	dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
-	dispatch->glUseProgram(0);
 	glamor_put_dispatch(glamor_priv);
 	return NULL;
 }
diff --git a/src/glamor_pixmap.c b/src/glamor_pixmap.c
index 617ed26..d6bc2e3 100644
--- a/src/glamor_pixmap.c
+++ b/src/glamor_pixmap.c
@@ -878,7 +878,6 @@ ready_to_upload:
 
 	dispatch->glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
 
-	dispatch->glUseProgram(0);
 	dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_POS);
 	dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
 	dispatch->glDeleteTextures(1, &tex);
@@ -1218,7 +1217,6 @@ glamor_es2_pixmap_read_prepare(PixmapPtr source, int x, int y, int w, int h, GLe
 
 	dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_POS);
 	dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
-	dispatch->glUseProgram(0);
 	glamor_put_dispatch(glamor_priv);
 	return temp_fbo;
 }
diff --git a/src/glamor_render.c b/src/glamor_render.c
index 4c31fea..9294cad 100644
--- a/src/glamor_render.c
+++ b/src/glamor_render.c
@@ -1421,7 +1421,6 @@ glamor_composite_with_shader(CARD8 op,
 	dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_MASK);
 	dispatch->glDisable(GL_BLEND);
 	DEBUGF("finish rendering.\n");
-	dispatch->glUseProgram(0);
 	glamor_priv->state = RENDER_STATE;
 	glamor_priv->render_idle_cnt = 0;
 	if (saved_source_format)
diff --git a/src/glamor_tile.c b/src/glamor_tile.c
index 3e3e553..3f42b24 100644
--- a/src/glamor_tile.c
+++ b/src/glamor_tile.c
@@ -86,7 +86,6 @@ glamor_init_tile_shader(ScreenPtr screen)
 	glamor_priv->tile_wh =
 	    dispatch->glGetUniformLocation(glamor_priv->tile_prog,
 					   "wh");
-	dispatch->glUseProgram(0);
 	glamor_put_dispatch(glamor_priv);
 }
 
@@ -177,7 +176,6 @@ _glamor_tile(PixmapPtr pixmap, PixmapPtr tile,
 
 	dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
 	dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_POS);
-	dispatch->glUseProgram(0);
 	glamor_put_dispatch(glamor_priv);
 
 	glamor_priv->state = RENDER_STATE;
diff --git a/src/glamor_trapezoid.c b/src/glamor_trapezoid.c
index cce7eb6..ca05cbf 100644
--- a/src/glamor_trapezoid.c
+++ b/src/glamor_trapezoid.c
@@ -930,7 +930,6 @@ TRAPEZOID_RESET_GL:
 	dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
 	dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_MASK);
 	dispatch->glDisable(GL_BLEND);
-	dispatch->glUseProgram(0);
 
 TRAPEZOID_OUT:
 	if (box) {
@@ -1312,8 +1311,6 @@ glamor_init_trapezoid_shader(ScreenPtr screen)
 
 	glamor_link_glsl_prog(dispatch, glamor_priv->trapezoid_prog);
 
-	dispatch->glUseProgram(0);
-
 	glamor_put_dispatch(glamor_priv);
 }
 
@@ -1524,7 +1521,6 @@ _glamor_generate_trapezoid_with_shader(ScreenPtr screen, PicturePtr picture,
 	dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_TOP_BOTTOM);
 	dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_LEFT_PARAM);
 	dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_RIGHT_PARAM);
-	dispatch->glUseProgram(0);
 	glamor_put_dispatch(glamor_priv);
 	return TRUE;
 }
diff --git a/src/glamor_xv.c b/src/glamor_xv.c
index 604a4d7..d090e7b 100644
--- a/src/glamor_xv.c
+++ b/src/glamor_xv.c
@@ -440,7 +440,6 @@ dispatch->glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
 dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_POS);
 dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
 
-dispatch->glUseProgram(0);
 glamor_put_dispatch(glamor_priv);
 DamageDamageRegion(port_priv->pDraw, &port_priv->clip);
 }
-- 
1.8.3.2



More information about the Glamor mailing list