nouveau: maintain a map of which vtxprog input corresponds to which array

This commit is contained in:
Ben Skeggs 2007-01-27 18:36:01 +11:00
parent 0c5b42a991
commit cafbc459f5
2 changed files with 47 additions and 0 deletions

View file

@ -55,6 +55,7 @@ typedef struct _nouveauShader {
int inst_count;
nvsCardPriv card_priv;
int vp_attrib_map[NVS_MAX_ATTRIBS];
struct {
GLfloat *source_val; /* NULL if invariant */

View file

@ -787,6 +787,50 @@ pass0_translate_instructions(nouveauShader *nvs, int ipos, int fpos,
return GL_TRUE;
}
static void
pass0_build_attrib_map(nouveauShader *nvs, struct gl_vertex_program *vp)
{
GLuint inputs_read = vp->Base.InputsRead;
GLuint input_alloc = ~0xFFFF;
int i;
for (i=0; i<NVS_MAX_ATTRIBS; i++)
nvs->vp_attrib_map[i] = -1;
while (inputs_read) {
int in = ffs(inputs_read) - 1;
int hw;
inputs_read &= ~(1<<in);
if (vp->IsNVProgram) {
/* NVvp: must alias */
if (in >= VERT_ATTRIB_GENERIC0)
hw = in - VERT_ATTRIB_GENERIC0;
else
hw = in;
} else {
/* ARBvp: may alias
* GL2.0: must not alias
*/
if (in >= VERT_ATTRIB_GENERIC0)
hw = ffs(~input_alloc) - 1;
else
hw = in;
input_alloc |= (1<<hw);
}
nvs->vp_attrib_map[hw] = in;
}
if (NOUVEAU_DEBUG & DEBUG_SHADERS) {
printf("vtxprog attrib map:\n");
for (i=0; i<NVS_MAX_ATTRIBS; i++) {
printf(" hw:%d = attrib:%d\n",
i, nvs->vp_attrib_map[i]);
}
}
}
GLboolean
nouveau_shader_pass0(GLcontext *ctx, nouveauShader *nvs)
{
@ -801,6 +845,8 @@ nouveau_shader_pass0(GLcontext *ctx, nouveauShader *nvs)
case GL_VERTEX_PROGRAM_ARB:
nvs->func = &nmesa->VPfunc;
pass0_build_attrib_map(nvs, vp);
if (vp->IsPositionInvariant)
_mesa_insert_mvp_code(ctx, vp);
#if 0