anv: Swizzle fast-clear values
Starting with Gen12, we can fast-clear a lot more surface formats and we are suddenly in the position of having to fast-clear surfaces with formats with an implicit swizzle such as VK_FORMAT_R4G4B4A4_UNORM_PACK16 which is represented as ISL_FORMAT_A4B4G4R4 with a BGRA swizzle. In order for blorp to do the fast-clear color conversion for us, it needs a properly swizzled color. This fixes the following Vulkan CTS groups on TGL: - dEQP-VK.pipeline.blend.format.b4g4r4a4_unorm_pack16.* - dEQP-VK.api.image_clearing.core.clear_color_image.*.b4g4r4a4* Cc: mesa-stable@lists.freedesktop.org Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com> Tested-by: Marge Bot <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4218> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4218>
This commit is contained in:
parent
3fb8f19481
commit
46187bb54f
|
@ -1732,7 +1732,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,
|
enum isl_format format, struct isl_swizzle swizzle,
|
||||||
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,
|
||||||
|
@ -1782,7 +1782,7 @@ 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, format, ISL_SWIZZLE_IDENTITY,
|
blorp_fast_clear(&batch, &surf, format, swizzle,
|
||||||
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;
|
||||||
|
@ -1805,7 +1805,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,
|
enum isl_format format, struct isl_swizzle swizzle,
|
||||||
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,
|
||||||
|
@ -1863,7 +1863,7 @@ 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, format, ISL_SWIZZLE_IDENTITY,
|
blorp_fast_clear(&batch, &surf, format, swizzle,
|
||||||
level, base_layer, layer_count,
|
level, base_layer, layer_count,
|
||||||
0, 0, level_width, level_height);
|
0, 0, level_width, level_height);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -3763,7 +3763,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,
|
enum isl_format format, struct isl_swizzle swizzle,
|
||||||
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,
|
||||||
|
@ -3771,7 +3771,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,
|
enum isl_format format, struct isl_swizzle swizzle,
|
||||||
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,
|
||||||
|
|
|
@ -802,6 +802,7 @@ 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,
|
enum isl_format format,
|
||||||
|
struct isl_swizzle swizzle,
|
||||||
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,
|
||||||
|
@ -826,14 +827,15 @@ anv_cmd_predicated_ccs_resolve(struct anv_cmd_buffer *cmd_buffer,
|
||||||
image->planes[plane].aux_usage == ISL_AUX_USAGE_CCS_D)
|
image->planes[plane].aux_usage == ISL_AUX_USAGE_CCS_D)
|
||||||
resolve_op = ISL_AUX_OP_FULL_RESOLVE;
|
resolve_op = ISL_AUX_OP_FULL_RESOLVE;
|
||||||
|
|
||||||
anv_image_ccs_op(cmd_buffer, image, format, aspect, level,
|
anv_image_ccs_op(cmd_buffer, image, format, swizzle, aspect,
|
||||||
array_layer, 1, resolve_op, NULL, true);
|
level, 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,
|
enum isl_format format,
|
||||||
|
struct isl_swizzle swizzle,
|
||||||
VkImageAspectFlagBits aspect,
|
VkImageAspectFlagBits aspect,
|
||||||
uint32_t array_layer,
|
uint32_t array_layer,
|
||||||
enum isl_aux_op resolve_op,
|
enum isl_aux_op resolve_op,
|
||||||
|
@ -847,7 +849,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, format, aspect,
|
anv_image_mcs_op(cmd_buffer, image, format, swizzle, 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");
|
||||||
|
@ -1233,6 +1235,7 @@ transition_color_buffer(struct anv_cmd_buffer *cmd_buffer,
|
||||||
|
|
||||||
anv_image_ccs_op(cmd_buffer, image,
|
anv_image_ccs_op(cmd_buffer, image,
|
||||||
image->planes[plane].surface.isl.format,
|
image->planes[plane].surface.isl.format,
|
||||||
|
ISL_SWIZZLE_IDENTITY,
|
||||||
aspect, level, base_layer, level_layer_count,
|
aspect, level, base_layer, level_layer_count,
|
||||||
ISL_AUX_OP_AMBIGUATE, NULL, false);
|
ISL_AUX_OP_AMBIGUATE, NULL, false);
|
||||||
|
|
||||||
|
@ -1252,6 +1255,7 @@ 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,
|
anv_image_mcs_op(cmd_buffer, image,
|
||||||
image->planes[plane].surface.isl.format,
|
image->planes[plane].surface.isl.format,
|
||||||
|
ISL_SWIZZLE_IDENTITY,
|
||||||
aspect, base_layer, layer_count,
|
aspect, base_layer, layer_count,
|
||||||
ISL_AUX_OP_FAST_CLEAR, NULL, false);
|
ISL_AUX_OP_FAST_CLEAR, NULL, false);
|
||||||
}
|
}
|
||||||
|
@ -1331,6 +1335,7 @@ transition_color_buffer(struct anv_cmd_buffer *cmd_buffer,
|
||||||
if (image->samples == 1) {
|
if (image->samples == 1) {
|
||||||
anv_cmd_predicated_ccs_resolve(cmd_buffer, image,
|
anv_cmd_predicated_ccs_resolve(cmd_buffer, image,
|
||||||
image->planes[plane].surface.isl.format,
|
image->planes[plane].surface.isl.format,
|
||||||
|
ISL_SWIZZLE_IDENTITY,
|
||||||
aspect, level, array_layer, resolve_op,
|
aspect, level, array_layer, resolve_op,
|
||||||
final_fast_clear);
|
final_fast_clear);
|
||||||
} else {
|
} else {
|
||||||
|
@ -1344,6 +1349,7 @@ transition_color_buffer(struct anv_cmd_buffer *cmd_buffer,
|
||||||
|
|
||||||
anv_cmd_predicated_mcs_resolve(cmd_buffer, image,
|
anv_cmd_predicated_mcs_resolve(cmd_buffer, image,
|
||||||
image->planes[plane].surface.isl.format,
|
image->planes[plane].surface.isl.format,
|
||||||
|
ISL_SWIZZLE_IDENTITY,
|
||||||
aspect, array_layer, resolve_op,
|
aspect, array_layer, resolve_op,
|
||||||
final_fast_clear);
|
final_fast_clear);
|
||||||
}
|
}
|
||||||
|
@ -5038,6 +5044,7 @@ cmd_buffer_begin_subpass(struct anv_cmd_buffer *cmd_buffer,
|
||||||
if (iview->image->samples == 1) {
|
if (iview->image->samples == 1) {
|
||||||
anv_image_ccs_op(cmd_buffer, image,
|
anv_image_ccs_op(cmd_buffer, image,
|
||||||
iview->planes[0].isl.format,
|
iview->planes[0].isl.format,
|
||||||
|
iview->planes[0].isl.swizzle,
|
||||||
VK_IMAGE_ASPECT_COLOR_BIT,
|
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,
|
||||||
|
@ -5045,6 +5052,7 @@ cmd_buffer_begin_subpass(struct anv_cmd_buffer *cmd_buffer,
|
||||||
} else {
|
} else {
|
||||||
anv_image_mcs_op(cmd_buffer, image,
|
anv_image_mcs_op(cmd_buffer, image,
|
||||||
iview->planes[0].isl.format,
|
iview->planes[0].isl.format,
|
||||||
|
iview->planes[0].isl.swizzle,
|
||||||
VK_IMAGE_ASPECT_COLOR_BIT,
|
VK_IMAGE_ASPECT_COLOR_BIT,
|
||||||
0, 1, ISL_AUX_OP_FAST_CLEAR,
|
0, 1, ISL_AUX_OP_FAST_CLEAR,
|
||||||
&clear_color,
|
&clear_color,
|
||||||
|
@ -5566,6 +5574,7 @@ cmd_buffer_end_subpass(struct anv_cmd_buffer *cmd_buffer)
|
||||||
if (image->samples == 1) {
|
if (image->samples == 1) {
|
||||||
anv_cmd_predicated_ccs_resolve(cmd_buffer, image,
|
anv_cmd_predicated_ccs_resolve(cmd_buffer, image,
|
||||||
iview->planes[0].isl.format,
|
iview->planes[0].isl.format,
|
||||||
|
iview->planes[0].isl.swizzle,
|
||||||
VK_IMAGE_ASPECT_COLOR_BIT,
|
VK_IMAGE_ASPECT_COLOR_BIT,
|
||||||
iview->planes[0].isl.base_level,
|
iview->planes[0].isl.base_level,
|
||||||
array_layer,
|
array_layer,
|
||||||
|
@ -5574,6 +5583,7 @@ cmd_buffer_end_subpass(struct anv_cmd_buffer *cmd_buffer)
|
||||||
} else {
|
} else {
|
||||||
anv_cmd_predicated_mcs_resolve(cmd_buffer, image,
|
anv_cmd_predicated_mcs_resolve(cmd_buffer, image,
|
||||||
iview->planes[0].isl.format,
|
iview->planes[0].isl.format,
|
||||||
|
iview->planes[0].isl.swizzle,
|
||||||
VK_IMAGE_ASPECT_COLOR_BIT,
|
VK_IMAGE_ASPECT_COLOR_BIT,
|
||||||
base_layer,
|
base_layer,
|
||||||
ISL_AUX_OP_PARTIAL_RESOLVE,
|
ISL_AUX_OP_PARTIAL_RESOLVE,
|
||||||
|
|
Loading…
Reference in New Issue