nouveau: maintain a map of which vtxprog input corresponds to which array
authorBen Skeggs <darktama@iinet.net.au>
Sat, 27 Jan 2007 07:36:01 +0000 (18:36 +1100)
committerBen Skeggs <darktama@iinet.net.au>
Tue, 30 Jan 2007 05:38:30 +0000 (16:38 +1100)
src/mesa/drivers/dri/nouveau/nouveau_shader.h
src/mesa/drivers/dri/nouveau/nouveau_shader_0.c

index 82eb27b053ef8c606bbf49233e2b3c0125c900ed..e2515c1c79a2ad36ebbe46731bb9305206d31699 100644 (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 */
index 3bcc2ba755c78dcc11e7c4a2036c3996eda3dedf..81ed012c78358c86a01472f26a6ecfe2ce5bb9db 100644 (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