summaryrefslogtreecommitdiff
path: root/src/mesa/drivers/dri/r300/radeon_vtxfmt_a.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/radeon_vtxfmt_a.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/radeon_vtxfmt_a.c')
-rw-r--r--src/mesa/drivers/dri/r300/radeon_vtxfmt_a.c113
1 files changed, 66 insertions, 47 deletions
diff --git a/src/mesa/drivers/dri/r300/radeon_vtxfmt_a.c b/src/mesa/drivers/dri/r300/radeon_vtxfmt_a.c
index 053af1ac66..5ea9bb4eb4 100644
--- a/src/mesa/drivers/dri/r300/radeon_vtxfmt_a.c
+++ b/src/mesa/drivers/dri/r300/radeon_vtxfmt_a.c
@@ -45,15 +45,55 @@
#include "api_validate.h"
#include "state.h"
+#define CONV_VB(a, b) rvb->AttribPtr[(a)].size = vb->b->size, \
+ rvb->AttribPtr[(a)].type = GL_FLOAT, \
+ rvb->AttribPtr[(a)].stride = vb->b->stride, \
+ rvb->AttribPtr[(a)].data = vb->b->data
+
+void radeon_vb_to_rvb(r300ContextPtr rmesa, struct radeon_vertex_buffer *rvb, struct vertex_buffer *vb)
+{
+ int i;
+ GLcontext *ctx;
+ ctx = rmesa->radeon.glCtx;
+
+ memset(rvb, 0, sizeof(*rvb));
+
+ rvb->Elts = vb->Elts;
+ rvb->elt_size = 4;
+ rvb->elt_min = 0;
+ rvb->elt_max = vb->Count;
+
+ rvb->Count = vb->Count;
+
+ CONV_VB(VERT_ATTRIB_POS, ObjPtr);
+ CONV_VB(VERT_ATTRIB_NORMAL, NormalPtr);
+ CONV_VB(VERT_ATTRIB_COLOR0, ColorPtr[0]);
+ CONV_VB(VERT_ATTRIB_COLOR1, SecondaryColorPtr[0]);
+ CONV_VB(VERT_ATTRIB_FOG, FogCoordPtr);
+
+ for (i=0; i < MAX_TEXTURE_COORD_UNITS; i++)
+ CONV_VB(VERT_ATTRIB_TEX0 + i, TexCoordPtr[i]);
+
+ rvb->Primitive = vb->Primitive;
+ rvb->PrimitiveCount = vb->PrimitiveCount;
+ rvb->LockFirst = rvb->LockCount = 0;
+ rvb->lock_uptodate = GL_FALSE;
+}
+
#ifdef RADEON_VTXFMT_A
extern void _tnl_array_init( GLcontext *ctx );
-#define CONV(a, b) rmesa->state.VB.AttribPtr[(a)].size = ctx->Array.b.Size, \
- rmesa->state.VB.AttribPtr[(a)].data = ctx->Array.b.BufferObj->Name ? \
- (void *)ADD_POINTERS(ctx->Array.b.Ptr, ctx->Array.b.BufferObj->Data) : (void *)ctx->Array.b.Ptr, \
- rmesa->state.VB.AttribPtr[(a)].stride = ctx->Array.b.StrideB, \
- rmesa->state.VB.AttribPtr[(a)].type = ctx->Array.b.Type
+#define CONV(a, b) do { \
+ if (ctx->Array.b.Enabled) { \
+ rmesa->state.VB.AttribPtr[(a)].size = ctx->Array.b.Size; \
+ rmesa->state.VB.AttribPtr[(a)].data = ctx->Array.b.BufferObj->Name ? \
+ (void *)ADD_POINTERS(ctx->Array.b.Ptr, ctx->Array.b.BufferObj->Data) : (void *)ctx->Array.b.Ptr; \
+ rmesa->state.VB.AttribPtr[(a)].stride = ctx->Array.b.StrideB; \
+ rmesa->state.VB.AttribPtr[(a)].type = ctx->Array.b.Type; \
+ enabled |= 1 << (a); \
+ } \
+ } while (0)
static int setup_arrays(r300ContextPtr rmesa, GLint start)
{
@@ -63,40 +103,25 @@ static int setup_arrays(r300ContextPtr rmesa, GLint start)
GLuint enabled = 0;
ctx = rmesa->radeon.glCtx;
- if (r300Fallback(ctx))
- return -1;
+ i = r300Fallback(ctx);
+ if (i)
+ return i;
memset(rmesa->state.VB.AttribPtr, 0, VERT_ATTRIB_MAX*sizeof(struct dt));
CONV(VERT_ATTRIB_POS, Vertex);
- if (ctx->Array.Vertex.Enabled)
- enabled |= 1 << VERT_ATTRIB_POS;
-
CONV(VERT_ATTRIB_NORMAL, Normal);
- if (ctx->Array.Normal.Enabled)
- enabled |= 1 << VERT_ATTRIB_NORMAL;
-
CONV(VERT_ATTRIB_COLOR0, Color);
- if (ctx->Array.Color.Enabled)
- enabled |= 1 << VERT_ATTRIB_COLOR0;
-
CONV(VERT_ATTRIB_COLOR1, SecondaryColor);
- if (ctx->Array.SecondaryColor.Enabled)
- enabled |= 1 << VERT_ATTRIB_COLOR1;
-
CONV(VERT_ATTRIB_FOG, FogCoord);
- if (ctx->Array.FogCoord.Enabled)
- enabled |= 1 << VERT_ATTRIB_FOG;
- for (i=0; i < MAX_TEXTURE_COORD_UNITS; i++) {
+ for (i=0; i < MAX_TEXTURE_COORD_UNITS; i++)
CONV(VERT_ATTRIB_TEX0 + i, TexCoord[i]);
-
- if(ctx->Array.TexCoord[i].Enabled) {
- enabled |= 1 << (VERT_ATTRIB_TEX0+i);
- }
-
- }
-
+
+ if (ctx->VertexProgram._Enabled)
+ for (i=0; i < VERT_ATTRIB_MAX; i++)
+ CONV(i, VertexAttrib[i]);
+
for (i=0; i < VERT_ATTRIB_MAX; i++) {
if (enabled & (1 << i)) {
rmesa->state.VB.AttribPtr[i].data += rmesa->state.VB.AttribPtr[i].stride * start;
@@ -113,12 +138,12 @@ static int setup_arrays(r300ContextPtr rmesa, GLint start)
if(rmesa->state.VB.AttribPtr[i].type != GL_UNSIGNED_BYTE &&
rmesa->state.VB.AttribPtr[i].type != GL_FLOAT){
WARN_ONCE("Unsupported format %d at index %d\n", rmesa->state.VB.AttribPtr[i].type, i);
- return -1;
+ return R300_FALLBACK_TCL;
}
if(rmesa->state.VB.AttribPtr[i].type == GL_UNSIGNED_BYTE &&
rmesa->state.VB.AttribPtr[i].size != 4){
WARN_ONCE("Unsupported component count for ub colors\n");
- return -1;
+ return R300_FALLBACK_TCL;
}
/*fprintf(stderr, "%d: ", i);
@@ -143,7 +168,7 @@ static int setup_arrays(r300ContextPtr rmesa, GLint start)
fprintf(stderr, "Stride %d ", rmesa->state.VB.AttribPtr[i].stride);
fprintf(stderr, "\n");*/
}
- return 0;
+ return R300_FALLBACK_NONE;
}
void radeon_init_vtxfmt_a(r300ContextPtr rmesa);
@@ -180,12 +205,6 @@ static void radeonDrawElements( GLenum mode, GLsizei count, GLenum type, const G
return;
FLUSH_CURRENT( ctx, 0 );
- /*
- fprintf(stderr, "dt at %s:\n", __FUNCTION__);
- for(i=0; i < VERT_ATTRIB_MAX; i++){
- fprintf(stderr, "dt %d:", i);
- dump_dt(&rmesa->state.VB.AttribPtr[i], rmesa->state.VB.Count);
- }*/
r300ReleaseDmaRegion(rmesa, &rvb, __FUNCTION__);
switch (type) {
@@ -276,7 +295,7 @@ static void radeonDrawElements( GLenum mode, GLsizei count, GLenum type, const G
rmesa->state.VB.Count = rmesa->state.VB.LockCount;
r300ReleaseArrays(ctx);
- r300EmitArraysVtx(ctx, GL_FALSE);
+ r300EmitArrays(ctx, GL_FALSE);
rmesa->state.VB.lock_uptodate = GL_TRUE;
}
@@ -292,7 +311,7 @@ static void radeonDrawElements( GLenum mode, GLsizei count, GLenum type, const G
return;
}
} else {
- if (setup_arrays(rmesa, min))
+ if (setup_arrays(rmesa, min) >= R300_FALLBACK_TCL)
goto fallback;
rmesa->state.VB.Count = max - min + 1;
@@ -313,7 +332,7 @@ static void radeonDrawElements( GLenum mode, GLsizei count, GLenum type, const G
rmesa->state.VB.Elts = ptr;
rmesa->state.VB.elt_size = elt_size;
- r300_run_vb_render_vtxfmt_a(ctx, NULL);
+ r300_run_vb_render(ctx, NULL);
if(rvb.buf)
radeon_mm_use(rmesa, rvb.buf->id);
@@ -438,7 +457,7 @@ static void radeonDrawRangeElements(GLenum mode, GLuint min, GLuint max, GLsizei
rmesa->state.VB.Count = rmesa->state.VB.LockCount;
r300ReleaseArrays(ctx);
- r300EmitArraysVtx(ctx, GL_FALSE);
+ r300EmitArrays(ctx, GL_FALSE);
rmesa->state.VB.lock_uptodate = GL_TRUE;
}
@@ -454,7 +473,7 @@ static void radeonDrawRangeElements(GLenum mode, GLuint min, GLuint max, GLsizei
return;
}*/
} else {
- if (setup_arrays(rmesa, min))
+ if (setup_arrays(rmesa, min) >= R300_FALLBACK_TCL)
goto fallback;
rmesa->state.VB.Count = max - min + 1;
@@ -477,7 +496,7 @@ static void radeonDrawRangeElements(GLenum mode, GLuint min, GLuint max, GLsizei
rmesa->state.VB.elt_min = min;
rmesa->state.VB.elt_max = max;
- r300_run_vb_render_vtxfmt_a(ctx, NULL);
+ r300_run_vb_render(ctx, NULL);
if(rvb.buf)
radeon_mm_use(rmesa, rvb.buf->id);
@@ -531,7 +550,7 @@ static void radeonDrawArrays( GLenum mode, GLint start, GLsizei count )
rmesa->state.VB.Count = rmesa->state.VB.LockCount;
r300ReleaseArrays(ctx);
- r300EmitArraysVtx(ctx, GL_FALSE);
+ r300EmitArrays(ctx, GL_FALSE);
rmesa->state.VB.lock_uptodate = GL_TRUE;
}
@@ -547,7 +566,7 @@ static void radeonDrawArrays( GLenum mode, GLint start, GLsizei count )
goto fallback;
}
} else {
- if (setup_arrays(rmesa, start))
+ if (setup_arrays(rmesa, start) >= R300_FALLBACK_TCL)
goto fallback;
rmesa->state.VB.Count = count;
@@ -570,7 +589,7 @@ static void radeonDrawArrays( GLenum mode, GLint start, GLsizei count )
rmesa->state.VB.elt_min = 0;
rmesa->state.VB.elt_max = 0;
- r300_run_vb_render_vtxfmt_a(ctx, NULL);
+ r300_run_vb_render(ctx, NULL);
return ;