Merge remote branch 'main/radeon-rewrite'
[mesa.git] / src / mesa / drivers / dri / r200 / r200_cmdbuf.c
index cb1bd8be9563065bba237968d9f614afbe0fd7ae..df9dd83344caa5bd701f0a2418f9ac3e351b421a 100644 (file)
@@ -105,6 +105,35 @@ void r200SetUpAtomList( r200ContextPtr rmesa )
    insert_at_tail( &rmesa->radeon.hw.atomlist, &rmesa->hw.vpi[1] );
 }
 
+void r200EmitScissor(r200ContextPtr rmesa)
+{
+    BATCH_LOCALS(&rmesa->radeon);
+    if (!rmesa->radeon.radeonScreen->kernel_mm) {
+       return;
+    }
+    if (rmesa->radeon.state.scissor.enabled) {
+        BEGIN_BATCH(8);
+        OUT_BATCH(CP_PACKET0(R200_RE_CNTL, 0));
+        OUT_BATCH(R200_SCISSOR_ENABLE | rmesa->hw.set.cmd[SET_RE_CNTL]);
+        OUT_BATCH(CP_PACKET0(R200_RE_AUX_SCISSOR_CNTL, 0));
+        OUT_BATCH(R200_SCISSOR_ENABLE_0);
+        OUT_BATCH(CP_PACKET0(R200_RE_SCISSOR_TL_0, 0));
+        OUT_BATCH((rmesa->radeon.state.scissor.rect.y1 << 16) |
+                  rmesa->radeon.state.scissor.rect.x1);
+        OUT_BATCH(CP_PACKET0(R200_RE_SCISSOR_BR_0, 0));
+        OUT_BATCH(((rmesa->radeon.state.scissor.rect.y2 - 1) << 16) |
+                  (rmesa->radeon.state.scissor.rect.x2 - 1));
+        END_BATCH();
+    } else {
+        BEGIN_BATCH(4);
+        OUT_BATCH(CP_PACKET0(R200_RE_CNTL, 0));
+        OUT_BATCH(rmesa->hw.set.cmd[SET_RE_CNTL] & ~R200_SCISSOR_ENABLE);
+        OUT_BATCH(CP_PACKET0(R200_RE_AUX_SCISSOR_CNTL, 0));
+        OUT_BATCH(0);
+        END_BATCH();
+    }
+}
+
 /* Fire a section of the retained (indexed_verts) buffer as a regular
  * primtive.  
  */
@@ -112,7 +141,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));
@@ -122,6 +150,7 @@ void r200EmitVbufPrim( r200ContextPtr rmesa,
    if (R200_DEBUG & (DEBUG_IOCTL|DEBUG_PRIMS))
       fprintf(stderr, "%s cmd_used/4: %d prim %x nr %d\n", __FUNCTION__,
              rmesa->store.cmd_used/4, primitive, vertex_nr);
+   r200EmitScissor(rmesa);
  
    BEGIN_BATCH(3);
    OUT_BATCH_PACKET3_CLIP(R200_CP_CMD_3D_DRAW_VBUF_2, 0);
@@ -135,27 +164,29 @@ 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);
+        r200EmitScissor(rmesa);
+               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 +195,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 +204,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 +233,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 +273,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 +292,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();
-}
-