anv: explictly specify format for blorp ccs/mcs op
Resolve operations can happen when dealing with view (begin/end subpasses) in which case the view's format needs to apply, not the image's format. v2: Relayout arguments of a ccs_op() call (Jason) Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com> Suggested-by: Jason Ekstrand <jason@jlekstrand.net> Reviewed-by: Jason Ekstrand <jason@jlekstrand.net> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=108911 Cc: mesa-stable@lists.freedesktop.org
This commit is contained in:
@@ -1658,6 +1658,7 @@ anv_image_hiz_clear(struct anv_cmd_buffer *cmd_buffer,
|
|||||||
void
|
void
|
||||||
anv_image_mcs_op(struct anv_cmd_buffer *cmd_buffer,
|
anv_image_mcs_op(struct anv_cmd_buffer *cmd_buffer,
|
||||||
const struct anv_image *image,
|
const struct anv_image *image,
|
||||||
|
enum isl_format format,
|
||||||
VkImageAspectFlagBits aspect,
|
VkImageAspectFlagBits aspect,
|
||||||
uint32_t base_layer, uint32_t layer_count,
|
uint32_t base_layer, uint32_t layer_count,
|
||||||
enum isl_aux_op mcs_op, union isl_color_value *clear_value,
|
enum isl_aux_op mcs_op, union isl_color_value *clear_value,
|
||||||
@@ -1713,12 +1714,12 @@ anv_image_mcs_op(struct anv_cmd_buffer *cmd_buffer,
|
|||||||
|
|
||||||
switch (mcs_op) {
|
switch (mcs_op) {
|
||||||
case ISL_AUX_OP_FAST_CLEAR:
|
case ISL_AUX_OP_FAST_CLEAR:
|
||||||
blorp_fast_clear(&batch, &surf, surf.surf->format,
|
blorp_fast_clear(&batch, &surf, format,
|
||||||
0, base_layer, layer_count,
|
0, base_layer, layer_count,
|
||||||
0, 0, image->extent.width, image->extent.height);
|
0, 0, image->extent.width, image->extent.height);
|
||||||
break;
|
break;
|
||||||
case ISL_AUX_OP_PARTIAL_RESOLVE:
|
case ISL_AUX_OP_PARTIAL_RESOLVE:
|
||||||
blorp_mcs_partial_resolve(&batch, &surf, surf.surf->format,
|
blorp_mcs_partial_resolve(&batch, &surf, format,
|
||||||
base_layer, layer_count);
|
base_layer, layer_count);
|
||||||
break;
|
break;
|
||||||
case ISL_AUX_OP_FULL_RESOLVE:
|
case ISL_AUX_OP_FULL_RESOLVE:
|
||||||
@@ -1736,6 +1737,7 @@ anv_image_mcs_op(struct anv_cmd_buffer *cmd_buffer,
|
|||||||
void
|
void
|
||||||
anv_image_ccs_op(struct anv_cmd_buffer *cmd_buffer,
|
anv_image_ccs_op(struct anv_cmd_buffer *cmd_buffer,
|
||||||
const struct anv_image *image,
|
const struct anv_image *image,
|
||||||
|
enum isl_format format,
|
||||||
VkImageAspectFlagBits aspect, uint32_t level,
|
VkImageAspectFlagBits aspect, uint32_t level,
|
||||||
uint32_t base_layer, uint32_t layer_count,
|
uint32_t base_layer, uint32_t layer_count,
|
||||||
enum isl_aux_op ccs_op, union isl_color_value *clear_value,
|
enum isl_aux_op ccs_op, union isl_color_value *clear_value,
|
||||||
@@ -1799,14 +1801,14 @@ anv_image_ccs_op(struct anv_cmd_buffer *cmd_buffer,
|
|||||||
|
|
||||||
switch (ccs_op) {
|
switch (ccs_op) {
|
||||||
case ISL_AUX_OP_FAST_CLEAR:
|
case ISL_AUX_OP_FAST_CLEAR:
|
||||||
blorp_fast_clear(&batch, &surf, surf.surf->format,
|
blorp_fast_clear(&batch, &surf, format,
|
||||||
level, base_layer, layer_count,
|
level, base_layer, layer_count,
|
||||||
0, 0, level_width, level_height);
|
0, 0, level_width, level_height);
|
||||||
break;
|
break;
|
||||||
case ISL_AUX_OP_FULL_RESOLVE:
|
case ISL_AUX_OP_FULL_RESOLVE:
|
||||||
case ISL_AUX_OP_PARTIAL_RESOLVE:
|
case ISL_AUX_OP_PARTIAL_RESOLVE:
|
||||||
blorp_ccs_resolve(&batch, &surf, level, base_layer, layer_count,
|
blorp_ccs_resolve(&batch, &surf, level, base_layer, layer_count,
|
||||||
surf.surf->format, ccs_op);
|
format, ccs_op);
|
||||||
break;
|
break;
|
||||||
case ISL_AUX_OP_AMBIGUATE:
|
case ISL_AUX_OP_AMBIGUATE:
|
||||||
for (uint32_t a = 0; a < layer_count; a++) {
|
for (uint32_t a = 0; a < layer_count; a++) {
|
||||||
|
@@ -2938,6 +2938,7 @@ anv_image_hiz_clear(struct anv_cmd_buffer *cmd_buffer,
|
|||||||
void
|
void
|
||||||
anv_image_mcs_op(struct anv_cmd_buffer *cmd_buffer,
|
anv_image_mcs_op(struct anv_cmd_buffer *cmd_buffer,
|
||||||
const struct anv_image *image,
|
const struct anv_image *image,
|
||||||
|
enum isl_format format,
|
||||||
VkImageAspectFlagBits aspect,
|
VkImageAspectFlagBits aspect,
|
||||||
uint32_t base_layer, uint32_t layer_count,
|
uint32_t base_layer, uint32_t layer_count,
|
||||||
enum isl_aux_op mcs_op, union isl_color_value *clear_value,
|
enum isl_aux_op mcs_op, union isl_color_value *clear_value,
|
||||||
@@ -2945,6 +2946,7 @@ anv_image_mcs_op(struct anv_cmd_buffer *cmd_buffer,
|
|||||||
void
|
void
|
||||||
anv_image_ccs_op(struct anv_cmd_buffer *cmd_buffer,
|
anv_image_ccs_op(struct anv_cmd_buffer *cmd_buffer,
|
||||||
const struct anv_image *image,
|
const struct anv_image *image,
|
||||||
|
enum isl_format format,
|
||||||
VkImageAspectFlagBits aspect, uint32_t level,
|
VkImageAspectFlagBits aspect, uint32_t level,
|
||||||
uint32_t base_layer, uint32_t layer_count,
|
uint32_t base_layer, uint32_t layer_count,
|
||||||
enum isl_aux_op ccs_op, union isl_color_value *clear_value,
|
enum isl_aux_op ccs_op, union isl_color_value *clear_value,
|
||||||
|
@@ -737,6 +737,7 @@ anv_cmd_simple_resolve_predicate(struct anv_cmd_buffer *cmd_buffer,
|
|||||||
static void
|
static void
|
||||||
anv_cmd_predicated_ccs_resolve(struct anv_cmd_buffer *cmd_buffer,
|
anv_cmd_predicated_ccs_resolve(struct anv_cmd_buffer *cmd_buffer,
|
||||||
const struct anv_image *image,
|
const struct anv_image *image,
|
||||||
|
enum isl_format format,
|
||||||
VkImageAspectFlagBits aspect,
|
VkImageAspectFlagBits aspect,
|
||||||
uint32_t level, uint32_t array_layer,
|
uint32_t level, uint32_t array_layer,
|
||||||
enum isl_aux_op resolve_op,
|
enum isl_aux_op resolve_op,
|
||||||
@@ -761,13 +762,14 @@ anv_cmd_predicated_ccs_resolve(struct anv_cmd_buffer *cmd_buffer,
|
|||||||
image->planes[plane].aux_usage == ISL_AUX_USAGE_NONE)
|
image->planes[plane].aux_usage == ISL_AUX_USAGE_NONE)
|
||||||
resolve_op = ISL_AUX_OP_FULL_RESOLVE;
|
resolve_op = ISL_AUX_OP_FULL_RESOLVE;
|
||||||
|
|
||||||
anv_image_ccs_op(cmd_buffer, image, aspect, level,
|
anv_image_ccs_op(cmd_buffer, image, format, aspect, level,
|
||||||
array_layer, 1, resolve_op, NULL, true);
|
array_layer, 1, resolve_op, NULL, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
anv_cmd_predicated_mcs_resolve(struct anv_cmd_buffer *cmd_buffer,
|
anv_cmd_predicated_mcs_resolve(struct anv_cmd_buffer *cmd_buffer,
|
||||||
const struct anv_image *image,
|
const struct anv_image *image,
|
||||||
|
enum isl_format format,
|
||||||
VkImageAspectFlagBits aspect,
|
VkImageAspectFlagBits aspect,
|
||||||
uint32_t array_layer,
|
uint32_t array_layer,
|
||||||
enum isl_aux_op resolve_op,
|
enum isl_aux_op resolve_op,
|
||||||
@@ -781,7 +783,7 @@ anv_cmd_predicated_mcs_resolve(struct anv_cmd_buffer *cmd_buffer,
|
|||||||
aspect, 0, array_layer,
|
aspect, 0, array_layer,
|
||||||
resolve_op, fast_clear_supported);
|
resolve_op, fast_clear_supported);
|
||||||
|
|
||||||
anv_image_mcs_op(cmd_buffer, image, aspect,
|
anv_image_mcs_op(cmd_buffer, image, format, aspect,
|
||||||
array_layer, 1, resolve_op, NULL, true);
|
array_layer, 1, resolve_op, NULL, true);
|
||||||
#else
|
#else
|
||||||
unreachable("MCS resolves are unsupported on Ivybridge and Bay Trail");
|
unreachable("MCS resolves are unsupported on Ivybridge and Bay Trail");
|
||||||
@@ -1037,8 +1039,9 @@ transition_color_buffer(struct anv_cmd_buffer *cmd_buffer,
|
|||||||
uint32_t level_layer_count =
|
uint32_t level_layer_count =
|
||||||
MIN2(layer_count, aux_layers - base_layer);
|
MIN2(layer_count, aux_layers - base_layer);
|
||||||
|
|
||||||
anv_image_ccs_op(cmd_buffer, image, aspect, level,
|
anv_image_ccs_op(cmd_buffer, image,
|
||||||
base_layer, level_layer_count,
|
image->planes[plane].surface.isl.format,
|
||||||
|
aspect, level, base_layer, level_layer_count,
|
||||||
ISL_AUX_OP_AMBIGUATE, NULL, false);
|
ISL_AUX_OP_AMBIGUATE, NULL, false);
|
||||||
|
|
||||||
if (image->planes[plane].aux_usage == ISL_AUX_USAGE_CCS_E) {
|
if (image->planes[plane].aux_usage == ISL_AUX_USAGE_CCS_E) {
|
||||||
@@ -1055,8 +1058,9 @@ transition_color_buffer(struct anv_cmd_buffer *cmd_buffer,
|
|||||||
}
|
}
|
||||||
|
|
||||||
assert(base_level == 0 && level_count == 1);
|
assert(base_level == 0 && level_count == 1);
|
||||||
anv_image_mcs_op(cmd_buffer, image, aspect,
|
anv_image_mcs_op(cmd_buffer, image,
|
||||||
base_layer, layer_count,
|
image->planes[plane].surface.isl.format,
|
||||||
|
aspect, base_layer, layer_count,
|
||||||
ISL_AUX_OP_FAST_CLEAR, NULL, false);
|
ISL_AUX_OP_FAST_CLEAR, NULL, false);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
@@ -1133,8 +1137,9 @@ transition_color_buffer(struct anv_cmd_buffer *cmd_buffer,
|
|||||||
for (uint32_t a = 0; a < level_layer_count; a++) {
|
for (uint32_t a = 0; a < level_layer_count; a++) {
|
||||||
uint32_t array_layer = base_layer + a;
|
uint32_t array_layer = base_layer + a;
|
||||||
if (image->samples == 1) {
|
if (image->samples == 1) {
|
||||||
anv_cmd_predicated_ccs_resolve(cmd_buffer, image, aspect,
|
anv_cmd_predicated_ccs_resolve(cmd_buffer, image,
|
||||||
level, array_layer, resolve_op,
|
image->planes[plane].surface.isl.format,
|
||||||
|
aspect, level, array_layer, resolve_op,
|
||||||
final_fast_clear);
|
final_fast_clear);
|
||||||
} else {
|
} else {
|
||||||
/* We only support fast-clear on the first layer so partial
|
/* We only support fast-clear on the first layer so partial
|
||||||
@@ -1145,8 +1150,9 @@ transition_color_buffer(struct anv_cmd_buffer *cmd_buffer,
|
|||||||
array_layer != 0)
|
array_layer != 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
anv_cmd_predicated_mcs_resolve(cmd_buffer, image, aspect,
|
anv_cmd_predicated_mcs_resolve(cmd_buffer, image,
|
||||||
array_layer, resolve_op,
|
image->planes[plane].surface.isl.format,
|
||||||
|
aspect, array_layer, resolve_op,
|
||||||
final_fast_clear);
|
final_fast_clear);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3674,12 +3680,16 @@ cmd_buffer_begin_subpass(struct anv_cmd_buffer *cmd_buffer,
|
|||||||
union isl_color_value clear_color = {};
|
union isl_color_value clear_color = {};
|
||||||
anv_clear_color_from_att_state(&clear_color, att_state, iview);
|
anv_clear_color_from_att_state(&clear_color, att_state, iview);
|
||||||
if (iview->image->samples == 1) {
|
if (iview->image->samples == 1) {
|
||||||
anv_image_ccs_op(cmd_buffer, image, VK_IMAGE_ASPECT_COLOR_BIT,
|
anv_image_ccs_op(cmd_buffer, image,
|
||||||
|
iview->planes[0].isl.format,
|
||||||
|
VK_IMAGE_ASPECT_COLOR_BIT,
|
||||||
0, 0, 1, ISL_AUX_OP_FAST_CLEAR,
|
0, 0, 1, ISL_AUX_OP_FAST_CLEAR,
|
||||||
&clear_color,
|
&clear_color,
|
||||||
false);
|
false);
|
||||||
} else {
|
} else {
|
||||||
anv_image_mcs_op(cmd_buffer, image, VK_IMAGE_ASPECT_COLOR_BIT,
|
anv_image_mcs_op(cmd_buffer, image,
|
||||||
|
iview->planes[0].isl.format,
|
||||||
|
VK_IMAGE_ASPECT_COLOR_BIT,
|
||||||
0, 1, ISL_AUX_OP_FAST_CLEAR,
|
0, 1, ISL_AUX_OP_FAST_CLEAR,
|
||||||
&clear_color,
|
&clear_color,
|
||||||
false);
|
false);
|
||||||
|
Reference in New Issue
Block a user