Module: Mesa
Branch: master
Commit: 30fef21aa34667d332669f1445de74b49994eb0e
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=30fef21aa34667d332669f1445de74b49994eb0e

Author: Eric Anholt <e...@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)

---

 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 35d5fe3..6232e47 100644
--- a/src/mesa/drivers/dri/intel/intel_blit.c
+++ b/src/mesa/drivers/dri/intel/intel_blit.c
@@ -206,7 +206,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);
@@ -214,6 +214,7 @@ intelClearWithBlit(struct gl_context *ctx, GLbitfield mask)
    GLuint clear_depth;
    GLboolean all;
    GLint cx, cy, cw, ch;
+   GLbitfield fail_mask = 0;
    BATCH_LOCALS;
 
    /*
@@ -236,7 +237,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);
@@ -332,9 +333,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;
         }
       }
 
@@ -369,6 +370,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) {

_______________________________________________
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to