svga: simplify/improve the format compatibility check for region copies
authorBrian Paul <brianp@vmware.com>
Tue, 20 Sep 2016 23:36:32 +0000 (17:36 -0600)
committerBrian Paul <brianp@vmware.com>
Sat, 24 Sep 2016 01:54:42 +0000 (19:54 -0600)
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 <charmainel@vmware.com>
src/gallium/drivers/svga/svga_pipe_blit.c

index fa4540a59c5b2710acf6a39e06daff40da8b999f..7016186c7a7d878701d84369d69f87737fef6f2f 100644 (file)
@@ -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);
 }