mesa: Add support for the ARB_fragment_program part of ARB_draw_buffers.

Fixes fbo-drawbuffers-arbfp.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=34321
Reviewed-by: Brian Paul <brianp@vmware.com>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
This commit is contained in:
Eric Anholt
2011-04-13 11:09:55 -07:00
parent 4847f802c2
commit 28cec9e832
2 changed files with 30 additions and 0 deletions

View File

@@ -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;