From c42000545df33b9ab18aa2c5f9775632e0667783 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Tue, 20 Sep 2016 17:36:32 -0600 Subject: [PATCH] svga: simplify/improve the format compatibility check for region copies The util_is_format_compatible() function didn't quite do what we wanted for vgpu10. This check is more flexible and allows copies between formats such as R32G32B32A32_FLOAT and R32G32B32A32_INT. Reviewed-by: Charmaine Lee --- src/gallium/drivers/svga/svga_pipe_blit.c | 30 +++++++++++++++++++---- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/src/gallium/drivers/svga/svga_pipe_blit.c b/src/gallium/drivers/svga/svga_pipe_blit.c index fa4540a59c5..7016186c7a7 100644 --- a/src/gallium/drivers/svga/svga_pipe_blit.c +++ b/src/gallium/drivers/svga/svga_pipe_blit.c @@ -26,6 +26,7 @@ #include "svga_context.h" #include "svga_debug.h" #include "svga_cmd.h" +#include "svga_format.h" #include "svga_resource_buffer.h" #include "svga_resource_texture.h" #include "svga_surface.h" @@ -208,6 +209,27 @@ svga_resource_copy_region(struct pipe_context *pipe, } +/** + * Are the given pipe formats compatible, in terms of vgpu10's + * PredCopyRegion() command? + */ +static bool +formats_compatible(const struct svga_screen *ss, + enum pipe_format src_fmt, + enum pipe_format dst_fmt) +{ + SVGA3dSurfaceFormat src_svga_fmt, dst_svga_fmt; + + src_svga_fmt = svga_translate_format(ss, src_fmt, PIPE_BIND_SAMPLER_VIEW); + dst_svga_fmt = svga_translate_format(ss, dst_fmt, PIPE_BIND_SAMPLER_VIEW); + + src_svga_fmt = svga_typeless_format(src_svga_fmt); + dst_svga_fmt = svga_typeless_format(dst_svga_fmt); + + return src_svga_fmt == dst_svga_fmt; +} + + /** * The state tracker implements some resource copies with blits (for * GL_ARB_copy_image). This function checks if we should really do the blit @@ -248,11 +270,9 @@ can_blit_via_copy_region_vgpu10(struct svga_context *svga, blit_info->scissor_enable) return false; - /* check that src/dst surface formats are compatible for - the VGPU device.*/ - return util_is_format_compatible( - util_format_description(blit_info->src.resource->format), - util_format_description(blit_info->dst.resource->format)); + return formats_compatible(svga_screen(svga->pipe.screen), + blit_info->src.resource->format, + blit_info->dst.resource->format); }