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