diff options
author | Nanley Chery <[email protected]> | 2017-02-01 11:27:58 -0800 |
---|---|---|
committer | Nanley Chery <[email protected]> | 2017-03-02 13:17:54 -0800 |
commit | 425e33bcdb273911ca28efebbe15e66dffaac0d3 (patch) | |
tree | 1e9837b35a35feb45978ad2bcf68677154d051e6 | |
parent | 178f9e5f29f3fe83eb5af99a69d7c583c30d21d1 (diff) |
anv/image: Add anv_layout_to_aux_usage()
This function supersedes layout_to_hiz_usage().
v2:
- Don't find the optimal buffer for layout transitions (Jason Ekstrand).
- Pass the devinfo instead of the gen (Jason Ekstrand)
- Update the function documentation.
Signed-off-by: Nanley Chery <[email protected]>
Reviewed-by: Jason Ekstrand <[email protected]>
-rw-r--r-- | src/intel/vulkan/anv_image.c | 134 | ||||
-rw-r--r-- | src/intel/vulkan/anv_private.h | 5 |
2 files changed, 139 insertions, 0 deletions
diff --git a/src/intel/vulkan/anv_image.c b/src/intel/vulkan/anv_image.c index cd142938e7f..a1720fcd7f6 100644 --- a/src/intel/vulkan/anv_image.c +++ b/src/intel/vulkan/anv_image.c @@ -432,6 +432,140 @@ 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. + * + * @param devinfo The device information of the Intel GPU. + * @param image The image that may contain a collection of buffers. + * @param aspects The aspect(s) of the image to be accessed. + * @param layout The current layout of the image aspect(s). + * + * @return The primary buffer that should be used for the given layout. + */ +enum isl_aux_usage +anv_layout_to_aux_usage(const struct gen_device_info * const devinfo, + const struct anv_image * const image, + const VkImageAspectFlags aspects, + const VkImageLayout layout) +{ + /* Validate the inputs. */ + + /* The devinfo is needed as the optimal buffer varies across generations. */ + assert(devinfo != NULL); + + /* The layout of a NULL image is not properly defined. */ + assert(image != NULL); + + /* The aspects must be a subset of the image aspects. */ + assert(aspects & image->aspects && aspects <= image->aspects); + + /* Determine the optimal buffer. */ + + /* If there is no auxiliary surface allocated, we must use the one and only + * main buffer. + */ + if (image->aux_surface.isl.size == 0) + return ISL_AUX_USAGE_NONE; + + /* All images that use an auxiliary surface are required to be tiled. */ + assert(image->tiling == VK_IMAGE_TILING_OPTIMAL); + + /* On BDW+, when clearing the stencil aspect of a depth stencil image, + * the HiZ buffer allows us to record the clear with a relatively small + * number of packets. Prior to BDW, the HiZ buffer provides no known benefit + * to the stencil aspect. + */ + if (devinfo->gen < 8 && aspects == VK_IMAGE_ASPECT_STENCIL_BIT) + return ISL_AUX_USAGE_NONE; + + const bool has_depth = aspects & VK_IMAGE_ASPECT_DEPTH_BIT; + const bool color_aspect = aspects == VK_IMAGE_ASPECT_COLOR_BIT; + + /* The following switch currently only handles depth stencil aspects. + * TODO: Handle the color aspect. + */ + if (color_aspect) + return image->aux_usage; + + switch (layout) { + + /* Invalid Layouts */ + + /* According to the Vulkan Spec, the following layouts are valid only as + * initial layouts in a layout transition and don't support device access. + */ + 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."); + + + /* Transfer Layouts + * + * This buffer could be a depth buffer used in a transfer operation. BLORP + * currently doesn't use HiZ for transfer operations so we must use the main + * buffer for this layout. TODO: Enable HiZ in BLORP. + */ + case VK_IMAGE_LAYOUT_GENERAL: + case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL: + case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL: + return ISL_AUX_USAGE_NONE; + + + /* Sampling Layouts */ + case VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL: + assert(!color_aspect); + /* Fall-through */ + case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL: + if (has_depth && anv_can_sample_with_hiz(devinfo->gen, image->samples)) + return ISL_AUX_USAGE_HIZ; + else + return ISL_AUX_USAGE_NONE; + + case VK_IMAGE_LAYOUT_PRESENT_SRC_KHR: + assert(color_aspect); + + /* On SKL+, the render buffer can be decompressed by the presentation + * engine. Support for this feature has not yet landed in the wider + * ecosystem. TODO: Update this code when support lands. + * + * From the BDW PRM, Vol 7, Render Target Resolve: + * + * If the MCS is enabled on a non-multisampled render target, the + * render target must be resolved before being used for other + * purposes (display, texture, CPU lock) The clear value from + * SURFACE_STATE is written into pixels in the render target + * indicated as clear in the MCS. + * + * Pre-SKL, the render buffer must be resolved before being used for + * presentation. We can infer that the auxiliary buffer is not used. + */ + return ISL_AUX_USAGE_NONE; + + + /* Rendering Layouts */ + case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL: + assert(color_aspect); + unreachable("Color images are not yet supported."); + + case VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL: + assert(!color_aspect); + return ISL_AUX_USAGE_HIZ; + } + + /* If the layout isn't recognized in the exhaustive switch above, the + * VkImageLayout value is not defined in vulkan.h. + */ + unreachable("layout is not a VkImageLayout enumeration member."); +} + + static struct anv_state alloc_surface_state(struct anv_device *device) { diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index b3bc1b33a3f..3a9393bac83 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -1777,6 +1777,11 @@ anv_gen8_hiz_op_resolve(struct anv_cmd_buffer *cmd_buffer, const struct anv_image *image, enum blorp_hiz_op op); +enum isl_aux_usage +anv_layout_to_aux_usage(const struct gen_device_info * const devinfo, + const struct anv_image *image, + const VkImageAspectFlags aspects, + const VkImageLayout layout); static inline uint32_t anv_get_layerCount(const struct anv_image *image, const VkImageSubresourceRange *range) |