main/format: skip format conversion if src and dst format are equal
authorKarol Herbst <karolherbst@gmail.com>
Wed, 16 Aug 2017 18:32:42 +0000 (20:32 +0200)
committerKenneth Graunke <kenneth@whitecape.org>
Tue, 10 Oct 2017 22:06:17 +0000 (15:06 -0700)
Fixes 'KHR-GL45.copy_image.functional' on Nouveau and i965.

v2: (by Kenneth Graunke)
    Rewrite patch according to Jason Ekstrand's review feedback.
    This makes it handle differing strides, which i965 needed.

Signed-off-by: Karol Herbst <karolherbst@gmail.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
src/mesa/main/format_utils.c

index d16d69c37951abadd8b09d68e091d1399b3a6040..31580750bd45bfce9c10bfa4e3a16de3b6ab2f5d 100644 (file)
@@ -312,6 +312,20 @@ _mesa_format_convert(void *void_dst, uint32_t dst_format, size_t dst_stride,
     * enable it for specific combinations that are known to work.
     */
    if (!rebase_swizzle) {
+      /* Do a direct memcpy where possible */
+      if ((dst_format_is_mesa_array_format &&
+           src_format_is_mesa_array_format &&
+           src_array_format == dst_array_format) ||
+          src_format == dst_format) {
+         int format_size = _mesa_get_format_bytes(src_format);
+         for (row = 0; row < height; row++) {
+            memcpy(dst, src, width * format_size);
+            src += src_stride;
+            dst += dst_stride;
+         }
+         return;
+      }
+
       /* Handle the cases where we can directly unpack */
       if (!src_format_is_mesa_array_format) {
          if (dst_array_format == RGBA32_FLOAT) {