From 7b05b70c2af9f76222a40941b393b5f04ce83048 Mon Sep 17 00:00:00 2001 From: Vladimir Dergachev Date: Wed, 29 Dec 2004 04:51:46 +0000 Subject: Rearrange code so we don't dump state as often. --- src/mesa/drivers/dri/r300/r300_render.c | 140 ++++++++++++++++++-------------- 1 file changed, 78 insertions(+), 62 deletions(-) (limited to 'src/mesa/drivers/dri/r300') diff --git a/src/mesa/drivers/dri/r300/r300_render.c b/src/mesa/drivers/dri/r300/r300_render.c index bafaf272d8..3007d282e4 100644 --- a/src/mesa/drivers/dri/r300/r300_render.c +++ b/src/mesa/drivers/dri/r300/r300_render.c @@ -73,62 +73,16 @@ static void r300_render_flat_primitive(r300ContextPtr rmesa, struct vertex_buffer *VB = &tnl->vb; GLuint i; int k; - ADAPTOR adaptor; - AOS_DATA vb_arrays[2]; LOCAL_VARS if(end<=start)return; /* do we need to watch for this ? */ - /* setup array of structures data */ - - /* Note: immediate vertex data includes all coordinates. - To save bandwidth use either VBUF or state-based vertex generation */ - /* xyz */ - vb_arrays[0].element_size=4; - vb_arrays[0].stride=4; - vb_arrays[0].offset=0; /* Not used */ - vb_arrays[0].format=AOS_FORMAT_FLOAT; - vb_arrays[0].ncomponents=4; - - /* color */ - vb_arrays[1].element_size=4; - vb_arrays[1].stride=4; - vb_arrays[1].offset=0; /* Not used */ - vb_arrays[1].format=AOS_FORMAT_FLOAT_COLOR; - vb_arrays[1].ncomponents=4; - - adaptor=TWO_PIPE_ADAPTOR; - - adaptor.color_offset[0]=rmesa->radeon.radeonScreen->backOffset+rmesa->radeon.radeonScreen->fbLocation; - adaptor.color_pitch[0]=(rmesa->radeon.radeonScreen->backPitch) | (0xc0<<16); - - adaptor.depth_offset=rmesa->radeon.radeonScreen->depthOffset; - adaptor.depth_pitch=rmesa->radeon.radeonScreen->depthPitch | (0x2 << 16); - - init_3d(PASS_PREFIX &adaptor); - init_flat_primitive(PASS_PREFIX &adaptor); - - set_scissors(PASS_PREFIX 0, 0, 2647, 1941); - - set_cliprect(PASS_PREFIX 0, 0, 0, 2647,1941); - set_cliprect(PASS_PREFIX 1, 0, 0, 2647,1941); - set_cliprect(PASS_PREFIX 2, 0, 0, 2647,1941); - set_cliprect(PASS_PREFIX 3, 0, 0, 2647,1941); - - reg_start(R300_RE_OCCLUSION_CNTL, 0); - e32(R300_OCCLUSION_ON); - - set_quad0(PASS_PREFIX 1.0,1.0,1.0,1.0); - set_init21(PASS_PREFIX 0.0,1.0); - - /* We need LOAD_VBPNTR to setup AOS_ATTR fields.. the offsets are irrelevant */ - setup_AOS(PASS_PREFIX vb_arrays, 2); start_immediate_packet(end-start, type, 8); for(i=start;iObjPtr, GLfloat, i)[0], VEC_ELT(VB->ObjPtr, GLfloat, i)[1], @@ -149,7 +103,7 @@ static void r300_render_flat_primitive(r300ContextPtr rmesa, #if 0 efloat(VEC_ELT(VB->ObjPtr, GLfloat, i)[3]); #else - efloat(1.0); + efloat(2.0); #endif /* color components */ @@ -163,13 +117,9 @@ static void r300_render_flat_primitive(r300ContextPtr rmesa, #endif } - end_3d(PASS_PREFIX_VOID); - - start_packet3(RADEON_CP_PACKET3_NOP, 0); - e32(0x0); } -static void r300_render_primitive(r300ContextPtr rmesa, +static void r300_dispatch_flat_primitive(r300ContextPtr rmesa, GLcontext *ctx, int start, int end, @@ -257,33 +207,99 @@ static void r300_render_primitive(r300ContextPtr rmesa, } - -/** - * Called by the pipeline manager to render a batch of primitives. - * We can return true to pass on to the next stage (i.e. software - * rasterization) or false to indicate that the pipeline has finished - * after we render something. - */ -static GLboolean r300_run_render(GLcontext *ctx, +static GLboolean r300_run_flat_render(GLcontext *ctx, struct tnl_pipeline_stage *stage) { r300ContextPtr rmesa = R300_CONTEXT(ctx); TNLcontext *tnl = TNL_CONTEXT(ctx); struct vertex_buffer *VB = &tnl->vb; GLuint i; + ADAPTOR adaptor; + AOS_DATA vb_arrays[2]; + LOCAL_VARS if (RADEON_DEBUG == DEBUG_PRIMS) fprintf(stderr, "%s\n", __FUNCTION__); + /* setup array of structures data */ + + /* Note: immediate vertex data includes all coordinates. + To save bandwidth use either VBUF or state-based vertex generation */ + /* xyz */ + vb_arrays[0].element_size=4; + vb_arrays[0].stride=4; + vb_arrays[0].offset=0; /* Not used */ + vb_arrays[0].format=AOS_FORMAT_FLOAT; + vb_arrays[0].ncomponents=4; + + /* color */ + vb_arrays[1].element_size=4; + vb_arrays[1].stride=4; + vb_arrays[1].offset=0; /* Not used */ + vb_arrays[1].format=AOS_FORMAT_FLOAT_COLOR; + vb_arrays[1].ncomponents=4; + + adaptor=TWO_PIPE_ADAPTOR; + + adaptor.color_offset[0]=rmesa->radeon.radeonScreen->backOffset+rmesa->radeon.radeonScreen->fbLocation; + adaptor.color_pitch[0]=(rmesa->radeon.radeonScreen->backPitch) | (0xc0<<16); + + adaptor.depth_offset=rmesa->radeon.radeonScreen->depthOffset; + adaptor.depth_pitch=rmesa->radeon.radeonScreen->depthPitch | (0x2 << 16); + + init_3d(PASS_PREFIX &adaptor); + init_flat_primitive(PASS_PREFIX &adaptor); + + set_scissors(PASS_PREFIX 0, 0, 2647, 1941); + + set_cliprect(PASS_PREFIX 0, 0, 0, 2647,1941); + set_cliprect(PASS_PREFIX 1, 0, 0, 2647,1941); + set_cliprect(PASS_PREFIX 2, 0, 0, 2647,1941); + set_cliprect(PASS_PREFIX 3, 0, 0, 2647,1941); + + reg_start(R300_RE_OCCLUSION_CNTL, 0); + e32(R300_OCCLUSION_ON); + + set_quad0(PASS_PREFIX 1.0,1.0,1.0,1.0); + set_init21(PASS_PREFIX 0.0,1.0); + + /* We need LOAD_VBPNTR to setup AOS_ATTR fields.. the offsets are irrelevant */ + setup_AOS(PASS_PREFIX vb_arrays, 2); + for(i=0; i < VB->PrimitiveCount; i++){ GLuint prim = VB->Primitive[i].mode; GLuint start = VB->Primitive[i].start; GLuint length = VB->Primitive[i].count; - r300_render_primitive(rmesa, ctx, start, start + length, prim); + r300_dispatch_flat_primitive(rmesa, ctx, start, start + length, prim); } + end_3d(PASS_PREFIX_VOID); + + start_packet3(RADEON_CP_PACKET3_NOP, 0); + e32(0x0); fprintf(stderr, "\n"); + return GL_FALSE; +} + +/** + * Called by the pipeline manager to render a batch of primitives. + * We can return true to pass on to the next stage (i.e. software + * rasterization) or false to indicate that the pipeline has finished + * after we render something. + */ +static GLboolean r300_run_render(GLcontext *ctx, + struct tnl_pipeline_stage *stage) +{ + r300ContextPtr rmesa = R300_CONTEXT(ctx); + TNLcontext *tnl = TNL_CONTEXT(ctx); + struct vertex_buffer *VB = &tnl->vb; + GLuint i; + + if (RADEON_DEBUG == DEBUG_PRIMS) + fprintf(stderr, "%s\n", __FUNCTION__); + + return r300_run_flat_render(ctx, stage); #if 0 return GL_TRUE; #else -- cgit v1.2.3