Implement debugger callback, etc for vertex programs. Misc clean-ups.
authorBrian Paul <brian.paul@tungstengraphics.com>
Tue, 22 Jul 2003 03:34:54 +0000 (03:34 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Tue, 22 Jul 2003 03:34:54 +0000 (03:34 +0000)
src/mesa/main/arbprogram.c
src/mesa/main/get.c
src/mesa/main/mtypes.h
src/mesa/main/nvprogram.c
src/mesa/main/nvvertexec.c
src/mesa/main/nvvertparse.c
src/mesa/main/nvvertprog.h
src/mesa/swrast/s_nvfragprog.c

index 20118d45a1fb4a6039792c0ebaec5cfa1a484b30..24ab8a1035f5a0dfd7f6b5510851b65e8050e14c 100644 (file)
@@ -304,7 +304,9 @@ _mesa_GetProgramEnvParameterfvARB(GLenum target, GLuint index,
                                   GLfloat *params)
 {
    GET_CURRENT_CONTEXT(ctx);
-   ASSERT_OUTSIDE_BEGIN_END(ctx);
+
+   if (!ctx->_CurrentProgram)
+      ASSERT_OUTSIDE_BEGIN_END(ctx);
 
    if (target == GL_FRAGMENT_PROGRAM_ARB
        && ctx->Extensions.ARB_fragment_program) {
@@ -477,7 +479,9 @@ _mesa_GetProgramivARB(GLenum target, GLenum pname, GLint *params)
 {
    struct program *prog;
    GET_CURRENT_CONTEXT(ctx);
-   ASSERT_OUTSIDE_BEGIN_END(ctx);
+
+   if (!ctx->_CurrentProgram)
+      ASSERT_OUTSIDE_BEGIN_END(ctx);
 
    if (target == GL_VERTEX_PROGRAM_ARB
        && ctx->Extensions.ARB_vertex_program) {
@@ -682,7 +686,9 @@ _mesa_GetProgramStringARB(GLenum target, GLenum pname, GLvoid *string)
 {
    struct program *prog;
    GET_CURRENT_CONTEXT(ctx);
-   ASSERT_OUTSIDE_BEGIN_END(ctx);
+
+   if (!ctx->_CurrentProgram)
+      ASSERT_OUTSIDE_BEGIN_END(ctx);
 
    if (target == GL_VERTEX_PROGRAM_ARB) {
       prog = &(ctx->VertexProgram.Current->Base);
@@ -741,7 +747,7 @@ _mesa_ProgramCallbackMESA(GLenum target, GLprogramcallbackMESA callback,
          break;
       case GL_VERTEX_PROGRAM_ARB: /* == GL_VERTEX_PROGRAM_NV */
          if (!ctx->Extensions.ARB_vertex_program &&
-             !ctx->Extensions.ARB_vertex_program) {
+             !ctx->Extensions.NV_vertex_program) {
             _mesa_error(ctx, GL_INVALID_ENUM, "glProgramCallbackMESA(target)");
             return;
          }
@@ -815,7 +821,10 @@ _mesa_GetProgramRegisterfvMESA(GLenum target,
             GLint i;
             for (i = 0; i < ctx->Const.MaxVertexProgramAttribs; i++) {
                const char *name = _mesa_nv_vertex_input_register_name(i);
-               if (_mesa_strncmp(reg + 2, name, 4) == 0) {
+               char number[10];
+               sprintf(number, "%d", i);
+               if (_mesa_strncmp(reg + 2, name, 4) == 0 ||
+                   _mesa_strncmp(reg + 2, number, _mesa_strlen(number)) == 0) {
                   COPY_4V(v, ctx->VertexProgram.Machine.Registers
                           [VP_INPUT_REG_START + i]);
                   return;
index 3cf8453c78232fa6b997d2524490fa7eb1e92117..3e02c99c48c3981821a5e3ab754478bf784712cf 100644 (file)
@@ -136,14 +136,16 @@ _mesa_GetBooleanv( GLenum pname, GLboolean *params )
    if (!params)
       return;
 
-   /* We need this in order to get correct results for
-    * GL_OCCLUSION_TEST_RESULT_HP.  There might be other important cases.
-    */
-   FLUSH_VERTICES(ctx, 0);
-
    if (MESA_VERBOSE & VERBOSE_API)
       _mesa_debug(ctx, "glGetBooleanv %s\n", _mesa_lookup_enum_by_nr(pname));
 
+   if (!ctx->_CurrentProgram) {
+      /* We need this in order to get correct results for
+       * GL_OCCLUSION_TEST_RESULT_HP.  There might be other important cases.
+       */
+      FLUSH_VERTICES(ctx, 0);
+   }
+
    if (ctx->Driver.GetBooleanv
        && (*ctx->Driver.GetBooleanv)(ctx, pname, params))
       return;
@@ -1679,14 +1681,16 @@ _mesa_GetDoublev( GLenum pname, GLdouble *params )
    if (!params)
       return;
 
-   /* We need this in order to get correct results for
-    * GL_OCCLUSION_TEST_RESULT_HP.  There might be other important cases.
-    */
-   FLUSH_VERTICES(ctx, 0);
-
    if (MESA_VERBOSE & VERBOSE_API)
       _mesa_debug(ctx, "glGetDoublev %s\n", _mesa_lookup_enum_by_nr(pname));
 
+   if (!ctx->_CurrentProgram) {
+      /* We need this in order to get correct results for
+       * GL_OCCLUSION_TEST_RESULT_HP.  There might be other important cases.
+       */
+      FLUSH_VERTICES(ctx, 0);
+   }
+
    if (ctx->Driver.GetDoublev && (*ctx->Driver.GetDoublev)(ctx, pname, params))
       return;
 
@@ -3216,14 +3220,16 @@ _mesa_GetFloatv( GLenum pname, GLfloat *params )
    if (!params)
       return;
 
-   /* We need this in order to get correct results for
-    * GL_OCCLUSION_TEST_RESULT_HP.  There might be other important cases.
-    */
-   FLUSH_VERTICES(ctx, 0);
-
    if (MESA_VERBOSE & VERBOSE_API)
       _mesa_debug(ctx, "glGetFloatv %s\n", _mesa_lookup_enum_by_nr(pname));
 
+   if (!ctx->_CurrentProgram) {
+      /* We need this in order to get correct results for
+       * GL_OCCLUSION_TEST_RESULT_HP.  There might be other important cases.
+       */
+      FLUSH_VERTICES(ctx, 0);
+   }
+
    if (ctx->Driver.GetFloatv && (*ctx->Driver.GetFloatv)(ctx, pname, params))
       return;
 
@@ -4729,19 +4735,19 @@ _mesa_GetIntegerv( GLenum pname, GLint *params )
    if (!params)
       return;
 
-#if 0
-   /* We need this in order to get correct results for
-    * GL_OCCLUSION_TEST_RESULT_HP.  There might be other important cases.
-    */
-   FLUSH_VERTICES(ctx, 0);
-
    if (MESA_VERBOSE & VERBOSE_API)
       _mesa_debug(ctx, "glGetIntegerv %s\n", _mesa_lookup_enum_by_nr(pname));
 
+   if (!ctx->_CurrentProgram) {
+      /* We need this in order to get correct results for
+       * GL_OCCLUSION_TEST_RESULT_HP.  There might be other important cases.
+       */
+      FLUSH_VERTICES(ctx, 0);
+   }
+
    if (ctx->Driver.GetIntegerv
        && (*ctx->Driver.GetIntegerv)(ctx, pname, params))
       return;
-#endif
 
    switch (pname) {
       case GL_ACCUM_RED_BITS:
index cb408293d098583e23f28c95889da8a1aa8f65eb..27b01eee08fbddd1753882f6d01c85de894f7c38 100644 (file)
@@ -2143,6 +2143,7 @@ struct __GLcontextRec {
    GLuint _NeedEyeCoords;
    GLuint _ForceEyeCoords; 
    GLboolean _RotateMode;
+   GLenum _CurrentProgram;    /* currently executing program */
 
    struct gl_shine_tab *_ShineTable[2]; /**< Active shine tables */
    struct gl_shine_tab *_ShineTabList;  /**< MRU list of inactive shine tables */
index 6c5c15a3ca1ac0c08db5a2043aa22fd9223eeb10..1175e0961734c53e8b73d626fcdb74d1cdd51018 100644 (file)
@@ -571,7 +571,9 @@ _mesa_GetProgramivNV(GLuint id, GLenum pname, GLint *params)
 {
    struct program *prog;
    GET_CURRENT_CONTEXT(ctx);
-   ASSERT_OUTSIDE_BEGIN_END(ctx);
+
+   if (!ctx->_CurrentProgram)
+      ASSERT_OUTSIDE_BEGIN_END(ctx);
 
    prog = (struct program *) _mesa_HashLookup(ctx->Shared->Programs, id);
    if (!prog) {
@@ -606,16 +608,18 @@ _mesa_GetProgramStringNV(GLuint id, GLenum pname, GLubyte *program)
 {
    struct program *prog;
    GET_CURRENT_CONTEXT(ctx);
-   ASSERT_OUTSIDE_BEGIN_END(ctx);
+
+   if (!ctx->_CurrentProgram)
+      ASSERT_OUTSIDE_BEGIN_END(ctx);
 
    if (pname != GL_PROGRAM_STRING_NV) {
-      _mesa_error(ctx, GL_INVALID_ENUM, "glGetProgramivNV(pname)");
+      _mesa_error(ctx, GL_INVALID_ENUM, "glGetProgramStringNV(pname)");
       return;
    }
 
    prog = (struct program *) _mesa_HashLookup(ctx->Shared->Programs, id);
    if (!prog) {
-      _mesa_error(ctx, GL_INVALID_OPERATION, "glGetProgramivNV");
+      _mesa_error(ctx, GL_INVALID_OPERATION, "glGetProgramStringNV");
       return;
    }
 
@@ -1165,7 +1169,9 @@ _mesa_GetProgramNamedParameterfvNV(GLuint id, GLsizei len, const GLubyte *name,
    struct fragment_program *fragProg;
    GLint i;
    GET_CURRENT_CONTEXT(ctx);
-   ASSERT_OUTSIDE_BEGIN_END(ctx);
+
+   if (!ctx->_CurrentProgram)
+      ASSERT_OUTSIDE_BEGIN_END(ctx);
 
    prog = (struct program *) _mesa_HashLookup(ctx->Shared->Programs, id);
    if (!prog || prog->Target != GL_FRAGMENT_PROGRAM_NV) {
@@ -1204,107 +1210,3 @@ _mesa_GetProgramNamedParameterdvNV(GLuint id, GLsizei len, const GLubyte *name,
    _mesa_GetProgramNamedParameterfvNV(id, len, name, floatParams);
    COPY_4V(params, floatParams);
 }
-
-
-#if 000
-void
-_mesa_ProgramLocalParameter4fARB(GLenum target, GLuint index,
-                                 GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   ASSERT_OUTSIDE_BEGIN_END(ctx);
-
-   if (target == GL_FRAGMENT_PROGRAM_NV) {
-      struct fragment_program *fprog = ctx->FragmentProgram.Current;
-      if (!fprog) {
-         _mesa_error(ctx, GL_INVALID_ENUM, "glProgramLocalParameterARB");
-         return;
-      }
-      if (index >= MAX_NV_FRAGMENT_PROGRAM_PARAMS) {
-         _mesa_error(ctx, GL_INVALID_VALUE, "glProgramLocalParameterARB");
-         return;
-      }
-      fprog->Base.LocalParams[index][0] = x;
-      fprog->Base.LocalParams[index][1] = y;
-      fprog->Base.LocalParams[index][2] = z;
-      fprog->Base.LocalParams[index][3] = w;
-   }
-   else {
-      _mesa_error(ctx, GL_INVALID_ENUM, "glProgramLocalParameterARB");
-      return;
-   }
-}
-
-
-/* XXX move into arbprogram.c */
-void
-_mesa_ProgramLocalParameter4fvARB(GLenum target, GLuint index,
-                                  const GLfloat *params)
-{
-   _mesa_ProgramLocalParameter4fARB(target, index, params[0], params[1],
-                                    params[2], params[3]);
-}
-
-
-/* XXX move into arbprogram.c */
-void
-_mesa_ProgramLocalParameter4dARB(GLenum target, GLuint index,
-                                 GLdouble x, GLdouble y,
-                                 GLdouble z, GLdouble w)
-{
-   _mesa_ProgramLocalParameter4fARB(target, index, (GLfloat)x, (GLfloat)y, 
-                                    (GLfloat)z, (GLfloat)w);
-}
-
-
-/* XXX move into arbprogram.c */
-void
-_mesa_ProgramLocalParameter4dvARB(GLenum target, GLuint index,
-                                  const GLdouble *params)
-{
-   _mesa_ProgramLocalParameter4fARB(target, index, (GLfloat)params[0], 
-                                    (GLfloat)params[1], (GLfloat)params[2],
-                                    (GLfloat)params[3]);
-}
-
-
-/* XXX move into arbprogram.c */
-void
-_mesa_GetProgramLocalParameterfvARB(GLenum target, GLuint index,
-                                    GLfloat *params)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   ASSERT_OUTSIDE_BEGIN_END(ctx);
-
-   if (target == GL_FRAGMENT_PROGRAM_NV) {
-      struct fragment_program *fprog = ctx->FragmentProgram.Current;
-      if (!fprog) {
-         _mesa_error(ctx, GL_INVALID_ENUM, "glGetProgramLocalParameterARB");
-         return;
-      }
-      if (index >= MAX_NV_FRAGMENT_PROGRAM_PARAMS) {
-         _mesa_error(ctx, GL_INVALID_VALUE, "glGetProgramLocalParameterARB");
-         return;
-      }
-      params[0] = fprog->Base.LocalParams[index][0];
-      params[1] = fprog->Base.LocalParams[index][1];
-      params[2] = fprog->Base.LocalParams[index][2];
-      params[3] = fprog->Base.LocalParams[index][3];
-   }
-   else {
-      _mesa_error(ctx, GL_INVALID_ENUM, "glGetProgramLocalParameterARB");
-      return;
-   }
-}
-
-
-/* XXX move into arbprogram.c */
-void
-_mesa_GetProgramLocalParameterdvARB(GLenum target, GLuint index,
-                                    GLdouble *params)
-{
-   GLfloat floatParams[4];
-   _mesa_GetProgramLocalParameterfvARB(target, index, floatParams);
-   COPY_4V(params, floatParams);
-}
-#endif
index b81c2278a58ec40c88808263321f85e7851dd3b9..06f54ca909b5410fd829dee8c28a81650958a285 100644 (file)
@@ -332,7 +332,17 @@ _mesa_exec_vertex_program(GLcontext *ctx, const struct vertex_program *program)
    struct vp_machine *machine = &ctx->VertexProgram.Machine;
    const struct vp_instruction *inst;
 
+   ctx->_CurrentProgram = GL_VERTEX_PROGRAM_ARB; /* or NV, doesn't matter */
+
    for (inst = program->Instructions; inst->Opcode != VP_OPCODE_END; inst++) {
+
+      if (ctx->VertexProgram.CallbackEnabled &&
+          ctx->VertexProgram.Callback) {
+         ctx->VertexProgram.CurrentPosition = inst->StringPos;
+         ctx->VertexProgram.Callback(program->Base.Target,
+                                     ctx->VertexProgram.CallbackData);
+      }
+
       switch (inst->Opcode) {
          case VP_OPCODE_MOV:
             {
@@ -420,10 +430,11 @@ _mesa_exec_vertex_program(GLcontext *ctx, const struct vertex_program *program)
                    * infinity.  This may need some tweaking.
                    */
 #ifdef VMS
-                  if (abs_t0 == __MAXFLOAT) {
+                  if (abs_t0 == __MAXFLOAT)
 #else
-                  if (IS_INF_OR_NAN(abs_t0)) {
+                  if (IS_INF_OR_NAN(abs_t0))
 #endif
+                  {
                      SET_POS_INFINITY(q[0]);
                      q[1] = 1.0F;
                      SET_POS_INFINITY(q[2]);
@@ -435,7 +446,7 @@ _mesa_exec_vertex_program(GLcontext *ctx, const struct vertex_program *program)
                      q[1] = (GLfloat) (2.0 * mantissa); /* map [.5, 1) -> [1, 2) */
                      q[2] = (GLfloat) (q[0] + LOG2(q[1]));
                   }
-               }
+                  }
                else {
                   SET_NEG_INFINITY(q[0]);
                   q[1] = 1.0F;
@@ -723,13 +734,17 @@ _mesa_exec_vertex_program(GLcontext *ctx, const struct vertex_program *program)
             break;
 
          case VP_OPCODE_END:
+            ctx->_CurrentProgram = 0;
             return;
          default:
             /* bad instruction opcode */
             _mesa_problem(ctx, "Bad VP Opcode in _mesa_exec_vertex_program");
+            ctx->_CurrentProgram = 0;
             return;
-      }
-   }
+      } /* switch */
+   } /* for */
+
+   ctx->_CurrentProgram = 0;
 }
 
 
index 9d0cd5f54d4d8db0e8820f97f830693a91da0112..d6cf58a87ed50c6da3408737663ffa71ccc79946 100644 (file)
@@ -48,6 +48,7 @@ struct parse_state {
    GLcontext *ctx;
    const GLubyte *start;
    const GLubyte *pos;
+   const GLubyte *curLine;
    GLboolean isStateProgram;
    GLboolean isPositionInvariant;
    GLboolean isVersion1_1;
@@ -134,8 +135,9 @@ static GLboolean IsWhitespace(GLubyte b)
  * \return <= 0 we found an error, else, return number of characters parsed.
  */
 static GLint
-GetToken(const GLubyte *str, GLubyte *token)
+GetToken(struct parse_state *parseState, GLubyte *token)
 {
+   const GLubyte *str = parseState->pos;
    GLint i = 0, j = 0;
 
    token[0] = 0;
@@ -147,9 +149,13 @@ GetToken(const GLubyte *str, GLubyte *token)
          while (str[i] && (str[i] != '\n' && str[i] != '\r')) {
             i++;
          }
+         if (str[i] == '\n' || str[i] == '\r')
+            parseState->curLine = str + i + 1;
       }
       else {
          /* skip whitespace */
+         if (str[i] == '\n' || str[i] == '\r')
+            parseState->curLine = str + i + 1;
          i++;
       }
    }
@@ -175,7 +181,7 @@ GetToken(const GLubyte *str, GLubyte *token)
       return i;
    }
 
-   /* punctuation */
+   /* punctuation character */
    if (str[i]) {
       token[0] = str[i++];
       token[1] = 0;
@@ -195,7 +201,7 @@ static GLboolean
 Parse_Token(struct parse_state *parseState, GLubyte *token)
 {
    GLint i;
-   i = GetToken(parseState->pos, token);
+   i = GetToken(parseState, token);
    if (i <= 0) {
       parseState->pos += (-i);
       return GL_FALSE;
@@ -212,7 +218,7 @@ static GLboolean
 Peek_Token(struct parse_state *parseState, GLubyte *token)
 {
    GLint i, len;
-   i = GetToken(parseState->pos, token);
+   i = GetToken(parseState, token);
    if (i <= 0) {
       parseState->pos += (-i);
       return GL_FALSE;
@@ -240,9 +246,13 @@ Parse_String(struct parse_state *parseState, const char *pattern)
          while (*parseState->pos && (*parseState->pos != '\n' && *parseState->pos != '\r')) {
             parseState->pos += 1;
          }
+         if (*parseState->pos == '\n' || *parseState->pos == '\r')
+            parseState->curLine = parseState->pos + 1;
       }
       else {
          /* skip whitespace */
+         if (*parseState->pos == '\n' || *parseState->pos == '\r')
+            parseState->curLine = parseState->pos + 1;
          parseState->pos += 1;
       }
    }
@@ -792,6 +802,7 @@ Parse_UnaryOpInstruction(struct parse_state *parseState,
       RETURN_ERROR1("ABS illegal for vertex program 1.0");
 
    inst->Opcode = opcode;
+   inst->StringPos = parseState->curLine - parseState->start;
 
    /* dest reg */
    if (!Parse_MaskedDstReg(parseState, &inst->DstReg))
@@ -823,6 +834,7 @@ Parse_BiOpInstruction(struct parse_state *parseState,
       RETURN_ERROR1("SUB illegal for vertex program 1.0");
 
    inst->Opcode = opcode;
+   inst->StringPos = parseState->curLine - parseState->start;
 
    /* dest reg */
    if (!Parse_MaskedDstReg(parseState, &inst->DstReg))
@@ -869,6 +881,7 @@ Parse_TriOpInstruction(struct parse_state *parseState,
                        struct vp_instruction *inst, enum vp_opcode opcode)
 {
    inst->Opcode = opcode;
+   inst->StringPos = parseState->curLine - parseState->start;
 
    /* dest reg */
    if (!Parse_MaskedDstReg(parseState, &inst->DstReg))
@@ -938,6 +951,7 @@ Parse_ScalarInstruction(struct parse_state *parseState,
       RETURN_ERROR1("RCC illegal for vertex program 1.0");
 
    inst->Opcode = opcode;
+   inst->StringPos = parseState->curLine - parseState->start;
 
    /* dest reg */
    if (!Parse_MaskedDstReg(parseState, &inst->DstReg))
@@ -963,6 +977,7 @@ static GLboolean
 Parse_AddressInstruction(struct parse_state *parseState, struct vp_instruction *inst)
 {
    inst->Opcode = VP_OPCODE_ARL;
+   inst->StringPos = parseState->curLine - parseState->start;
 
    /* dest A0 reg */
    if (!Parse_AddrReg(parseState))
@@ -990,6 +1005,7 @@ Parse_EndInstruction(struct parse_state *parseState, struct vp_instruction *inst
    GLubyte token[100];
 
    inst->Opcode = VP_OPCODE_END;
+   inst->StringPos = parseState->curLine - parseState->start;
 
    /* this should fail! */
    if (Parse_Token(parseState, token))
index 411426e963be4536acbb5c5a678d01923dfb1606..6ccb0c4efbc1a35bb35514cb4006a8b00dc2dea6 100644 (file)
@@ -114,6 +114,9 @@ struct vp_instruction
    enum vp_opcode Opcode;
    struct vp_src_register SrcReg[3];
    struct vp_dst_register DstReg;
+#if FEATURE_MESA_program_debug
+   GLint StringPos;
+#endif
 };
 
 
index 1416e7981a193f68fe74e455ae99091985c657e3..9fef97c6f83347c69c37b26223ba9f8c681d263a 100644 (file)
@@ -1181,6 +1181,8 @@ _swrast_exec_nv_fragment_program( GLcontext *ctx, struct sw_span *span )
    const struct fragment_program *program = ctx->FragmentProgram.Current;
    GLuint i;
 
+   ctx->_CurrentProgram = GL_FRAGMENT_PROGRAM_ARB; /* or NV, doesn't matter */
+
    for (i = 0; i < span->end; i++) {
       if (span->array->mask[i]) {
          init_machine(ctx, &ctx->FragmentProgram.Machine,
@@ -1205,5 +1207,7 @@ _swrast_exec_nv_fragment_program( GLcontext *ctx, struct sw_span *span )
             span->array->z[i] = IROUND(ctx->FragmentProgram.Machine.Registers[FP_OUTPUT_REG_START + 2][0] * ctx->DepthMaxF);
       }
    }
+
+   ctx->_CurrentProgram = 0;
 }