diff options
author | Nanley Chery <[email protected]> | 2017-10-26 16:05:52 -0700 |
---|---|---|
committer | Nanley Chery <[email protected]> | 2017-10-31 14:26:23 -0700 |
commit | 9e849eb8bb97259136b40dc2b06f42a81cfd3dae (patch) | |
tree | d18732b060de1ac89888b699c60fa7a27782b93d | |
parent | c7baaafe543ee5d4756fdd034a89fdcc47429a7e (diff) |
i965: Check CCS_E compatibility for texture view rendering
Only use CCS_E to render to a texture that is CCS_E-compatible with the
original texture's miptree (linear) format. This prevents render
operations from writing data that can't be decoded with the original
miptree format.
On Gen10, with the new CCS_E-enabled formats handled, this enables the
driver to pass the arb_texture_view-rendering-formats piglit test.
v2. Add a TODO for texturing. (Jason)
Cc: <[email protected]>
Signed-off-by: Nanley Chery <[email protected]>
Reviewed-by: Jason Ekstrand <[email protected]>
-rw-r--r-- | src/mesa/drivers/dri/i965/intel_mipmap_tree.c | 29 |
1 files changed, 27 insertions, 2 deletions
diff --git a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c index a850f4d17bc..82f5a814a1e 100644 --- a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c +++ b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c @@ -241,6 +241,27 @@ intel_miptree_supports_hiz(const struct brw_context *brw, } } +/** + * Return true if the format that will be used to access the miptree is + * CCS_E-compatible with the miptree's linear/non-sRGB format. + * + * Why use the linear format? Well, although the miptree may be specified with + * an sRGB format, the usage of that color space/format can be toggled. Since + * our HW tends to support more linear formats than sRGB ones, we use this + * format variant for check for CCS_E compatibility. + */ +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) +{ + assert(mt->aux_usage == ISL_AUX_USAGE_CCS_E); + + 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_formats_are_ccs_e_compatible(devinfo, isl_format, access_format); +} + static bool intel_miptree_supports_ccs_e(struct brw_context *brw, const struct intel_mipmap_tree *mt) @@ -2545,6 +2566,7 @@ can_texture_with_ccs(struct brw_context *brw, if (mt->aux_usage != ISL_AUX_USAGE_CCS_E) return false; + /* TODO: Replace with format_ccs_e_compat_with_miptree for better perf. */ if (!isl_formats_are_ccs_e_compatible(&brw->screen->devinfo, mt->surf.format, view_format)) { perf_debug("Incompatible sampling format (%s) for rbc (%s)\n", @@ -2662,8 +2684,11 @@ intel_miptree_render_aux_usage(struct brw_context *brw, return mt->mcs_buf ? ISL_AUX_USAGE_CCS_D : ISL_AUX_USAGE_NONE; case ISL_AUX_USAGE_CCS_E: { - /* If the format supports CCS_E, then we can just use it */ - if (isl_format_supports_ccs_e(&brw->screen->devinfo, render_format)) + /* If the format supports CCS_E and is compatible with the miptree, + * then we can use it. + */ + if (format_ccs_e_compat_with_miptree(&brw->screen->devinfo, + mt, render_format)) return ISL_AUX_USAGE_CCS_E; /* Otherwise, we have to fall back to CCS_D */ |