From 883017b67ec888f453814e58705cc6f4626da304 Mon Sep 17 00:00:00 2001 From: Erik Faye-Lund Date: Fri, 21 May 2021 14:40:27 +0200 Subject: [PATCH] zink: do not copy colors through floats Copying per compoents might flush NaN values, leading to changes in the values, so it'd be safer to copy as unsigned integers here. But in one of the cases here we can do even better, and just copy the whole damn union instead. Reviewed-By: Mike Blumenkrantz Part-of: --- src/gallium/drivers/zink/zink_clear.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/gallium/drivers/zink/zink_clear.c b/src/gallium/drivers/zink/zink_clear.c index 6b6db04c3ca..6a9e00f92a5 100644 --- a/src/gallium/drivers/zink/zink_clear.c +++ b/src/gallium/drivers/zink/zink_clear.c @@ -75,10 +75,10 @@ clear_in_rp(struct pipe_context *pctx, if (buffers & PIPE_CLEAR_COLOR) { VkClearColorValue color; - color.float32[0] = pcolor->f[0]; - color.float32[1] = pcolor->f[1]; - color.float32[2] = pcolor->f[2]; - color.float32[3] = pcolor->f[3]; + color.uint32[0] = pcolor->ui[0]; + color.uint32[1] = pcolor->ui[1]; + color.uint32[2] = pcolor->ui[2]; + color.uint32[3] = pcolor->ui[3]; for (unsigned i = 0; i < fb->nr_cbufs; i++) { if (!(buffers & (PIPE_CLEAR_COLOR0 << i)) || !fb->cbufs[i]) @@ -134,10 +134,10 @@ clear_color_no_rp(struct zink_context *ctx, struct zink_resource *res, const uni range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; VkClearColorValue color; - color.float32[0] = pcolor->f[0]; - color.float32[1] = pcolor->f[1]; - color.float32[2] = pcolor->f[2]; - color.float32[3] = pcolor->f[3]; + color.uint32[0] = pcolor->ui[0]; + color.uint32[1] = pcolor->ui[1]; + color.uint32[2] = pcolor->ui[2]; + color.uint32[3] = pcolor->ui[3]; if (zink_resource_image_needs_barrier(res, VK_IMAGE_LAYOUT_GENERAL, 0, 0) && zink_resource_image_needs_barrier(res, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 0, 0)) @@ -533,8 +533,7 @@ zink_fb_clear_util_unpack_clear_color(struct zink_framebuffer_clear_data *clear, } color->f[3] = clear->color.color.f[3]; } else { - for (unsigned i = 0; i < 4; i++) - color->f[i] = clear->color.color.f[i]; + *color = clear->color.color; } }