mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-24 12:30:19 +01:00
anv: Be more careful about fast-clear colors
Previously, we just used all the channels regardless of the format. This is less than ideal because some channels may have undefined values and this should be ok from the client's perspective. Even though the driver should do the correct thing regardless of what is in the undefined value, it makes things less deterministic. In particular, the driver may choose to fast-clear or not based on undefined values. This level of nondeterminism is bad. Cc: mesa-stable@lists.freedesktop.org Reviewed-by: Nanley Chery <nanley.g.chery@intel.com>
This commit is contained in:
parent
4796025ba5
commit
85d0bec961
1 changed files with 19 additions and 27 deletions
|
|
@ -202,24 +202,6 @@ add_image_view_relocs(struct anv_cmd_buffer *cmd_buffer,
|
|||
}
|
||||
}
|
||||
|
||||
static bool
|
||||
color_is_zero_one(VkClearColorValue value, enum isl_format format)
|
||||
{
|
||||
if (isl_format_has_int_channel(format)) {
|
||||
for (unsigned i = 0; i < 4; i++) {
|
||||
if (value.int32[i] != 0 && value.int32[i] != 1)
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
for (unsigned i = 0; i < 4; i++) {
|
||||
if (value.float32[i] != 0.0f && value.float32[i] != 1.0f)
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static void
|
||||
color_attachment_compute_aux_usage(struct anv_device * device,
|
||||
struct anv_cmd_state * cmd_state,
|
||||
|
|
@ -283,13 +265,25 @@ color_attachment_compute_aux_usage(struct anv_device * device,
|
|||
|
||||
assert(iview->image->planes[0].aux_surface.isl.usage & ISL_SURF_USAGE_CCS_BIT);
|
||||
|
||||
const struct isl_format_layout *view_fmtl =
|
||||
isl_format_get_layout(iview->planes[0].isl.format);
|
||||
union isl_color_value clear_color = {};
|
||||
|
||||
#define COPY_CLEAR_COLOR_CHANNEL(c, i) \
|
||||
if (view_fmtl->channels.c.bits) \
|
||||
clear_color.u32[i] = att_state->clear_value.color.uint32[i]
|
||||
|
||||
COPY_CLEAR_COLOR_CHANNEL(r, 0);
|
||||
COPY_CLEAR_COLOR_CHANNEL(g, 1);
|
||||
COPY_CLEAR_COLOR_CHANNEL(b, 2);
|
||||
COPY_CLEAR_COLOR_CHANNEL(a, 3);
|
||||
|
||||
#undef COPY_CLEAR_COLOR_CHANNEL
|
||||
|
||||
att_state->clear_color_is_zero_one =
|
||||
color_is_zero_one(att_state->clear_value.color, iview->planes[0].isl.format);
|
||||
isl_color_value_is_zero_one(clear_color, iview->planes[0].isl.format);
|
||||
att_state->clear_color_is_zero =
|
||||
att_state->clear_value.color.uint32[0] == 0 &&
|
||||
att_state->clear_value.color.uint32[1] == 0 &&
|
||||
att_state->clear_value.color.uint32[2] == 0 &&
|
||||
att_state->clear_value.color.uint32[3] == 0;
|
||||
isl_color_value_is_zero(clear_color, iview->planes[0].isl.format);
|
||||
|
||||
if (att_state->pending_clear_aspects == VK_IMAGE_ASPECT_COLOR_BIT) {
|
||||
/* Start off assuming fast clears are possible */
|
||||
|
|
@ -341,10 +335,8 @@ color_attachment_compute_aux_usage(struct anv_device * device,
|
|||
"LOAD_OP_CLEAR. Only fast-clearing the first slice");
|
||||
}
|
||||
|
||||
if (att_state->fast_clear) {
|
||||
memcpy(fast_clear_color->u32, att_state->clear_value.color.uint32,
|
||||
sizeof(fast_clear_color->u32));
|
||||
}
|
||||
if (att_state->fast_clear)
|
||||
*fast_clear_color = clear_color;
|
||||
} else {
|
||||
att_state->fast_clear = false;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue