[virglrenderer-devel] [PATCH] formats: include compressed formats in the copy-compatibility check

Gert Wollny gert.wollny at collabora.com
Fri Aug 3 21:02:27 UTC 2018


Add the combinations that include compressed format to the check to use
glCopyImageSubData. This fixes a number tests of "arb_copy_image-formats"
were compressed textures are the source and uncompressed textures the 
destination (no regressions).

Signed-off-by: Gert Wollny <gert.wollny at collabora.com>
---
Two remarks: 

* Given the way the piglit is written it will be impossible to fix the tests
  where the destination texture is a compressed texture when run on a GLES
  host, because this would require glGetCompressedTexImage, (unless of course 
  one would want to mirror each copy operation on the backing IOVs. 
  On a GL host the ways readbacks are done would need an overhaul to give 
  precedence to the  gettextimage code path. 
* All the dEQP copy_image tests are already passing, but with this piglit 
  all tests that include snorm images fail, because the negative values 
  are clamped to zero. I think this is an issue worth investigating, because it
  might point to a more important bug.  

 src/vrend_formats.c | 75 +++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 72 insertions(+), 3 deletions(-)

diff --git a/src/vrend_formats.c b/src/vrend_formats.c
index 4647c43..7975823 100644
--- a/src/vrend_formats.c
+++ b/src/vrend_formats.c
@@ -488,6 +488,67 @@ unsigned vrend_renderer_query_multisample_caps(unsigned max_samples, struct virg
    return max_samples_confirmed;
 }
 
+/* returns: 1 = compatible, -1 = not compatible, 0 = undecided */
+static int format_uncompressed_compressed_copy_compatible(enum pipe_format src,
+                                                          enum pipe_format dst)
+{
+   switch (src) {
+   case PIPE_FORMAT_R32G32B32A32_UINT:
+   case PIPE_FORMAT_R32G32B32A32_SINT:
+   case PIPE_FORMAT_R32G32B32A32_FLOAT:
+   case PIPE_FORMAT_R32G32B32A32_SNORM:
+   case PIPE_FORMAT_R32G32B32A32_UNORM:
+      switch (dst) {
+      case PIPE_FORMAT_DXT3_RGBA:
+      case PIPE_FORMAT_DXT3_SRGBA:
+      case PIPE_FORMAT_DXT5_RGBA:
+      case PIPE_FORMAT_DXT5_SRGBA:
+      case PIPE_FORMAT_RGTC2_UNORM:
+      case PIPE_FORMAT_RGTC2_SNORM:
+      case PIPE_FORMAT_BPTC_RGBA_UNORM:
+      case PIPE_FORMAT_BPTC_SRGBA:
+      case PIPE_FORMAT_BPTC_RGB_FLOAT:
+      case PIPE_FORMAT_BPTC_RGB_UFLOAT:
+         return 1;
+      default:
+         return -1;
+      }
+   case PIPE_FORMAT_R16G16B16A16_UINT:
+   case PIPE_FORMAT_R16G16B16A16_SINT:
+   case PIPE_FORMAT_R16G16B16A16_FLOAT:
+   case PIPE_FORMAT_R16G16B16A16_SNORM:
+   case PIPE_FORMAT_R16G16B16A16_UNORM:
+   case PIPE_FORMAT_R32G32_UINT:
+   case PIPE_FORMAT_R32G32_SINT:
+   case PIPE_FORMAT_R32G32_FLOAT:
+   case PIPE_FORMAT_R32G32_UNORM:
+   case PIPE_FORMAT_R32G32_SNORM:
+      switch (dst) {
+      case PIPE_FORMAT_DXT1_RGBA:
+      case PIPE_FORMAT_DXT1_SRGBA:
+      case PIPE_FORMAT_DXT1_RGB:
+      case PIPE_FORMAT_DXT1_SRGB:
+      case PIPE_FORMAT_RGTC1_UNORM:
+      case PIPE_FORMAT_RGTC1_SNORM:
+         return 1;
+      default:
+         return -1;
+      }
+   default:
+      return 0;
+   }
+}
+
+static boolean format_compressed_compressed_copy_compatible(enum pipe_format src, enum pipe_format dst)
+{
+   if ((src == PIPE_FORMAT_RGTC1_UNORM && dst == PIPE_FORMAT_RGTC1_SNORM) ||
+       (src == PIPE_FORMAT_RGTC2_UNORM && dst == PIPE_FORMAT_RGTC2_SNORM) ||
+       (src == PIPE_FORMAT_BPTC_RGBA_UNORM && dst == PIPE_FORMAT_BPTC_SRGBA) ||
+       (src == PIPE_FORMAT_BPTC_RGB_FLOAT && dst == PIPE_FORMAT_BPTC_RGB_UFLOAT))
+      return true;
+   return false;
+}
+
 boolean format_is_copy_compatible(enum pipe_format src, enum pipe_format dst)
 {
    int r;
@@ -501,6 +562,14 @@ boolean format_is_copy_compatible(enum pipe_format src, enum pipe_format dst)
       return util_is_format_compatible(src_desc, dst_desc);
    }
 
-   /* compressed formats will be supported later */
-   return false;
-}
\ No newline at end of file
+   /* compressed-uncompressed */
+   r = format_uncompressed_compressed_copy_compatible(src, dst);
+   if (r)
+      return r > 0;
+
+   r = format_uncompressed_compressed_copy_compatible(dst, src);
+   if (r)
+      return r > 0;
+
+   return format_compressed_compressed_copy_compatible(dst, src);
+}
-- 
2.17.1



More information about the virglrenderer-devel mailing list