summaryrefslogtreecommitdiffstats
path: root/src/mesa/main/spirv_extensions.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa/main/spirv_extensions.c')
-rw-r--r--src/mesa/main/spirv_extensions.c32
1 files changed, 32 insertions, 0 deletions
diff --git a/src/mesa/main/spirv_extensions.c b/src/mesa/main/spirv_extensions.c
index 7598510e21c..99af4db2ba0 100644
--- a/src/mesa/main/spirv_extensions.c
+++ b/src/mesa/main/spirv_extensions.c
@@ -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++;
+ }
+}