anv: Adjust params of color buffer transitioning functions
Splitting out these fields will make the color buffer transitioning function simpler when it gains more features. v2: Remove unintended blank line (Iago Toral) Signed-off-by: Nanley Chery <nanley.g.chery@intel.com> Reviewed-by: Iago Toral Quiroga <itoral@igalia.com> Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
This commit is contained in:
@@ -1436,11 +1436,16 @@ void anv_CmdResolveImage(
|
|||||||
void
|
void
|
||||||
anv_image_ccs_clear(struct anv_cmd_buffer *cmd_buffer,
|
anv_image_ccs_clear(struct anv_cmd_buffer *cmd_buffer,
|
||||||
const struct anv_image *image,
|
const struct anv_image *image,
|
||||||
const struct isl_view *view,
|
const uint32_t base_level, const uint32_t level_count,
|
||||||
const VkImageSubresourceRange *subresourceRange)
|
const uint32_t base_layer, uint32_t layer_count)
|
||||||
{
|
{
|
||||||
assert(image->type == VK_IMAGE_TYPE_3D || image->extent.depth == 1);
|
assert(image->type == VK_IMAGE_TYPE_3D || image->extent.depth == 1);
|
||||||
|
|
||||||
|
if (image->type == VK_IMAGE_TYPE_3D) {
|
||||||
|
assert(base_layer == 0);
|
||||||
|
assert(layer_count == anv_minify(image->extent.depth, base_level));
|
||||||
|
}
|
||||||
|
|
||||||
struct blorp_batch batch;
|
struct blorp_batch batch;
|
||||||
blorp_batch_init(&cmd_buffer->device->blorp, &batch, cmd_buffer, 0);
|
blorp_batch_init(&cmd_buffer->device->blorp, &batch, cmd_buffer, 0);
|
||||||
|
|
||||||
@@ -1466,11 +1471,8 @@ anv_image_ccs_clear(struct anv_cmd_buffer *cmd_buffer,
|
|||||||
cmd_buffer->state.pending_pipe_bits |=
|
cmd_buffer->state.pending_pipe_bits |=
|
||||||
ANV_PIPE_RENDER_TARGET_CACHE_FLUSH_BIT | ANV_PIPE_CS_STALL_BIT;
|
ANV_PIPE_RENDER_TARGET_CACHE_FLUSH_BIT | ANV_PIPE_CS_STALL_BIT;
|
||||||
|
|
||||||
const uint32_t level_count =
|
|
||||||
view ? view->levels : anv_get_levelCount(image, subresourceRange);
|
|
||||||
for (uint32_t l = 0; l < level_count; l++) {
|
for (uint32_t l = 0; l < level_count; l++) {
|
||||||
const uint32_t level =
|
const uint32_t level = base_level + l;
|
||||||
(view ? view->base_level : subresourceRange->baseMipLevel) + l;
|
|
||||||
|
|
||||||
const VkExtent3D extent = {
|
const VkExtent3D extent = {
|
||||||
.width = anv_minify(image->extent.width, level),
|
.width = anv_minify(image->extent.width, level),
|
||||||
@@ -1478,24 +1480,13 @@ anv_image_ccs_clear(struct anv_cmd_buffer *cmd_buffer,
|
|||||||
.depth = anv_minify(image->extent.depth, level),
|
.depth = anv_minify(image->extent.depth, level),
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Blorp likes to treat 2D_ARRAY and 3D the same. */
|
if (image->type == VK_IMAGE_TYPE_3D)
|
||||||
uint32_t blorp_base_layer, blorp_layer_count;
|
layer_count = extent.depth;
|
||||||
if (image->type == VK_IMAGE_TYPE_3D) {
|
|
||||||
blorp_base_layer = 0;
|
|
||||||
blorp_layer_count = extent.depth;
|
|
||||||
} else if (view) {
|
|
||||||
blorp_base_layer = view->base_array_layer;
|
|
||||||
blorp_layer_count = view->array_len;
|
|
||||||
} else {
|
|
||||||
blorp_base_layer = subresourceRange->baseArrayLayer;
|
|
||||||
blorp_layer_count = anv_get_layerCount(image, subresourceRange);
|
|
||||||
}
|
|
||||||
|
|
||||||
assert(level < anv_image_aux_levels(image));
|
assert(level < anv_image_aux_levels(image));
|
||||||
assert(blorp_base_layer + blorp_layer_count <=
|
assert(base_layer + layer_count <= anv_image_aux_layers(image, level));
|
||||||
anv_image_aux_layers(image, level));
|
|
||||||
blorp_fast_clear(&batch, &surf, surf.surf->format,
|
blorp_fast_clear(&batch, &surf, surf.surf->format,
|
||||||
level, blorp_base_layer, blorp_layer_count,
|
level, base_layer, layer_count,
|
||||||
0, 0, extent.width, extent.height);
|
0, 0, extent.width, extent.height);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -2132,8 +2132,8 @@ anv_gen8_hiz_op_resolve(struct anv_cmd_buffer *cmd_buffer,
|
|||||||
void
|
void
|
||||||
anv_image_ccs_clear(struct anv_cmd_buffer *cmd_buffer,
|
anv_image_ccs_clear(struct anv_cmd_buffer *cmd_buffer,
|
||||||
const struct anv_image *image,
|
const struct anv_image *image,
|
||||||
const struct isl_view *view,
|
const uint32_t base_level, const uint32_t level_count,
|
||||||
const VkImageSubresourceRange *subresourceRange);
|
const uint32_t base_layer, uint32_t layer_count);
|
||||||
|
|
||||||
enum isl_aux_usage
|
enum isl_aux_usage
|
||||||
anv_layout_to_aux_usage(const struct gen_device_info * const devinfo,
|
anv_layout_to_aux_usage(const struct gen_device_info * const devinfo,
|
||||||
|
@@ -387,10 +387,10 @@ transition_depth_buffer(struct anv_cmd_buffer *cmd_buffer,
|
|||||||
static void
|
static void
|
||||||
transition_color_buffer(struct anv_cmd_buffer *cmd_buffer,
|
transition_color_buffer(struct anv_cmd_buffer *cmd_buffer,
|
||||||
const struct anv_image *image,
|
const struct anv_image *image,
|
||||||
|
const uint32_t base_level, uint32_t level_count,
|
||||||
|
uint32_t base_layer, uint32_t layer_count,
|
||||||
VkImageLayout initial_layout,
|
VkImageLayout initial_layout,
|
||||||
VkImageLayout final_layout,
|
VkImageLayout final_layout)
|
||||||
const struct isl_view *view,
|
|
||||||
const VkImageSubresourceRange *subresourceRange)
|
|
||||||
{
|
{
|
||||||
if (image->aux_usage != ISL_AUX_USAGE_CCS_E)
|
if (image->aux_usage != ISL_AUX_USAGE_CCS_E)
|
||||||
return;
|
return;
|
||||||
@@ -399,13 +399,20 @@ transition_color_buffer(struct anv_cmd_buffer *cmd_buffer,
|
|||||||
initial_layout != VK_IMAGE_LAYOUT_PREINITIALIZED)
|
initial_layout != VK_IMAGE_LAYOUT_PREINITIALIZED)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
/* A transition of a 3D subresource works on all slices at a time. */
|
||||||
|
if (image->type == VK_IMAGE_TYPE_3D) {
|
||||||
|
base_layer = 0;
|
||||||
|
layer_count = anv_minify(image->extent.depth, base_level);
|
||||||
|
}
|
||||||
|
|
||||||
#if GEN_GEN >= 9
|
#if GEN_GEN >= 9
|
||||||
/* We're transitioning from an undefined layout so it doesn't really matter
|
/* 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
|
* 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
|
* that the CCS has valid data in it. One easy way to do that is to
|
||||||
* fast-clear the specified range.
|
* fast-clear the specified range.
|
||||||
*/
|
*/
|
||||||
anv_image_ccs_clear(cmd_buffer, image, view, subresourceRange);
|
anv_image_ccs_clear(cmd_buffer, image, base_level, level_count,
|
||||||
|
base_layer, layer_count);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -990,18 +997,21 @@ void genX(CmdPipelineBarrier)(
|
|||||||
src_flags |= pImageMemoryBarriers[i].srcAccessMask;
|
src_flags |= pImageMemoryBarriers[i].srcAccessMask;
|
||||||
dst_flags |= pImageMemoryBarriers[i].dstAccessMask;
|
dst_flags |= pImageMemoryBarriers[i].dstAccessMask;
|
||||||
ANV_FROM_HANDLE(anv_image, image, pImageMemoryBarriers[i].image);
|
ANV_FROM_HANDLE(anv_image, image, pImageMemoryBarriers[i].image);
|
||||||
if (pImageMemoryBarriers[i].subresourceRange.aspectMask &
|
const VkImageSubresourceRange *range =
|
||||||
VK_IMAGE_ASPECT_DEPTH_BIT) {
|
&pImageMemoryBarriers[i].subresourceRange;
|
||||||
|
|
||||||
|
if (range->aspectMask & VK_IMAGE_ASPECT_DEPTH_BIT) {
|
||||||
transition_depth_buffer(cmd_buffer, image,
|
transition_depth_buffer(cmd_buffer, image,
|
||||||
pImageMemoryBarriers[i].oldLayout,
|
pImageMemoryBarriers[i].oldLayout,
|
||||||
pImageMemoryBarriers[i].newLayout);
|
pImageMemoryBarriers[i].newLayout);
|
||||||
} else if (pImageMemoryBarriers[i].subresourceRange.aspectMask ==
|
} else if (range->aspectMask == VK_IMAGE_ASPECT_COLOR_BIT) {
|
||||||
VK_IMAGE_ASPECT_COLOR_BIT) {
|
|
||||||
transition_color_buffer(cmd_buffer, image,
|
transition_color_buffer(cmd_buffer, image,
|
||||||
|
range->baseMipLevel,
|
||||||
|
anv_get_levelCount(image, range),
|
||||||
|
range->baseArrayLayer,
|
||||||
|
anv_get_layerCount(image, range),
|
||||||
pImageMemoryBarriers[i].oldLayout,
|
pImageMemoryBarriers[i].oldLayout,
|
||||||
pImageMemoryBarriers[i].newLayout,
|
pImageMemoryBarriers[i].newLayout);
|
||||||
NULL,
|
|
||||||
&pImageMemoryBarriers[i].subresourceRange);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2490,8 +2500,10 @@ cmd_buffer_subpass_transition_layouts(struct anv_cmd_buffer * const cmd_buffer,
|
|||||||
image->aspects, target_layout);
|
image->aspects, target_layout);
|
||||||
} else if (image->aspects == VK_IMAGE_ASPECT_COLOR_BIT) {
|
} else if (image->aspects == VK_IMAGE_ASPECT_COLOR_BIT) {
|
||||||
transition_color_buffer(cmd_buffer, image,
|
transition_color_buffer(cmd_buffer, image,
|
||||||
att_state->current_layout, target_layout,
|
iview->isl.base_level, 1,
|
||||||
&iview->isl, NULL);
|
iview->isl.base_array_layer,
|
||||||
|
iview->isl.array_len,
|
||||||
|
att_state->current_layout, target_layout);
|
||||||
}
|
}
|
||||||
|
|
||||||
att_state->current_layout = target_layout;
|
att_state->current_layout = target_layout;
|
||||||
|
Reference in New Issue
Block a user