v3d: keep clear color untouched

When invoking TLB clear, the color to clear could require
swapping and clamping.

Do the changes in a copy and leave the original color untouched, as it
is passed as constant.

This fixes local outside scope issues with Coverity.

Fixes: 54cba7d2 ("v3d: clamp clear color")
Signed-off-by: Juan A. Suarez Romero <jasuarez@igalia.com>
Reviewed-by: Iago Toral Quiroga <itoral@igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14534>
This commit is contained in:
Juan A. Suarez Romero 2022-01-13 18:42:09 +01:00 committed by Marge Bot
parent afdfcdd542
commit 68f16660f1

View file

@ -1559,15 +1559,6 @@ v3d_tlb_clear(struct v3d_job *job, unsigned buffers,
union util_color uc;
uint32_t internal_size = 4 << surf->internal_bpp;
static union pipe_color_union swapped_color;
if (v3d->swap_color_rb & (1 << i)) {
swapped_color.f[0] = color->f[2];
swapped_color.f[1] = color->f[1];
swapped_color.f[2] = color->f[0];
swapped_color.f[3] = color->f[3];
color = &swapped_color;
}
/* While hardware supports clamping, this is not applied on
* the clear values, so we need to do it manually.
*
@ -1577,37 +1568,44 @@ v3d_tlb_clear(struct v3d_job *job, unsigned buffers,
*/
union pipe_color_union clamped_color =
util_clamp_color(psurf->format, color);
color = &clamped_color;
if (v3d->swap_color_rb & (1 << i)) {
union pipe_color_union orig_color = clamped_color;
clamped_color.f[0] = orig_color.f[2];
clamped_color.f[1] = orig_color.f[1];
clamped_color.f[2] = orig_color.f[0];
clamped_color.f[3] = orig_color.f[3];
}
switch (surf->internal_type) {
case V3D_INTERNAL_TYPE_8:
util_pack_color(color->f, PIPE_FORMAT_R8G8B8A8_UNORM,
util_pack_color(clamped_color.f, PIPE_FORMAT_R8G8B8A8_UNORM,
&uc);
memcpy(job->clear_color[i], uc.ui, internal_size);
break;
case V3D_INTERNAL_TYPE_8I:
case V3D_INTERNAL_TYPE_8UI:
job->clear_color[i][0] = ((color->ui[0] & 0xff) |
(color->ui[1] & 0xff) << 8 |
(color->ui[2] & 0xff) << 16 |
(color->ui[3] & 0xff) << 24);
job->clear_color[i][0] = ((clamped_color.ui[0] & 0xff) |
(clamped_color.ui[1] & 0xff) << 8 |
(clamped_color.ui[2] & 0xff) << 16 |
(clamped_color.ui[3] & 0xff) << 24);
break;
case V3D_INTERNAL_TYPE_16F:
util_pack_color(color->f, PIPE_FORMAT_R16G16B16A16_FLOAT,
util_pack_color(clamped_color.f, PIPE_FORMAT_R16G16B16A16_FLOAT,
&uc);
memcpy(job->clear_color[i], uc.ui, internal_size);
break;
case V3D_INTERNAL_TYPE_16I:
case V3D_INTERNAL_TYPE_16UI:
job->clear_color[i][0] = ((color->ui[0] & 0xffff) |
color->ui[1] << 16);
job->clear_color[i][1] = ((color->ui[2] & 0xffff) |
color->ui[3] << 16);
job->clear_color[i][0] = ((clamped_color.ui[0] & 0xffff) |
clamped_color.ui[1] << 16);
job->clear_color[i][1] = ((clamped_color.ui[2] & 0xffff) |
clamped_color.ui[3] << 16);
break;
case V3D_INTERNAL_TYPE_32F:
case V3D_INTERNAL_TYPE_32I:
case V3D_INTERNAL_TYPE_32UI:
memcpy(job->clear_color[i], color->ui, internal_size);
memcpy(job->clear_color[i], clamped_color.ui, internal_size);
break;
}