radeon: emit scissor when using cs path
[mesa.git] / src / mesa / drivers / dri / radeon / radeon_ioctl.c
index b5ab9234df6976a4a45e192336e27bfac503327f..b5fde6d3de59a3edfa3ba3f6ffba5f413ebb1a6c 100644 (file)
@@ -37,6 +37,20 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include <sched.h>
 #include <errno.h> 
 
+#include "main/attrib.h"
+#include "main/enable.h"
+#include "main/blend.h"
+#include "main/bufferobj.h"
+#include "main/buffers.h"
+#include "main/depth.h"
+#include "main/shaders.h"
+#include "main/texstate.h"
+#include "main/varray.h"
+#include "glapi/dispatch.h"
+#include "swrast/swrast.h"
+#include "main/stencil.h"
+#include "main/matrix.h"
+
 #include "main/glheader.h"
 #include "main/imports.h"
 #include "main/simple_list.h"
@@ -299,9 +313,9 @@ void radeonEmitAOS( r100ContextPtr rmesa,
 {
 #if RADEON_OLD_PACKETS
    assert( nr == 1 );
-   rmesa->ioctl.bo = rmesa->tcl.aos[0].bo;
+   rmesa->ioctl.bo = rmesa->radeon.tcl.aos[0].bo;
    rmesa->ioctl.vertex_offset = 
-     (rmesa->tcl.aos[0].offset + offset * rmesa->tcl.aos[0].stride * 4);
+     (rmesa->radeon.tcl.aos[0].offset + offset * rmesa->radeon.tcl.aos[0].stride * 4);
 #else
    BATCH_LOCALS(&rmesa->radeon);
    uint32_t voffset;
@@ -318,79 +332,79 @@ void radeonEmitAOS( r100ContextPtr rmesa,
 
    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);
       }
@@ -405,72 +419,20 @@ void radeonEmitAOS( r100ContextPtr rmesa,
  */
 #define RADEON_MAX_CLEARS      256
 
-static void radeonClear( GLcontext *ctx, GLbitfield mask )
+static void radeonUserClear(GLcontext *ctx, GLuint mask)
 {
-   r100ContextPtr rmesa = R100_CONTEXT(ctx);
+   radeon_clear_tris(ctx, mask);
+}
+
+static void radeonKernelClear(GLcontext *ctx, GLuint flags)
+{
+     r100ContextPtr rmesa = R100_CONTEXT(ctx);
    __DRIdrawablePrivate *dPriv = rmesa->radeon.dri.drawable;
    drm_radeon_sarea_t *sarea = rmesa->radeon.sarea;
    uint32_t clear;
-   GLuint flags = 0;
-   GLuint color_mask = 0;
    GLint ret, i;
    GLint cx, cy, cw, ch;
 
-   if ( RADEON_DEBUG & DEBUG_IOCTL ) {
-      fprintf( stderr, "radeonClear\n");
-   }
-
-   {
-      LOCK_HARDWARE( &rmesa->radeon );
-      UNLOCK_HARDWARE( &rmesa->radeon );
-      if ( dPriv->numClipRects == 0 ) 
-        return;
-   }
-   
-   radeonFlush( ctx ); 
-
-   if ( mask & BUFFER_BIT_FRONT_LEFT ) {
-      flags |= RADEON_FRONT;
-      color_mask = rmesa->hw.msk.cmd[MSK_RB3D_PLANEMASK];
-      mask &= ~BUFFER_BIT_FRONT_LEFT;
-   }
-
-   if ( mask & BUFFER_BIT_BACK_LEFT ) {
-      flags |= RADEON_BACK;
-      color_mask = rmesa->hw.msk.cmd[MSK_RB3D_PLANEMASK];
-      mask &= ~BUFFER_BIT_BACK_LEFT;
-   }
-
-   if ( mask & BUFFER_BIT_DEPTH ) {
-      flags |= RADEON_DEPTH;
-      mask &= ~BUFFER_BIT_DEPTH;
-   }
-
-   if ( (mask & BUFFER_BIT_STENCIL) && rmesa->radeon.state.stencil.hwBuffer ) {
-      flags |= RADEON_STENCIL;
-      mask &= ~BUFFER_BIT_STENCIL;
-   }
-
-   if ( mask ) {
-      if (RADEON_DEBUG & DEBUG_FALLBACKS)
-        fprintf(stderr, "%s: swrast clear, mask: %x\n", __FUNCTION__, mask);
-      _swrast_Clear( ctx, mask );
-   }
-
-   if ( !flags ) 
-      return;
-
-   if (rmesa->using_hyperz) {
-      flags |= RADEON_USE_COMP_ZBUF;
-/*      if (rmesa->radeon.radeonScreen->chipset & RADEON_CHIPSET_TCL) 
-         flags |= RADEON_USE_HIERZ; */
-      if (!(rmesa->radeon.state.stencil.hwBuffer) ||
-        ((flags & RADEON_DEPTH) && (flags & RADEON_STENCIL) &&
-           ((rmesa->radeon.state.stencil.clear & RADEON_STENCIL_WRITE_MASK) == RADEON_STENCIL_WRITE_MASK))) {
-         flags |= RADEON_CLEAR_FASTZ;
-      }
-   }
-
    LOCK_HARDWARE( &rmesa->radeon );
 
    /* compute region after locking: */
@@ -580,9 +542,77 @@ static void radeonClear( GLcontext *ctx, GLbitfield mask )
         exit( 1 );
       }
    }
-
    UNLOCK_HARDWARE( &rmesa->radeon );
-   rmesa->radeon.hw.all_dirty = GL_TRUE;
+}
+
+static void radeonClear( GLcontext *ctx, GLbitfield mask )
+{
+   r100ContextPtr rmesa = R100_CONTEXT(ctx);
+   __DRIdrawablePrivate *dPriv = rmesa->radeon.dri.drawable;
+   GLuint flags = 0;
+   GLuint color_mask = 0;
+   GLuint orig_mask = mask;
+
+   if ( RADEON_DEBUG & DEBUG_IOCTL ) {
+      fprintf( stderr, "radeonClear\n");
+   }
+
+   {
+      LOCK_HARDWARE( &rmesa->radeon );
+      UNLOCK_HARDWARE( &rmesa->radeon );
+      if ( dPriv->numClipRects == 0 ) 
+        return;
+   }
+   
+   radeon_firevertices(&rmesa->radeon); 
+
+   if ( mask & BUFFER_BIT_FRONT_LEFT ) {
+      flags |= RADEON_FRONT;
+      color_mask = rmesa->hw.msk.cmd[MSK_RB3D_PLANEMASK];
+      mask &= ~BUFFER_BIT_FRONT_LEFT;
+   }
+
+   if ( mask & BUFFER_BIT_BACK_LEFT ) {
+      flags |= RADEON_BACK;
+      color_mask = rmesa->hw.msk.cmd[MSK_RB3D_PLANEMASK];
+      mask &= ~BUFFER_BIT_BACK_LEFT;
+   }
+
+   if ( mask & BUFFER_BIT_DEPTH ) {
+      flags |= RADEON_DEPTH;
+      mask &= ~BUFFER_BIT_DEPTH;
+   }
+
+   if ( (mask & BUFFER_BIT_STENCIL) ) {
+      flags |= RADEON_STENCIL;
+      mask &= ~BUFFER_BIT_STENCIL;
+   }
+
+   if ( mask ) {
+      if (RADEON_DEBUG & DEBUG_FALLBACKS)
+        fprintf(stderr, "%s: swrast clear, mask: %x\n", __FUNCTION__, mask);
+      _swrast_Clear( ctx, mask );
+   }
+
+   if ( !flags ) 
+      return;
+
+   if (rmesa->using_hyperz) {
+      flags |= RADEON_USE_COMP_ZBUF;
+/*      if (rmesa->radeon.radeonScreen->chipset & RADEON_CHIPSET_TCL) 
+         flags |= RADEON_USE_HIERZ; */
+      if (((flags & RADEON_DEPTH) && (flags & RADEON_STENCIL) &&
+           ((rmesa->radeon.state.stencil.clear & RADEON_STENCIL_WRITE_MASK) == RADEON_STENCIL_WRITE_MASK))) {
+         flags |= RADEON_CLEAR_FASTZ;
+      }
+   }
+
+   if (rmesa->radeon.radeonScreen->kernel_mm)
+     radeonUserClear(ctx, orig_mask);
+   else {
+      radeonKernelClear(ctx, flags);
+      rmesa->radeon.hw.all_dirty = GL_TRUE;
+   }
 }
 
 void radeonInitIoctlFuncs( GLcontext *ctx )