mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-04 20:38:06 +02:00
sl/pp: re-do extension testing code
The #extension directive should not effect which extension preprocessor symbols are defined/undefined; only whether/how the compiler accepts language features defined by the extension.
This commit is contained in:
parent
f7aea808a4
commit
de5928a615
4 changed files with 36 additions and 7 deletions
|
|
@ -43,9 +43,16 @@
|
|||
|
||||
#define SL_PP_MAX_PREDEFINED 16
|
||||
|
||||
enum sl_pp_extension_state {
|
||||
SL_PP_EXTENSION_STATE_ENABLED,
|
||||
SL_PP_EXTENSION_STATE_DISABLED,
|
||||
SL_PP_EXTENSION_STATE_WARN,
|
||||
SL_PP_EXTENSION_STATE_REQUIRE
|
||||
};
|
||||
|
||||
struct sl_pp_extension {
|
||||
int name; /*< GL_VENDOR_extension_name */
|
||||
int enabled;
|
||||
enum sl_pp_extension_state state;
|
||||
};
|
||||
|
||||
struct sl_pp_predefined {
|
||||
|
|
|
|||
|
|
@ -53,7 +53,7 @@ sl_pp_context_add_extension(struct sl_pp_context *context,
|
|||
return -1;
|
||||
}
|
||||
|
||||
ext.enabled = 0;
|
||||
ext.state = SL_PP_EXTENSION_STATE_DISABLED;
|
||||
|
||||
context->extensions[context->num_extensions++] = ext;
|
||||
|
||||
|
|
@ -62,6 +62,24 @@ sl_pp_context_add_extension(struct sl_pp_context *context,
|
|||
return 0;
|
||||
}
|
||||
|
||||
|
||||
enum sl_pp_extension_state
|
||||
sl_pp_get_extension_state(const struct sl_pp_context *context,
|
||||
int extension_name)
|
||||
{
|
||||
unsigned i;
|
||||
|
||||
for (i = 0; i < context->num_extensions; i++) {
|
||||
if (extension_name == context->extensions[i].name) {
|
||||
return context->extensions[i].state;
|
||||
}
|
||||
}
|
||||
|
||||
assert(0 && "unknown extension");
|
||||
return SL_PP_EXTENSION_STATE_DISABLED;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Process a "#extension name: behavior" directive.
|
||||
*/
|
||||
|
|
@ -140,7 +158,7 @@ sl_pp_process_extension(struct sl_pp_context *context,
|
|||
|
||||
if (extension_name != context->dict.all) {
|
||||
assert(extension);
|
||||
extension->enabled = 1;
|
||||
extension->state = SL_PP_EXTENSION_STATE_REQUIRE;
|
||||
}
|
||||
} else if (behavior == context->dict.enable) {
|
||||
if (out.data.extension == -1) {
|
||||
|
|
@ -155,7 +173,7 @@ sl_pp_process_extension(struct sl_pp_context *context,
|
|||
|
||||
if (extension_name != context->dict.all) {
|
||||
assert(extension);
|
||||
extension->enabled = 1;
|
||||
extension->state = SL_PP_EXTENSION_STATE_ENABLED;
|
||||
}
|
||||
} else if (behavior == context->dict.warn) {
|
||||
if (out.data.extension == -1) {
|
||||
|
|
@ -166,7 +184,7 @@ sl_pp_process_extension(struct sl_pp_context *context,
|
|||
|
||||
if (extension_name != context->dict.all) {
|
||||
assert(extension);
|
||||
extension->enabled = 1;
|
||||
extension->state = SL_PP_EXTENSION_STATE_WARN;
|
||||
}
|
||||
} else if (behavior == context->dict.disable) {
|
||||
if (out.data.extension == -1) {
|
||||
|
|
@ -177,7 +195,7 @@ sl_pp_process_extension(struct sl_pp_context *context,
|
|||
|
||||
if (extension_name != context->dict.all) {
|
||||
assert(extension);
|
||||
extension->enabled = 0;
|
||||
extension->state = SL_PP_EXTENSION_STATE_DISABLED;
|
||||
}
|
||||
} else {
|
||||
strcpy(context->error_msg, "unrecognised behavior name");
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@ _macro_is_defined(struct sl_pp_context *context,
|
|||
|
||||
for (i = 0; i < context->num_extensions; i++) {
|
||||
if (macro_name == context->extensions[i].name) {
|
||||
return context->extensions[i].enabled;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -55,6 +55,10 @@ int
|
|||
sl_pp_context_add_extension(struct sl_pp_context *context,
|
||||
const char *name);
|
||||
|
||||
enum sl_pp_extension_state
|
||||
sl_pp_get_extension_state(const struct sl_pp_context *context,
|
||||
int extension_name);
|
||||
|
||||
int
|
||||
sl_pp_context_add_predefined(struct sl_pp_context *context,
|
||||
const char *name,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue