r600c: pull over 6xx/7xx vertex fixes for evergreen
authorAlex Deucher <alexdeucher@gmail.com>
Fri, 1 Oct 2010 03:13:50 +0000 (23:13 -0400)
committerAlex Deucher <alexdeucher@gmail.com>
Fri, 1 Oct 2010 04:51:37 +0000 (00:51 -0400)
src/mesa/drivers/dri/r600/evergreen_chip.c
src/mesa/drivers/dri/r600/evergreen_render.c
src/mesa/drivers/dri/r600/evergreen_vertprog.c

index 5287a98..1662741 100644 (file)
@@ -275,7 +275,6 @@ static void evergreenSetupVTXConstants(GLcontext  * ctx,
 {
     context_t *context = EVERGREEN_CONTEXT(ctx);
     struct radeon_aos * paos = (struct radeon_aos *)pAos;
-    unsigned int nVBsize;
     BATCH_LOCALS(&context->radeon);
 
     unsigned int uSQ_VTX_CONSTANT_WORD0_0;
@@ -289,21 +288,11 @@ static void evergreenSetupVTXConstants(GLcontext  * ctx,
 
        r700SyncSurf(context, paos->bo, RADEON_GEM_DOMAIN_GTT, 0, VC_ACTION_ENA_bit);
 
-    if(0 == pStreamDesc->stride)
-    {
-        nVBsize = paos->count * pStreamDesc->size * getTypeSize(pStreamDesc->type);
-    }
-    else
-    {
-        nVBsize = (paos->count - 1) * pStreamDesc->stride
-                  + pStreamDesc->size * getTypeSize(pStreamDesc->type);
-    }
-
     //uSQ_VTX_CONSTANT_WORD0_0
     uSQ_VTX_CONSTANT_WORD0_0 = paos->offset;
 
     //uSQ_VTX_CONSTANT_WORD1_0
-    uSQ_VTX_CONSTANT_WORD1_0 = nVBsize;
+    uSQ_VTX_CONSTANT_WORD1_0 = paos->bo->size - paos->offset - 1;
         
     //uSQ_VTX_CONSTANT_WORD2_0
     SETfield(uSQ_VTX_CONSTANT_WORD2_0, 
@@ -391,17 +380,6 @@ static void evergreenSendVTX(GLcontext *ctx, struct radeon_state_atom *atom)
     if (context->radeon.tcl.aos_count == 0)
            return;
 
-    BEGIN_BATCH_NO_AUTOSTATE(6);
-    R600_OUT_BATCH(CP_PACKET3(R600_IT_SET_CTL_CONST, 1));
-    R600_OUT_BATCH(mmSQ_VTX_BASE_VTX_LOC - ASIC_CTL_CONST_BASE_INDEX);
-    R600_OUT_BATCH(0);
-
-    R600_OUT_BATCH(CP_PACKET3(R600_IT_SET_CTL_CONST, 1));
-    R600_OUT_BATCH(mmSQ_VTX_START_INST_LOC - ASIC_CTL_CONST_BASE_INDEX);
-    R600_OUT_BATCH(0);
-    END_BATCH();
-    COMMIT_BATCH();
-    
     for(i=0; i<VERT_ATTRIB_MAX; i++) {
            if(vp->mesa_program->Base.InputsRead & (1 << i))
            {
@@ -410,7 +388,7 @@ static void evergreenSendVTX(GLcontext *ctx, struct radeon_state_atom *atom)
                                      &(context->stream_desc[j]));
                    j++;
            }
-    } 
+    }
 }
 static void evergreenSendPA(GLcontext *ctx, struct radeon_state_atom *atom)
 {
@@ -1522,7 +1500,7 @@ void evergreenInitAtoms(context_t *context)
     context->radeon.hw.atomlist.name = "atom-list";
 
     EVERGREEN_ALLOC_STATE(init, always, 19, evergreenSendSQConfig);
-    EVERGREEN_ALLOC_STATE(vtx,       evergreen_vtx, (6 + (VERT_ATTRIB_MAX * 12)), evergreenSendVTX);
+    EVERGREEN_ALLOC_STATE(vtx,       evergreen_vtx, (VERT_ATTRIB_MAX * 12), evergreenSendVTX);
     EVERGREEN_ALLOC_STATE(pa,        always,        124, evergreenSendPA);
     EVERGREEN_ALLOC_STATE(tp,        always,        0,   evergreenSendTP);
     EVERGREEN_ALLOC_STATE(sq,        always,        86,  evergreenSendSQ); /* 85 */
index 85b2f9d..27089bf 100644 (file)
@@ -148,7 +148,8 @@ static int evergreenNumVerts(int num_verts, int prim) //same
        return num_verts - verts_off;
 }
 
-static void evergreenRunRenderPrimitive(GLcontext * ctx, int start, int end, int prim) //same
+static void evergreenRunRenderPrimitive(GLcontext * ctx, int start, int end, int prim,
+                                       GLint basevertex) //same
 {
     context_t *context = EVERGREEN_CONTEXT(ctx);
     BATCH_LOCALS(&context->radeon);
@@ -186,6 +187,7 @@ static void evergreenRunRenderPrimitive(GLcontext * ctx, int start, int end, int
     total_emit =   3  /* VGT_PRIMITIVE_TYPE */
                 + 2  /* VGT_INDEX_TYPE */
                 + 2  /* NUM_INSTANCES */
+                + 4  /* VTX_BASE_VTX_LOC + VTX_START_INST_LOC */
                 + 5 + 2; /* DRAW_INDEX */
 
     BEGIN_BATCH_NO_AUTOSTATE(total_emit);
@@ -198,6 +200,11 @@ static void evergreenRunRenderPrimitive(GLcontext * ctx, int start, int end, int
     // num instances
     R600_OUT_BATCH(CP_PACKET3(R600_IT_NUM_INSTANCES, 0));
     R600_OUT_BATCH(1);
+    /* offset */
+    R600_OUT_BATCH(CP_PACKET3(R600_IT_SET_CTL_CONST, 2));
+    R600_OUT_BATCH(mmSQ_VTX_BASE_VTX_LOC - ASIC_CTL_CONST_BASE_INDEX);
+    R600_OUT_BATCH(basevertex); //VTX_BASE_VTX_LOC
+    R600_OUT_BATCH(0); //VTX_START_INST_LOC
     // draw packet
     R600_OUT_BATCH(CP_PACKET3(R600_IT_DRAW_INDEX, 3));
     R600_OUT_BATCH(context->ind_buf.bo_offset);
@@ -268,6 +275,7 @@ static void evergreenRunRenderPrimitiveImmediate(GLcontext * ctx, int start, int
     total_emit +=   3 /* VGT_PRIMITIVE_TYPE */
                  + 2 /* VGT_INDEX_TYPE */
                  + 2 /* NUM_INSTANCES */
+                 + 4 /* VTX_BASE_VTX_LOC + VTX_START_INST_LOC */
                  + 3; /* DRAW */              
 
     BEGIN_BATCH_NO_AUTOSTATE(total_emit);
@@ -280,6 +288,11 @@ static void evergreenRunRenderPrimitiveImmediate(GLcontext * ctx, int start, int
     // num instances
     R600_OUT_BATCH(CP_PACKET3(R600_IT_NUM_INSTANCES, 0));
     R600_OUT_BATCH(1);
+    /* offset */
+    R600_OUT_BATCH(CP_PACKET3(R600_IT_SET_CTL_CONST, 2));
+    R600_OUT_BATCH(mmSQ_VTX_BASE_VTX_LOC - ASIC_CTL_CONST_BASE_INDEX);
+    R600_OUT_BATCH(0); //VTX_BASE_VTX_LOC
+    R600_OUT_BATCH(0); //VTX_START_INST_LOC
     // draw packet
     if(start == 0)
     {
@@ -527,16 +540,16 @@ static GLuint evergreenPredictRenderSize(GLcontext* ctx,
 
     dwords = PRE_EMIT_STATE_BUFSZ;
     if (ib)
-           dwords += nr_prims * 14;
+           dwords += nr_prims * 18;
     else {
            for (i = 0; i < nr_prims; ++i)
            {
                    if (prim[i].start == 0)
-                           dwords += 10;
+                           dwords += 14;
                    else if (prim[i].count > 0xffff)
-                           dwords += prim[i].count + 10;
+                           dwords += prim[i].count + 14;
                    else
-                           dwords += ((prim[i].count + 1) / 2) + 10;
+                           dwords += ((prim[i].count + 1) / 2) + 14;
            }
     }
 
@@ -665,11 +678,11 @@ static void evergreenSetupStreams(GLcontext *ctx, const struct gl_client_array *
 
         stride = (input[i]->StrideB == 0) ? getTypeSize(input[i]->Type) * input[i]->Size : input[i]->StrideB;
 
-        if (input[i]->Type == GL_DOUBLE || input[i]->Type == GL_UNSIGNED_INT || input[i]->Type == GL_INT ||
+        if (input[i]->Type == GL_DOUBLE || input[i]->Type == GL_UNSIGNED_INT || input[i]->Type == GL_INT
 #if MESA_BIG_ENDIAN
-            getTypeSize(input[i]->Type) != 4 || 
+            || getTypeSize(input[i]->Type) != 4
 #endif
-            stride < 4) 
+          )
         {
             evergreenConvertAttrib(ctx, count, input[i], &context->stream_desc[index]);
         } 
@@ -677,19 +690,10 @@ static void evergreenSetupStreams(GLcontext *ctx, const struct gl_client_array *
         {
             if (input[i]->BufferObj->Name) 
             {
-                if (stride % 4 != 0) 
-                {
-                    assert(((intptr_t) input[i]->Ptr) % input[i]->StrideB == 0);
-                    evergreenAlignDataToDword(ctx, input[i], count, &context->stream_desc[index]);
-                    context->stream_desc[index].is_named_bo = GL_FALSE;
-                } 
-                else 
-                {
-                    context->stream_desc[index].stride = input[i]->StrideB;
-                    context->stream_desc[index].bo_offset = (intptr_t) input[i]->Ptr;
-                    context->stream_desc[index].bo = get_radeon_buffer_object(input[i]->BufferObj)->bo;
-                    context->stream_desc[index].is_named_bo = GL_TRUE;
-                }
+                   context->stream_desc[index].stride = input[i]->StrideB;
+                   context->stream_desc[index].bo_offset = (intptr_t) input[i]->Ptr;
+                   context->stream_desc[index].bo = get_radeon_buffer_object(input[i]->BufferObj)->bo;
+                   context->stream_desc[index].is_named_bo = GL_TRUE;
             } 
             else 
             {
@@ -857,7 +861,8 @@ static GLboolean evergreenTryDrawPrims(GLcontext *ctx,
                    evergreenRunRenderPrimitive(ctx,
                                           prim[i].start,
                                           prim[i].start + prim[i].count,
-                                          prim[i].mode);
+                                          prim[i].mode,
+                                          prim[i].basevertex);
            else
                    evergreenRunRenderPrimitiveImmediate(ctx,
                                                    prim[i].start,
@@ -907,15 +912,16 @@ static void evergreenDrawPrims(GLcontext *ctx,
        /* This check should get folded into just the places that
         * min/max index are really needed.
         */
-       if (!index_bounds_valid) {
-               vbo_get_minmax_index(ctx, prim, ib, &min_index, &max_index);
-       }
-
-       if (min_index) {
-               vbo_rebase_prims( ctx, arrays, prim, nr_prims, ib, min_index, max_index, evergreenDrawPrims );
-               return;
+       if (!vbo_all_varyings_in_vbos(arrays)) {
+               if (!index_bounds_valid)
+                       vbo_get_minmax_index(ctx, prim, ib, &min_index, &max_index);
+               /* do we want to rebase, minimizes the 
+                * amount of data to upload? */
+               if (min_index) {
+                       vbo_rebase_prims( ctx, arrays, prim, nr_prims, ib, min_index, max_index, evergreenDrawPrims );
+                       return;
+               }
        }
-
        /* Make an attempt at drawing */
        retval = evergreenTryDrawPrims(ctx, arrays, prim, nr_prims, ib, min_index, max_index);
 
index 6840fa3..0099cef 100644 (file)
@@ -459,11 +459,11 @@ static void evergreenTranslateAttrib(GLcontext *ctx, GLuint unLoc, int count, co
        stride = (input->StrideB == 0) ? evergreen_getTypeSize(input->Type) * input->Size 
                                    : input->StrideB;
 
-    if (input->Type == GL_DOUBLE || input->Type == GL_UNSIGNED_INT || input->Type == GL_INT ||
+    if (input->Type == GL_DOUBLE || input->Type == GL_UNSIGNED_INT || input->Type == GL_INT
 #if MESA_BIG_ENDIAN
-        evergreen_getTypeSize(input->Type) != 4 ||
+        || evergreen_getTypeSize(input->Type) != 4
 #endif
-        stride < 4) 
+        )
     {
         pStreamDesc->type = GL_FLOAT;