summaryrefslogtreecommitdiff
path: root/src/mesa/drivers/dri/r300/r300_render.c
diff options
context:
space:
mode:
authorAapo Tahkola <aet@rasterburn.org>2006-03-19 18:04:12 +0000
committerAapo Tahkola <aet@rasterburn.org>2006-03-19 18:04:12 +0000
commit77174f0072be992eeffb6a53a3311fbd33463c5f (patch)
treeedb65204572c3928f4783809e96ce2387cd68d0c /src/mesa/drivers/dri/r300/r300_render.c
parent21a4fb41376ab90afdfca67375e55e4a0ded6c0f (diff)
-fix texrect fallback when using vtxfmt_a (glitz, xgl, etc.)
-struct vertex_buffer to struct radeon_vertex_buffer conversion -vertex attrib arrays did not supersede conventinal arrays when enabled
Diffstat (limited to 'src/mesa/drivers/dri/r300/r300_render.c')
-rw-r--r--src/mesa/drivers/dri/r300/r300_render.c147
1 files changed, 28 insertions, 119 deletions
diff --git a/src/mesa/drivers/dri/r300/r300_render.c b/src/mesa/drivers/dri/r300/r300_render.c
index ee24f14f61..acdecb54ec 100644
--- a/src/mesa/drivers/dri/r300/r300_render.c
+++ b/src/mesa/drivers/dri/r300/r300_render.c
@@ -282,99 +282,6 @@ static void r300_render_vb_primitive(r300ContextPtr rmesa,
int prim)
{
int type, num_verts;
- LOCAL_VARS
-
- type=r300_get_primitive_type(rmesa, ctx, prim);
- num_verts=r300_get_num_verts(rmesa, ctx, end-start, prim);
-
- if(type<0 || num_verts <= 0)return;
-
- if(rmesa->state.Elts){
- r300EmitAOS(rmesa, rmesa->state.aos_count, 0);
-#if 0
- int i;
- start_index32_packet(num_verts, type);
- for(i=0; i < num_verts; i++)
- e32(rmesa->state.Elts[start+i]); /* start ? */
-#else
- if(num_verts == 1){
- start_index32_packet(num_verts, type);
- e32(rmesa->state.Elts[start]);
- return;
- }
-
- if(num_verts > 65535){ /* not implemented yet */
- WARN_ONCE("Too many elts\n");
- return;
- }
- r300EmitElts(ctx, rmesa->state.Elts+start, num_verts, 4);
- fire_EB(PASS_PREFIX GET_START(&(rmesa->state.elt_dma)), num_verts, type, 4);
-#endif
- }else{
- r300EmitAOS(rmesa, rmesa->state.aos_count, start);
- fire_AOS(PASS_PREFIX num_verts, type);
- }
-}
-
-static GLboolean r300_run_vb_render(GLcontext *ctx,
- struct tnl_pipeline_stage *stage)
-{
- r300ContextPtr rmesa = R300_CONTEXT(ctx);
- TNLcontext *tnl = TNL_CONTEXT(ctx);
- struct vertex_buffer *VB = &tnl->vb;
- int i;
- LOCAL_VARS
-
- if (RADEON_DEBUG & DEBUG_PRIMS)
- fprintf(stderr, "%s\n", __FUNCTION__);
-
-
- //r300UpdateShaders(rmesa);
-
- r300ReleaseArrays(ctx);
- r300EmitArrays(ctx, GL_FALSE);
-
- r300UpdateShaderStates(rmesa);
-
- reg_start(R300_RB3D_DSTCACHE_CTLSTAT,0);
- e32(0x0000000a);
-
- reg_start(0x4f18,0);
- e32(0x00000003);
- r300EmitState(rmesa);
-
- 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;
-
- r300_render_vb_primitive(rmesa, ctx, start, start + length, prim);
- }
-
- reg_start(R300_RB3D_DSTCACHE_CTLSTAT,0);
- e32(0x0000000a);
-
- reg_start(0x4f18,0);
- e32(0x00000003);
-
-#ifdef USER_BUFFERS
- r300UseArrays(ctx);
-#endif
-
- return GL_FALSE;
-}
-
-#ifdef RADEON_VTXFMT_A
-
-static void r300_render_vb_primitive_vtxfmt_a(r300ContextPtr rmesa,
- GLcontext *ctx,
- int start,
- int end,
- int prim)
-{
- int type, num_verts;
type=r300_get_primitive_type(rmesa, ctx, prim);
num_verts=r300_get_num_verts(rmesa, ctx, end-start, prim);
@@ -416,6 +323,7 @@ void dump_array(struct r300_dma_region *rvb, int count)
int *out = (int *)(rvb->address + rvb->start);
int i, ci;
+ fprintf(stderr, "stride %d:", rvb->aos_stride);
for (i=0; i < count; i++) {
fprintf(stderr, "{");
if (rvb->aos_format == AOS_FORMAT_FLOAT)
@@ -437,7 +345,7 @@ void dump_dt(struct dt *dt, int count)
int *out = dt->data;
int i, ci;
- fprintf(stderr, "base at %p ", out);
+ fprintf(stderr, "stride %d", dt->stride);
for (i=0; i < count; i++){
fprintf(stderr, "{");
@@ -456,23 +364,27 @@ void dump_dt(struct dt *dt, int count)
}
#endif
-/*static */GLboolean r300_run_vb_render_vtxfmt_a(GLcontext *ctx,
+GLboolean r300_run_vb_render(GLcontext *ctx,
struct tnl_pipeline_stage *stage)
{
- r300ContextPtr rmesa = R300_CONTEXT(ctx);
- //TNLcontext *tnl = TNL_CONTEXT(ctx);
- struct radeon_vertex_buffer *VB = &rmesa->state.VB; //&tnl->vb;
- int i;
- LOCAL_VARS
+ r300ContextPtr rmesa = R300_CONTEXT(ctx);
+ struct radeon_vertex_buffer *VB = &rmesa->state.VB;
+ int i;
+ LOCAL_VARS
if (RADEON_DEBUG & DEBUG_PRIMS)
fprintf(stderr, "%s\n", __FUNCTION__);
+
+ if (stage) {
+ TNLcontext *tnl = TNL_CONTEXT(ctx);
+ radeon_vb_to_rvb(rmesa, VB, &tnl->vb);
+ }
r300UpdateShaders(rmesa);
if (rmesa->state.VB.LockCount == 0 || 1) {
r300ReleaseArrays(ctx);
- r300EmitArraysVtx(ctx, GL_FALSE);
-
+ r300EmitArrays(ctx, GL_FALSE);
+
r300UpdateShaderStates(rmesa);
} else {
/* TODO: Figure out why do we need these. */
@@ -496,7 +408,7 @@ void dump_dt(struct dt *dt, int count)
#endif
#if 0
r300ReleaseArrays(ctx);
- r300EmitArraysVtx(ctx, GL_FALSE);
+ r300EmitArrays(ctx, GL_FALSE);
fprintf(stderr, "after:\n");
for(i=0; i < rmesa->state.aos_count; i++){
@@ -522,7 +434,7 @@ void dump_dt(struct dt *dt, int count)
GLuint start = VB->Primitive[i].start;
GLuint length = VB->Primitive[i].count;
- r300_render_vb_primitive_vtxfmt_a(rmesa, ctx, start, start + length, prim);
+ r300_render_vb_primitive(rmesa, ctx, start, start + length, prim);
}
reg_start(R300_RB3D_DSTCACHE_CTLSTAT,0);
@@ -536,19 +448,19 @@ void dump_dt(struct dt *dt, int count)
#endif
return GL_FALSE;
}
-#endif
#define FALLBACK_IF(expr) \
do { \
if (expr) { \
if (1 || RADEON_DEBUG & DEBUG_FALLBACKS) \
WARN_ONCE("fallback:%s\n", #expr); \
- return GL_TRUE; \
+ return R300_FALLBACK_RAST; \
} \
} while(0)
-GLboolean r300Fallback(GLcontext *ctx)
+int r300Fallback(GLcontext *ctx)
{
+ int i;
//FALLBACK_IF(ctx->RenderMode != GL_RENDER); // We do not do SELECT or FEEDBACK (yet ?)
@@ -576,8 +488,12 @@ GLboolean r300Fallback(GLcontext *ctx)
/* Rest could be done with vertex fragments */
if (ctx->Extensions.NV_point_sprite || ctx->Extensions.ARB_point_sprite)
FALLBACK_IF(ctx->Point.PointSprite); // GL_POINT_SPRITE_NV
-
- return GL_FALSE;
+
+ for (i = 0; i < ctx->Const.MaxTextureUnits; i++)
+ if (ctx->Texture.Unit[i]._ReallyEnabled & TEXTURE_RECT_BIT)
+ return R300_FALLBACK_TCL;
+
+ return R300_FALLBACK_NONE;
}
/**
@@ -593,9 +509,9 @@ static GLboolean r300_run_render(GLcontext *ctx,
if (RADEON_DEBUG & DEBUG_PRIMS)
fprintf(stderr, "%s\n", __FUNCTION__);
- if (r300Fallback(ctx))
+ if (r300Fallback(ctx) >= R300_FALLBACK_RAST)
return GL_TRUE;
-
+
return r300_run_vb_render(ctx, stage);
}
@@ -613,7 +529,6 @@ static GLboolean r300_run_tcl_render(GLcontext *ctx,
{
r300ContextPtr rmesa = R300_CONTEXT(ctx);
struct r300_vertex_program *vp;
- int i;
hw_tcl_on=future_hw_tcl_on;
@@ -622,17 +537,11 @@ static GLboolean r300_run_tcl_render(GLcontext *ctx,
if(hw_tcl_on == GL_FALSE)
return GL_TRUE;
- if (r300Fallback(ctx)) {
+ if (r300Fallback(ctx) >= R300_FALLBACK_TCL) {
hw_tcl_on = GL_FALSE;
return GL_TRUE;
}
- for (i = 0; i < ctx->Const.MaxTextureUnits; i++) /* XXX: Needs to be part of r300Fallback */
- if (ctx->Texture.Unit[i]._ReallyEnabled & TEXTURE_RECT_BIT) {
- hw_tcl_on = GL_FALSE;
- return GL_TRUE;
- }
-
r300UpdateShaders(rmesa);
vp = (struct r300_vertex_program *)CURRENT_VERTEX_SHADER(ctx);