浏览代码

anv: Avoid some resolves for samplable HiZ buffers

v2: Simplify nested ifs (Jason Ekstrand)

Signed-off-by: Nanley Chery <nanley.g.chery@intel.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
tags/17.0-branchpoint
Nanley Chery 8 年前
父节点
当前提交
64272d4f1b
共有 1 个文件被更改,包括 49 次插入18 次删除
  1. 49
    18
      src/intel/vulkan/genX_cmd_buffer.c

+ 49
- 18
src/intel/vulkan/genX_cmd_buffer.c 查看文件

@@ -311,11 +311,21 @@ need_input_attachment_state(const struct anv_render_pass_attachment *att)
}

static enum isl_aux_usage
layout_to_hiz_usage(VkImageLayout layout)
layout_to_hiz_usage(VkImageLayout layout, uint8_t samples)
{
switch (layout) {
case VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL:
return ISL_AUX_USAGE_HIZ;
case VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL:
case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL:
if (anv_can_sample_with_hiz(GEN_GEN, samples))
return ISL_AUX_USAGE_HIZ;
/* Fall-through */
case VK_IMAGE_LAYOUT_GENERAL:
/* This buffer could be used as a source or destination in a transfer
* operation. Transfer operations current don't perform HiZ-enabled reads
* and writes.
*/
default:
return ISL_AUX_USAGE_NONE;
}
@@ -333,28 +343,48 @@ transition_depth_buffer(struct anv_cmd_buffer *cmd_buffer,
{
assert(image);

if (image->aux_usage != ISL_AUX_USAGE_HIZ)
if (image->aux_usage != ISL_AUX_USAGE_HIZ || final_layout == initial_layout)
return;

const bool hiz_enabled = layout_to_hiz_usage(initial_layout) ==
const bool hiz_enabled = layout_to_hiz_usage(initial_layout, image->samples) ==
ISL_AUX_USAGE_HIZ;
const bool enable_hiz = layout_to_hiz_usage(final_layout) ==
const bool enable_hiz = layout_to_hiz_usage(final_layout, image->samples) ==
ISL_AUX_USAGE_HIZ;

/* We've already initialized the aux HiZ buffer at BindImageMemory time,
* so there's no need to perform a HIZ resolve or clear to avoid GPU hangs.
* This initial layout indicates that the user doesn't care about the data
* that's currently in the buffer, so no resolves are necessary.
*/
if (initial_layout == VK_IMAGE_LAYOUT_UNDEFINED)
return;

if (hiz_enabled == enable_hiz) {
/* The same buffer will be used, no resolves are necessary */
enum blorp_hiz_op hiz_op;
if (initial_layout == VK_IMAGE_LAYOUT_UNDEFINED) {
/* We've already initialized the aux HiZ buffer at BindImageMemory time,
* so there's no need to perform a HIZ resolve or clear to avoid GPU hangs.
* This initial layout indicates that the user doesn't care about the data
* that's currently in the buffer, so resolves are not necessary except
* for the special case noted below.
*/
hiz_op = BLORP_HIZ_OP_NONE;
} else if (hiz_enabled && !enable_hiz) {
anv_gen8_hiz_op_resolve(cmd_buffer, image, BLORP_HIZ_OP_DEPTH_RESOLVE);
hiz_op = BLORP_HIZ_OP_DEPTH_RESOLVE;
} else if (!hiz_enabled && enable_hiz) {
hiz_op = BLORP_HIZ_OP_HIZ_RESOLVE;
} else {
assert(!hiz_enabled && enable_hiz);
assert(hiz_enabled == enable_hiz);
/* If the same buffer will be used, no resolves are necessary except for
* the special case noted below.
*/
hiz_op = BLORP_HIZ_OP_NONE;
}

if (hiz_op != BLORP_HIZ_OP_NONE)
anv_gen8_hiz_op_resolve(cmd_buffer, image, hiz_op);

/* Images that have sampling with HiZ enabled cause all shader sampling to
* load data with the HiZ buffer. Therefore, in the case of transitioning to
* the general layout - which currently routes all writes to the depth
* buffer - we must ensure that the HiZ buffer remains consistent with the
* depth buffer by performing an additional HIZ resolve if the operation
* required by this transition was not already a HiZ resolve.
*/
if (final_layout == VK_IMAGE_LAYOUT_GENERAL &&
anv_can_sample_with_hiz(GEN_GEN, image->samples) &&
hiz_op != BLORP_HIZ_OP_HIZ_RESOLVE) {
anv_gen8_hiz_op_resolve(cmd_buffer, image, BLORP_HIZ_OP_HIZ_RESOLVE);
}
}
@@ -512,7 +542,7 @@ genX(cmd_buffer_setup_attachments)(struct anv_cmd_buffer *cmd_buffer,
} else {
if (iview->image->aux_usage == ISL_AUX_USAGE_HIZ) {
state->attachments[i].aux_usage =
layout_to_hiz_usage(att->initial_layout);
layout_to_hiz_usage(att->initial_layout, iview->image->samples);
} else {
state->attachments[i].aux_usage = ISL_AUX_USAGE_NONE;
}
@@ -2312,7 +2342,8 @@ genX(cmd_buffer_set_subpass)(struct anv_cmd_buffer *cmd_buffer,
cmd_buffer->state.attachments[ds].current_layout =
cmd_buffer->state.subpass->depth_stencil_layout;
cmd_buffer->state.attachments[ds].aux_usage =
layout_to_hiz_usage(cmd_buffer->state.subpass->depth_stencil_layout);
layout_to_hiz_usage(cmd_buffer->state.subpass->depth_stencil_layout,
iview->image->samples);
}

cmd_buffer_emit_depth_stencil(cmd_buffer);

正在加载...
取消
保存