Re-implement intelClear() in terms of softpipe_clear(). Pretty simple/small now.
authorBrian <brian@i915.localnet.net>
Wed, 1 Aug 2007 21:11:59 +0000 (15:11 -0600)
committerBrian <brian@i915.localnet.net>
Wed, 1 Aug 2007 21:11:59 +0000 (15:11 -0600)
Note: softpipe_clear() should really be renamed to something like
pipe_clear_with_blits() and put into a driver-indepedent module...

src/mesa/drivers/dri/i915pipe/intel_blit.c
src/mesa/drivers/dri/i915pipe/intel_buffers.c
src/mesa/drivers/dri/i915pipe/intel_context.c
src/mesa/pipe/softpipe/sp_clear.c

index 109d4face26f56fa3b60387531ed897a92304b1e..4a5f58ed9e0137987eccf749644bbdf12a9fe02b 100644 (file)
@@ -216,6 +216,10 @@ intelEmitFillBlit(struct intel_context *intel,
    GLboolean badMask = GL_FALSE;
    BATCH_LOCALS;
 
+   /*
+   printf("Emit fill blit value=0x%x  mask=0x%x\n", value, mask);
+   */
+
    dst_pitch *= cpp;
 
    switch (cpp) {
index fb93151430258f6939f34e916a169ae5f7920e74..e39220fe47ecc490a23019cdab27d9cedb836e28 100644 (file)
@@ -295,16 +295,16 @@ intelWindowMoved(struct intel_context *intel)
 
 
 
-
 /**
  * Called by ctx->Driver.Clear.
+ * XXX NO LONGER USED - REMOVE IN NEAR FUTURE
  */
 #if 0
 static void
 intelClear(GLcontext *ctx, GLbitfield mask)
 #else
-void
-intelClear(struct pipe_context *pipe,
+static void
+OLD_intelClear(struct pipe_context *pipe,
            GLboolean color, GLboolean depth,
            GLboolean stencil, GLboolean accum)
 #endif
@@ -396,6 +396,34 @@ intelClear(struct pipe_context *pipe,
 }
 
 
+/**
+ * Clear buffers.  Called via pipe->clear().
+ */
+void
+intelClear(struct pipe_context *pipe,
+           GLboolean color, GLboolean depth,
+           GLboolean stencil, GLboolean accum)
+{
+   GLcontext *ctx = (GLcontext *) pipe->glctx;
+   struct intel_context *intel = intel_context(ctx);
+
+   /* XXX
+    * Examine stencil and color writemasks to determine if we can clear
+    * with blits.
+    */
+
+   intelFlush(&intel->ctx);
+   LOCK_HARDWARE(intel);
+
+   softpipe_clear(pipe, color, depth, stencil, accum);
+
+   intel_batchbuffer_flush(intel->batch);
+
+   UNLOCK_HARDWARE(intel);
+}
+
+
+
 /* Emit wait for pending flips */
 void
 intel_wait_flips(struct intel_context *intel, GLuint batch_flags)
index 6121f6bc608544322670ea05443dfd550b93d174..be8235d7d116da3a91a751252cea528ab482ce07 100644 (file)
@@ -763,6 +763,7 @@ void LOCK_HARDWARE( struct intel_context *intel )
    */
 void UNLOCK_HARDWARE( struct intel_context *intel )
 {
+   assert(intel->locked);
    intel->locked = 0;
 
    DRM_UNLOCK(intel->driFd, intel->driHwLock, intel->hHWContext);
index aa7601ab8cb6fa8a768c8d3e9efee1f04da57168..b3bbc96f307f87576db9bcc2a3d57af2834ed176 100644 (file)
@@ -90,7 +90,8 @@ color_mask(GLuint format, GLuint pipeMask)
 
 
 /**
- * XXX maybe this belongs in the GL state tracker...
+ * XXX This should probaby be renamed to something like pipe_clear_with_blits()
+ * and moved into a device-independent pipe file.
  */
 void
 softpipe_clear(struct pipe_context *pipe, GLboolean color, GLboolean depth,
@@ -157,16 +158,32 @@ softpipe_clear(struct pipe_context *pipe, GLboolean color, GLboolean depth,
       if (stencil) {
          struct pipe_surface *ps = softpipe->framebuffer.sbuf;
          GLuint clearVal = softpipe->stencil.clear_value;
-         GLuint mask = 0xff;
-         if (softpipe->stencil.write_mask[0] /*== 0xff*/) {
-            /* no masking */
-            pipe->region_fill(pipe, ps->region, 0, x, y, w, h, clearVal, mask);
-         }
-         else if (softpipe->stencil.write_mask[0] != 0x0) {
-            /* masking */
-            /* fill with quad funcs */
+         GLuint mask = softpipe->stencil.write_mask[0];
+
+         switch (ps->format) {
+         case PIPE_FORMAT_S8_Z24:
+            clearVal = clearVal << 24;
+            mask = mask << 24;
+            break;
+         case PIPE_FORMAT_U_S8:
+            /* nothing */
+            break;
+         default:
             assert(0);
          }
+
+         pipe->region_fill(pipe, ps->region, 0, x, y, w, h, clearVal, mask);
       }
    }
+
+   if (accum) {
+      /* XXX there might be no notion of accum buffers in 'pipe'.
+       * Just implement them with a deep RGBA surface format...
+       */
+      struct pipe_surface *ps = softpipe->framebuffer.abuf;
+      GLuint clearVal = 0x0; /* XXX FIX */
+      GLuint mask = !0;
+      assert(ps);
+      pipe->region_fill(pipe, ps->region, 0, x, y, w, h, clearVal, mask);
+   }
 }