diff options
Diffstat (limited to 'mesalib/src/glsl')
-rw-r--r-- | mesalib/src/glsl/glcpp/glcpp-parse.y | 89 | ||||
-rw-r--r-- | mesalib/src/glsl/ir_validate.cpp | 1 | ||||
-rw-r--r-- | mesalib/src/glsl/linker.cpp | 146 | ||||
-rw-r--r-- | mesalib/src/glsl/opt_function_inlining.cpp | 1 | ||||
-rw-r--r-- | mesalib/src/glsl/standalone_scaffolding.cpp | 1 |
5 files changed, 121 insertions, 117 deletions
diff --git a/mesalib/src/glsl/glcpp/glcpp-parse.y b/mesalib/src/glsl/glcpp/glcpp-parse.y index 940830416..17941a9be 100644 --- a/mesalib/src/glsl/glcpp/glcpp-parse.y +++ b/mesalib/src/glsl/glcpp/glcpp-parse.y @@ -1275,6 +1275,48 @@ _glcpp_parser_expand_if (glcpp_parser_t *parser, int type, token_list_t *list) glcpp_parser_lex_from (parser, expanded); } +static void +_glcpp_parser_apply_pastes (glcpp_parser_t *parser, token_list_t *list) +{ + token_node_t *node; + + node = list->head; + while (node) + { + token_node_t *next_non_space; + + /* Look ahead for a PASTE token, skipping space. */ + next_non_space = node->next; + while (next_non_space && next_non_space->token->type == SPACE) + next_non_space = next_non_space->next; + + if (next_non_space == NULL) + break; + + if (next_non_space->token->type != PASTE) { + node = next_non_space; + continue; + } + + /* Now find the next non-space token after the PASTE. */ + next_non_space = next_non_space->next; + while (next_non_space && next_non_space->token->type == SPACE) + next_non_space = next_non_space->next; + + if (next_non_space == NULL) { + yyerror (&node->token->location, parser, "'##' cannot appear at either end of a macro expansion\n"); + return; + } + + node->token = _token_paste (parser, node->token, next_non_space->token); + node->next = next_non_space->next; + if (next_non_space == list->tail) + list->tail = node; + } + + list->non_space_tail = list->tail; +} + /* This is a helper function that's essentially part of the * implementation of _glcpp_parser_expand_node. It shouldn't be called * except for by that function. @@ -1386,43 +1428,7 @@ _glcpp_parser_expand_function (glcpp_parser_t *parser, _token_list_trim_trailing_space (substituted); - node = substituted->head; - while (node) - { - token_node_t *next_non_space; - - /* Look ahead for a PASTE token, skipping space. */ - next_non_space = node->next; - while (next_non_space && next_non_space->token->type == SPACE) - next_non_space = next_non_space->next; - - if (next_non_space == NULL) - break; - - if (next_non_space->token->type != PASTE) { - node = next_non_space; - continue; - } - - /* Now find the next non-space token after the PASTE. */ - next_non_space = next_non_space->next; - while (next_non_space && next_non_space->token->type == SPACE) - next_non_space = next_non_space->next; - - if (next_non_space == NULL) { - yyerror (&node->token->location, parser, "'##' cannot appear at either end of a macro expansion\n"); - return NULL; - } - - node->token = _token_paste (parser, node->token, next_non_space->token); - node->next = next_non_space->next; - if (next_non_space == substituted->tail) - substituted->tail = node; - - node = node->next; - } - - substituted->non_space_tail = substituted->tail; + _glcpp_parser_apply_pastes (parser, substituted); return substituted; } @@ -1492,13 +1498,16 @@ _glcpp_parser_expand_node (glcpp_parser_t *parser, if (! macro->is_function) { + token_list_t *replacement; *last = node; /* Replace a macro defined as empty with a SPACE token. */ if (macro->replacements == NULL) return _token_list_create_with_one_space (parser); - return _token_list_copy (parser, macro->replacements); + replacement = _token_list_copy (parser, macro->replacements); + _glcpp_parser_apply_pastes (parser, replacement); + return replacement; } return _glcpp_parser_expand_function (parser, node, last); @@ -1654,8 +1663,8 @@ _check_for_reserved_macro_name (glcpp_parser_t *parser, YYLTYPE *loc, /* According to the GLSL specification, macro names starting with "__" * or "GL_" are reserved for future use. So, don't allow them. */ - if (strncmp(identifier, "__", 2) == 0) { - glcpp_error (loc, parser, "Macro names starting with \"__\" are reserved.\n"); + if (strstr(identifier, "__")) { + glcpp_error (loc, parser, "Macro names containing \"__\" are reserved.\n"); } if (strncmp(identifier, "GL_", 3) == 0) { glcpp_error (loc, parser, "Macro names starting with \"GL_\" are reserved.\n"); diff --git a/mesalib/src/glsl/ir_validate.cpp b/mesalib/src/glsl/ir_validate.cpp index 2d1c6097c..c387ecbca 100644 --- a/mesalib/src/glsl/ir_validate.cpp +++ b/mesalib/src/glsl/ir_validate.cpp @@ -33,7 +33,6 @@ * a dereference chain. */ -#include <inttypes.h> #include "ir.h" #include "ir_hierarchical_visitor.h" #include "program/hash_table.h" diff --git a/mesalib/src/glsl/linker.cpp b/mesalib/src/glsl/linker.cpp index d802a0a9b..9463f5305 100644 --- a/mesalib/src/glsl/linker.cpp +++ b/mesalib/src/glsl/linker.cpp @@ -1298,71 +1298,6 @@ assign_attribute_or_color_locations(gl_shader_program *prog, invalidate_variable_locations(sh, direction, generic_base); - if ((target_index == MESA_SHADER_VERTEX) && (prog->Attributes != NULL)) { - for (unsigned i = 0; i < prog->Attributes->NumParameters; i++) { - ir_variable *const var = - sh->symbols->get_variable(prog->Attributes->Parameters[i].Name); - - /* Note: attributes that occupy multiple slots, such as arrays or - * matrices, may appear in the attrib array multiple times. - */ - if ((var == NULL) || (var->location != -1)) - continue; - - /* From page 61 of the OpenGL 4.0 spec: - * - * "LinkProgram will fail if the attribute bindings assigned by - * BindAttribLocation do not leave not enough space to assign a - * location for an active matrix attribute or an active attribute - * array, both of which require multiple contiguous generic - * attributes." - * - * Previous versions of the spec contain similar language but omit the - * bit about attribute arrays. - * - * Page 61 of the OpenGL 4.0 spec also says: - * - * "It is possible for an application to bind more than one - * attribute name to the same location. This is referred to as - * aliasing. This will only work if only one of the aliased - * attributes is active in the executable program, or if no path - * through the shader consumes more than one attribute of a set - * of attributes aliased to the same location. A link error can - * occur if the linker determines that every path through the - * shader consumes multiple aliased attributes, but - * implementations are not required to generate an error in this - * case." - * - * These two paragraphs are either somewhat contradictory, or I don't - * fully understand one or both of them. - */ - /* FINISHME: The code as currently written does not support attribute - * FINISHME: location aliasing (see comment above). - */ - const int attr = prog->Attributes->Parameters[i].StateIndexes[0]; - const unsigned slots = count_attribute_slots(var->type); - - /* Mask representing the contiguous slots that will be used by this - * attribute. - */ - const unsigned use_mask = (1 << slots) - 1; - - /* Generate a link error if the set of bits requested for this - * attribute overlaps any previously allocated bits. - */ - if ((~(use_mask << attr) & used_locations) != used_locations) { - linker_error(prog, - "insufficient contiguous attribute locations " - "available for vertex shader input `%s'", - var->name); - return false; - } - - var->location = VERT_ATTRIB_GENERIC0 + attr; - used_locations |= (use_mask << attr); - } - } - /* Temporary storage for the set of attributes that need locations assigned. */ struct temp_attr { @@ -1389,28 +1324,83 @@ assign_attribute_or_color_locations(gl_shader_program *prog, continue; if (var->explicit_location) { - const unsigned slots = count_attribute_slots(var->type); - const unsigned use_mask = (1 << slots) - 1; - const int attr = var->location - generic_base; - if ((var->location >= (int)(max_index + generic_base)) || (var->location < 0)) { linker_error(prog, "invalid explicit location %d specified for `%s'\n", - (var->location < 0) ? var->location : attr, + (var->location < 0) + ? var->location : var->location - generic_base, var->name); return false; - } else if (var->location >= generic_base) { - used_locations |= (use_mask << attr); + } + } else if (target_index == MESA_SHADER_VERTEX) { + unsigned binding; + + if (prog->AttributeBindings->get(binding, var->name)) { + assert(binding >= VERT_ATTRIB_GENERIC0); + var->location = binding; } } /* The location was explicitly assigned, nothing to do here. */ - if (var->location != -1) + const unsigned slots = count_attribute_slots(var->type); + if (var->location != -1) { + if (var->location >= generic_base) { + /* From page 61 of the OpenGL 4.0 spec: + * + * "LinkProgram will fail if the attribute bindings assigned + * by BindAttribLocation do not leave not enough space to + * assign a location for an active matrix attribute or an + * active attribute array, both of which require multiple + * contiguous generic attributes." + * + * Previous versions of the spec contain similar language but omit + * the bit about attribute arrays. + * + * Page 61 of the OpenGL 4.0 spec also says: + * + * "It is possible for an application to bind more than one + * attribute name to the same location. This is referred to as + * aliasing. This will only work if only one of the aliased + * attributes is active in the executable program, or if no + * path through the shader consumes more than one attribute of + * a set of attributes aliased to the same location. A link + * error can occur if the linker determines that every path + * through the shader consumes multiple aliased attributes, + * but implementations are not required to generate an error + * in this case." + * + * These two paragraphs are either somewhat contradictory, or I + * don't fully understand one or both of them. + */ + /* FINISHME: The code as currently written does not support + * FINISHME: attribute location aliasing (see comment above). + */ + /* Mask representing the contiguous slots that will be used by + * this attribute. + */ + const unsigned attr = var->location - generic_base; + const unsigned use_mask = (1 << slots) - 1; + + /* Generate a link error if the set of bits requested for this + * attribute overlaps any previously allocated bits. + */ + if ((~(use_mask << attr) & used_locations) != used_locations) { + linker_error(prog, + "insufficient contiguous attribute locations " + "available for vertex shader input `%s'", + var->name); + return false; + } + + used_locations |= (use_mask << attr); + } + continue; + } - to_assign[num_attr].slots = count_attribute_slots(var->type); + to_assign[num_attr].slots = slots; to_assign[num_attr].var = var; num_attr++; } @@ -1831,6 +1821,14 @@ done: /* Retain any live IR, but trash the rest. */ reparent_ir(prog->_LinkedShaders[i]->ir, prog->_LinkedShaders[i]->ir); + + /* The symbol table in the linked shaders may contain references to + * variables that were removed (e.g., unused uniforms). Since it may + * contain junk, there is no possible valid use. Delete it and set the + * pointer to NULL. + */ + delete prog->_LinkedShaders[i]->symbols; + prog->_LinkedShaders[i]->symbols = NULL; } ralloc_free(mem_ctx); diff --git a/mesalib/src/glsl/opt_function_inlining.cpp b/mesalib/src/glsl/opt_function_inlining.cpp index 8fef358cc..ec8b72c63 100644 --- a/mesalib/src/glsl/opt_function_inlining.cpp +++ b/mesalib/src/glsl/opt_function_inlining.cpp @@ -27,7 +27,6 @@ * Replaces calls to functions with the body of the function. */ -#include <inttypes.h> #include "ir.h" #include "ir_visitor.h" #include "ir_function_inlining.h" diff --git a/mesalib/src/glsl/standalone_scaffolding.cpp b/mesalib/src/glsl/standalone_scaffolding.cpp index 72aa1e428..5cc6c9879 100644 --- a/mesalib/src/glsl/standalone_scaffolding.cpp +++ b/mesalib/src/glsl/standalone_scaffolding.cpp @@ -67,7 +67,6 @@ void initialize_context_to_defaults(struct gl_context *ctx, gl_api api) ctx->Extensions.dummy_false = false; ctx->Extensions.dummy_true = true; ctx->Extensions.ARB_ES2_compatibility = true; - ctx->Extensions.ARB_draw_buffers = true; ctx->Extensions.ARB_draw_instanced = true; ctx->Extensions.ARB_fragment_coord_conventions = true; ctx->Extensions.EXT_texture_array = true; |