evergreen: set gl_texture_image::TexFormat field in evergreenSetTexBuffer()
[mesa.git] / src / mesa / drivers / dri / intel / intel_clear.c
index f682ee3de5b4f759d7ee86d8e175c61f51507ee4..fa451f0045ecaf4dd8ec8a9b8fad17d565447833 100644 (file)
 
 #include "intel_context.h"
 #include "intel_blit.h"
-#include "intel_chipset.h"
 #include "intel_clear.h"
 #include "intel_fbo.h"
-#include "intel_pixel.h"
 #include "intel_regions.h"
-#include "intel_batchbuffer.h"
 
 #define FILE_DEBUG_FLAG DEBUG_BLIT
 
@@ -61,19 +58,33 @@ static const char *buffer_names[] = {
    [BUFFER_COLOR7] = "color7",
 };
 
+static void
+debug_mask(const char *name, GLbitfield mask)
+{
+   GLuint i;
+
+   if (unlikely(INTEL_DEBUG & DEBUG_BLIT)) {
+      DBG("%s clear:", name);
+      for (i = 0; i < BUFFER_COUNT; i++) {
+        if (mask & (1 << i))
+           DBG(" %s", buffer_names[i]);
+      }
+      DBG("\n");
+   }
+}
+
 /**
  * Called by ctx->Driver.Clear.
  */
 static void
-intelClear(GLcontext *ctx, GLbitfield mask)
+intelClear(struct gl_context *ctx, GLbitfield mask)
 {
    struct intel_context *intel = intel_context(ctx);
-   const GLuint colorMask = *((GLuint *) & ctx->Color.ColorMask);
+   const GLuint colorMask = *((GLuint *) & ctx->Color.ColorMask[0]);
    GLbitfield tri_mask = 0;
    GLbitfield blit_mask = 0;
    GLbitfield swrast_mask = 0;
    struct gl_framebuffer *fb = ctx->DrawBuffer;
-   GLuint i;
 
    if (mask & (BUFFER_BIT_FRONT_LEFT | BUFFER_BIT_FRONT_RIGHT)) {
       intel->front_buffer_dirty = GL_TRUE;
@@ -93,6 +104,10 @@ intelClear(GLcontext *ctx, GLbitfield mask)
       tri_mask |= (mask & (BUFFER_BIT_FRONT_LEFT | BUFFER_BIT_BACK_LEFT));
    }
 
+   /* Make sure we have up to date buffers before we start looking at
+    * the tiling bits to determine how to clear. */
+   intel_prepare_render(intel);
+
    /* HW stencil */
    if (mask & BUFFER_BIT_STENCIL) {
       const struct intel_region *stencilRegion
@@ -136,6 +151,12 @@ intelClear(GLcontext *ctx, GLbitfield mask)
       }
    }
 
+   if (intel->gen >= 6) {
+      /* Blits are in a different ringbuffer so we don't use them. */
+      tri_mask |= blit_mask;
+      blit_mask = 0;
+   }
+
    /* SW fallback clearing */
    swrast_mask = mask & ~tri_mask & ~blit_mask;
 
@@ -155,39 +176,17 @@ intelClear(GLcontext *ctx, GLbitfield mask)
    }
 
    if (blit_mask) {
-      if (INTEL_DEBUG & DEBUG_BLIT) {
-        DBG("blit clear:");
-        for (i = 0; i < BUFFER_COUNT; i++) {
-           if (blit_mask & (1 << i))
-              DBG(" %s", buffer_names[i]);
-        }
-        DBG("\n");
-      }
+      debug_mask("blit", blit_mask);
       intelClearWithBlit(ctx, blit_mask);
    }
 
    if (tri_mask) {
-      if (INTEL_DEBUG & DEBUG_BLIT) {
-        DBG("tri clear:");
-        for (i = 0; i < BUFFER_COUNT; i++) {
-           if (tri_mask & (1 << i))
-              DBG(" %s", buffer_names[i]);
-        }
-        DBG("\n");
-      }
-
+      debug_mask("tri", tri_mask);
       _mesa_meta_Clear(&intel->ctx, tri_mask);
    }
 
    if (swrast_mask) {
-      if (INTEL_DEBUG & DEBUG_BLIT) {
-        DBG("swrast clear:");
-        for (i = 0; i < BUFFER_COUNT; i++) {
-           if (swrast_mask & (1 << i))
-              DBG(" %s", buffer_names[i]);
-        }
-        DBG("\n");
-      }
+      debug_mask("swrast", swrast_mask);
       _swrast_Clear(ctx, swrast_mask);
    }
 }