mesa: new gl_fragment_program fields indicating use of fog, front-facing, point coord
This commit is contained in:
parent
3b3d34d637
commit
d7a7b0a10d
|
@ -1953,7 +1953,10 @@ struct gl_fragment_program
|
|||
{
|
||||
struct gl_program Base; /**< base class */
|
||||
GLenum FogOption;
|
||||
GLboolean UsesKill;
|
||||
GLboolean UsesKill; /**< shader uses KIL instruction */
|
||||
GLboolean UsesPointCoord; /**< shader uses gl_PointCoord */
|
||||
GLboolean UsesFrontFacing; /**< shader used gl_FrontFacing */
|
||||
GLboolean UsesFogFragCoord; /**< shader used gl_FogFragCoord */
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -42,6 +42,24 @@
|
|||
#include "slang_link.h"
|
||||
|
||||
|
||||
/** cast wrapper */
|
||||
static struct gl_vertex_program *
|
||||
vertex_program(struct gl_program *prog)
|
||||
{
|
||||
assert(prog->Target == GL_VERTEX_PROGRAM_ARB);
|
||||
return (struct gl_vertex_program *) prog;
|
||||
}
|
||||
|
||||
|
||||
/** cast wrapper */
|
||||
static struct gl_fragment_program *
|
||||
fragment_program(struct gl_program *prog)
|
||||
{
|
||||
assert(prog->Target == GL_FRAGMENT_PROGRAM_ARB);
|
||||
return (struct gl_fragment_program *) prog;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Record a linking error.
|
||||
*/
|
||||
|
@ -374,6 +392,20 @@ _slang_update_inputs_outputs(struct gl_program *prog)
|
|||
for (j = 0; j < numSrc; j++) {
|
||||
if (inst->SrcReg[j].File == PROGRAM_INPUT) {
|
||||
prog->InputsRead |= 1 << inst->SrcReg[j].Index;
|
||||
if (prog->Target == GL_FRAGMENT_PROGRAM_ARB &&
|
||||
inst->SrcReg[j].Index == FRAG_ATTRIB_FOGC) {
|
||||
/* The fragment shader FOGC input is used for fog,
|
||||
* front-facing and sprite/point coord.
|
||||
*/
|
||||
struct gl_fragment_program *fp = fragment_program(prog);
|
||||
const GLint swz = GET_SWZ(inst->SrcReg[j].Swizzle, 0);
|
||||
if (swz == SWIZZLE_X)
|
||||
fp->UsesFogFragCoord = GL_TRUE;
|
||||
else if (swz == SWIZZLE_Y)
|
||||
fp->UsesFrontFacing = GL_TRUE;
|
||||
else if (swz == SWIZZLE_Z || swz == SWIZZLE_W)
|
||||
fp->UsesPointCoord = GL_TRUE;
|
||||
}
|
||||
}
|
||||
else if (inst->SrcReg[j].File == PROGRAM_ADDRESS) {
|
||||
maxAddrReg = MAX2(maxAddrReg, inst->SrcReg[j].Index + 1);
|
||||
|
@ -391,24 +423,6 @@ _slang_update_inputs_outputs(struct gl_program *prog)
|
|||
}
|
||||
|
||||
|
||||
/** cast wrapper */
|
||||
static struct gl_vertex_program *
|
||||
vertex_program(struct gl_program *prog)
|
||||
{
|
||||
assert(prog->Target == GL_VERTEX_PROGRAM_ARB);
|
||||
return (struct gl_vertex_program *) prog;
|
||||
}
|
||||
|
||||
|
||||
/** cast wrapper */
|
||||
static struct gl_fragment_program *
|
||||
fragment_program(struct gl_program *prog)
|
||||
{
|
||||
assert(prog->Target == GL_FRAGMENT_PROGRAM_ARB);
|
||||
return (struct gl_fragment_program *) prog;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Shader linker. Currently:
|
||||
*
|
||||
|
|
Loading…
Reference in New Issue