Module: Mesa Branch: main Commit: 9c5a28d919139ca9088f2bdaf5dca30510912726 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=9c5a28d919139ca9088f2bdaf5dca30510912726
Author: Jianxun Zhang <jianxun.zh...@intel.com> Date: Tue Oct 31 10:37:41 2023 -0700 intel/vulkan: Use the last 2 dwords of clear color struct Refer to the comments added in the code, we now take the last 2 dwords in the clear color struct to store the fast clear type and the first compression state. Suggested by Nanley Chery <nanley.g.ch...@intel.com> Signed-off-by: Jianxun Zhang <jianxun.zh...@intel.com> Reviewed-by: Nanley Chery <nanley.g.ch...@intel.com> Acked-by: Rohan Garg <rohan.g...@intel.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25651> --- src/intel/vulkan/anv_image.c | 31 ++++++++++++++++++++++++++++--- src/intel/vulkan/anv_private.h | 13 ++++++++++--- 2 files changed, 38 insertions(+), 6 deletions(-) diff --git a/src/intel/vulkan/anv_image.c b/src/intel/vulkan/anv_image.c index 09c8b813a55..5853895ee9f 100644 --- a/src/intel/vulkan/anv_image.c +++ b/src/intel/vulkan/anv_image.c @@ -614,9 +614,34 @@ add_aux_state_tracking_buffer(struct anv_device *device, image->vk.aspects & (VK_IMAGE_ASPECT_ANY_COLOR_BIT_ANV | VK_IMAGE_ASPECT_DEPTH_BIT)); - const unsigned clear_color_state_size = device->info->ver >= 10 ? - device->isl_dev.ss.clear_color_state_size : - device->isl_dev.ss.clear_value_size; + unsigned clear_color_state_size; + if (device->info->ver >= 11) { + /* When importing an image from another source with a drm modifier that + * supports clear color, the clear color values are in a 32-byte struct + * defined in drm_fourcc.h. The fast clear type and compression state + * are not defined in these drm_fourcc.h, so there won't be memory + * allocated for these extra meta data by the source. + * + * We use the last 2 dwords of the clear color struct's memory to store + * the fast clear type and the first compression state, so the driver + * doesn't assume the extra size or need another allocation later. + * + * So far, the 2 stolen dwords are either not used in the clear color + * struct or for features not enabled. There should be no side effect to + * the hardware and destinations of images exported by this driver. + * + * Images with multiple levels or layers are not supported by drm + * modifiers, so we don't have to apply the above approach or face a + * bigger shortage from multiple compression states. We just apply the + * approach to all cases to keep the design unified. + * + * As a result, the state starts 8 bytes lower than where it should be. + */ + assert(device->isl_dev.ss.clear_color_state_size >= 32); + clear_color_state_size = device->isl_dev.ss.clear_color_state_size - 8; + } else { + clear_color_state_size = device->isl_dev.ss.clear_value_size; + } /* Clear color and fast clear type */ unsigned state_size = clear_color_state_size + 4; diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index d675616bc1d..feedb9f4851 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -5083,9 +5083,16 @@ anv_image_get_fast_clear_type_addr(const struct anv_device *device, struct anv_address addr = anv_image_get_clear_color_addr(device, image, aspect); - const unsigned clear_color_state_size = device->info->ver >= 10 ? - device->isl_dev.ss.clear_color_state_size : - device->isl_dev.ss.clear_value_size; + unsigned clear_color_state_size; + if (device->info->ver >= 11) { + /* The fast clear type and the first compression state are stored in the + * last 2 dwords of the clear color struct. Refer to the comment in + * add_aux_state_tracking_buffer(). + */ + assert(device->isl_dev.ss.clear_color_state_size >= 32); + clear_color_state_size = device->isl_dev.ss.clear_color_state_size - 8; + } else + clear_color_state_size = device->isl_dev.ss.clear_value_size; return anv_address_add(addr, clear_color_state_size); }