r200: emit cliprect with indexed primitive
[mesa.git] / src / mesa / drivers / dri / r200 / r200_cmdbuf.c
index cb1bd8be9563065bba237968d9f614afbe0fd7ae..8b2335d149cd5f6f55fafed834ca5e56b91d9262 100644 (file)
@@ -112,7 +112,6 @@ void r200EmitVbufPrim( r200ContextPtr rmesa,
                        GLuint primitive,
                        GLuint vertex_nr )
 {
-   drm_radeon_cmd_header_t *cmd;
    BATCH_LOCALS(&rmesa->radeon);
 
    assert(!(primitive & R200_VF_PRIM_WALK_IND));
@@ -135,27 +134,28 @@ static void r200FireEB(r200ContextPtr rmesa, int vertex_count, int type)
        BATCH_LOCALS(&rmesa->radeon);
 
        if (vertex_count > 0) {
-               BEGIN_BATCH(8);
-               OUT_BATCH_PACKET3(R200_CP_CMD_3D_DRAW_INDX_2, 0);
+               BEGIN_BATCH(8+2);
+               OUT_BATCH_PACKET3_CLIP(R200_CP_CMD_3D_DRAW_INDX_2, 0);
                OUT_BATCH(R200_VF_PRIM_WALK_IND |
+                         R200_VF_COLOR_ORDER_RGBA | 
                          ((vertex_count + 0) << 16) |
                          type);
                
                if (!rmesa->radeon.radeonScreen->kernel_mm) {
                        OUT_BATCH_PACKET3(R200_CP_CMD_INDX_BUFFER, 2);
                        OUT_BATCH((0x80 << 24) | (0 << 16) | 0x810);
-                       OUT_BATCH_RELOC(rmesa->tcl.elt_dma_offset,
-                                       rmesa->tcl.elt_dma_bo,
-                                       rmesa->tcl.elt_dma_offset,
+                       OUT_BATCH_RELOC(rmesa->radeon.tcl.elt_dma_offset,
+                                       rmesa->radeon.tcl.elt_dma_bo,
+                                       rmesa->radeon.tcl.elt_dma_offset,
                                        RADEON_GEM_DOMAIN_GTT, 0, 0);
-                       OUT_BATCH(vertex_count/2);
+                       OUT_BATCH((vertex_count + 1)/2);
                } else {
                        OUT_BATCH_PACKET3(R200_CP_CMD_INDX_BUFFER, 2);
                        OUT_BATCH((0x80 << 24) | (0 << 16) | 0x810);
-                       OUT_BATCH(rmesa->tcl.elt_dma_offset);
-                       OUT_BATCH(vertex_count/2);
+                       OUT_BATCH(rmesa->radeon.tcl.elt_dma_offset);
+                       OUT_BATCH((vertex_count + 1)/2);
                        radeon_cs_write_reloc(rmesa->radeon.cmdbuf.cs,
-                                             rmesa->tcl.elt_dma_bo,
+                                             rmesa->radeon.tcl.elt_dma_bo,
                                              RADEON_GEM_DOMAIN_GTT, 0, 0);
                }
                END_BATCH();
@@ -164,8 +164,7 @@ static void r200FireEB(r200ContextPtr rmesa, int vertex_count, int type)
 
 void r200FlushElts(GLcontext *ctx)
 {
-  r200ContextPtr rmesa = R200_CONTEXT(ctx);
-   int dwords;
+   r200ContextPtr rmesa = R200_CONTEXT(ctx);
    int nr, elt_used = rmesa->tcl.elt_used;
 
    if (R200_DEBUG & (DEBUG_IOCTL|DEBUG_PRIMS))
@@ -174,20 +173,18 @@ void r200FlushElts(GLcontext *ctx)
    assert( rmesa->radeon.dma.flush == r200FlushElts );
    rmesa->radeon.dma.flush = NULL;
 
-   elt_used = (elt_used + 2) & ~2;
-
    nr = elt_used / 2;
 
-   radeon_bo_unmap(rmesa->tcl.elt_dma_bo);
+   radeon_bo_unmap(rmesa->radeon.tcl.elt_dma_bo);
 
    r200FireEB(rmesa, nr, rmesa->tcl.hw_primitive);
 
-   radeon_bo_unref(rmesa->tcl.elt_dma_bo);
-   rmesa->tcl.elt_dma_bo = NULL;
+   radeon_bo_unref(rmesa->radeon.tcl.elt_dma_bo);
+   rmesa->radeon.tcl.elt_dma_bo = NULL;
 
    if (R200_DEBUG & DEBUG_SYNC) {
       fprintf(stderr, "%s: Syncing\n", __FUNCTION__);
-      r200Finish( rmesa->radeon.glCtx );
+      radeonFinish( rmesa->radeon.glCtx );
    }
 }
 
@@ -205,14 +202,19 @@ GLushort *r200AllocEltsOpenEnded( r200ContextPtr rmesa,
    
    radeonEmitState(&rmesa->radeon);
 
-   rmesa->tcl.elt_dma_bo = radeon_bo_open(rmesa->radeon.radeonScreen->bom,
+   rmesa->radeon.tcl.elt_dma_bo = radeon_bo_open(rmesa->radeon.radeonScreen->bom,
                                          0, R200_ELT_BUF_SZ, 4,
                                          RADEON_GEM_DOMAIN_GTT, 0);
-   rmesa->tcl.elt_dma_offset = 0;
+   rmesa->radeon.tcl.elt_dma_offset = 0;
    rmesa->tcl.elt_used = min_nr * 2;
 
-   radeon_bo_map(rmesa->tcl.elt_dma_bo, 1);
-   retval = rmesa->tcl.elt_dma_bo->ptr + rmesa->tcl.elt_dma_offset;
+   radeon_validate_bo(&rmesa->radeon, rmesa->radeon.tcl.elt_dma_bo,
+                      RADEON_GEM_DOMAIN_GTT, 0);
+   if (radeon_revalidate_bos(rmesa->radeon.glCtx) == GL_FALSE)
+      fprintf(stderr,"failure to revalidate BOs - badness\n");
+
+   radeon_bo_map(rmesa->radeon.tcl.elt_dma_bo, 1);
+   retval = rmesa->radeon.tcl.elt_dma_bo->ptr + rmesa->radeon.tcl.elt_dma_offset;
    
 
    if (R200_DEBUG & DEBUG_PRIMS)
@@ -240,7 +242,7 @@ void r200EmitVertexAOS( r200ContextPtr rmesa,
              __FUNCTION__, vertex_size, offset);
 
 
-   BEGIN_BATCH(5);
+   BEGIN_BATCH(7);
    OUT_BATCH_PACKET3(R200_CP_CMD_3D_LOAD_VBPNTR, 2);
    OUT_BATCH(1);
    OUT_BATCH(vertex_size | (vertex_size << 8));
@@ -259,100 +261,89 @@ void r200EmitAOS(r200ContextPtr rmesa, GLuint nr, GLuint offset)
       fprintf(stderr, "%s: nr=%d, ofs=0x%08x\n", __FUNCTION__, nr,
              offset);
 
-   BEGIN_BATCH(sz+2);
+   BEGIN_BATCH(sz+2+ (nr*2));
    OUT_BATCH_PACKET3(R200_CP_CMD_3D_LOAD_VBPNTR, sz - 1);
    OUT_BATCH(nr);
 
     
    if (!rmesa->radeon.radeonScreen->kernel_mm) {
       for (i = 0; i + 1 < nr; i += 2) {
-        OUT_BATCH((rmesa->tcl.aos[i].components << 0) |
-                  (rmesa->tcl.aos[i].stride << 8) |
-                  (rmesa->tcl.aos[i + 1].components << 16) |
-                  (rmesa->tcl.aos[i + 1].stride << 24));
+        OUT_BATCH((rmesa->radeon.tcl.aos[i].components << 0) |
+                  (rmesa->radeon.tcl.aos[i].stride << 8) |
+                  (rmesa->radeon.tcl.aos[i + 1].components << 16) |
+                  (rmesa->radeon.tcl.aos[i + 1].stride << 24));
                        
-        voffset =  rmesa->tcl.aos[i + 0].offset +
-           offset * 4 * rmesa->tcl.aos[i + 0].stride;
+        voffset =  rmesa->radeon.tcl.aos[i + 0].offset +
+           offset * 4 * rmesa->radeon.tcl.aos[i + 0].stride;
         OUT_BATCH_RELOC(voffset,
-                        rmesa->tcl.aos[i].bo,
+                        rmesa->radeon.tcl.aos[i].bo,
                         voffset,
                         RADEON_GEM_DOMAIN_GTT,
                         0, 0);
-        voffset =  rmesa->tcl.aos[i + 1].offset +
-           offset * 4 * rmesa->tcl.aos[i + 1].stride;
+        voffset =  rmesa->radeon.tcl.aos[i + 1].offset +
+           offset * 4 * rmesa->radeon.tcl.aos[i + 1].stride;
         OUT_BATCH_RELOC(voffset,
-                        rmesa->tcl.aos[i+1].bo,
+                        rmesa->radeon.tcl.aos[i+1].bo,
                         voffset,
                         RADEON_GEM_DOMAIN_GTT,
                         0, 0);
       }
       
       if (nr & 1) {
-        OUT_BATCH((rmesa->tcl.aos[nr - 1].components << 0) |
-                  (rmesa->tcl.aos[nr - 1].stride << 8));
-        voffset =  rmesa->tcl.aos[nr - 1].offset +
-           offset * 4 * rmesa->tcl.aos[nr - 1].stride;
+        OUT_BATCH((rmesa->radeon.tcl.aos[nr - 1].components << 0) |
+                  (rmesa->radeon.tcl.aos[nr - 1].stride << 8));
+        voffset =  rmesa->radeon.tcl.aos[nr - 1].offset +
+           offset * 4 * rmesa->radeon.tcl.aos[nr - 1].stride;
         OUT_BATCH_RELOC(voffset,
-                        rmesa->tcl.aos[nr - 1].bo,
+                        rmesa->radeon.tcl.aos[nr - 1].bo,
                         voffset,
                         RADEON_GEM_DOMAIN_GTT,
                         0, 0);
       }
    } else {
       for (i = 0; i + 1 < nr; i += 2) {
-        OUT_BATCH((rmesa->tcl.aos[i].components << 0) |
-                  (rmesa->tcl.aos[i].stride << 8) |
-                  (rmesa->tcl.aos[i + 1].components << 16) |
-                  (rmesa->tcl.aos[i + 1].stride << 24));
+        OUT_BATCH((rmesa->radeon.tcl.aos[i].components << 0) |
+                  (rmesa->radeon.tcl.aos[i].stride << 8) |
+                  (rmesa->radeon.tcl.aos[i + 1].components << 16) |
+                  (rmesa->radeon.tcl.aos[i + 1].stride << 24));
         
-        voffset =  rmesa->tcl.aos[i + 0].offset +
-           offset * 4 * rmesa->tcl.aos[i + 0].stride;
+        voffset =  rmesa->radeon.tcl.aos[i + 0].offset +
+           offset * 4 * rmesa->radeon.tcl.aos[i + 0].stride;
         OUT_BATCH(voffset);
-        voffset =  rmesa->tcl.aos[i + 1].offset +
-           offset * 4 * rmesa->tcl.aos[i + 1].stride;
+        voffset =  rmesa->radeon.tcl.aos[i + 1].offset +
+           offset * 4 * rmesa->radeon.tcl.aos[i + 1].stride;
         OUT_BATCH(voffset);
       }
       
       if (nr & 1) {
-        OUT_BATCH((rmesa->tcl.aos[nr - 1].components << 0) |
-                  (rmesa->tcl.aos[nr - 1].stride << 8));
-        voffset =  rmesa->tcl.aos[nr - 1].offset +
-           offset * 4 * rmesa->tcl.aos[nr - 1].stride;
+        OUT_BATCH((rmesa->radeon.tcl.aos[nr - 1].components << 0) |
+                  (rmesa->radeon.tcl.aos[nr - 1].stride << 8));
+        voffset =  rmesa->radeon.tcl.aos[nr - 1].offset +
+           offset * 4 * rmesa->radeon.tcl.aos[nr - 1].stride;
         OUT_BATCH(voffset);
       }
       for (i = 0; i + 1 < nr; i += 2) {
-        voffset =  rmesa->tcl.aos[i + 0].offset +
-           offset * 4 * rmesa->tcl.aos[i + 0].stride;
+        voffset =  rmesa->radeon.tcl.aos[i + 0].offset +
+           offset * 4 * rmesa->radeon.tcl.aos[i + 0].stride;
         radeon_cs_write_reloc(rmesa->radeon.cmdbuf.cs,
-                              rmesa->tcl.aos[i+0].bo,
+                              rmesa->radeon.tcl.aos[i+0].bo,
                               RADEON_GEM_DOMAIN_GTT,
                               0, 0);
-        voffset =  rmesa->tcl.aos[i + 1].offset +
-           offset * 4 * rmesa->tcl.aos[i + 1].stride;
+        voffset =  rmesa->radeon.tcl.aos[i + 1].offset +
+           offset * 4 * rmesa->radeon.tcl.aos[i + 1].stride;
         radeon_cs_write_reloc(rmesa->radeon.cmdbuf.cs,
-                              rmesa->tcl.aos[i+1].bo,
+                              rmesa->radeon.tcl.aos[i+1].bo,
                               RADEON_GEM_DOMAIN_GTT,
                               0, 0);
       }
       if (nr & 1) {
-        voffset =  rmesa->tcl.aos[nr - 1].offset +
-           offset * 4 * rmesa->tcl.aos[nr - 1].stride;
+        voffset =  rmesa->radeon.tcl.aos[nr - 1].offset +
+           offset * 4 * rmesa->radeon.tcl.aos[nr - 1].stride;
         radeon_cs_write_reloc(rmesa->radeon.cmdbuf.cs,
-                              rmesa->tcl.aos[nr-1].bo,
+                              rmesa->radeon.tcl.aos[nr-1].bo,
                               RADEON_GEM_DOMAIN_GTT,
                               0, 0);
       }
    }
    END_BATCH();
 }
-
-void r200FireAOS(r200ContextPtr rmesa, int vertex_count, int type)
-{
-       BATCH_LOCALS(&rmesa->radeon);
-
-       BEGIN_BATCH(3);
-       OUT_BATCH_PACKET3(R200_CP_CMD_3D_DRAW_VBUF_2, 0);
-       OUT_BATCH(R200_VF_PRIM_WALK_LIST | (vertex_count << 16) | type);
-       END_BATCH();
-}
-