Re-enable regular fast-clears (CCS_D) on gen9+

This reverts commit ee57b15ec7, "i965:
Disable regular fast-clears (CCS_D) on gen9+".  How taht we've fixed the
issue with too many different aux usages in the render cache, it should
be safe to re-enable CCS_D for sRGB.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=104163
Tested-by: Eero Tamminen <eero.t.tamminen@intel.com>
Reviewed-by: Iago Toral Quiroga <itoral@igalia.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Cc: "17.3" <mesa-stable@lists.freedesktop.org>
This commit is contained in:
Jason Ekstrand 2017-12-05 14:41:48 -08:00
parent d84275b884
commit f79bb2e651
2 changed files with 25 additions and 42 deletions

View File

@ -293,17 +293,7 @@ brw_is_color_fast_clear_compatible(struct brw_context *brw,
brw->mesa_to_isl_render_format[mt->format])
return false;
/* Gen9 doesn't support fast clear on single-sampled SRGB buffers. When
* GL_FRAMEBUFFER_SRGB is enabled any color renderbuffers will be
* resolved in intel_update_state. In that case it's pointless to do a
* fast clear because it's very likely to be immediately resolved.
*/
const bool srgb_rb = _mesa_get_srgb_format_linear(mt->format) != mt->format;
if (devinfo->gen >= 9 &&
mt->surf.samples == 1 &&
ctx->Color.sRGBEnabled && srgb_rb)
return false;
/* Gen10 doesn't automatically decode the clear color of sRGB buffers. Since
* we currently don't perform this decode in software, avoid a fast-clear
* altogether. TODO: Do this in software.

View File

@ -211,13 +211,7 @@ intel_miptree_supports_ccs(struct brw_context *brw,
if (!brw->mesa_format_supports_render[mt->format])
return false;
if (devinfo->gen >= 9) {
mesa_format linear_format = _mesa_get_srgb_format_linear(mt->format);
const enum isl_format isl_format =
brw_isl_format_for_mesa_format(linear_format);
return isl_format_supports_ccs_e(&brw->screen->devinfo, isl_format);
} else
return true;
return true;
}
static bool
@ -260,7 +254,7 @@ intel_miptree_supports_hiz(const struct brw_context *brw,
* our HW tends to support more linear formats than sRGB ones, we use this
* format variant for check for CCS_E compatibility.
*/
MAYBE_UNUSED static bool
static bool
format_ccs_e_compat_with_miptree(const struct gen_device_info *devinfo,
const struct intel_mipmap_tree *mt,
enum isl_format access_format)
@ -294,12 +288,13 @@ intel_miptree_supports_ccs_e(struct brw_context *brw,
if (!intel_miptree_supports_ccs(brw, mt))
return false;
/* Fast clear can be also used to clear srgb surfaces by using equivalent
* linear format. This trick, however, can't be extended to be used with
* lossless compression and therefore a check is needed to see if the format
* really is linear.
/* Many window system buffers are sRGB even if they are never rendered as
* sRGB. For those, we want CCS_E for when sRGBEncode is false. When the
* surface is used as sRGB, we fall back to CCS_D.
*/
return _mesa_get_srgb_format_linear(mt->format) == mt->format;
mesa_format linear_format = _mesa_get_srgb_format_linear(mt->format);
enum isl_format isl_format = brw_isl_format_for_mesa_format(linear_format);
return isl_format_supports_ccs_e(&brw->screen->devinfo, isl_format);
}
/**
@ -2690,29 +2685,27 @@ intel_miptree_render_aux_usage(struct brw_context *brw,
return ISL_AUX_USAGE_MCS;
case ISL_AUX_USAGE_CCS_D:
/* If FRAMEBUFFER_SRGB is used on Gen9+ then we need to resolve any of
* the single-sampled color renderbuffers because the CCS buffer isn't
* supported for SRGB formats. This only matters if FRAMEBUFFER_SRGB is
* enabled because otherwise the surface state will be programmed with
* the linear equivalent format anyway.
*/
if (isl_format_is_srgb(render_format) &&
_mesa_get_srgb_format_linear(mt->format) != mt->format) {
return ISL_AUX_USAGE_NONE;
} else if (!mt->mcs_buf) {
return ISL_AUX_USAGE_NONE;
} else {
return ISL_AUX_USAGE_CCS_D;
}
return mt->mcs_buf ? ISL_AUX_USAGE_CCS_D : ISL_AUX_USAGE_NONE;
case ISL_AUX_USAGE_CCS_E: {
/* Lossless compression is not supported for SRGB formats, it
* should be impossible to get here with such surfaces.
/* If the format supports CCS_E and is compatible with the miptree,
* then we can use it.
*/
assert(!isl_format_is_srgb(render_format) ||
_mesa_get_srgb_format_linear(mt->format) == mt->format);
if (format_ccs_e_compat_with_miptree(&brw->screen->devinfo,
mt, render_format))
return ISL_AUX_USAGE_CCS_E;
return ISL_AUX_USAGE_CCS_E;
/* Otherwise, we have to fall back to CCS_D */
/* gen9 hardware technically supports non-0/1 clear colors with sRGB
* formats. However, there are issues with blending where it doesn't
* properly apply the sRGB curve to the clear color when blending.
*/
if (blend_enabled && isl_format_is_srgb(render_format) &&
!isl_color_value_is_zero_one(mt->fast_clear_color, render_format))
return ISL_AUX_USAGE_NONE;
return ISL_AUX_USAGE_CCS_D;
}
default: