anv/cmd_buffer: Add a stencil transition helper
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
This commit is contained in:
parent
86fc268142
commit
2b736d9e6c
|
@ -474,6 +474,20 @@ transition_depth_buffer(struct anv_cmd_buffer *cmd_buffer,
|
|||
0, 0, 1, hiz_op);
|
||||
}
|
||||
|
||||
/* Transitions a HiZ-enabled depth buffer from one layout to another. Unless
|
||||
* the initial layout is undefined, the HiZ buffer and depth buffer will
|
||||
* represent the same data at the end of this operation.
|
||||
*/
|
||||
static void
|
||||
transition_stencil_buffer(struct anv_cmd_buffer *cmd_buffer,
|
||||
const struct anv_image *image,
|
||||
uint32_t base_level, uint32_t level_count,
|
||||
uint32_t base_layer, uint32_t layer_count,
|
||||
VkImageLayout initial_layout,
|
||||
VkImageLayout final_layout)
|
||||
{
|
||||
}
|
||||
|
||||
#define MI_PREDICATE_SRC0 0x2400
|
||||
#define MI_PREDICATE_SRC1 0x2408
|
||||
#define MI_PREDICATE_RESULT 0x2418
|
||||
|
@ -1854,24 +1868,34 @@ void genX(CmdPipelineBarrier)(
|
|||
const VkImageSubresourceRange *range =
|
||||
&pImageMemoryBarriers[i].subresourceRange;
|
||||
|
||||
uint32_t base_layer, layer_count;
|
||||
if (image->type == VK_IMAGE_TYPE_3D) {
|
||||
base_layer = 0;
|
||||
layer_count = anv_minify(image->extent.depth, range->baseMipLevel);
|
||||
} else {
|
||||
base_layer = range->baseArrayLayer;
|
||||
layer_count = anv_get_layerCount(image, range);
|
||||
}
|
||||
|
||||
if (range->aspectMask & VK_IMAGE_ASPECT_DEPTH_BIT) {
|
||||
transition_depth_buffer(cmd_buffer, image,
|
||||
pImageMemoryBarriers[i].oldLayout,
|
||||
pImageMemoryBarriers[i].newLayout);
|
||||
} else if (range->aspectMask & VK_IMAGE_ASPECT_ANY_COLOR_BIT_ANV) {
|
||||
}
|
||||
|
||||
if (range->aspectMask & VK_IMAGE_ASPECT_STENCIL_BIT) {
|
||||
transition_stencil_buffer(cmd_buffer, image,
|
||||
range->baseMipLevel,
|
||||
anv_get_levelCount(image, range),
|
||||
base_layer, layer_count,
|
||||
pImageMemoryBarriers[i].oldLayout,
|
||||
pImageMemoryBarriers[i].newLayout);
|
||||
}
|
||||
|
||||
if (range->aspectMask & VK_IMAGE_ASPECT_ANY_COLOR_BIT_ANV) {
|
||||
VkImageAspectFlags color_aspects =
|
||||
anv_image_expand_aspects(image, range->aspectMask);
|
||||
uint32_t aspect_bit;
|
||||
|
||||
uint32_t base_layer, layer_count;
|
||||
if (image->type == VK_IMAGE_TYPE_3D) {
|
||||
base_layer = 0;
|
||||
layer_count = anv_minify(image->extent.depth, range->baseMipLevel);
|
||||
} else {
|
||||
base_layer = range->baseArrayLayer;
|
||||
layer_count = anv_get_layerCount(image, range);
|
||||
}
|
||||
|
||||
anv_foreach_image_aspect_bit(aspect_bit, image, color_aspects) {
|
||||
transition_color_buffer(cmd_buffer, image, 1UL << aspect_bit,
|
||||
range->baseMipLevel,
|
||||
|
@ -4017,30 +4041,38 @@ cmd_buffer_begin_subpass(struct anv_cmd_buffer *cmd_buffer,
|
|||
target_layout = subpass->attachments[i].layout;
|
||||
}
|
||||
|
||||
uint32_t base_layer, layer_count;
|
||||
if (image->type == VK_IMAGE_TYPE_3D) {
|
||||
base_layer = 0;
|
||||
layer_count = anv_minify(iview->image->extent.depth,
|
||||
iview->planes[0].isl.base_level);
|
||||
} else {
|
||||
base_layer = iview->planes[0].isl.base_array_layer;
|
||||
layer_count = fb->layers;
|
||||
}
|
||||
|
||||
if (image->aspects & VK_IMAGE_ASPECT_ANY_COLOR_BIT_ANV) {
|
||||
assert(image->aspects == VK_IMAGE_ASPECT_COLOR_BIT);
|
||||
|
||||
uint32_t base_layer, layer_count;
|
||||
if (image->type == VK_IMAGE_TYPE_3D) {
|
||||
base_layer = 0;
|
||||
layer_count = anv_minify(iview->image->extent.depth,
|
||||
iview->planes[0].isl.base_level);
|
||||
} else {
|
||||
base_layer = iview->planes[0].isl.base_array_layer;
|
||||
layer_count = fb->layers;
|
||||
}
|
||||
|
||||
transition_color_buffer(cmd_buffer, image, VK_IMAGE_ASPECT_COLOR_BIT,
|
||||
iview->planes[0].isl.base_level, 1,
|
||||
base_layer, layer_count,
|
||||
att_state->current_layout, target_layout);
|
||||
} else if (image->aspects & VK_IMAGE_ASPECT_DEPTH_BIT) {
|
||||
}
|
||||
|
||||
if (image->aspects & VK_IMAGE_ASPECT_DEPTH_BIT) {
|
||||
transition_depth_buffer(cmd_buffer, image,
|
||||
att_state->current_layout, target_layout);
|
||||
att_state->aux_usage =
|
||||
anv_layout_to_aux_usage(&cmd_buffer->device->info, image,
|
||||
VK_IMAGE_ASPECT_DEPTH_BIT, target_layout);
|
||||
}
|
||||
|
||||
if (image->aspects & VK_IMAGE_ASPECT_STENCIL_BIT) {
|
||||
transition_stencil_buffer(cmd_buffer, image,
|
||||
iview->planes[0].isl.base_level, 1,
|
||||
base_layer, layer_count,
|
||||
att_state->current_layout, target_layout);
|
||||
}
|
||||
att_state->current_layout = target_layout;
|
||||
|
||||
if (att_state->pending_clear_aspects & VK_IMAGE_ASPECT_COLOR_BIT) {
|
||||
|
@ -4537,27 +4569,35 @@ cmd_buffer_end_subpass(struct anv_cmd_buffer *cmd_buffer)
|
|||
VkImageLayout target_layout =
|
||||
cmd_state->pass->attachments[a].final_layout;
|
||||
|
||||
uint32_t base_layer, layer_count;
|
||||
if (image->type == VK_IMAGE_TYPE_3D) {
|
||||
base_layer = 0;
|
||||
layer_count = anv_minify(iview->image->extent.depth,
|
||||
iview->planes[0].isl.base_level);
|
||||
} else {
|
||||
base_layer = iview->planes[0].isl.base_array_layer;
|
||||
layer_count = fb->layers;
|
||||
}
|
||||
|
||||
if (image->aspects & VK_IMAGE_ASPECT_ANY_COLOR_BIT_ANV) {
|
||||
assert(image->aspects == VK_IMAGE_ASPECT_COLOR_BIT);
|
||||
|
||||
uint32_t base_layer, layer_count;
|
||||
if (image->type == VK_IMAGE_TYPE_3D) {
|
||||
base_layer = 0;
|
||||
layer_count = anv_minify(iview->image->extent.depth,
|
||||
iview->planes[0].isl.base_level);
|
||||
} else {
|
||||
base_layer = iview->planes[0].isl.base_array_layer;
|
||||
layer_count = fb->layers;
|
||||
}
|
||||
|
||||
transition_color_buffer(cmd_buffer, image, VK_IMAGE_ASPECT_COLOR_BIT,
|
||||
iview->planes[0].isl.base_level, 1,
|
||||
base_layer, layer_count,
|
||||
att_state->current_layout, target_layout);
|
||||
} else if (image->aspects & VK_IMAGE_ASPECT_DEPTH_BIT) {
|
||||
}
|
||||
|
||||
if (image->aspects & VK_IMAGE_ASPECT_DEPTH_BIT) {
|
||||
transition_depth_buffer(cmd_buffer, image,
|
||||
att_state->current_layout, target_layout);
|
||||
}
|
||||
|
||||
if (image->aspects & VK_IMAGE_ASPECT_STENCIL_BIT) {
|
||||
transition_stencil_buffer(cmd_buffer, image,
|
||||
iview->planes[0].isl.base_level, 1,
|
||||
base_layer, layer_count,
|
||||
att_state->current_layout, target_layout);
|
||||
}
|
||||
}
|
||||
|
||||
/* Accumulate any subpass flushes that need to happen after the subpass.
|
||||
|
|
Loading…
Reference in New Issue