minor re-org of program matrix, program local parameter limits
authorBrian Paul <brian.paul@tungstengraphics.com>
Fri, 18 Apr 2003 18:02:43 +0000 (18:02 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Fri, 18 Apr 2003 18:02:43 +0000 (18:02 +0000)
src/mesa/main/arbprogram.c
src/mesa/main/config.h
src/mesa/main/context.c
src/mesa/main/get.c
src/mesa/main/matrix.c
src/mesa/main/mtypes.h

index 639a4d33a3e65b58d804283a53869f88da9840df..fd5abf0a93db503f1e8a62457d0857614b22c94e 100644 (file)
 
 
 #include "glheader.h"
+#include "arbprogram.h"
 #include "context.h"
 #include "hash.h"
 #include "imports.h"
 #include "macros.h"
 #include "mtypes.h"
 #include "nvprogram.h"
-#include "arbprogram.h"
+#include "nvfragprog.h"
+#include "nvvertprog.h"
 
 
 /* XXX temporary */
@@ -554,7 +556,7 @@ _mesa_ProgramEnvParameter4fARB(GLenum target, GLuint index,
          _mesa_error(ctx, GL_INVALID_VALUE, "glProgramEnvParameter(index)");
          return;
       }
-      index += MAX_NV_FRAGMENT_PROGRAM_TEMPS;  /* XXX fix */
+      index += FP_PROG_REG_START;
       ASSIGN_4V(ctx->FragmentProgram.Machine.Registers[index], x, y, z, w);
    }
    if (target == GL_VERTEX_PROGRAM_ARB
@@ -563,7 +565,7 @@ _mesa_ProgramEnvParameter4fARB(GLenum target, GLuint index,
          _mesa_error(ctx, GL_INVALID_VALUE, "glProgramEnvParameter(index)");
          return;
       }
-      index += MAX_NV_VERTEX_PROGRAM_TEMPS;  /* XXX fix */
+      index += VP_PROG_REG_START;
       ASSIGN_4V(ctx->VertexProgram.Machine.Registers[index], x, y, z, w);
    }
    else {
@@ -612,7 +614,7 @@ _mesa_GetProgramEnvParameterfvARB(GLenum target, GLuint index,
          _mesa_error(ctx, GL_INVALID_VALUE, "glGetProgramEnvParameter(index)");
          return;
       }
-      index += MAX_NV_FRAGMENT_PROGRAM_TEMPS;  /* XXX fix */
+      index += FP_PROG_REG_START;
       COPY_4V(params, ctx->FragmentProgram.Machine.Registers[index]);
    }
    if (target == GL_VERTEX_PROGRAM_ARB
@@ -621,7 +623,7 @@ _mesa_GetProgramEnvParameterfvARB(GLenum target, GLuint index,
          _mesa_error(ctx, GL_INVALID_VALUE, "glGetProgramEnvParameter(index)");
          return;
       }
-      index += MAX_NV_VERTEX_PROGRAM_TEMPS;  /* XXX fix */
+      index += VP_PROG_REG_START;
       COPY_4V(params, ctx->VertexProgram.Machine.Registers[index]);
    }
    else {
@@ -639,46 +641,37 @@ _mesa_ProgramLocalParameter4fARB(GLenum target, GLuint index,
                                  GLfloat x, GLfloat y, GLfloat z, GLfloat w)
 {
    GET_CURRENT_CONTEXT(ctx);
+   struct program *prog;
    ASSERT_OUTSIDE_BEGIN_END(ctx);
 
    if ((target == GL_FRAGMENT_PROGRAM_NV
         && ctx->Extensions.NV_fragment_program) ||
        (target == GL_FRAGMENT_PROGRAM_ARB
         && ctx->Extensions.ARB_fragment_program)) {
-      struct fragment_program *fprog = ctx->FragmentProgram.Current;
-      if (!fprog) {
-         _mesa_error(ctx, GL_INVALID_ENUM, "glProgramLocalParameterARB");
-         return;
-      }
       if (index >= ctx->Const.MaxFragmentProgramLocalParams) {
          _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;
+      prog = &(ctx->FragmentProgram.Current->Base);
    }
    else if (target == GL_VERTEX_PROGRAM_ARB
             && ctx->Extensions.ARB_vertex_program) {
-      struct vertex_program *vprog = ctx->VertexProgram.Current;
-      if (!vprog) {
-         _mesa_error(ctx, GL_INVALID_ENUM, "glProgramLocalParameterARB");
-         return;
-      }
       if (index >= ctx->Const.MaxVertexProgramLocalParams) {
          _mesa_error(ctx, GL_INVALID_VALUE, "glProgramLocalParameterARB");
          return;
       }
-      vprog->Base.LocalParams[index][0] = x;
-      vprog->Base.LocalParams[index][1] = y;
-      vprog->Base.LocalParams[index][2] = z;
-      vprog->Base.LocalParams[index][3] = w;
+      prog = &(ctx->VertexProgram.Current->Base);
    }
    else {
       _mesa_error(ctx, GL_INVALID_ENUM, "glProgramLocalParameterARB");
       return;
    }
+
+   ASSERT(index < MAX_PROGRAM_LOCAL_PARAMS);
+   prog->LocalParams[index][0] = x;
+   prog->LocalParams[index][1] = y;
+   prog->LocalParams[index][2] = z;
+   prog->LocalParams[index][3] = w;
 }
 
 
@@ -760,6 +753,7 @@ _mesa_GetProgramLocalParameterfvARB(GLenum target, GLuint index,
    }
 
    ASSERT(prog);
+   ASSERT(index < MAX_PROGRAM_LOCAL_PARAMS);
    COPY_4V(params, prog->LocalParams[index]);
 }
 
index f537a539e6db1a3b9bdf93d76197f83270acd789..e7e8e541382b6523df2762b3ef8c4209fbbe676d 100644 (file)
 /* Maximum color matrix stack depth: */
 #define MAX_COLOR_STACK_DEPTH 4
 
-/* Vertex program matrix stacks: */
-#define MAX_PROGRAM_MATRICES 8
-#define MAX_PROGRAM_STACK_DEPTH 4
-
 /* Maximum attribute stack depth: */
 #define MAX_ATTRIB_STACK_DEPTH 16
 
 #define MAX_FRAGMENT_PROGRAM_TEX_INSTRUCTIONS 24
 #define MAX_FRAGMENT_PROGRAM_TEX_INDIRECTIONS  4
 
+/* Any program target/extension */
+#define MAX_PROGRAM_LOCAL_PARAMS 96
+#define MAX_PROGRAM_MATRICES 8
+#define MAX_PROGRAM_MATRIX_STACK_DEPTH 4
+
+
+
 
 /*
  * Mesa-specific parameters
index 88dea9e1db5fa188abb16c3a7b1a52ad1015af58..c8d21e471bcf5646fa361694fb3320144783a93c 100644 (file)
@@ -1,5 +1,3 @@
-/* $Id: context.c,v 1.199 2003/04/17 01:48:20 brianp Exp $ */
-
 /*
  * Mesa 3-D graphics library
  * Version:  5.1
@@ -1007,6 +1005,8 @@ init_attrib_groups( GLcontext *ctx )
    ctx->Const.MaxFragmentProgramTexInstructions = MAX_FRAGMENT_PROGRAM_TEX_INSTRUCTIONS;
    ctx->Const.MaxFragmentProgramTexIndirections = MAX_FRAGMENT_PROGRAM_TEX_INDIRECTIONS;
 #endif
+   ctx->Const.MaxProgramMatrices = MAX_PROGRAM_MATRICES;
+   ctx->Const.MaxProgramMatrixStackDepth = MAX_PROGRAM_MATRIX_STACK_DEPTH;
 
 
    /* Initialize matrix stacks */
@@ -1020,8 +1020,8 @@ init_attrib_groups( GLcontext *ctx )
       init_matrix_stack(&ctx->TextureMatrixStack[i], MAX_TEXTURE_STACK_DEPTH,
                         _NEW_TEXTURE_MATRIX);
    for (i = 0; i < MAX_PROGRAM_MATRICES; i++)
-      init_matrix_stack(&ctx->ProgramMatrixStack[i], MAX_PROGRAM_STACK_DEPTH,
-                        _NEW_TRACK_MATRIX);
+      init_matrix_stack(&ctx->ProgramMatrixStack[i],
+                        MAX_PROGRAM_MATRIX_STACK_DEPTH, _NEW_TRACK_MATRIX);
    ctx->CurrentStack = &ctx->ModelviewMatrixStack;
 
    /* Init combined Modelview*Projection matrix */
index c7d21d8494552d08a147cff4ea0a45206e84847d..65c41065cf94034b35c2c09d4cdf23a9d5ffc0e4 100644 (file)
@@ -1371,11 +1371,11 @@ _mesa_GetBooleanv( GLenum pname, GLboolean *params )
          break;
       case GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV:
          CHECK_EXTENSION_B(NV_vertex_program, pname);
-         *params = (MAX_PROGRAM_STACK_DEPTH > 0) ? GL_TRUE : GL_FALSE;
+         *params = (ctx->Const.MaxProgramMatrixStackDepth > 0) ? GL_TRUE : GL_FALSE;
          break;
       case GL_MAX_TRACK_MATRICES_NV:
          CHECK_EXTENSION_B(NV_vertex_program, pname);
-         *params = (MAX_PROGRAM_MATRICES > 0) ? GL_TRUE : GL_FALSE;
+         *params = (ctx->Const.MaxProgramMatrices > 0) ? GL_TRUE : GL_FALSE;
          break;
       case GL_CURRENT_MATRIX_STACK_DEPTH_NV:
          CHECK_EXTENSION_B(NV_vertex_program, pname);
@@ -2859,11 +2859,11 @@ _mesa_GetDoublev( GLenum pname, GLdouble *params )
          break;
       case GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV:
          CHECK_EXTENSION_D(NV_vertex_program, pname);
-         *params = (GLdouble) MAX_PROGRAM_STACK_DEPTH;
+         *params = (GLdouble) ctx->Const.MaxProgramMatrixStackDepth;
          break;
       case GL_MAX_TRACK_MATRICES_NV:
          CHECK_EXTENSION_D(NV_vertex_program, pname);
-         *params = (GLdouble) MAX_PROGRAM_MATRICES;
+         *params = (GLdouble) ctx->Const.MaxProgramMatrices;
          break;
       case GL_CURRENT_MATRIX_STACK_DEPTH_NV:
          CHECK_EXTENSION_D(NV_vertex_program, pname);
@@ -4321,11 +4321,11 @@ _mesa_GetFloatv( GLenum pname, GLfloat *params )
          break;
       case GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV:
          CHECK_EXTENSION_F(NV_vertex_program, pname);
-         *params = (GLfloat) MAX_PROGRAM_STACK_DEPTH;
+         *params = (GLfloat) ctx->Const.MaxProgramMatrixStackDepth;
          break;
       case GL_MAX_TRACK_MATRICES_NV:
          CHECK_EXTENSION_F(NV_vertex_program, pname);
-         *params = (GLfloat) MAX_PROGRAM_MATRICES;
+         *params = (GLfloat) ctx->Const.MaxProgramMatrices;
          break;
       case GL_CURRENT_MATRIX_STACK_DEPTH_NV:
          CHECK_EXTENSION_F(NV_vertex_program, pname);
@@ -5821,11 +5821,11 @@ _mesa_GetIntegerv( GLenum pname, GLint *params )
          break;
       case GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV:
          CHECK_EXTENSION_I(NV_vertex_program, pname);
-         *params = MAX_PROGRAM_STACK_DEPTH;
+         *params = ctx->Const.MaxProgramMatrixStackDepth;
          break;
       case GL_MAX_TRACK_MATRICES_NV:
          CHECK_EXTENSION_I(NV_vertex_program, pname);
-         *params = MAX_PROGRAM_MATRICES;
+         *params = ctx->Const.MaxProgramMatrices;
          break;
       case GL_CURRENT_MATRIX_STACK_DEPTH_NV:
          CHECK_EXTENSION_I(NV_vertex_program, pname);
index af046a3c8f076cfe6df540ae73427c07112c6eaa..83d2ff425ee087ef8bbab69412825bf3c637a366 100644 (file)
@@ -1,5 +1,3 @@
-/* $Id: matrix.c,v 1.46 2003/03/01 01:50:21 brianp Exp $ */
-
 /*
  * Mesa 3-D graphics library
  * Version:  5.1
@@ -132,14 +130,39 @@ _mesa_MatrixMode( GLenum mode )
    case GL_MATRIX5_NV:
    case GL_MATRIX6_NV:
    case GL_MATRIX7_NV:
-      if (!ctx->Extensions.NV_vertex_program) {
-         _mesa_error( ctx,  GL_INVALID_ENUM, "glMatrixMode" );
+      if (ctx->Extensions.NV_vertex_program) {
+         ctx->CurrentStack = &ctx->ProgramMatrixStack[mode - GL_MATRIX0_NV];
+      }
+      else {
+         _mesa_error( ctx,  GL_INVALID_ENUM, "glMatrixMode(mode)" );
+         return;
+      }
+      break;
+   case GL_MATRIX0_ARB:
+   case GL_MATRIX1_ARB:
+   case GL_MATRIX2_ARB:
+   case GL_MATRIX3_ARB:
+   case GL_MATRIX4_ARB:
+   case GL_MATRIX5_ARB:
+   case GL_MATRIX6_ARB:
+   case GL_MATRIX7_ARB:
+      if (ctx->Extensions.ARB_vertex_program ||
+          ctx->Extensions.ARB_fragment_program) {
+         const GLint m = mode - GL_MATRIX0_ARB;
+         if (m > ctx->Const.MaxProgramMatrices) {
+            _mesa_error(ctx, GL_INVALID_ENUM,
+                        "glMatrixMode(GL_MATRIX%d_ARB)", m);
+            return;
+         }
+         ctx->CurrentStack = &ctx->ProgramMatrixStack[m];
+      }
+      else {
+         _mesa_error( ctx,  GL_INVALID_ENUM, "glMatrixMode(mode)" );
          return;
       }
-      ctx->CurrentStack = &ctx->ProgramMatrixStack[mode - GL_MATRIX0_NV];
       break;
    default:
-      _mesa_error( ctx,  GL_INVALID_ENUM, "glMatrixMode" );
+      _mesa_error( ctx,  GL_INVALID_ENUM, "glMatrixMode(mode)" );
       return;
    }
 
index e931f49de88ee0f7fa7ee2a0ae23d2b9a858f995..edea218095f432095964089eb1ecee0dd1ae9f4a 100644 (file)
@@ -1240,7 +1240,7 @@ struct program
    GLenum Format;      /* String encoding format */
    GLint RefCount;
    GLboolean Resident;
-   GLfloat LocalParams[MAX_NV_FRAGMENT_PROGRAM_PARAMS][4];
+   GLfloat LocalParams[MAX_PROGRAM_LOCAL_PARAMS][4];
    GLuint NumInstructions;  /* GL_ARB_vertex/fragment_program */
    GLuint NumTemporaries;
    GLuint NumParameters;
@@ -1424,6 +1424,9 @@ struct gl_constants {
    GLuint MaxFragmentProgramAluInstructions;
    GLuint MaxFragmentProgramTexInstructions;
    GLuint MaxFragmentProgramTexIndirections;
+   /* vertex or fragment program */
+   GLuint MaxProgramMatrices;
+   GLuint MaxProgramMatrixStackDepth;
 };