turnip: Disallow NPoT formats.
authorBas Nieuwenhuizen <basni@chromium.org>
Thu, 19 Sep 2019 21:34:36 +0000 (23:34 +0200)
committerBas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Fri, 27 Sep 2019 13:05:21 +0000 (15:05 +0200)
Copying is a mess for these formats for now.

Reviewed-by: Kristian H. Kristensen <hoegsberg@google.com>
Reviewed-by: Eric Anholt <eric@anholt.net>
src/freedreno/vulkan/tu_formats.c

index 5ae04d1e6ad617879f6363a197aab6fe298baf12..095f77570ba732ddac0d2ca27bf9298ca6c56576 100644 (file)
@@ -614,15 +614,26 @@ tu_physical_device_get_format_properties(
    const struct vk_format_description *desc = vk_format_description(format);
    const struct tu_native_format *native_fmt = tu6_get_native_format(format);
    if (!desc || !native_fmt) {
-      out_properties->linearTilingFeatures = linear;
-      out_properties->optimalTilingFeatures = tiled;
-      out_properties->bufferFeatures = buffer;
-      return;
+      goto end;
    }
 
-   linear |= VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT;
-   tiled |= VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT;
    buffer |= VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT;
+   if (native_fmt->vtx >= 0) {
+      buffer |= VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT;
+   }
+
+   /*
+    * The non-power-of-two formats cannot be copied, so to make sure nothing
+    * broken is allowed don't allow these formats at all.
+    */
+   if (!util_is_power_of_two_or_zero(vk_format_get_blocksizebits(format))) {
+      goto end;
+   }
+
+   if (native_fmt->tex >= 0 || native_fmt->rb >= 0) {
+      linear |= VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT;
+      tiled |= VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT;
+   }
 
    if (native_fmt->tex >= 0) {
       linear |= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT;
@@ -635,10 +646,7 @@ tu_physical_device_get_format_properties(
       tiled |= VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT;
    }
 
-   if (native_fmt->vtx >= 0) {
-      buffer |= VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT;
-   }
-
+end:
    out_properties->linearTilingFeatures = linear;
    out_properties->optimalTilingFeatures = tiled;
    out_properties->bufferFeatures = buffer;