[Mesa-dev] [PATCH 1/3] mesa: Add support for the ARB_fragment_program part of ARB_draw_buffers.

Brian Paul brianp at vmware.com
Wed Apr 13 13:24:52 PDT 2011


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 <brianp at vmware.com>

-Brian


More information about the mesa-dev mailing list