diff options
Diffstat (limited to 'src/mesa/shader')
| -rw-r--r-- | src/mesa/shader/arbprogparse.c | 5 | ||||
| -rw-r--r-- | src/mesa/shader/slang/slang_preprocess.c | 83 | 
2 files changed, 84 insertions, 4 deletions
| diff --git a/src/mesa/shader/arbprogparse.c b/src/mesa/shader/arbprogparse.c index a90ce95a63..7e166830fd 100644 --- a/src/mesa/shader/arbprogparse.c +++ b/src/mesa/shader/arbprogparse.c @@ -1022,7 +1022,10 @@ parse_teximage_num (GLcontext * ctx, const GLubyte ** inst,     GLint i = parse_integer (inst, Program);     if ((i < 0) || (i >= (int)ctx->Const.MaxTextureImageUnits)) { -      program_error(ctx, Program->Position, "Invalid texture image index"); +      char s[100]; +      _mesa_snprintf(s, sizeof(s), "Invalid texture image index %d (%u is max)", +                     i, ctx->Const.MaxTextureImageUnits); +      program_error(ctx, Program->Position, s);        return 1;     } diff --git a/src/mesa/shader/slang/slang_preprocess.c b/src/mesa/shader/slang/slang_preprocess.c index c16a111132..e9a24cc009 100644 --- a/src/mesa/shader/slang/slang_preprocess.c +++ b/src/mesa/shader/slang/slang_preprocess.c @@ -1053,8 +1053,23 @@ preprocess_source (slang_string *output, const char *source,                 id = (const char *) (&prod[i]);                 idlen = _mesa_strlen (id);                 if (state.cond.top->effective) { +                  slang_string replacement; +                  expand_state es; +                    pp_annotate (output, ") %s", id); -                  slang_string_pushs (&symbol->replacement, id, idlen); + +                  slang_string_init(&replacement); +                  slang_string_pushs(&replacement, id, idlen); + +                  /* Expand macro replacement. */ +                  es.output = &symbol->replacement; +                  es.input = slang_string_cstr(&replacement); +                  es.state = &state; +                  if (!expand(&es, &state.symbols)) { +                     slang_string_free(&replacement); +                     goto error; +                  } +                  slang_string_free(&replacement);                 }                 i += idlen + 1;              } @@ -1286,6 +1301,45 @@ error:  /** + * Remove the continuation characters from the input string. + * This is the very first step in preprocessing and is effective + * even inside comment blocks. + * If there is a whitespace between a backslash and a newline, + * this is not considered as a line continuation. + * \return GL_TRUE for success, GL_FALSE otherwise. + */ +static GLboolean +_slang_preprocess_backslashes(slang_string *output, +                              const char *input) +{ +   while (*input) { +      if (input[0] == '\\') { +         /* If a newline follows, eat the backslash and the newline. */ +         if (input[1] == '\r') { +            if (input[2] == '\n') { +               input += 3; +            } else { +               input += 2; +            } +         } else if (input[1] == '\n') { +            if (input[2] == '\r') { +               input += 3; +            } else { +               input += 2; +            } +         } else { +            /* Leave the backslash alone. */ +            slang_string_pushc(output, *input++); +         } +      } else { +         slang_string_pushc(output, *input++); +      } +   } +   return GL_TRUE; +} + + +/**   * Run preprocessor on source code.   * \param extensions  indicates which GL extensions are enabled   * \param output  the post-process results @@ -1304,6 +1358,7 @@ _slang_preprocess_directives(slang_string *output,  {     grammar pid, eid;     GLboolean success; +   slang_string without_backslashes;     pid = grammar_load_from_text ((const byte *) (slang_pp_directives_syn));     if (pid == 0) { @@ -1316,14 +1371,36 @@ _slang_preprocess_directives(slang_string *output,        grammar_destroy (pid);        return GL_FALSE;     } -   success = preprocess_source (output, input, pid, eid, elog, extensions, pragmas); + +   slang_string_init(&without_backslashes); +   success = _slang_preprocess_backslashes(&without_backslashes, input); + +   if (0) { +      _mesa_printf("Pre-processed shader:\n"); +      _mesa_printf("%s", slang_string_cstr(&without_backslashes)); +      _mesa_printf("----------------------\n"); +   } + +   if (success) { +      success = preprocess_source(output, +                                  slang_string_cstr(&without_backslashes), +                                  pid, +                                  eid, +                                  elog, +                                  extensions, +                                  pragmas); +   } + +   slang_string_free(&without_backslashes);     grammar_destroy (eid);     grammar_destroy (pid); +     if (0) {        _mesa_printf("Post-processed shader:\n"); -      _mesa_printf("%s", output->data); +      _mesa_printf("%s", slang_string_cstr(output));        _mesa_printf("----------------------\n");     } +     return success;  } | 
