summaryrefslogtreecommitdiff
path: root/src/mesa/drivers/dri/r300/r300_maos.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa/drivers/dri/r300/r300_maos.c')
-rw-r--r--src/mesa/drivers/dri/r300/r300_maos.c45
1 files changed, 36 insertions, 9 deletions
diff --git a/src/mesa/drivers/dri/r300/r300_maos.c b/src/mesa/drivers/dri/r300/r300_maos.c
index 2f112d4bb2..20a804d97a 100644
--- a/src/mesa/drivers/dri/r300/r300_maos.c
+++ b/src/mesa/drivers/dri/r300/r300_maos.c
@@ -210,7 +210,8 @@ static void emit_vector(GLcontext * ctx,
}
-void emit_elts(GLcontext * ctx, GLuint *elts, int oec, int ec)
+void emit_elts(GLcontext * ctx, GLuint *elts,
+ unsigned long n_elts, unsigned long n_fake_elts, int align)
{
r300ContextPtr rmesa = R300_CONTEXT(ctx);
radeonScreenPtr rsp=rmesa->radeon.radeonScreen;
@@ -218,17 +219,43 @@ void emit_elts(GLcontext * ctx, GLuint *elts, int oec, int ec)
int i;
int inc_found=0;
int dec_found=0;
+ unsigned long *dst;
+ unsigned long magic_tbl2[6]= { 0x3f51eb85, 0x3e99999a, 0x3f1eb852, 0x3e6b851f, 0x3f2b851f, 0x3eb33333 };
- hw_elts=malloc(ec*sizeof(unsigned short int));
+ if(n_elts == 1){
+ fprintf(stderr, "Dont know how to handle this\n");
+ exit(-1);
+ }
- for(i=0; i < oec; i++)
+ hw_elts=malloc(n_fake_elts*sizeof(unsigned short int));
+
+ for(i=0; i < n_elts; i++)
hw_elts[i]=(unsigned short int)elts[i];
/* Work around magic_1 problem by filling rest of the data with last idx */
- for(; i < ec; i++)
- hw_elts[i]=(unsigned short int)elts[oec-1];
+ for(; i < n_fake_elts; i++)
+ hw_elts[i]=(unsigned short int)elts[n_elts-1];
+
+ dst=rsp->gartTextures.map;
+
+ /* Buffer underrun in fgl causes these patterns to appear.
+ Filling these shouldnt be needed in real life. */
+ for(i=0; i < align; i++)
+ if(dst[i] = magic_tbl2[6-align+i])
+
+ //memset(dst, 0, align*sizeof(unsigned long));
+ /*for(i=0; i < align; i++)
+ dst[i]=rand()%(~0);*/
+
+ dst=&dst[align];
+
+ memcpy(dst, hw_elts, n_fake_elts*sizeof(unsigned short int));
+ dst=((char *)dst)+n_fake_elts*sizeof(unsigned short int);
+
+ /*for(i=0; i < 1024/4; i++)
+ dst[i]=rand()%(~0);*/
+ //memset(dst, 0, 1024);
- memcpy(rsp->gartTextures.map, hw_elts, ec*sizeof(unsigned short int));
//memset(((char *)rsp->gartTextures.map)+ec*sizeof(unsigned short int), 0, 1024);
/*emit_vector(ctx, &rmesa->state.elt_ao,
(char *)hw_elts,
@@ -250,15 +277,15 @@ void emit_elts(GLcontext * ctx, GLuint *elts, int oec, int ec)
}
fprintf(stderr, "elts:");
- for(i=0; i < oec; i++)
- fprintf(stderr, "%d\n", hw_elts[i]);
- fprintf(stderr, "\n");
if(inc_found==0 && dec_found==0){
fprintf(stderr, "error found\n");
exit(-1);
}
*/
+ /*for(i=0; i < n_elts; i++)
+ fprintf(stderr, "%d ", hw_elts[i]);
+ fprintf(stderr, "\n");*/
}
/* Emit vertex data to GART memory (unless immediate mode)