diff options
author | Ben Skeggs <darktama@iinet.net.au> | 2005-02-11 05:59:13 +0000 |
---|---|---|
committer | Ben Skeggs <darktama@iinet.net.au> | 2005-02-11 05:59:13 +0000 |
commit | 2d10924a14c439376816c5398cecd46e940482fd (patch) | |
tree | 2ab7b47029084a0471a12435e4521d69267307f6 /src/mesa/drivers/dri/r300/r300_render.c | |
parent | 4837ea30208d002bc36a836d2117f826d40c8bfa (diff) |
Port of r200 VB code. VB path should be as fast as the immediate path now, tuxracer should render correctly. Immediate path was left enabled.
Diffstat (limited to 'src/mesa/drivers/dri/r300/r300_render.c')
-rw-r--r-- | src/mesa/drivers/dri/r300/r300_render.c | 150 |
1 files changed, 31 insertions, 119 deletions
diff --git a/src/mesa/drivers/dri/r300/r300_render.c b/src/mesa/drivers/dri/r300/r300_render.c index 56c8a5af4d..1d21574496 100644 --- a/src/mesa/drivers/dri/r300/r300_render.c +++ b/src/mesa/drivers/dri/r300/r300_render.c @@ -485,8 +485,8 @@ static GLboolean r300_run_immediate_render(GLcontext *ctx, efloat(1.0); #endif - /* We need LOAD_VBPNTR to setup AOS_ATTR fields.. the offsets are irrelevant */ - r300EmitLOAD_VBPNTR(rmesa, 0); +/* Why do we need this for immediate mode?? */ +// r300EmitLOAD_VBPNTR(rmesa, 0); for(i=0; i < VB->PrimitiveCount; i++){ GLuint prim = VB->Primitive[i].mode; @@ -508,91 +508,8 @@ static GLboolean r300_run_immediate_render(GLcontext *ctx, return GL_FALSE; } - /* vertex buffer implementation */ -/* We use the start part of GART texture buffer for vertices */ - - -static void upload_vertex_buffer(r300ContextPtr rmesa, GLcontext *ctx) -{ - TNLcontext *tnl = TNL_CONTEXT(ctx); - struct vertex_buffer *VB = &tnl->vb; - int idx=0; - int i,j,k; - radeonScreenPtr rsp=rmesa->radeon.radeonScreen; - GLuint render_inputs; - - /* A hack - we don't want to overwrite vertex buffers, so we - just use AGP space for them.. Fix me ! */ - static int offset=0; - if(offset>2*1024*1024){ - //fprintf(stderr, "Wrapping agp vertex buffer offset\n"); - offset=0; - } - /* Not the most efficient implementation, but, for now, I just want something that - works */ - /* to do - make single memcpy per column (is it possible ?) */ - /* to do - use dirty flags to avoid redundant copies */ - #define UPLOAD_VECTOR(v)\ - { \ - /* Is the data dirty ? */ \ - if (v->flags & ((1<<v->size)-1)) { \ - /* fprintf(stderr, "size=%d vs stride=%d\n", v->size, v->stride); */ \ - if(v->size*4==v->stride){\ - /* fast path */ \ - memcpy(rsp->gartTextures.map+offset, v->data, v->stride*VB->Count); \ - } else { \ - for(i=0;i<VB->Count;i++){ \ - /* copy one vertex at a time*/ \ - memcpy(rsp->gartTextures.map+offset+i*v->size*4, VEC_ELT(v, GLfloat, i), v->size*4); \ - } \ - } \ - /* v->flags &= ~((1<<v->size)-1);*/ \ - } \ - rmesa->state.aos[idx].offset=rsp->gartTextures.handle+offset; \ - offset+=v->size*4*VB->Count; \ - idx++; \ - } - - render_inputs = rmesa->state.render_inputs; - - if(!render_inputs){ - WARN_ONCE("Aeiee ! render_inputs==0. Skipping rendering.\n"); - return; - } - /* coordinates */ - if(render_inputs & _TNL_BIT_POS) - UPLOAD_VECTOR(VB->ObjPtr); - if(render_inputs & _TNL_BIT_NORMAL) - UPLOAD_VECTOR(VB->NormalPtr); - - /* color components */ - if(render_inputs & _TNL_BIT_COLOR0) - UPLOAD_VECTOR(VB->ColorPtr[0]); - if(render_inputs & _TNL_BIT_COLOR1) - UPLOAD_VECTOR(VB->SecondaryColorPtr[0]); - - if(render_inputs & _TNL_BIT_FOG) - UPLOAD_VECTOR(VB->FogCoordPtr); - - /* texture coordinates */ - for(k=0;k < ctx->Const.MaxTextureUnits;k++) - if(render_inputs & (_TNL_BIT_TEX0<<k)) - UPLOAD_VECTOR(VB->TexCoordPtr[k]); - - if(render_inputs & _TNL_BIT_INDEX) - UPLOAD_VECTOR(VB->IndexPtr[0]); - if(render_inputs & _TNL_BIT_POINTSIZE) - UPLOAD_VECTOR(VB->PointSizePtr); - - if(idx>=R300_MAX_AOS_ARRAYS){ - fprintf(stderr, "Aieee ! Maximum AOS arrays count exceeded.. \n"); - exit(-1); - } - //dump_inputs(ctx, render_inputs); return ; -} - static void r300_render_vb_primitive(r300ContextPtr rmesa, GLcontext *ctx, int start, @@ -624,50 +541,45 @@ static GLboolean r300_run_vb_render(GLcontext *ctx, fprintf(stderr, "%s\n", __FUNCTION__); - reg_start(R300_RB3D_DSTCACHE_CTLSTAT,0); + r300ReleaseArrays(ctx); + r300EmitArrays(ctx, rmesa->state.render_inputs); + +// LOCK_HARDWARE(&(rmesa->radeon)); + + reg_start(R300_RB3D_DSTCACHE_CTLSTAT,0); e32(0x0000000a); - reg_start(0x4f18,0); + reg_start(0x4f18,0); e32(0x00000003); - - r300_setup_routing(ctx, GL_FALSE); - - r300EmitState(rmesa); - /* setup array of structures data */ - LOCK_HARDWARE(&(rmesa->radeon)); + r300EmitState(rmesa); - upload_vertex_buffer(rmesa, ctx); - //fprintf(stderr, "Using %d AOS arrays\n", n_arrays); - - 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; - - /* We need LOAD_VBPNTR to setup AOS_ATTR fields.. */ - r300EmitLOAD_VBPNTR(rmesa, start); - - r300_render_vb_primitive(rmesa, ctx, start, start + length, prim); - } - - /* This sequence is required after any 3d drawing packet - I suspect it works around a bug (or deficiency) in hardware */ - - reg_start(R300_RB3D_DSTCACHE_CTLSTAT,0); + rmesa->state.Elts = VB->Elts; + + 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; + + r300EmitAOS(rmesa, rmesa->state.aos_count, start); + + r300_render_vb_primitive(rmesa, ctx, start, start + length, prim); + } + + reg_start(R300_RB3D_DSTCACHE_CTLSTAT,0); e32(0x0000000a); - - reg_start(0x4f18,0); + + reg_start(0x4f18,0); e32(0x00000003); - - end_3d(PASS_PREFIX_VOID); + +// end_3d(PASS_PREFIX_VOID); /* Flush state - we are done drawing.. */ - r300FlushCmdBufLocked(rmesa, __FUNCTION__); - radeonWaitForIdleLocked(&(rmesa->radeon)); +// r300FlushCmdBufLocked(rmesa, __FUNCTION__); +// radeonWaitForIdleLocked(&(rmesa->radeon)); - UNLOCK_HARDWARE(&(rmesa->radeon)); - return GL_FALSE; +// UNLOCK_HARDWARE(&(rmesa->radeon)); + return GL_FALSE; } /** |