Fast depth clears have the same depth/stencil alignment requirements as other drawing operations. Therefore, we need to call brw_workaround_depthstencil_alignment() from both the clear and drawing paths. Without this fix, we get image corruption if the following conditions hold: (a) the first ever drawing operation to a depth miplevel (or the first drawing operation after having used the texture for sampling) is a clear, (b) the depth miplevel has a size that is eligible for fast depth clears, and (c) the depth miplevel has an offset within the miptree that isn't 8x8 aligned. Fixes piglit "depthstencil-render-miplevels" tests with size 273. NOTE: This is a candidate for stable branches Reviewed-by: Chad Versace <chad.versace@linux.intel.com> Reviewed-by: Kenneth Graunke <kenneth@whitecape.org> Reviewed-by: Eric Anholt <eric@anholt.net>tags/mesa-9.2-rc1
@@ -40,6 +40,8 @@ | |||
#include "intel_mipmap_tree.h" | |||
#include "intel_regions.h" | |||
#include "brw_context.h" | |||
#define FILE_DEBUG_FLAG DEBUG_BLIT | |||
static const char *buffer_names[] = { | |||
@@ -219,7 +221,8 @@ brw_fast_clear_depth(struct gl_context *ctx) | |||
static void | |||
brw_clear(struct gl_context *ctx, GLbitfield mask) | |||
{ | |||
struct intel_context *intel = intel_context(ctx); | |||
struct brw_context *brw = brw_context(ctx); | |||
struct intel_context *intel = &brw->intel; | |||
if (!_mesa_check_conditional_render(ctx)) | |||
return; | |||
@@ -229,6 +232,7 @@ brw_clear(struct gl_context *ctx, GLbitfield mask) | |||
} | |||
intel_prepare_render(intel); | |||
brw_workaround_depthstencil_alignment(brw); | |||
if (mask & BUFFER_BIT_DEPTH) { | |||
if (brw_fast_clear_depth(ctx)) { |