summaryrefslogtreecommitdiff
path: root/src/mesa/drivers/dri/r300/r300_render.c
diff options
context:
space:
mode:
authorAapo Tahkola <aet@rasterburn.org>2005-02-22 05:16:42 +0000
committerAapo Tahkola <aet@rasterburn.org>2005-02-22 05:16:42 +0000
commit3c69df8a70efee6ae89615f28d25aac2323275ab (patch)
tree87ccba1243558febdb3b7fe95f11329f4d1aec18 /src/mesa/drivers/dri/r300/r300_render.c
parente00b72971629e41d5ac0e85391a466655c790d66 (diff)
New elt buffer code should be fairly stable.
Diffstat (limited to 'src/mesa/drivers/dri/r300/r300_render.c')
-rw-r--r--src/mesa/drivers/dri/r300/r300_render.c70
1 files changed, 20 insertions, 50 deletions
diff --git a/src/mesa/drivers/dri/r300/r300_render.c b/src/mesa/drivers/dri/r300/r300_render.c
index 261886ebc4..8aacb23ec6 100644
--- a/src/mesa/drivers/dri/r300/r300_render.c
+++ b/src/mesa/drivers/dri/r300/r300_render.c
@@ -460,55 +460,24 @@ static GLboolean r300_run_immediate_render(GLcontext *ctx,
}
/* vertex buffer implementation */
-void emit_elts(GLcontext * ctx, GLuint *elts,
- unsigned long n_elts, unsigned long n_fake_elts, int align);
-
-# define R300_EB_UNK1_SHIFT 24
-# define R300_EB_UNK1 (0x80<<24)
-# define R300_EB_UNK2 0x0810
-
-//#define PLAY_WITH_MAGIC_1
-
-unsigned long get_num_elts(unsigned long count)
-{
-#ifdef PLAY_WITH_MAGIC_1
- return count;
-#else
- /* round up elt count so that magic_1 is 0 (divisable by 4)*/
- return (count+3) & (~3);
- //return count - (count % 4);
-#endif
-}
-
-int get_align(int vertex_count)
-{
- unsigned char magic1_tbl[4]={ 0, 6, 4, 2 };
-
- return magic1_tbl[vertex_count % 4];
-}
static void inline fire_EB(PREFIX unsigned long addr, int vertex_count, int type)
{
LOCAL_VARS
- unsigned long magic_1;
-
- magic_1 = get_align(vertex_count);
-#ifndef PLAY_WITH_MAGIC_1
- if(magic_1 != 0){
- WARN_ONCE("Dont know how to handle this yet!\n");
- return ;
- }
-#endif
+ unsigned long addr_a;
+
+ addr_a = addr & 0x1c;
+
check_space(6);
start_packet3(RADEON_CP_PACKET3_3D_DRAW_INDX_2, 0);
+ /* TODO: Check if R300_VAP_VF_CNTL__INDEX_SIZE_32bit works. */
e32(R300_VAP_VF_CNTL__PRIM_WALK_INDICES | (vertex_count<<16) | type);
start_packet3(RADEON_CP_PACKET3_INDX_BUFFER, 2);
- e32(R300_EB_UNK1 | (magic_1 << 16) | R300_EB_UNK2);
- e32(addr);
- e32(((vertex_count+1) / 2) + magic_1); /* This still fails once in a while */
-
+ e32(R300_EB_UNK1 | (addr_a << 16) | R300_EB_UNK2);
+ e32(addr & 0xffffffe3);
+ e32((vertex_count+1)/2 + addr_a/4);
}
static void r300_render_vb_primitive(r300ContextPtr rmesa,
@@ -530,19 +499,24 @@ static void r300_render_vb_primitive(r300ContextPtr rmesa,
if(type<0 || num_verts <= 0)return;
if(rmesa->state.Elts){
- unsigned long elt_count;
-
- WARN_ONCE("Rendering with elts\n");
r300EmitAOS(rmesa, rmesa->state.aos_count, 0);
#if 1
start_index32_packet(num_verts, type);
for(i=0; i < num_verts; i++)
e32(rmesa->state.Elts[start+i]); /* start ? */
#else
- elt_count=get_num_elts(num_verts);
- //emit_elts(ctx, rmesa->state.Elts, VB->Count, get_num_elts(VB->Count));
- emit_elts(ctx, rmesa->state.Elts+start, num_verts, elt_count, get_align(elt_count));
- fire_EB(PASS_PREFIX rsp->gartTextures.handle/*rmesa->state.elt_ao.aos_offset*/, elt_count, type);
+ WARN_ONCE("Rendering with elt buffers\n");
+ if(num_verts == 1){
+ start_index32_packet(num_verts, type);
+ e32(rmesa->state.Elts[start]);
+ return;
+ }
+
+ if(num_verts > 65535){ /* not implemented yet */
+ return;
+ }
+ r300EmitElts(ctx, rmesa->state.Elts+start, num_verts);
+ fire_EB(PASS_PREFIX GET_START(&(rmesa->state.elt_dma)), num_verts, type);
#endif
}else{
r300EmitAOS(rmesa, rmesa->state.aos_count, start);
@@ -566,10 +540,6 @@ static GLboolean r300_run_vb_render(GLcontext *ctx,
r300ReleaseArrays(ctx);
r300EmitArrays(ctx, GL_FALSE);
//dump_inputs(ctx, rmesa->state.render_inputs);
-#if 0 /* Cant do this here yet due to magic_1 */
- if(rmesa->state.Elts)
- emit_elts(ctx, rmesa->state.Elts, /*600*/VB->Count, get_num_elts(/*600*/VB->Count));
-#endif
// LOCK_HARDWARE(&(rmesa->radeon));