|
|
|
@@ -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) |
|
|
|
{ |