llvmpipe/blit: for 32-bit unorm depth blits just copy 32-bit
authorDave Airlie <airlied@redhat.com>
Mon, 20 Jul 2020 03:41:34 +0000 (13:41 +1000)
committerMarge Bot <eric+marge@anholt.net>
Mon, 17 Aug 2020 20:12:40 +0000 (20:12 +0000)
Don't have the shader do a 32-bit unorn to float conversion,
the values don't remain accurate then.

Fixes:
GTF-GL45.gtf30.GL3Tests.framebuffer_blit.framebuffer_blit_functionality_multisampled_to_singlesampled_blit
for 32-bit unorm depth buffers.

Cc: "20.2" <mesa-stable@lists.freedesktop.org>
Reviewed-by: Roland Scheidegger <sroland@vmware.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6044>

src/gallium/drivers/llvmpipe/lp_surface.c

index c95892c66520bde5ea5e5a1b7b36e592ee749362..2a60d86c9968e084cf47fb79bdeacd4b3f92c56c 100644 (file)
@@ -132,6 +132,15 @@ static void lp_blit(struct pipe_context *pipe,
       return;
    }
 
+   /* for 32-bit unorm depth, avoid the conversions to float and back,
+      which can introduce accuracy errors. */
+   if (blit_info->src.format == PIPE_FORMAT_Z32_UNORM &&
+       blit_info->dst.format == PIPE_FORMAT_Z32_UNORM && info.filter == PIPE_TEX_FILTER_NEAREST) {
+      info.src.format = PIPE_FORMAT_R32_UINT;
+      info.dst.format = PIPE_FORMAT_R32_UINT;
+      info.mask = PIPE_MASK_R;
+   }
+
    /* XXX turn off occlusion and streamout queries */
 
    util_blitter_save_vertex_buffer_slot(lp->blitter, lp->vertex_buffer);