[Mesa-dev] [PATCH v2] i965: Fix mipmap offsets for HiZ and separate stencil buffers.
chad.versace at linux.intel.com
Thu May 3 11:01:47 PDT 2012
On 05/02/2012 02:48 PM, Paul Berry wrote:
> When rendering to a miplevel other than 0 within a color, depth,
> stencil, or HiZ buffer, we need to tell the GPU to render to an offset
> within the buffer, so that the data is written into the correct
> miplevel. We do this using a coarse offset (in pages), and a fine
> adjustment (the so-called "tile_x" and "tile_y" values, which are
> measured in pixels).
> We have always computed the coarse offset and fine adjustment using
> intel_renderbuffer_tile_offsets() function. This worked fine for
> color and combined depth/stencil buffers, but failed to work properly
> when HiZ and separate stencil were in use. It failed to work because
> there is only one set of fine adjustment controls shared by the HiZ,
> depth, and stencil buffers, so we need to choose tile_x and tile_y
> values that are compatible with the tiling of all three buffers, and
> then compute separate coarse offsets for each buffer.
> This patch fixes the HiZ and separate stencil case by replacing the
> call to intel_renderbuffer_tile_offsets() with calls to two functions:
> intel_region_get_tile_masks(), which determines how much of the
> adjustment can be performed using offsets and how much can be
> performed using tile_x and tile_y, and
> intel_region_get_aligned_offset(), which computes the coarse offset.
> intel_region_get_tile_offsets() is still used for color renderbuffers,
> so to avoid code duplication, I've re-worked it to use
> intel_region_get_tile_masks() and intel_region_get_aligned_offset().
> On i965 Gen6, fixes piglit tests
> "texturing/depthstencil-render-miplevels 1024 X" where X is one of
> (depth, depth_and_stencil, depth_stencil_single_binding, depth_x,
> depth_x_and_stencil, stencil, stencil_and_depth, stencil_and_depth_x).
> On i965 Gen7, the variants of
> "texturing/depthstencil-render-miplevels" that contain a stencil
> buffer still fail, due to another problem: Gen7 seems to ignore the 3
> LSB's of the tile_y adjustment (and possibly also tile_x).
> v2: Removed spurious comments. Added assertions to check
> preconditions of intel_region_get_aligned_offset().
> src/mesa/drivers/dri/i965/brw_misc_state.c | 96 ++++++++++++++++++++++++--
> src/mesa/drivers/dri/i965/gen6_hiz.c | 54 +++++++++++----
> src/mesa/drivers/dri/i965/gen7_hiz.c | 54 +++++++++++----
> src/mesa/drivers/dri/i965/gen7_misc_state.c | 79 ++++++++++++++++++++--
> src/mesa/drivers/dri/intel/intel_fbo.c | 27 ++-----
> src/mesa/drivers/dri/intel/intel_fbo.h | 5 ++
> src/mesa/drivers/dri/intel/intel_regions.c | 56 ++++++++++++++++
> src/mesa/drivers/dri/intel/intel_regions.h | 8 ++
> 8 files changed, 319 insertions(+), 60 deletions(-)
Thanks for adding the precondition checks.
Reviewed-by: Chad Versace <chad.versace at linux.intel.com>
More information about the mesa-dev