minor re-org of program matrix, program local parameter limits
This commit is contained in:
parent
9b14e0fbfd
commit
edd677454d
|
@ -30,13 +30,15 @@
|
|||
|
||||
|
||||
#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]);
|
||||
}
|
||||
|
||||
|
|
|
@ -53,10 +53,6 @@
|
|||
/* 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
|
||||
|
||||
|
@ -174,6 +170,13 @@
|
|||
#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
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue