intel: Use tri clears when we don't know how to blit clear the format.
authorEric Anholt <eric@anholt.net>
Mon, 3 Jan 2011 03:29:20 +0000 (19:29 -0800)
committerEric Anholt <eric@anholt.net>
Mon, 3 Jan 2011 21:28:26 +0000 (13:28 -0800)
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
src/mesa/drivers/dri/intel/intel_blit.h
src/mesa/drivers/dri/intel/intel_clear.c

index 35d5fe3da9b1c308c8da45f36701dfd362da3a87..6232e479cb6ef4ba86c38bd7d421ce4f2295714c 100644 (file)
@@ -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
index ff69e4f8f8f4ed99b6f086f7c6759d3a6ed0fbc2..88322c7b493253150020a51600cf4ad24c72f8f7 100644 (file)
@@ -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,
index 6eef5313b2947ccb4de8d47e7e444eda6183fac4..84729111d58281554277d112d786b2d64778a864 100644 (file)
@@ -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) {