On 04/13/2011 01:27 PM, Eric Anholt wrote:
Fixes fbo-drawbuffers-arbfp.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=34321
---
  src/mesa/program/program_parse.y  |   29 +++++++++++++++++++++++++++++
  src/mesa/program/program_parser.h |    1 +
  2 files changed, 30 insertions(+), 0 deletions(-)

diff --git a/src/mesa/program/program_parse.y b/src/mesa/program/program_parse.y
index 19aa8cc..b35bc5a 100644
--- a/src/mesa/program/program_parse.y
+++ b/src/mesa/program/program_parse.y
@@ -2064,6 +2064,34 @@ optResultFaceType:
              ? VERT_RESULT_COL0
              : FRAG_RESULT_COLOR;
        }
+       | '[' INTEGER ']'
+       {
+          if (state->mode == ARB_vertex) {
+             yyerror(&  @1, state, "invalid program result name");
+             YYERROR;
+          } else {
+             if (!state->option.DrawBuffers) {
+                /* From the ARB_draw_buffers spec (same text exists
+                 * for ATI_draw_buffers):
+                 *
+                 *     If this option is not specified, a fragment
+                 *     program that attempts to bind
+                 *     "result.color[n]" will fail to load, and only
+                 *     "result.color" will be allowed.
+                 */
+                yyerror(&  @1, state,
+                        "result.color[] used without "
+                        "`OPTION ARB_draw_buffers' or "
+                        "`OPTION ATI_draw_buffers'");
+                YYERROR;
+             } else if ($2>= state->MaxDrawBuffers) {
+                yyerror(&  @1, state,
+                        "result.color[] exceeds MAX_DRAW_BUFFERS_ARB");
+                YYERROR;
+             }
+             $$ = FRAG_RESULT_DATA0 + $2;
+          }
+       }
        | FRONT
        {
           if (state->mode == ARB_vertex) {
@@ -2681,6 +2709,7 @@ _mesa_parse_arb_program(struct gl_context *ctx, GLenum 
target, const GLubyte *st
     state->MaxClipPlanes = ctx->Const.MaxClipPlanes;
     state->MaxLights = ctx->Const.MaxLights;
     state->MaxProgramMatrices = ctx->Const.MaxProgramMatrices;
+   state->MaxDrawBuffers = ctx->Const.MaxDrawBuffers;

     state->state_param_enum = (target == GL_VERTEX_PROGRAM_ARB)
        ? STATE_VERTEX_PROGRAM : STATE_FRAGMENT_PROGRAM;
diff --git a/src/mesa/program/program_parser.h 
b/src/mesa/program/program_parser.h
index d689eef..8e5aaee 100644
--- a/src/mesa/program/program_parser.h
+++ b/src/mesa/program/program_parser.h
@@ -173,6 +173,7 @@ struct asm_parser_state {
     unsigned MaxClipPlanes;
     unsigned MaxLights;
     unsigned MaxProgramMatrices;
+   unsigned MaxDrawBuffers;
     /*@}*/

     /**

For the series:

Signed-off-by: Brian Paul <bri...@vmware.com>

-Brian
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to