From cc45c4bb8072b6593812f9b68a7b3d2d00bfb9f0 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Thu, 18 May 2017 11:30:47 -0700 Subject: [PATCH] anv: Handle transitioning depth from UNDEFINED to other layouts Reviewed-by: Nanley Chery Cc: "17.1" --- src/intel/vulkan/anv_image.c | 24 +++++++++++++----------- src/intel/vulkan/genX_cmd_buffer.c | 14 ++++++-------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/intel/vulkan/anv_image.c b/src/intel/vulkan/anv_image.c index d21e055f020..c3e2cb51d8e 100644 --- a/src/intel/vulkan/anv_image.c +++ b/src/intel/vulkan/anv_image.c @@ -423,12 +423,10 @@ void anv_GetImageSubresourceLayout( } /** - * This function determines the optimal buffer to use for device - * accesses given a VkImageLayout and other pieces of information needed to - * make that determination. This does not determine the optimal buffer to - * use during a resolve operation. - * - * NOTE: Some layouts do not support device access. + * This function determines the optimal buffer to use for a given + * VkImageLayout and other pieces of information needed to make that + * determination. This does not determine the optimal buffer to use + * during a resolve operation. * * @param devinfo The device information of the Intel GPU. * @param image The image that may contain a collection of buffers. @@ -484,15 +482,19 @@ anv_layout_to_aux_usage(const struct gen_device_info * const devinfo, switch (layout) { /* Invalid Layouts */ + case VK_IMAGE_LAYOUT_RANGE_SIZE: + case VK_IMAGE_LAYOUT_MAX_ENUM: + unreachable("Invalid image layout."); - /* According to the Vulkan Spec, the following layouts are valid only as - * initial layouts in a layout transition and don't support device access. + /* Undefined layouts + * + * The pre-initialized layout is equivalent to the undefined layout for + * optimally-tiled images. We can only do color compression (CCS or HiZ) + * on tiled images. */ case VK_IMAGE_LAYOUT_UNDEFINED: case VK_IMAGE_LAYOUT_PREINITIALIZED: - case VK_IMAGE_LAYOUT_RANGE_SIZE: - case VK_IMAGE_LAYOUT_MAX_ENUM: - unreachable("Invalid image layout for device access."); + return ISL_AUX_USAGE_NONE; /* Transfer Layouts diff --git a/src/intel/vulkan/genX_cmd_buffer.c b/src/intel/vulkan/genX_cmd_buffer.c index 79af9aad82c..0bb6d8e782c 100644 --- a/src/intel/vulkan/genX_cmd_buffer.c +++ b/src/intel/vulkan/genX_cmd_buffer.c @@ -355,15 +355,8 @@ transition_depth_buffer(struct anv_cmd_buffer *cmd_buffer, * The undefined layout indicates that the user doesn't care about the data * that's currently in the buffer. Therefore, a data-preserving resolve * operation is not needed. - * - * The pre-initialized layout is equivalent to the undefined layout for - * optimally-tiled images. Anv only exposes support for optimally-tiled - * depth buffers. */ - if (image->aux_usage != ISL_AUX_USAGE_HIZ || - initial_layout == final_layout || - initial_layout == VK_IMAGE_LAYOUT_UNDEFINED || - initial_layout == VK_IMAGE_LAYOUT_PREINITIALIZED) + if (image->aux_usage != ISL_AUX_USAGE_HIZ || initial_layout == final_layout) return; const bool hiz_enabled = ISL_AUX_USAGE_HIZ == @@ -404,6 +397,11 @@ transition_color_buffer(struct anv_cmd_buffer *cmd_buffer, return; #if GEN_GEN >= 9 + /* We're transitioning from an undefined layout so it doesn't really matter + * what data ends up in the color buffer. We do, however, need to ensure + * that the CCS has valid data in it. One easy way to do that is to + * fast-clear the specified range. + */ anv_image_ccs_clear(cmd_buffer, image, view, subresourceRange); #endif } -- 2.30.2