Mesa (7.10): intel: Use tri clears when we don' t know how to blit clear the format.

Eric Anholt anholt at kemper.freedesktop.org
Tue Jan 4 21:13:41 UTC 2011


Module: Mesa
Branch: 7.10
Commit: fa61cb36095bff78b59711df19572189fed6cec2
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=fa61cb36095bff78b59711df19572189fed6cec2

Author: Eric Anholt <eric at anholt.net>
Date:   Sun Jan  2 19:29:20 2011 -0800

intel: Use tri clears when we don't know how to blit clear the format.

Bug #32207.  Fixes ARB_texture_rg/fbo-clear-formats (see my
fbo-clear-formats piglit branch currently)
(cherry picked from commit 30fef21aa34667d332669f1445de74b49994eb0e)

---

 src/mesa/drivers/dri/intel/intel_blit.c  |   13 ++++++++-----
 src/mesa/drivers/dri/intel/intel_blit.h  |    2 +-
 src/mesa/drivers/dri/intel/intel_clear.c |    2 +-
 3 files changed, 10 insertions(+), 7 deletions(-)

diff --git a/src/mesa/drivers/dri/intel/intel_blit.c b/src/mesa/drivers/dri/intel/intel_blit.c
index a2822b1..c405e94 100644
--- a/src/mesa/drivers/dri/intel/intel_blit.c
+++ b/src/mesa/drivers/dri/intel/intel_blit.c
@@ -207,7 +207,7 @@ intelEmitCopyBlit(struct intel_context *intel,
  * which we're clearing with triangles.
  * \param mask  bitmask of BUFFER_BIT_* values indicating buffers to clear
  */
-void
+GLbitfield
 intelClearWithBlit(struct gl_context *ctx, GLbitfield mask)
 {
    struct intel_context *intel = intel_context(ctx);
@@ -215,6 +215,7 @@ intelClearWithBlit(struct gl_context *ctx, GLbitfield mask)
    GLuint clear_depth;
    GLboolean all;
    GLint cx, cy, cw, ch;
+   GLbitfield fail_mask = 0;
    BATCH_LOCALS;
 
    /*
@@ -237,7 +238,7 @@ intelClearWithBlit(struct gl_context *ctx, GLbitfield mask)
    ch = fb->_Ymax - fb->_Ymin;
 
    if (cw == 0 || ch == 0)
-      return;
+      return 0;
 
    GLuint buf;
    all = (cw == fb->Width && ch == fb->Height);
@@ -333,9 +334,9 @@ intelClearWithBlit(struct gl_context *ctx, GLbitfield mask)
 					clear[3], clear[3]);
 	    break;
 	 default:
-	    _mesa_problem(ctx, "Unexpected renderbuffer format: %d\n",
-			  irb->Base.Format);
-	    clear_val = 0;
+	    fail_mask |= bufBit;
+	    mask &= ~bufBit;
+	    continue;
 	 }
       }
 
@@ -370,6 +371,8 @@ intelClearWithBlit(struct gl_context *ctx, GLbitfield mask)
       else
 	 mask &= ~bufBit;    /* turn off bit, for faster loop exit */
    }
+
+   return fail_mask;
 }
 
 GLboolean
diff --git a/src/mesa/drivers/dri/intel/intel_blit.h b/src/mesa/drivers/dri/intel/intel_blit.h
index ff69e4f..88322c7 100644
--- a/src/mesa/drivers/dri/intel/intel_blit.h
+++ b/src/mesa/drivers/dri/intel/intel_blit.h
@@ -33,7 +33,7 @@
 extern void intelCopyBuffer(const __DRIdrawable * dpriv,
                             const drm_clip_rect_t * rect);
 
-extern void intelClearWithBlit(struct gl_context * ctx, GLbitfield mask);
+extern GLbitfield intelClearWithBlit(struct gl_context * ctx, GLbitfield mask);
 
 GLboolean
 intelEmitCopyBlit(struct intel_context *intel,
diff --git a/src/mesa/drivers/dri/intel/intel_clear.c b/src/mesa/drivers/dri/intel/intel_clear.c
index 6eef531..8472911 100644
--- a/src/mesa/drivers/dri/intel/intel_clear.c
+++ b/src/mesa/drivers/dri/intel/intel_clear.c
@@ -180,7 +180,7 @@ intelClear(struct gl_context *ctx, GLbitfield mask)
 
    if (blit_mask) {
       debug_mask("blit", blit_mask);
-      intelClearWithBlit(ctx, blit_mask);
+      tri_mask |= intelClearWithBlit(ctx, blit_mask);
    }
 
    if (tri_mask) {




More information about the mesa-commit mailing list