- handle IsPositionInvariant
authorKarl Rasche <karlrasche@gmail.com>
Tue, 9 Dec 2003 18:04:52 +0000 (18:04 +0000)
committerKarl Rasche <karlrasche@gmail.com>
Tue, 9 Dec 2003 18:04:52 +0000 (18:04 +0000)
- tweak assertion to allow for relative offets from ARB_vp

src/mesa/main/nvvertexec.c

index d73f82b9738ace8b0f54d0be4b0db8ceb56a5c5b..66b3363365f9484e5c8d6163e743ee13e17059b4 100644 (file)
@@ -234,7 +234,8 @@ get_register_pointer( const struct vp_src_register *source,
 {
    if (source->RelAddr) {
       const GLint reg = source->Index + state->AddressReg[0];
-      ASSERT(source->File == PROGRAM_ENV_PARAM);
+      ASSERT( (source->File == PROGRAM_ENV_PARAM) || 
+        (source->File == PROGRAM_STATE_VAR) );
       if (reg < 0 || reg > MAX_NV_VERTEX_PROGRAM_PARAMS)
          return zeroVec;
       else
@@ -369,6 +370,20 @@ _mesa_exec_vertex_program(GLcontext *ctx, const struct vertex_program *program)
 
    ctx->_CurrentProgram = GL_VERTEX_PROGRAM_ARB; /* or NV, doesn't matter */
 
+   /* If the program is position invariant, multiply the input
+    * position and the MVP matrix and stick it into the output pos slot
+    */
+   if (ctx->VertexProgram.Current->IsPositionInvariant) {
+      TRANSFORM_POINT( ctx->VertexProgram.Outputs[0], 
+                       ctx->_ModelProjectMatrix.m, 
+                       ctx->VertexProgram.Inputs[0]);
+
+      /* XXX: This could go elsewhere */
+      ctx->VertexProgram.Current->OutputsWritten |= 0x1;
+   }
+
+
+
    for (inst = program->Instructions; inst->Opcode != VP_OPCODE_END; inst++) {
 
       if (ctx->VertexProgram.CallbackEnabled &&