mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-24 21:50:12 +01:00
glsl/pp: Add support for user-defined macros.
This commit is contained in:
parent
d1a09a9ba4
commit
22200bcafc
4 changed files with 57 additions and 0 deletions
|
|
@ -79,6 +79,31 @@ sl_pp_context_error_message(const struct sl_pp_context *context)
|
|||
return context->error_msg;
|
||||
}
|
||||
|
||||
int
|
||||
sl_pp_context_add_predefined(struct sl_pp_context *context,
|
||||
const char *name,
|
||||
const char *value)
|
||||
{
|
||||
struct sl_pp_predefined pre;
|
||||
|
||||
if (context->num_predefined == SL_PP_MAX_PREDEFINED) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
pre.name = sl_pp_context_add_unique_str(context, name);
|
||||
if (pre.name == -1) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
pre.value = sl_pp_context_add_unique_str(context, value);
|
||||
if (pre.value == -1) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
context->predefined[context->num_predefined++] = pre;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
sl_pp_context_add_unique_str(struct sl_pp_context *context,
|
||||
const char *str)
|
||||
|
|
|
|||
|
|
@ -39,11 +39,18 @@
|
|||
|
||||
#define SL_PP_MAX_EXTENSIONS 16
|
||||
|
||||
#define SL_PP_MAX_PREDEFINED 16
|
||||
|
||||
struct sl_pp_extension {
|
||||
int name; /*< VENDOR_extension_name */
|
||||
int name_string; /*< GL_VENDOR_extension_name */
|
||||
};
|
||||
|
||||
struct sl_pp_predefined {
|
||||
int name;
|
||||
int value;
|
||||
};
|
||||
|
||||
struct sl_pp_context {
|
||||
char *cstr_pool;
|
||||
unsigned int cstr_pool_max;
|
||||
|
|
@ -56,6 +63,9 @@ struct sl_pp_context {
|
|||
struct sl_pp_extension extensions[SL_PP_MAX_EXTENSIONS];
|
||||
unsigned int num_extensions;
|
||||
|
||||
struct sl_pp_predefined predefined[SL_PP_MAX_PREDEFINED];
|
||||
unsigned int num_predefined;
|
||||
|
||||
unsigned int if_stack[SL_PP_MAX_IF_NESTING];
|
||||
unsigned int if_ptr;
|
||||
unsigned int if_value;
|
||||
|
|
|
|||
|
|
@ -163,6 +163,23 @@ sl_pp_macro_expand(struct sl_pp_context *context,
|
|||
return 0;
|
||||
}
|
||||
|
||||
for (j = 0; j < context->num_predefined; j++) {
|
||||
if (macro_name == context->predefined[j].name) {
|
||||
if (!mute) {
|
||||
struct sl_pp_token_info ti;
|
||||
|
||||
ti.token = SL_PP_UINT;
|
||||
ti.data._uint = context->predefined[j].value;
|
||||
if (sl_pp_process_out(state, &ti)) {
|
||||
strcpy(context->error_msg, "out of memory");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
(*pi)++;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* Replace extension names with 1.
|
||||
*/
|
||||
for (j = 0; j < context->num_extensions; j++) {
|
||||
|
|
|
|||
|
|
@ -50,6 +50,11 @@ sl_pp_context_add_extension(struct sl_pp_context *context,
|
|||
const char *name,
|
||||
const char *name_string);
|
||||
|
||||
int
|
||||
sl_pp_context_add_predefined(struct sl_pp_context *context,
|
||||
const char *name,
|
||||
const char *value);
|
||||
|
||||
int
|
||||
sl_pp_context_add_unique_str(struct sl_pp_context *context,
|
||||
const char *str);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue