diff options
author | Alejandro Piñeiro <[email protected]> | 2019-06-19 13:58:30 -0500 |
---|---|---|
committer | Alejandro Piñeiro <[email protected]> | 2019-07-17 10:45:32 +0200 |
commit | f6da2a55081daba10a285c2d1a77cd928ebd2854 (patch) | |
tree | 679893c8bb66018a94ae6ddcb410134eeba4a8f3 | |
parent | 06e5daf5758ffdc06a5a96ab0fe58552732e35d1 (diff) |
spirv_extensions: define spirv_extensions_supported
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 <[email protected]>
Signed-off-by: Arcady Goldmints-Orlov <[email protected]>
Reviewed-by: Caio Marcelo de Oliveira Filho <[email protected]>
-rw-r--r-- | src/mesa/main/spirv_extensions.c | 32 | ||||
-rw-r--r-- | src/mesa/main/spirv_extensions.h | 11 |
2 files changed, 43 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++; + } +} diff --git a/src/mesa/main/spirv_extensions.h b/src/mesa/main/spirv_extensions.h index 6c8b8275945..9372f505f25 100644 --- a/src/mesa/main/spirv_extensions.h +++ b/src/mesa/main/spirv_extensions.h @@ -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 |