Mesa (master): i965: Reduce a single GL_QUADS to GL_TRIANGLE_FAN.

Eric Anholt anholt at kemper.freedesktop.org
Thu May 13 20:03:17 UTC 2010


Module: Mesa
Branch: master
Commit: c67d9d84f501f145f841c0b981caff6f4dfd936f
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=c67d9d84f501f145f841c0b981caff6f4dfd936f

Author: Eric Anholt <eric at anholt.net>
Date:   Thu May 13 11:31:56 2010 -0700

i965: Reduce a single GL_QUADS to GL_TRIANGLE_FAN.

This is similar to the GL_QUAD_STRIP -> TRIANGLE_STRIP optimization --
the GS usage to split the quads into tris is a huge bottleneck, so a
quick check improves glean blendFunc time massively (width * height of
the window of single-pixel GL_QUADS, many many times).  This may also
end up helping with cairo performance, which sometimes ends up drawing
a single quad.

---

 src/mesa/drivers/dri/i965/brw_draw.c |   31 ++++++++++++++++++++-----------
 1 files changed, 20 insertions(+), 11 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_draw.c b/src/mesa/drivers/dri/i965/brw_draw.c
index e348d46..fe633d3 100644
--- a/src/mesa/drivers/dri/i965/brw_draw.c
+++ b/src/mesa/drivers/dri/i965/brw_draw.c
@@ -77,32 +77,41 @@ static const GLenum reduced_prim[GL_POLYGON+1] = {
  * programs be immune to the active primitive (ie. cope with all
  * possibilities).  That may not be realistic however.
  */
-static GLuint brw_set_prim(struct brw_context *brw, GLenum prim)
+static GLuint brw_set_prim(struct brw_context *brw,
+			   const struct _mesa_prim *prim)
 {
    GLcontext *ctx = &brw->intel.ctx;
+   GLenum mode = prim->mode;
 
    if (INTEL_DEBUG & DEBUG_PRIMS)
-      printf("PRIM: %s\n", _mesa_lookup_enum_by_nr(prim));
-   
+      printf("PRIM: %s\n", _mesa_lookup_enum_by_nr(prim->mode));
+
    /* Slight optimization to avoid the GS program when not needed:
     */
-   if (prim == GL_QUAD_STRIP &&
+   if (mode == GL_QUAD_STRIP &&
        ctx->Light.ShadeModel != GL_FLAT &&
        ctx->Polygon.FrontMode == GL_FILL &&
        ctx->Polygon.BackMode == GL_FILL)
-      prim = GL_TRIANGLE_STRIP;
+      mode = GL_TRIANGLE_STRIP;
+
+   if (prim->mode == GL_QUADS && prim->count == 4 &&
+       ctx->Light.ShadeModel != GL_FLAT &&
+       ctx->Polygon.FrontMode == GL_FILL &&
+       ctx->Polygon.BackMode == GL_FILL) {
+      mode = GL_TRIANGLE_FAN;
+   }
 
-   if (prim != brw->primitive) {
-      brw->primitive = prim;
+   if (mode != brw->primitive) {
+      brw->primitive = mode;
       brw->state.dirty.brw |= BRW_NEW_PRIMITIVE;
 
-      if (reduced_prim[prim] != brw->intel.reduced_primitive) {
-	 brw->intel.reduced_primitive = reduced_prim[prim];
+      if (reduced_prim[mode] != brw->intel.reduced_primitive) {
+	 brw->intel.reduced_primitive = reduced_prim[mode];
 	 brw->state.dirty.brw |= BRW_NEW_REDUCED_PRIMITIVE;
       }
    }
 
-   return prim_to_hw_prim[prim];
+   return prim_to_hw_prim[mode];
 }
 
 
@@ -351,7 +360,7 @@ static GLboolean brw_try_draw_prims( GLcontext *ctx,
        */
       intel_batchbuffer_require_space(intel->batch, intel->batch->size / 4);
 
-      hw_prim = brw_set_prim(brw, prim[i].mode);
+      hw_prim = brw_set_prim(brw, &prim[i]);
 
       if (first_time || (brw->state.dirty.brw & BRW_NEW_PRIMITIVE)) {
 	 first_time = GL_FALSE;




More information about the mesa-commit mailing list