New elt buffer code should be fairly stable.
authorAapo Tahkola <aet@rasterburn.org>
Tue, 22 Feb 2005 05:16:42 +0000 (05:16 +0000)
committerAapo Tahkola <aet@rasterburn.org>
Tue, 22 Feb 2005 05:16:42 +0000 (05:16 +0000)
src/mesa/drivers/dri/r300/r300_context.h
src/mesa/drivers/dri/r300/r300_maos.c
src/mesa/drivers/dri/r300/r300_maos.h
src/mesa/drivers/dri/r300/r300_reg.h
src/mesa/drivers/dri/r300/r300_render.c
src/mesa/drivers/dri/r300/r300_state.c

index f4911fd311d95e65987f514f56ba0af007fbf4ff..c7e1b8edca7886bdfd37c413cffa6d9983598788 100644 (file)
@@ -60,6 +60,7 @@ typedef struct r300_context *r300ContextPtr;
    I suppose we could inline this and use macro to fetch out __LINE__ and stuff in case we run into trouble 
    with other compilers ... GLUE!
 */
+#if 1
 #define WARN_ONCE(a, ...)      { \
        static int warn##__LINE__=1; \
        if(warn##__LINE__){ \
@@ -71,6 +72,9 @@ typedef struct r300_context *r300ContextPtr;
                warn##__LINE__=0;\
                } \
        }
+#else
+#define WARN_ONCE(a, ...) {}
+#endif
 
 typedef GLuint uint32_t;
 typedef GLubyte uint8_t;
@@ -663,7 +667,7 @@ struct r300_state {
        int aos_count;
 
        GLuint *Elts;
-       struct r300_dma_region elt_ao;
+       struct r300_dma_region elt_dma;
        
        GLuint render_inputs; /* actual render inputs that R300 was configured for. 
                                 They are the same as tnl->render_inputs for fixed pipeline */  
index 04abe8c54fda7aa6db47e7d99d9e76d7bd615a14..ca945956b845b6f063b1992d211fd4165a75add9 100644 (file)
@@ -210,82 +210,22 @@ static void emit_vector(GLcontext * ctx,
 
 }
 
-void emit_elts(GLcontext * ctx, GLuint *elts,
-               unsigned long n_elts, unsigned long n_fake_elts, int align)
+void r300EmitElts(GLcontext * ctx, GLuint *elts, unsigned long n_elts)
 {
        r300ContextPtr rmesa = R300_CONTEXT(ctx);
-       radeonScreenPtr rsp=rmesa->radeon.radeonScreen;
-       unsigned short int *hw_elts;
+       struct r300_dma_region *rvb=&rmesa->state.elt_dma;
+       unsigned short int *out;
        int i;
-       int inc_found=0;
-       int dec_found=0;
-       unsigned long *dst;
-       unsigned long magic_tbl2[6]= { 0x3f51eb85, 0x3e99999a, 0x3f1eb852, 0x3e6b851f, 0x3f2b851f, 0x3eb33333 };
-
-       if(n_elts == 1){
-               fprintf(stderr, "Dont know how to handle this\n");
-               exit(-1);
-       }
-
-       hw_elts=malloc(n_fake_elts*sizeof(unsigned short int));
-
+       
+       r300AllocDmaRegion(rmesa, rvb, (n_elts+1)*2 , 0x20);
+       
+       out = (unsigned short int *)(rvb->address + rvb->start);
+       
        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 < 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);
-
-       //memset(((char *)rsp->gartTextures.map)+ec*sizeof(unsigned short int), 0, 1024);
-       /*emit_vector(ctx, &rmesa->state.elt_ao,
-                       (char *)hw_elts,
-                       2,
-                       2, ec);*/
-       /*
-       // some debug code...
-       inc_found=1;
-       for(i=1; i < oec; i++)
-               if(hw_elts[i-1] != hw_elts[i]+1){
-                       inc_found=0;
-                       break;
-               }
-
-       dec_found=1;
-       for(i=1; i < oec; i++)
-               if(hw_elts[i-1] != hw_elts[i]-1){
-                       dec_found=0;
-               }
-
-       fprintf(stderr, "elts:");
-
-       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");*/
+               out[i]=(unsigned short int)elts[i];
+       
+       if(n_elts & 1)
+               out[i]=0;
 }
 
 /* Emit vertex data to GART memory (unless immediate mode)
@@ -558,7 +498,7 @@ void r300ReleaseArrays(GLcontext * ctx)
        r300ContextPtr rmesa = R300_CONTEXT(ctx);
        int i;
 
-       //r300ReleaseDmaRegion(rmesa, &rmesa->state.elt_ao, __FUNCTION__);
+       r300ReleaseDmaRegion(rmesa, &rmesa->state.elt_dma, __FUNCTION__);
        for (i=0;i<rmesa->state.aos_count;i++) {
                r300ReleaseDmaRegion(rmesa, &rmesa->state.aos[i], __FUNCTION__);
        }
index ec827a39b397bdb75a1581203bccc9e2e5a507fb..f76c94a21914dc7a9fed1a1adc52c7b6cba88b5c 100644 (file)
@@ -40,6 +40,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 #include "r300_context.h"
 
+extern void r300EmitElts(GLcontext * ctx, GLuint *elts, unsigned long n_elts);
 extern void r300EmitArrays(GLcontext * ctx, GLboolean immd);
 extern void r300ReleaseArrays(GLcontext * ctx);
 
index d44d149bffa59028207a4e2e9fb29b44eed08c42..007a20beb4edcfc63b61476e7d260e40526e5295 100644 (file)
@@ -1310,6 +1310,9 @@ I am fairly certain that they are correct unless stated otherwise in comments.
 #define R300_PACKET3_3D_LOAD_VBPNTR         0x00002F00
 
 #define R300_PACKET3_INDX_BUFFER            0x00003300
+#    define R300_EB_UNK1_SHIFT                      24
+#    define R300_EB_UNK1                    (0x80<<24)
+#    define R300_EB_UNK2                        0x0810
 #define R300_PACKET3_3D_DRAW_INDX_2         0x00003600
 
 //END
index 261886ebc4cf6bcfcd7580bbe5eddd26b844ee09..8aacb23ec69318f251d9b480622f29cc5f053c6e 100644 (file)
@@ -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));
 
index 1229cd678b42305ada35c717e73b766af7eb79c8..0123c75c2ffbb055d953636cf1c1efc18f8d3bad 100644 (file)
@@ -1606,6 +1606,7 @@ void r300GenerateSimpleVertexShader(r300ContextPtr r300)
 void r300SetupVertexShader(r300ContextPtr rmesa)
 {
        GLcontext* ctx = rmesa->radeon.glCtx;
+       LOCAL_VARS
 
        if(rmesa->current_vp != NULL){
                r300SetupVertexProgram(rmesa);