The current behavior masked two bugs where the flag was not set to true after modifying the stencil texture. One case was a regression introduced with commit bdbb527a65fc729e7a9319ae67de60d03d06c3fd and another was a bug in the depthstencil mapping code. These have since been fixed.
To prevent such bugs from being masked in the future, create the texturing miptree immediately. Note that the r8stencil_mt is now created with ISL_SURF_USAGE_RENDER_TARGET_BIT. This is appropriate because it is used as blit destination during the update process. Also note that we now properly handle the case in which make_surface fails. --- src/mesa/drivers/dri/i965/intel_mipmap_tree.c | 47 ++++++++++--------- 1 file changed, 25 insertions(+), 22 deletions(-) diff --git a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c index b078c759243..6311b2257db 100644 --- a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c +++ b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c @@ -354,6 +354,17 @@ needs_separate_stencil(const struct brw_context *brw, intel_miptree_supports_hiz(brw, mt); } +static bool +needs_r8stencil(const struct brw_context *brw, + mesa_format format) +{ + const struct gen_device_info *devinfo = &brw->screen->devinfo; + const GLenum base_fmt = _mesa_get_format_base_format(format); + + return (base_fmt == GL_STENCIL_INDEX || + base_fmt == GL_DEPTH_STENCIL) && devinfo->gen == 7; +} + /** * Choose the aux usage for this miptree. This function must be called fairly * late in the miptree create process after we have a tiling. @@ -672,8 +683,6 @@ make_separate_stencil_surface(struct brw_context *brw, if (!mt->stencil_mt) return false; - mt->stencil_mt->r8stencil_needs_update = true; - return true; } @@ -742,6 +751,18 @@ miptree_create(struct brw_context *brw, } } + if (needs_r8stencil(brw, format)) { + mt->r8stencil_mt = + make_surface(brw, target, MESA_FORMAT_R_UINT8, first_level, last_level, + width0, height0, depth0, num_samples, + ISL_TILING_Y0_BIT, mt_surf_usage(MESA_FORMAT_R_UINT8), + BO_ALLOC_BUSY, 0, NULL); + if (mt->r8stencil_mt == NULL) { + intel_miptree_release(&mt); + return NULL; + } + } + if (_mesa_is_format_color_format(format) && mt_fmt != format) mt->etc_format = format; @@ -2934,32 +2955,14 @@ intel_update_r8stencil(struct brw_context *brw, { const struct gen_device_info *devinfo = &brw->screen->devinfo; - assert(devinfo->gen >= 7); + assert(devinfo->gen > 6); /* Handle MIPTREE_LAYOUT_GEN6_HIZ_STENCIL */ struct intel_mipmap_tree *src = mt->format == MESA_FORMAT_S_UINT8 ? mt : mt->stencil_mt; if (!src || devinfo->gen >= 8 || !src->r8stencil_needs_update) return; assert(src->surf.size > 0); - - if (!mt->r8stencil_mt) { - assert(devinfo->gen > 6); /* Handle MIPTREE_LAYOUT_GEN6_HIZ_STENCIL */ - mt->r8stencil_mt = make_surface( - brw, - src->target, - MESA_FORMAT_R_UINT8, - src->first_level, src->last_level, - src->surf.logical_level0_px.width, - src->surf.logical_level0_px.height, - src->surf.dim == ISL_SURF_DIM_3D ? - src->surf.logical_level0_px.depth : - src->surf.logical_level0_px.array_len, - src->surf.samples, - ISL_TILING_Y0_BIT, - ISL_SURF_USAGE_TEXTURE_BIT, - BO_ALLOC_BUSY, 0, NULL); - assert(mt->r8stencil_mt); - } + assert(mt->r8stencil_mt); struct intel_mipmap_tree *dst = mt->r8stencil_mt; -- 2.17.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev