[Mesa-dev] [PATCH 3/3] i965: Apply miptree workaround for very small depth buffers.
Kenneth Graunke
kenneth at whitecape.org
Mon Jul 25 17:07:09 PDT 2011
According to the documentation for 3DSTATE_DEPTH_BUFFER (G45 and
beyond), the 3 LSBs of "Depth Coordinate Offset X" (and Y) must be 0.
Detect this and apply the Gen4 miptree hack for working around
unsupported offsets.
Fixes piglit test fbo-clear-formats for GL_ARB_depth_texture and
GL_EXT_packed_depth_stencil on Ivybridge.
Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
---
src/mesa/drivers/dri/intel/intel_fbo.c | 11 +++++++++--
1 files changed, 9 insertions(+), 2 deletions(-)
diff --git a/src/mesa/drivers/dri/intel/intel_fbo.c b/src/mesa/drivers/dri/intel/intel_fbo.c
index f00943e..7ea81e0 100644
--- a/src/mesa/drivers/dri/intel/intel_fbo.c
+++ b/src/mesa/drivers/dri/intel/intel_fbo.c
@@ -649,7 +649,8 @@ intel_renderbuffer_tile_offsets(struct intel_renderbuffer *irb,
#ifndef I915
static bool
need_tile_offset_workaround(struct brw_context *brw,
- struct intel_renderbuffer *irb)
+ struct intel_renderbuffer *irb,
+ bool is_depthbuffer)
{
uint32_t tile_x, tile_y;
@@ -658,6 +659,12 @@ need_tile_offset_workaround(struct brw_context *brw,
if (!brw->has_surface_tile_offset)
return tile_x != 0 || tile_y != 0;
+ /* In 3DSTATE_DEPTH_BUFFER, the 3 LSBs of Depth Coordinate Offset X/Y
+ * must be zero. We need the workaround in those cases.
+ */
+ if (is_depthbuffer)
+ return (tile_x & 0x3) != 0 || (tile_y & 0x3) != 0;
+
return false;
}
#endif
@@ -724,7 +731,7 @@ intel_render_texture(struct gl_context * ctx,
irb = intel_get_renderbuffer(fb, BUFFER_DEPTH);
#ifndef I915
- if (need_tile_offset_workaround(brw_context(ctx), irb)) {
+ if (need_tile_offset_workaround(brw_context(ctx), irb, is_depthbuffer)) {
/* Original gen4 hardware couldn't draw to a non-tile-aligned
* destination in a miptree unless you actually setup your
* renderbuffer as a miptree and used the fragile
--
1.7.4.4
More information about the mesa-dev
mailing list