i965: enable VS constant buffers
authorBrian Paul <brianp@vmware.com>
Wed, 22 Apr 2009 17:52:16 +0000 (11:52 -0600)
committerBrian Paul <brianp@vmware.com>
Wed, 22 Apr 2009 17:52:16 +0000 (11:52 -0600)
In the VS constants can now be handled in two different ways:
1. If there's room in the GRF, put constants there.  They're preloaded from
   the CURBE prior to VS execution.  This is the historical approach.  The
   problem is the GRF may not have room for all the shader's constants and
   temps and misc registers.  Hence...
2. Use a separate constant buffer which is read from using a READ message.
   This allows a very large number of constants and frees up GRF regs for
   shader temporaries.  This is the new approach.  May be a little slower
   than 1.

1 vs. 2 is chosen according to how many constants and temps the shader needs.

src/mesa/drivers/dri/i965/brw_vs_emit.c

index 524f1211cee9d6dd9dfb81be5bd6d9a65f791676..1da5a3f5023860fae6c6840ea01e931dd2e45cd8 100644 (file)
@@ -69,13 +69,17 @@ static void brw_vs_alloc_regs( struct brw_vs_compile *c )
 {
    GLuint i, reg = 0, mrf;
 
-#if 0
-   if (c->vp->program.Base.Parameters->NumParameters >= 6)
-      c->use_const_buffer = 1;
+   /* Determine whether to use a real constant buffer or use a block
+    * of GRF registers for constants.  The later is faster but only
+    * works if everything fits in the GRF.
+    * XXX this heuristic/check may need some fine tuning...
+    */
+   if (c->vp->program.Base.Parameters->NumParameters +
+       c->vp->program.Base.NumTemporaries + 20 > BRW_MAX_GRF)
+      c->use_const_buffer = GL_TRUE;
    else
-#endif
       c->use_const_buffer = GL_FALSE;
-   /*printf("use_const_buffer = %d\n", c->use_const_buffer);*/
+   printf("use_const_buffer = %d\n", c->use_const_buffer);
 
    /* r0 -- reserved as usual
     */