Hi,

In this patch I try to make the driver practice the art of doing the
least amount of work possible.

This is not complete, but a step in the right direction.

Quake 3 get a ~4% improvement and Nexuiz gets ~7%.

These changes can potentially cause lockups so I was hoping for some
testing before I commit. I intend to apply this after the 6.5.2 release.


Rune Petersen
? depend
? server
Index: r300_fragprog.h
===================================================================
RCS file: /cvs/mesa/Mesa/src/mesa/drivers/dri/r300/r300_fragprog.h,v
retrieving revision 1.12
diff -u -r1.12 r300_fragprog.h
--- r300_fragprog.h     1 Nov 2006 12:03:36 -0000       1.12
+++ r300_fragprog.h     25 Nov 2006 14:16:33 -0000
@@ -114,5 +114,6 @@
 struct r300_fragment_program;
 
 extern void r300_translate_fragment_shader(struct r300_fragment_program *rp);
+extern void r300UpdateFragmentParams(GLcontext *ctx);
 
 #endif
Index: r300_render.c
===================================================================
RCS file: /cvs/mesa/Mesa/src/mesa/drivers/dri/r300/r300_render.c,v
retrieving revision 1.112
diff -u -r1.112 r300_render.c
--- r300_render.c       14 Sep 2006 17:44:58 -0000      1.112
+++ r300_render.c       25 Nov 2006 14:16:34 -0000
@@ -337,7 +337,6 @@
                radeon_vb_to_rvb(rmesa, VB, &tnl->vb);
        }
        
-       r300UpdateShaders(rmesa);
        if (r300EmitArrays(ctx))
                return GL_TRUE;
 
@@ -493,8 +492,6 @@
                return GL_TRUE;
        }
        
-       r300UpdateShaders(rmesa);
-
        vp = (struct r300_vertex_program *)CURRENT_VERTEX_SHADER(ctx);
 #if 0 /* Draw every second request with software arb vp */
        vp->native++;
Index: r300_shader.c
===================================================================
RCS file: /cvs/mesa/Mesa/src/mesa/drivers/dri/r300/r300_shader.c,v
retrieving revision 1.19
diff -u -r1.19 r300_shader.c
--- r300_shader.c       17 Nov 2006 19:08:05 -0000      1.19
+++ r300_shader.c       25 Nov 2006 14:16:35 -0000
@@ -4,16 +4,18 @@
 
 #include "program.h"
 #include "tnl/tnl.h"
+#include "r300_state.h"
 #include "r300_context.h"
 #include "r300_fragprog.h"
 
+extern int future_hw_tcl_on;
 static void
 r300BindProgram(GLcontext *ctx, GLenum target, struct gl_program *prog)
 {
        
        r300ContextPtr rmesa = R300_CONTEXT(ctx);
-       struct r300_vertex_program_cont *vp=(void *)prog;
-       
+//     struct r300_vertex_program_cont *vp=(void *)prog;
+       struct r300_vertex_program *vp; 
        
        switch(target){
                case GL_VERTEX_PROGRAM_ARB:
@@ -25,8 +27,24 @@
                        _mesa_print_program(&vp->mesa_program.Base);
                }
 #endif
-               
+
+               r300_select_vertex_shader(rmesa);
+               vp = (struct r300_vertex_program *)CURRENT_VERTEX_SHADER(ctx);
+               if (vp->translated == GL_FALSE) {
+                       fprintf(stderr, "Failing back to sw-tcl\n");
+                       hw_tcl_on = future_hw_tcl_on = 0;
+                       r300ResetHwState(rmesa);
+
+                       return ;
+               }
+
+               r300_setup_rs_unit(ctx);
+               /* fall-through
+                  only really needed in rare cases, but good enough for now.
+               */
                case GL_FRAGMENT_PROGRAM_ARB:
+//             fprintf(stderr, "GL_FRAGMENT_PROGRAM_ARB\n");
+               r300SetupPixelShader(rmesa);
                break;
                default:
                        WARN_ONCE("Target not supported yet!\n");
Index: r300_state.c
===================================================================
RCS file: /cvs/mesa/Mesa/src/mesa/drivers/dri/r300/r300_state.c,v
retrieving revision 1.170
diff -u -r1.170 r300_state.c
--- r300_state.c        17 Nov 2006 19:12:42 -0000      1.170
+++ r300_state.c        25 Nov 2006 14:16:36 -0000
@@ -1713,18 +1713,15 @@
 
 extern void _tnl_UpdateFixedFunctionProgram( GLcontext *ctx );
 
-extern int future_hw_tcl_on;
-void r300UpdateShaders(r300ContextPtr rmesa)
+void r300UpdateFixedFunctionProgram(r300ContextPtr rmesa)
 {
        GLcontext *ctx;
        struct r300_vertex_program *vp;
        int i;
        
        ctx = rmesa->radeon.glCtx;
-       
-       if (rmesa->NewGLState && hw_tcl_on) {
-               rmesa->NewGLState = 0;
-               
+       if ( hw_tcl_on ) {
+
                for (i = _TNL_FIRST_MAT; i <= _TNL_LAST_MAT; i++) {
                        rmesa->temp_attrib[i] = 
TNL_CONTEXT(ctx)->vb.AttribPtr[i];
                        TNL_CONTEXT(ctx)->vb.AttribPtr[i] = 
&rmesa->dummy_attrib[i];
@@ -1735,21 +1732,7 @@
                for (i = _TNL_FIRST_MAT; i <= _TNL_LAST_MAT; i++) {
                        TNL_CONTEXT(ctx)->vb.AttribPtr[i] = 
rmesa->temp_attrib[i];
                }
-               
-               r300_select_vertex_shader(rmesa);
-               vp = (struct r300_vertex_program *)CURRENT_VERTEX_SHADER(ctx);
-               /*if (vp->translated == GL_FALSE)
-                       r300_translate_vertex_shader(vp);*/
-               if (vp->translated == GL_FALSE) {
-                       fprintf(stderr, "Failing back to sw-tcl\n");
-                       hw_tcl_on = future_hw_tcl_on = 0;
-                       r300ResetHwState(rmesa);
-
-                       return ;
-               }
-               r300UpdateStateParameters(ctx, _NEW_PROGRAM);
        }
-       
 }
 
 void r300UpdateShaderStates(r300ContextPtr rmesa)
@@ -1761,11 +1744,9 @@
        r300UpdateTextureState(ctx);
 #endif
 
-       r300SetupPixelShader(rmesa);
        r300_setup_textures(ctx);
        
        r300SetupVertexShader(rmesa);
-       r300_setup_rs_unit(ctx);
 }
 
 /* This is probably wrong for some values, I need to test this
@@ -1878,6 +1859,8 @@
        _tnl_InvalidateState(ctx, new_state);
        _ae_invalidate_state(ctx, new_state);
 
+       r300UpdateFixedFunctionProgram(r300);
+
        if (new_state & (_NEW_BUFFERS | _NEW_COLOR | _NEW_PIXEL)) {
                r300UpdateDrawBuffer(ctx);
        }
Index: r300_state.h
===================================================================
RCS file: /cvs/mesa/Mesa/src/mesa/drivers/dri/r300/r300_state.h,v
retrieving revision 1.11
diff -u -r1.11 r300_state.h
--- r300_state.h        13 Mar 2006 20:40:46 -0000      1.11
+++ r300_state.h        25 Nov 2006 14:16:36 -0000
@@ -71,7 +71,7 @@
 
 extern void r300_setup_textures(GLcontext *ctx);
 extern void r300_setup_rs_unit(GLcontext *ctx);
-extern void r300UpdateShaders(r300ContextPtr rmesa);
+extern void r300UpdateFixedFunctionProgram(r300ContextPtr rmesa);
 extern void r300UpdateShaderStates(r300ContextPtr rmesa);
 
 extern void r300_print_state_atom(r300ContextPtr r300, struct r300_state_atom 
*state);
Index: radeon_vtxfmt_a.c
===================================================================
RCS file: /cvs/mesa/Mesa/src/mesa/drivers/dri/r300/radeon_vtxfmt_a.c,v
retrieving revision 1.22
diff -u -r1.22 radeon_vtxfmt_a.c
--- radeon_vtxfmt_a.c   23 Aug 2006 23:18:39 -0000      1.22
+++ radeon_vtxfmt_a.c   25 Nov 2006 14:16:45 -0000
@@ -302,8 +302,6 @@
        if (ctx->NewState) 
                _mesa_update_state( ctx );
        
-       r300UpdateShaders(rmesa);
-       
        if (setup_arrays(rmesa, min) >= R300_FALLBACK_TCL) {
                r300ReleaseDmaRegion(rmesa, &rvb, __FUNCTION__);
                goto fallback;
@@ -311,8 +309,6 @@
        
        rmesa->state.VB.Count = max - min + 1;
        
-       r300UpdateShaderStates(rmesa);
-       
        rmesa->state.VB.Primitive = &prim;
        rmesa->state.VB.PrimitiveCount = 1;
        
@@ -473,8 +469,6 @@
        if (ctx->NewState) 
                _mesa_update_state( ctx );
        
-       r300UpdateShaders(rmesa);
-
        if (setup_arrays(rmesa, min) >= R300_FALLBACK_TCL) {
                r300ReleaseDmaRegion(rmesa, &rvb, __FUNCTION__);
                goto fallback;
@@ -482,8 +476,6 @@
 
        rmesa->state.VB.Count = max - min + 1;
        
-       r300UpdateShaderStates(rmesa);
-       
        rmesa->state.VB.Primitive = &prim;
        rmesa->state.VB.PrimitiveCount = 1;
        
@@ -539,15 +531,11 @@
        
        /* XXX: setup_arrays before state update? */
        
-       r300UpdateShaders(rmesa);
-
        if (setup_arrays(rmesa, start) >= R300_FALLBACK_TCL)
                goto fallback;
 
        rmesa->state.VB.Count = count;
 
-       r300UpdateShaderStates(rmesa);
-       
        rmesa->state.VB.Primitive = &prim;
        rmesa->state.VB.PrimitiveCount = 1;
        
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
--
_______________________________________________
Dri-devel mailing list
Dri-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/dri-devel

Reply via email to