spirv_extensions: define spirv_extensions_supported
authorAlejandro Piñeiro <apinheiro@igalia.com>
Wed, 19 Jun 2019 18:58:30 +0000 (13:58 -0500)
committerAlejandro Piñeiro <apinheiro@igalia.com>
Wed, 17 Jul 2019 08:45:32 +0000 (10:45 +0200)
Add a struct to maintain which SPIR-V extensions are supported, and an
utility method to initialize it based on
nir_spirv_supported_capabilities.

v2:
  * Fixing code style (Ian Romanick)
  * Adding a prefix (spirv) to fill_supported_spirv_extensions (Ian Romanick)

v3: rebase update (nir_spirv_supported_extensions renamed)

v4: include AMD_gcn_shader support

v5: move spirv_fill_supported_spirv_extensions to
    src/mesa/main/spirv_extensions.c

Signed-off-by: Alejandro Piñeiro <apinheiro@igalia.com>
Signed-off-by: Arcady Goldmints-Orlov <agoldmints@igalia.com>
Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@intel.com>
src/mesa/main/spirv_extensions.c
src/mesa/main/spirv_extensions.h

index 7598510e21c60d5c421a8daa14bad233ec0efec7..99af4db2ba07aee50057ee8c10f971295d70be27 100644 (file)
@@ -26,6 +26,7 @@
  * \brief SPIRV-V extension handling. See ARB_spirv_extensions
  */
 
+#include <stdbool.h>
 #include "spirv_extensions.h"
 
 GLuint
@@ -62,3 +63,34 @@ _mesa_spirv_extensions_to_string(enum SpvExtension ext)
 
    return "unknown";
 }
+
+/**
+ * Sets the supported flags for known SPIR-V extensions based on the
+ * capabilites supported (spirv capabilities based on the spirv to nir
+ * support).
+ *
+ * One could argue that makes more sense in the other way around, as from the
+ * spec pov capabilities are enable for a given extension. But from our pov,
+ * we support or not (depending on the driver) some given capability, and
+ * spirv_to_nir check for capabilities not extensions. Also we usually fill
+ * first the supported capabilities, that are not always related to an
+ * extension.
+ */
+void
+_mesa_fill_supported_spirv_extensions(struct spirv_supported_extensions *ext,
+                                      const struct spirv_supported_capabilities *cap)
+{
+   memset(ext->supported, 0, sizeof(ext->supported));
+
+   ext->count = 0;
+
+   ext->supported[SPV_KHR_shader_draw_parameters] = cap->draw_parameters;
+   ext->supported[SPV_KHR_multiview] = cap->multiview;
+   ext->supported[SPV_KHR_variable_pointers] = cap->variable_pointers;
+   ext->supported[SPV_AMD_gcn_shader] = cap->amd_gcn_shader;
+
+   for (unsigned i = 0; i < SPV_EXTENSIONS_COUNT; i++) {
+      if (ext->supported[i])
+         ext->count++;
+   }
+}
index 6c8b82759459259837cbebc087ba8e4c19405ad3..9372f505f25bdc92e8affabfb2b289b887651571 100644 (file)
@@ -48,6 +48,14 @@ enum SpvExtension {
    SPV_EXTENSIONS_COUNT
 };
 
+struct spirv_supported_extensions {
+   /** Flags the supported extensions. Array to make it easier to iterate. */
+   bool supported[SPV_EXTENSIONS_COUNT];
+
+   /** Number of supported extensions */
+   unsigned int count;
+};
+
 extern GLuint
 _mesa_get_spirv_extension_count(struct gl_context *ctx);
 
@@ -57,6 +65,9 @@ _mesa_get_enabled_spirv_extension(struct gl_context *ctx,
 
 const char *_mesa_spirv_extensions_to_string(enum SpvExtension ext);
 
+void _mesa_fill_supported_spirv_extensions(struct spirv_supported_extensions *ext,
+                                           const struct spirv_supported_capabilities *cap);
+
 #ifdef __cplusplus
 }
 #endif