mesa: new _mesa_set_vp_override() function for driver-override of vertex program

Patch provide by Keith.
Used in state tracker by DrawPixels to indicate that the state tracker (driver)
is using its own vertex program.  This prevents the texenvprogram code from
replacing conventional shader inputs with state vars.
Fixes glDraw/CopyPixels regressions.
This commit is contained in:
Brian Paul 2008-10-10 13:39:14 -06:00
parent f7556fdd40
commit 6d4d51d647
5 changed files with 57 additions and 11 deletions

View file

@ -2007,6 +2007,8 @@ struct gl_vertex_program_state
GLboolean CallbackEnabled;
GLuint CurrentPosition;
#endif
GLboolean _Overriden;
};

View file

@ -1,6 +1,6 @@
/*
* Mesa 3-D graphics library
* Version: 7.1
* Version: 7.3
*
* Copyright (C) 1999-2008 Brian Paul All Rights Reserved.
*
@ -466,10 +466,12 @@ _mesa_update_state_locked( GLcontext *ctx )
if (ctx->FragmentProgram._MaintainTexEnvProgram) {
prog_flags |= (_NEW_ARRAY | _NEW_TEXTURE_MATRIX | _NEW_LIGHT |
_NEW_RENDERMODE |
_NEW_TEXTURE | _NEW_FOG | _DD_NEW_SEPARATE_SPECULAR);
}
if (ctx->VertexProgram._MaintainTnlProgram) {
prog_flags |= (_NEW_ARRAY | _NEW_TEXTURE | _NEW_TEXTURE_MATRIX |
_NEW_RENDERMODE |
_NEW_TRANSFORM | _NEW_POINT |
_NEW_FOG | _NEW_LIGHT |
_MESA_NEW_NEED_EYE_COORDS);
@ -509,7 +511,8 @@ _mesa_update_state( GLcontext *ctx )
/* Want to figure out which fragment program inputs are actually
/**
* Want to figure out which fragment program inputs are actually
* constant/current values from ctx->Current. These should be
* referenced as a tracked state variable rather than a fragment
* program input, to save the overhead of putting a constant value in
@ -537,6 +540,26 @@ _mesa_set_varying_vp_inputs( GLcontext *ctx,
if (ctx->varying_vp_inputs != varying_inputs) {
ctx->varying_vp_inputs = varying_inputs;
ctx->NewState |= _NEW_ARRAY;
//_mesa_printf("%s %x\n", __FUNCTION__, varying_inputs);
/*_mesa_printf("%s %x\n", __FUNCTION__, varying_inputs);*/
}
}
/**
* Used by drivers to tell core Mesa that the driver is going to
* install/ use its own vertex program. In particular, this will
* prevent generated fragment programs from using state vars instead
* of ordinary varyings/inputs.
*/
void
_mesa_set_vp_override(GLcontext *ctx, GLboolean flag)
{
if (ctx->VertexProgram._Overriden != flag) {
ctx->VertexProgram._Overriden = flag;
/* Set one of the bits which will trigger fragment program
* regeneration:
*/
ctx->NewState |= _NEW_ARRAY;
}
}

View file

@ -1,6 +1,6 @@
/*
* Mesa 3-D graphics library
* Version: 7.1
* Version: 7.3
*
* Copyright (C) 1999-2008 Brian Paul All Rights Reserved.
*
@ -29,16 +29,21 @@
#include "mtypes.h"
extern void
_mesa_update_state( GLcontext *ctx );
_mesa_update_state(GLcontext *ctx);
/* As above but can only be called between _mesa_lock_context_textures() and
* _mesa_unlock_context_textures().
*/
extern void
_mesa_update_state_locked( GLcontext *ctx );
_mesa_update_state_locked(GLcontext *ctx);
extern void
_mesa_set_varying_vp_inputs(GLcontext *ctx, GLbitfield varying_inputs);
extern void
_mesa_set_vp_override(GLcontext *ctx, GLboolean flag);
void
_mesa_set_varying_vp_inputs( GLcontext *ctx,
GLbitfield varying_inputs );
#endif

View file

@ -205,8 +205,18 @@ static GLbitfield get_fp_input_mask( GLcontext *ctx )
{
GLbitfield fp_inputs = 0x0;
if (!ctx->VertexProgram._Enabled ||
!ctx->VertexProgram._Current) {
if (ctx->VertexProgram._Overriden) {
/* Somebody's messing with the vertex program and we don't have
* a clue what's happening. Assume that it could be producing
* all possible outputs.
*/
fp_inputs = ~0;
}
else if (ctx->RenderMode == GL_FEEDBACK) {
fp_inputs = (FRAG_BIT_COL0 | FRAG_BIT_TEX0);
}
else if (!ctx->VertexProgram._Enabled ||
!ctx->VertexProgram._Current) {
/* Fixed function logic */
GLbitfield varying_inputs = ctx->varying_vp_inputs;

View file

@ -35,6 +35,7 @@
#include "main/bufferobj.h"
#include "main/macros.h"
#include "main/texformat.h"
#include "main/state.h"
#include "shader/program.h"
#include "shader/prog_parameter.h"
#include "shader/prog_print.h"
@ -835,6 +836,9 @@ st_DrawPixels(GLcontext *ctx, GLint x, GLint y, GLsizei width, GLsizei height,
return;
}
_mesa_set_vp_override( ctx, TRUE );
_mesa_update_state( ctx );
st_validate_state(st);
if (format == GL_DEPTH_COMPONENT) {
@ -874,6 +878,8 @@ st_DrawPixels(GLcontext *ctx, GLint x, GLint y, GLsizei width, GLsizei height,
/* blit */
draw_blit(st, width, height, format, type, pixels);
}
_mesa_set_vp_override( ctx, FALSE );
}