Move _mesa_load_tracked_matrices() from TNL module to prog_statevars.c
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Mesa 3-D graphics library
|
* Mesa 3-D graphics library
|
||||||
* Version: 7.0
|
* Version: 7.1
|
||||||
*
|
*
|
||||||
* Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
|
* Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
|
||||||
*
|
*
|
||||||
@@ -824,3 +824,94 @@ _mesa_load_state_parameters(GLcontext *ctx,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Copy the 16 elements of a matrix into four consecutive program
|
||||||
|
* registers starting at 'pos'.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
load_matrix(GLfloat registers[][4], GLuint pos, const GLfloat mat[16])
|
||||||
|
{
|
||||||
|
GLuint i;
|
||||||
|
for (i = 0; i < 4; i++) {
|
||||||
|
registers[pos + i][0] = mat[0 + i];
|
||||||
|
registers[pos + i][1] = mat[4 + i];
|
||||||
|
registers[pos + i][2] = mat[8 + i];
|
||||||
|
registers[pos + i][3] = mat[12 + i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* As above, but transpose the matrix.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
load_transpose_matrix(GLfloat registers[][4], GLuint pos,
|
||||||
|
const GLfloat mat[16])
|
||||||
|
{
|
||||||
|
MEMCPY(registers[pos], mat, 16 * sizeof(GLfloat));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load current vertex program's parameter registers with tracked
|
||||||
|
* matrices (if NV program). This only needs to be done per
|
||||||
|
* glBegin/glEnd, not per-vertex.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
_mesa_load_tracked_matrices(GLcontext *ctx)
|
||||||
|
{
|
||||||
|
GLuint i;
|
||||||
|
|
||||||
|
for (i = 0; i < MAX_NV_VERTEX_PROGRAM_PARAMS / 4; i++) {
|
||||||
|
/* point 'mat' at source matrix */
|
||||||
|
GLmatrix *mat;
|
||||||
|
if (ctx->VertexProgram.TrackMatrix[i] == GL_MODELVIEW) {
|
||||||
|
mat = ctx->ModelviewMatrixStack.Top;
|
||||||
|
}
|
||||||
|
else if (ctx->VertexProgram.TrackMatrix[i] == GL_PROJECTION) {
|
||||||
|
mat = ctx->ProjectionMatrixStack.Top;
|
||||||
|
}
|
||||||
|
else if (ctx->VertexProgram.TrackMatrix[i] == GL_TEXTURE) {
|
||||||
|
mat = ctx->TextureMatrixStack[ctx->Texture.CurrentUnit].Top;
|
||||||
|
}
|
||||||
|
else if (ctx->VertexProgram.TrackMatrix[i] == GL_COLOR) {
|
||||||
|
mat = ctx->ColorMatrixStack.Top;
|
||||||
|
}
|
||||||
|
else if (ctx->VertexProgram.TrackMatrix[i]==GL_MODELVIEW_PROJECTION_NV) {
|
||||||
|
/* XXX verify the combined matrix is up to date */
|
||||||
|
mat = &ctx->_ModelProjectMatrix;
|
||||||
|
}
|
||||||
|
else if (ctx->VertexProgram.TrackMatrix[i] >= GL_MATRIX0_NV &&
|
||||||
|
ctx->VertexProgram.TrackMatrix[i] <= GL_MATRIX7_NV) {
|
||||||
|
GLuint n = ctx->VertexProgram.TrackMatrix[i] - GL_MATRIX0_NV;
|
||||||
|
ASSERT(n < MAX_PROGRAM_MATRICES);
|
||||||
|
mat = ctx->ProgramMatrixStack[n].Top;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* no matrix is tracked, but we leave the register values as-is */
|
||||||
|
assert(ctx->VertexProgram.TrackMatrix[i] == GL_NONE);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* load the matrix values into sequential registers */
|
||||||
|
if (ctx->VertexProgram.TrackMatrixTransform[i] == GL_IDENTITY_NV) {
|
||||||
|
load_matrix(ctx->VertexProgram.Parameters, i*4, mat->m);
|
||||||
|
}
|
||||||
|
else if (ctx->VertexProgram.TrackMatrixTransform[i] == GL_INVERSE_NV) {
|
||||||
|
_math_matrix_analyse(mat); /* update the inverse */
|
||||||
|
ASSERT(!_math_matrix_is_dirty(mat));
|
||||||
|
load_matrix(ctx->VertexProgram.Parameters, i*4, mat->inv);
|
||||||
|
}
|
||||||
|
else if (ctx->VertexProgram.TrackMatrixTransform[i] == GL_TRANSPOSE_NV) {
|
||||||
|
load_transpose_matrix(ctx->VertexProgram.Parameters, i*4, mat->m);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
assert(ctx->VertexProgram.TrackMatrixTransform[i]
|
||||||
|
== GL_INVERSE_TRANSPOSE_NV);
|
||||||
|
_math_matrix_analyse(mat); /* update the inverse */
|
||||||
|
ASSERT(!_math_matrix_is_dirty(mat));
|
||||||
|
load_transpose_matrix(ctx->VertexProgram.Parameters, i*4, mat->inv);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
/*
|
/*
|
||||||
* Mesa 3-D graphics library
|
* Mesa 3-D graphics library
|
||||||
* Version: 6.5.2
|
* Version: 7.1
|
||||||
*
|
*
|
||||||
* Copyright (C) 1999-2006 Brian Paul All Rights Reserved.
|
* Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
* copy of this software and associated documentation files (the "Software"),
|
* copy of this software and associated documentation files (the "Software"),
|
||||||
@@ -126,4 +126,8 @@ extern const char *
|
|||||||
_mesa_program_state_string(const gl_state_index state[STATE_LENGTH]);
|
_mesa_program_state_string(const gl_state_index state[STATE_LENGTH]);
|
||||||
|
|
||||||
|
|
||||||
|
extern void
|
||||||
|
_mesa_load_tracked_matrices(GLcontext *ctx);
|
||||||
|
|
||||||
|
|
||||||
#endif /* PROG_STATEVARS_H */
|
#endif /* PROG_STATEVARS_H */
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Mesa 3-D graphics library
|
* Mesa 3-D graphics library
|
||||||
* Version: 6.5.3
|
* Version: 7.1
|
||||||
*
|
*
|
||||||
* Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
|
* Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
|
||||||
*
|
*
|
||||||
@@ -245,98 +245,6 @@ init_machine(GLcontext *ctx, struct gl_program_machine *machine)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Copy the 16 elements of a matrix into four consecutive program
|
|
||||||
* registers starting at 'pos'.
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
load_matrix(GLfloat registers[][4], GLuint pos, const GLfloat mat[16])
|
|
||||||
{
|
|
||||||
GLuint i;
|
|
||||||
for (i = 0; i < 4; i++) {
|
|
||||||
registers[pos + i][0] = mat[0 + i];
|
|
||||||
registers[pos + i][1] = mat[4 + i];
|
|
||||||
registers[pos + i][2] = mat[8 + i];
|
|
||||||
registers[pos + i][3] = mat[12 + i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* As above, but transpose the matrix.
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
load_transpose_matrix(GLfloat registers[][4], GLuint pos,
|
|
||||||
const GLfloat mat[16])
|
|
||||||
{
|
|
||||||
MEMCPY(registers[pos], mat, 16 * sizeof(GLfloat));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Load current vertex program's parameter registers with tracked
|
|
||||||
* matrices (if NV program). This only needs to be done per
|
|
||||||
* glBegin/glEnd, not per-vertex.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
_mesa_load_tracked_matrices(GLcontext *ctx)
|
|
||||||
{
|
|
||||||
GLuint i;
|
|
||||||
|
|
||||||
for (i = 0; i < MAX_NV_VERTEX_PROGRAM_PARAMS / 4; i++) {
|
|
||||||
/* point 'mat' at source matrix */
|
|
||||||
GLmatrix *mat;
|
|
||||||
if (ctx->VertexProgram.TrackMatrix[i] == GL_MODELVIEW) {
|
|
||||||
mat = ctx->ModelviewMatrixStack.Top;
|
|
||||||
}
|
|
||||||
else if (ctx->VertexProgram.TrackMatrix[i] == GL_PROJECTION) {
|
|
||||||
mat = ctx->ProjectionMatrixStack.Top;
|
|
||||||
}
|
|
||||||
else if (ctx->VertexProgram.TrackMatrix[i] == GL_TEXTURE) {
|
|
||||||
mat = ctx->TextureMatrixStack[ctx->Texture.CurrentUnit].Top;
|
|
||||||
}
|
|
||||||
else if (ctx->VertexProgram.TrackMatrix[i] == GL_COLOR) {
|
|
||||||
mat = ctx->ColorMatrixStack.Top;
|
|
||||||
}
|
|
||||||
else if (ctx->VertexProgram.TrackMatrix[i]==GL_MODELVIEW_PROJECTION_NV) {
|
|
||||||
/* XXX verify the combined matrix is up to date */
|
|
||||||
mat = &ctx->_ModelProjectMatrix;
|
|
||||||
}
|
|
||||||
else if (ctx->VertexProgram.TrackMatrix[i] >= GL_MATRIX0_NV &&
|
|
||||||
ctx->VertexProgram.TrackMatrix[i] <= GL_MATRIX7_NV) {
|
|
||||||
GLuint n = ctx->VertexProgram.TrackMatrix[i] - GL_MATRIX0_NV;
|
|
||||||
ASSERT(n < MAX_PROGRAM_MATRICES);
|
|
||||||
mat = ctx->ProgramMatrixStack[n].Top;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
/* no matrix is tracked, but we leave the register values as-is */
|
|
||||||
assert(ctx->VertexProgram.TrackMatrix[i] == GL_NONE);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* load the matrix values into sequential registers */
|
|
||||||
if (ctx->VertexProgram.TrackMatrixTransform[i] == GL_IDENTITY_NV) {
|
|
||||||
load_matrix(ctx->VertexProgram.Parameters, i*4, mat->m);
|
|
||||||
}
|
|
||||||
else if (ctx->VertexProgram.TrackMatrixTransform[i] == GL_INVERSE_NV) {
|
|
||||||
_math_matrix_analyse(mat); /* update the inverse */
|
|
||||||
ASSERT(!_math_matrix_is_dirty(mat));
|
|
||||||
load_matrix(ctx->VertexProgram.Parameters, i*4, mat->inv);
|
|
||||||
}
|
|
||||||
else if (ctx->VertexProgram.TrackMatrixTransform[i] == GL_TRANSPOSE_NV) {
|
|
||||||
load_transpose_matrix(ctx->VertexProgram.Parameters, i*4, mat->m);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
assert(ctx->VertexProgram.TrackMatrixTransform[i]
|
|
||||||
== GL_INVERSE_TRANSPOSE_NV);
|
|
||||||
_math_matrix_analyse(mat); /* update the inverse */
|
|
||||||
ASSERT(!_math_matrix_is_dirty(mat));
|
|
||||||
load_transpose_matrix(ctx->VertexProgram.Parameters, i*4, mat->inv);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This function executes vertex programs
|
* This function executes vertex programs
|
||||||
*/
|
*/
|
||||||
|
@@ -1,9 +1,8 @@
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Mesa 3-D graphics library
|
* Mesa 3-D graphics library
|
||||||
* Version: 3.5
|
* Version: 7.1
|
||||||
*
|
*
|
||||||
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
|
* Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
* copy of this software and associated documentation files (the "Software"),
|
* copy of this software and associated documentation files (the "Software"),
|
||||||
@@ -82,7 +81,4 @@ _tnl_draw_prims( GLcontext *ctx,
|
|||||||
GLuint min_index,
|
GLuint min_index,
|
||||||
GLuint max_index);
|
GLuint max_index);
|
||||||
|
|
||||||
extern void
|
|
||||||
_mesa_load_tracked_matrices(GLcontext *ctx);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Reference in New Issue
Block a user