mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-29 22:30:24 +01:00
glsl: propagate pragma info down into compiler from preprocessor
This commit is contained in:
parent
aac4a0509e
commit
fae9604727
8 changed files with 90 additions and 24 deletions
|
|
@ -2094,6 +2094,13 @@ struct gl_query_state
|
|||
};
|
||||
|
||||
|
||||
/** Set by #pragma directives */
|
||||
struct gl_sl_pragmas
|
||||
{
|
||||
GLboolean Optimize; /**< defaults on */
|
||||
GLboolean Debug; /**< defaults off */
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* A GLSL vertex or fragment shader object.
|
||||
|
|
@ -2104,12 +2111,12 @@ struct gl_shader
|
|||
GLuint Name; /**< AKA the handle */
|
||||
GLint RefCount; /**< Reference count */
|
||||
GLboolean DeletePending;
|
||||
|
||||
const GLchar *Source; /**< Source code string */
|
||||
GLboolean CompileStatus;
|
||||
GLboolean Main; /**< shader defines main() */
|
||||
const GLchar *Source; /**< Source code string */
|
||||
struct gl_program *Program; /**< Post-compile assembly code */
|
||||
GLchar *InfoLog;
|
||||
GLboolean Main; /**< shader defines main() */
|
||||
struct gl_sl_pragmas Pragmas;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -4493,7 +4493,7 @@ _slang_codegen_global_variable(slang_assemble_ctx *A, slang_variable *var,
|
|||
n = _slang_gen_var_decl(A, var, var->initializer);
|
||||
|
||||
/* emit GPU instructions */
|
||||
success = _slang_emit_code(n, A->vartable, A->program, GL_FALSE, A->log);
|
||||
success = _slang_emit_code(n, A->vartable, A->program, A->pragmas, GL_FALSE, A->log);
|
||||
|
||||
_slang_free_ir_tree(n);
|
||||
}
|
||||
|
|
@ -4603,7 +4603,7 @@ _slang_codegen_function(slang_assemble_ctx * A, slang_function * fun)
|
|||
#endif
|
||||
|
||||
/* Emit program instructions */
|
||||
success = _slang_emit_code(n, A->vartable, A->program, GL_TRUE, A->log);
|
||||
success = _slang_emit_code(n, A->vartable, A->program, A->pragmas, GL_TRUE, A->log);
|
||||
_slang_free_ir_tree(n);
|
||||
|
||||
/* free codegen context */
|
||||
|
|
|
|||
|
|
@ -36,6 +36,7 @@ typedef struct slang_assemble_ctx_
|
|||
slang_atom_pool *atoms;
|
||||
slang_name_space space;
|
||||
struct gl_program *program;
|
||||
struct gl_sl_pragmas *pragmas;
|
||||
slang_var_table *vartable;
|
||||
slang_info_log *log;
|
||||
struct slang_label_ *curFuncEndLabel;
|
||||
|
|
|
|||
|
|
@ -144,6 +144,7 @@ typedef struct slang_output_ctx_
|
|||
slang_function_scope *funs;
|
||||
slang_struct_scope *structs;
|
||||
struct gl_program *program;
|
||||
struct gl_sl_pragmas *pragmas;
|
||||
slang_var_table *vartable;
|
||||
GLuint default_precision[TYPE_SPECIFIER_COUNT];
|
||||
GLboolean allow_precision;
|
||||
|
|
@ -2059,6 +2060,7 @@ parse_init_declarator(slang_parse_ctx * C, slang_output_ctx * O,
|
|||
A.space.structs = O->structs;
|
||||
A.space.vars = O->vars;
|
||||
A.program = O->program;
|
||||
A.pragmas = O->pragmas;
|
||||
A.vartable = O->vartable;
|
||||
A.log = C->L;
|
||||
A.curFuncEndLabel = NULL;
|
||||
|
|
@ -2349,6 +2351,7 @@ parse_code_unit(slang_parse_ctx * C, slang_code_unit * unit,
|
|||
o.structs = &unit->structs;
|
||||
o.vars = &unit->vars;
|
||||
o.program = shader ? shader->Program : NULL;
|
||||
o.pragmas = shader ? &shader->Pragmas : NULL;
|
||||
o.vartable = _slang_new_var_table(maxRegs);
|
||||
_slang_push_var_table(o.vartable);
|
||||
|
||||
|
|
@ -2417,6 +2420,7 @@ parse_code_unit(slang_parse_ctx * C, slang_code_unit * unit,
|
|||
A.space.structs = o.structs;
|
||||
A.space.vars = o.vars;
|
||||
A.program = o.program;
|
||||
A.pragmas = &shader->Pragmas;
|
||||
A.vartable = o.vartable;
|
||||
A.log = C->L;
|
||||
|
||||
|
|
@ -2475,7 +2479,8 @@ compile_with_grammar(grammar id, const char *source, slang_code_unit * unit,
|
|||
slang_unit_type type, slang_info_log * infolog,
|
||||
slang_code_unit * builtin,
|
||||
struct gl_shader *shader,
|
||||
const struct gl_extensions *extensions)
|
||||
const struct gl_extensions *extensions,
|
||||
struct gl_sl_pragmas *pragmas)
|
||||
{
|
||||
byte *prod;
|
||||
GLuint size, start, version;
|
||||
|
|
@ -2504,7 +2509,7 @@ compile_with_grammar(grammar id, const char *source, slang_code_unit * unit,
|
|||
/* Now preprocess the source string. */
|
||||
slang_string_init(&preprocessed);
|
||||
if (!_slang_preprocess_directives(&preprocessed, &source[start],
|
||||
infolog, extensions)) {
|
||||
infolog, extensions, pragmas)) {
|
||||
slang_string_free(&preprocessed);
|
||||
slang_info_log_error(infolog, "failed to preprocess the source.");
|
||||
return GL_FALSE;
|
||||
|
|
@ -2578,7 +2583,8 @@ static GLboolean
|
|||
compile_object(grammar * id, const char *source, slang_code_object * object,
|
||||
slang_unit_type type, slang_info_log * infolog,
|
||||
struct gl_shader *shader,
|
||||
const struct gl_extensions *extensions)
|
||||
const struct gl_extensions *extensions,
|
||||
struct gl_sl_pragmas *pragmas)
|
||||
{
|
||||
slang_code_unit *builtins = NULL;
|
||||
GLuint base_version = 110;
|
||||
|
|
@ -2677,7 +2683,7 @@ compile_object(grammar * id, const char *source, slang_code_object * object,
|
|||
|
||||
/* compile the actual shader - pass-in built-in library for external shader */
|
||||
return compile_with_grammar(*id, source, &object->unit, type, infolog,
|
||||
builtins, shader, extensions);
|
||||
builtins, shader, extensions, pragmas);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -2701,7 +2707,7 @@ compile_shader(GLcontext *ctx, slang_code_object * object,
|
|||
_slang_code_object_ctr(object);
|
||||
|
||||
success = compile_object(&id, shader->Source, object, type, infolog, shader,
|
||||
&ctx->Extensions);
|
||||
&ctx->Extensions, &shader->Pragmas);
|
||||
if (id != 0)
|
||||
grammar_destroy(id);
|
||||
if (!success)
|
||||
|
|
|
|||
|
|
@ -2377,10 +2377,20 @@ _slang_resolve_subroutines(slang_emit_info *emitInfo)
|
|||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Convert the IR tree into GPU instructions.
|
||||
* \param n root of IR tree
|
||||
* \param vt variable table
|
||||
* \param prog program to put GPU instructions into
|
||||
* \param pragmas controls codegen options
|
||||
* \param withEnd if true, emit END opcode at end
|
||||
* \param log log for emitting errors/warnings/info
|
||||
*/
|
||||
GLboolean
|
||||
_slang_emit_code(slang_ir_node *n, slang_var_table *vt,
|
||||
struct gl_program *prog, GLboolean withEnd,
|
||||
struct gl_program *prog,
|
||||
const struct gl_sl_pragmas *pragmas,
|
||||
GLboolean withEnd,
|
||||
slang_info_log *log)
|
||||
{
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
|
|
@ -2397,7 +2407,7 @@ _slang_emit_code(slang_ir_node *n, slang_var_table *vt,
|
|||
|
||||
emitInfo.EmitHighLevelInstructions = ctx->Shader.EmitHighLevelInstructions;
|
||||
emitInfo.EmitCondCodes = ctx->Shader.EmitCondCodes;
|
||||
emitInfo.EmitComments = ctx->Shader.EmitComments;
|
||||
emitInfo.EmitComments = ctx->Shader.EmitComments || pragmas->Debug;
|
||||
emitInfo.EmitBeginEndSub = GL_TRUE;
|
||||
|
||||
if (!emitInfo.EmitCondCodes) {
|
||||
|
|
|
|||
|
|
@ -46,7 +46,9 @@ _slang_var_swizzle(GLint size, GLint comp);
|
|||
|
||||
extern GLboolean
|
||||
_slang_emit_code(slang_ir_node *n, slang_var_table *vartable,
|
||||
struct gl_program *prog, GLboolean withEnd,
|
||||
struct gl_program *prog,
|
||||
const struct gl_sl_pragmas *pragmas,
|
||||
GLboolean withEnd,
|
||||
slang_info_log *log);
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -531,17 +531,53 @@ pp_ext_set(pp_ext *self, const char *name, GLboolean enable)
|
|||
}
|
||||
|
||||
|
||||
static void
|
||||
pp_pragmas_init(struct gl_sl_pragmas *pragmas)
|
||||
{
|
||||
pragmas->Optimize = GL_TRUE;
|
||||
pragmas->Debug = GL_FALSE;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Called in response to #pragma. For example, "#pragma debug(on)" would
|
||||
* call this function as pp_pragma("debug", "on").
|
||||
* At this time, pragmas are silently ignored.
|
||||
* \return GL_TRUE if pragma is valid, GL_FALSE if invalid
|
||||
*/
|
||||
static void
|
||||
pp_pragma(const char *pragma, const char *param)
|
||||
static GLboolean
|
||||
pp_pragma(struct gl_sl_pragmas *pragmas, const char *pragma, const char *param)
|
||||
{
|
||||
#if 0
|
||||
printf("#pragma %s %s\n", pragma, param);
|
||||
#endif
|
||||
if (_mesa_strcmp(pragma, "optimize") == 0) {
|
||||
if (!param)
|
||||
return GL_FALSE; /* missing required param */
|
||||
if (_mesa_strcmp(param, "on") == 0) {
|
||||
pragmas->Optimize = GL_TRUE;
|
||||
}
|
||||
else if (_mesa_strcmp(param, "off") == 0) {
|
||||
pragmas->Optimize = GL_FALSE;
|
||||
}
|
||||
else {
|
||||
return GL_FALSE; /* invalid param */
|
||||
}
|
||||
}
|
||||
else if (_mesa_strcmp(pragma, "debug") == 0) {
|
||||
if (!param)
|
||||
return GL_FALSE; /* missing required param */
|
||||
if (_mesa_strcmp(param, "on") == 0) {
|
||||
pragmas->Debug = GL_TRUE;
|
||||
}
|
||||
else if (_mesa_strcmp(param, "off") == 0) {
|
||||
pragmas->Debug = GL_FALSE;
|
||||
}
|
||||
else {
|
||||
return GL_FALSE; /* invalid param */
|
||||
}
|
||||
}
|
||||
/* all other pragmas are silently ignored */
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -887,7 +923,8 @@ static GLboolean
|
|||
preprocess_source (slang_string *output, const char *source,
|
||||
grammar pid, grammar eid,
|
||||
slang_info_log *elog,
|
||||
const struct gl_extensions *extensions)
|
||||
const struct gl_extensions *extensions,
|
||||
struct gl_sl_pragmas *pragmas)
|
||||
{
|
||||
static const char *predefined[] = {
|
||||
"__FILE__",
|
||||
|
|
@ -909,6 +946,7 @@ preprocess_source (slang_string *output, const char *source,
|
|||
}
|
||||
|
||||
pp_state_init (&state, elog, extensions);
|
||||
pp_pragmas_init (pragmas);
|
||||
|
||||
/* add the predefined symbols to the symbol table */
|
||||
for (i = 0; predefined[i]; i++) {
|
||||
|
|
@ -1197,7 +1235,7 @@ preprocess_source (slang_string *output, const char *source,
|
|||
else {
|
||||
param = NULL;
|
||||
}
|
||||
pp_pragma(pragma, param);
|
||||
pp_pragma(pragmas, pragma, param);
|
||||
}
|
||||
break;
|
||||
|
||||
|
|
@ -1265,7 +1303,8 @@ GLboolean
|
|||
_slang_preprocess_directives(slang_string *output,
|
||||
const char *input,
|
||||
slang_info_log *elog,
|
||||
const struct gl_extensions *extensions)
|
||||
const struct gl_extensions *extensions,
|
||||
struct gl_sl_pragmas *pragmas)
|
||||
{
|
||||
grammar pid, eid;
|
||||
GLboolean success;
|
||||
|
|
@ -1281,7 +1320,7 @@ _slang_preprocess_directives(slang_string *output,
|
|||
grammar_destroy (pid);
|
||||
return GL_FALSE;
|
||||
}
|
||||
success = preprocess_source (output, input, pid, eid, elog, extensions);
|
||||
success = preprocess_source (output, input, pid, eid, elog, extensions, pragmas);
|
||||
grammar_destroy (eid);
|
||||
grammar_destroy (pid);
|
||||
return success;
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 6.5.3
|
||||
*
|
||||
* Copyright (C) 2005-2007 Brian Paul All Rights Reserved.
|
||||
* Copyright (C) 2005-2008 Brian Paul All Rights Reserved.
|
||||
* Copyright (C) 2009 VMware, Inc. All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
|
|
@ -35,6 +35,7 @@ _slang_preprocess_version (const char *, GLuint *, GLuint *, slang_info_log *);
|
|||
extern GLboolean
|
||||
_slang_preprocess_directives(slang_string *output, const char *input,
|
||||
slang_info_log *,
|
||||
const struct gl_extensions *extensions);
|
||||
const struct gl_extensions *extensions,
|
||||
struct gl_sl_pragmas *pragmas);
|
||||
|
||||
#endif /* SLANG_PREPROCESS_H */
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue