lavapipe: query formats for shader-image support
authorErik Faye-Lund <erik.faye-lund@collabora.com>
Mon, 31 May 2021 15:39:03 +0000 (17:39 +0200)
committerMarge Bot <eric+marge@anholt.net>
Mon, 12 Jul 2021 16:15:06 +0000 (16:15 +0000)
Assuming all formats are supported here isn't a good plan; we
don't actually support all formats.

Reviewed-By: Mike Blumenkrantz <michael.blumenkrantz@gmail.com>
Reviewed-by: Roland Scheidegger <sroland@vmware.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10467>

src/gallium/frontends/lavapipe/lvp_formats.c

index 10bca26..b33337b 100644 (file)
@@ -239,7 +239,7 @@ lvp_physical_device_get_format_properties(struct lvp_physical_device *physical_d
       out_properties->bufferFeatures = buffer_features;
       return;
    }
-   buffer_features = VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT;
+
    if (!util_format_is_srgb(pformat) &&
        physical_device->pscreen->is_format_supported(physical_device->pscreen, pformat,
                                                      PIPE_BUFFER, 0, 0, PIPE_BIND_VERTEX_BUFFER)) {
@@ -251,6 +251,10 @@ lvp_physical_device_get_format_properties(struct lvp_physical_device *physical_d
       buffer_features |= VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT;
    }
 
+   if (physical_device->pscreen->is_format_supported(physical_device->pscreen, pformat,
+                                                     PIPE_BUFFER, 0, 0, PIPE_BIND_SHADER_IMAGE)) {
+      buffer_features |= VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT;
+   }
 
    if (physical_device->pscreen->is_format_supported(physical_device->pscreen, pformat,
                                                      PIPE_TEXTURE_2D, 0, 0, PIPE_BIND_SAMPLER_VIEW)) {
@@ -267,6 +271,10 @@ lvp_physical_device_get_format_properties(struct lvp_physical_device *physical_d
       /* SNORM blending on llvmpipe fails CTS - disable for now */
       if (!util_format_is_snorm(pformat))
          features |= VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT;
+   }
+
+   if (physical_device->pscreen->is_format_supported(physical_device->pscreen, pformat,
+                                                     PIPE_TEXTURE_2D, 0, 0, PIPE_BIND_SHADER_IMAGE)) {
       features |= VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT;
    }