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 <apinheiro@igalia.com>
Signed-off-by: Arcady Goldmints-Orlov <agoldmints@igalia.com>
Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@intel.com>
This commit is contained in:
parent
06e5daf575
commit
f6da2a5508
2 changed files with 43 additions and 0 deletions
|
|
@ -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++;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue