mesa: rework matrix statevar enums to remove excessive branching in fetch_state
Instead of having $matrix and $modifier as separate enums, combine them to 1 enum $matrix_$modifier. Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6946>
This commit is contained in:
@@ -192,56 +192,40 @@ static const struct gl_builtin_uniform_element gl_CurrentAttribFragMESA_elements
|
|||||||
{NULL, {STATE_INTERNAL, STATE_CURRENT_ATTRIB_MAYBE_VP_CLAMPED, 0}, SWIZZLE_XYZW},
|
{NULL, {STATE_INTERNAL, STATE_CURRENT_ATTRIB_MAYBE_VP_CLAMPED, 0}, SWIZZLE_XYZW},
|
||||||
};
|
};
|
||||||
|
|
||||||
#define MATRIX(name, statevar, modifier) \
|
#define MATRIX(name, statevar) \
|
||||||
static const struct gl_builtin_uniform_element name ## _elements[] = { \
|
static const struct gl_builtin_uniform_element name ## _elements[] = { \
|
||||||
{ NULL, { statevar, 0, 0, 0, modifier}, SWIZZLE_XYZW }, \
|
{ NULL, { statevar, 0, 0, 0, 0}, SWIZZLE_XYZW }, \
|
||||||
{ NULL, { statevar, 0, 1, 1, modifier}, SWIZZLE_XYZW }, \
|
{ NULL, { statevar, 0, 1, 1, 0}, SWIZZLE_XYZW }, \
|
||||||
{ NULL, { statevar, 0, 2, 2, modifier}, SWIZZLE_XYZW }, \
|
{ NULL, { statevar, 0, 2, 2, 0}, SWIZZLE_XYZW }, \
|
||||||
{ NULL, { statevar, 0, 3, 3, modifier}, SWIZZLE_XYZW }, \
|
{ NULL, { statevar, 0, 3, 3, 0}, SWIZZLE_XYZW }, \
|
||||||
}
|
}
|
||||||
|
|
||||||
MATRIX(gl_ModelViewMatrix,
|
MATRIX(gl_ModelViewMatrix, STATE_MODELVIEW_MATRIX_TRANSPOSE);
|
||||||
STATE_MODELVIEW_MATRIX, STATE_MATRIX_TRANSPOSE);
|
MATRIX(gl_ModelViewMatrixInverse, STATE_MODELVIEW_MATRIX_INVTRANS);
|
||||||
MATRIX(gl_ModelViewMatrixInverse,
|
MATRIX(gl_ModelViewMatrixTranspose, STATE_MODELVIEW_MATRIX);
|
||||||
STATE_MODELVIEW_MATRIX, STATE_MATRIX_INVTRANS);
|
MATRIX(gl_ModelViewMatrixInverseTranspose, STATE_MODELVIEW_MATRIX_INVERSE);
|
||||||
MATRIX(gl_ModelViewMatrixTranspose,
|
|
||||||
STATE_MODELVIEW_MATRIX, 0);
|
|
||||||
MATRIX(gl_ModelViewMatrixInverseTranspose,
|
|
||||||
STATE_MODELVIEW_MATRIX, STATE_MATRIX_INVERSE);
|
|
||||||
|
|
||||||
MATRIX(gl_ProjectionMatrix,
|
MATRIX(gl_ProjectionMatrix, STATE_PROJECTION_MATRIX_TRANSPOSE);
|
||||||
STATE_PROJECTION_MATRIX, STATE_MATRIX_TRANSPOSE);
|
MATRIX(gl_ProjectionMatrixInverse, STATE_PROJECTION_MATRIX_INVTRANS);
|
||||||
MATRIX(gl_ProjectionMatrixInverse,
|
MATRIX(gl_ProjectionMatrixTranspose, STATE_PROJECTION_MATRIX);
|
||||||
STATE_PROJECTION_MATRIX, STATE_MATRIX_INVTRANS);
|
MATRIX(gl_ProjectionMatrixInverseTranspose, STATE_PROJECTION_MATRIX_INVERSE);
|
||||||
MATRIX(gl_ProjectionMatrixTranspose,
|
|
||||||
STATE_PROJECTION_MATRIX, 0);
|
|
||||||
MATRIX(gl_ProjectionMatrixInverseTranspose,
|
|
||||||
STATE_PROJECTION_MATRIX, STATE_MATRIX_INVERSE);
|
|
||||||
|
|
||||||
MATRIX(gl_ModelViewProjectionMatrix,
|
MATRIX(gl_ModelViewProjectionMatrix, STATE_MVP_MATRIX_TRANSPOSE);
|
||||||
STATE_MVP_MATRIX, STATE_MATRIX_TRANSPOSE);
|
MATRIX(gl_ModelViewProjectionMatrixInverse, STATE_MVP_MATRIX_INVTRANS);
|
||||||
MATRIX(gl_ModelViewProjectionMatrixInverse,
|
MATRIX(gl_ModelViewProjectionMatrixTranspose, STATE_MVP_MATRIX);
|
||||||
STATE_MVP_MATRIX, STATE_MATRIX_INVTRANS);
|
MATRIX(gl_ModelViewProjectionMatrixInverseTranspose, STATE_MVP_MATRIX_INVERSE);
|
||||||
MATRIX(gl_ModelViewProjectionMatrixTranspose,
|
|
||||||
STATE_MVP_MATRIX, 0);
|
|
||||||
MATRIX(gl_ModelViewProjectionMatrixInverseTranspose,
|
|
||||||
STATE_MVP_MATRIX, STATE_MATRIX_INVERSE);
|
|
||||||
|
|
||||||
MATRIX(gl_TextureMatrix,
|
MATRIX(gl_TextureMatrix, STATE_TEXTURE_MATRIX_TRANSPOSE);
|
||||||
STATE_TEXTURE_MATRIX, STATE_MATRIX_TRANSPOSE);
|
MATRIX(gl_TextureMatrixInverse, STATE_TEXTURE_MATRIX_INVTRANS);
|
||||||
MATRIX(gl_TextureMatrixInverse,
|
MATRIX(gl_TextureMatrixTranspose, STATE_TEXTURE_MATRIX);
|
||||||
STATE_TEXTURE_MATRIX, STATE_MATRIX_INVTRANS);
|
MATRIX(gl_TextureMatrixInverseTranspose, STATE_TEXTURE_MATRIX_INVERSE);
|
||||||
MATRIX(gl_TextureMatrixTranspose,
|
|
||||||
STATE_TEXTURE_MATRIX, 0);
|
|
||||||
MATRIX(gl_TextureMatrixInverseTranspose,
|
|
||||||
STATE_TEXTURE_MATRIX, STATE_MATRIX_INVERSE);
|
|
||||||
|
|
||||||
static const struct gl_builtin_uniform_element gl_NormalMatrix_elements[] = {
|
static const struct gl_builtin_uniform_element gl_NormalMatrix_elements[] = {
|
||||||
{ NULL, { STATE_MODELVIEW_MATRIX, 0, 0, 0, STATE_MATRIX_INVERSE},
|
{ NULL, { STATE_MODELVIEW_MATRIX_INVERSE, 0, 0, 0, 0},
|
||||||
MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_Z) },
|
MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_Z) },
|
||||||
{ NULL, { STATE_MODELVIEW_MATRIX, 0, 1, 1, STATE_MATRIX_INVERSE},
|
{ NULL, { STATE_MODELVIEW_MATRIX_INVERSE, 0, 1, 1, 0},
|
||||||
MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_Z) },
|
MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_Z) },
|
||||||
{ NULL, { STATE_MODELVIEW_MATRIX, 0, 2, 2, STATE_MATRIX_INVERSE},
|
{ NULL, { STATE_MODELVIEW_MATRIX_INVERSE, 0, 2, 2, 0},
|
||||||
MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_Z) },
|
MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_Z) },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -722,8 +722,8 @@ static struct ureg get_eye_position( struct tnl_program *p )
|
|||||||
emit_matrix_transform_vec4(p, p->eye_position, modelview, pos);
|
emit_matrix_transform_vec4(p, p->eye_position, modelview, pos);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
register_matrix_param5( p, STATE_MODELVIEW_MATRIX, 0, 0, 3,
|
register_matrix_param5( p, STATE_MODELVIEW_MATRIX_TRANSPOSE, 0, 0, 3,
|
||||||
STATE_MATRIX_TRANSPOSE, modelview );
|
0, modelview );
|
||||||
|
|
||||||
emit_transpose_matrix_transform_vec4(p, p->eye_position, modelview, pos);
|
emit_transpose_matrix_transform_vec4(p, p->eye_position, modelview, pos);
|
||||||
}
|
}
|
||||||
@@ -782,8 +782,8 @@ static struct ureg get_transformed_normal( struct tnl_program *p )
|
|||||||
struct ureg transformed_normal = reserve_temp(p);
|
struct ureg transformed_normal = reserve_temp(p);
|
||||||
|
|
||||||
if (p->state->need_eye_coords) {
|
if (p->state->need_eye_coords) {
|
||||||
register_matrix_param5( p, STATE_MODELVIEW_MATRIX, 0, 0, 2,
|
register_matrix_param5( p, STATE_MODELVIEW_MATRIX_INVTRANS, 0, 0, 2,
|
||||||
STATE_MATRIX_INVTRANS, mvinv );
|
0, mvinv );
|
||||||
|
|
||||||
/* Transform to eye space:
|
/* Transform to eye space:
|
||||||
*/
|
*/
|
||||||
@@ -827,8 +827,8 @@ static void build_hpos( struct tnl_program *p )
|
|||||||
emit_matrix_transform_vec4( p, hpos, mvp, pos );
|
emit_matrix_transform_vec4( p, hpos, mvp, pos );
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
register_matrix_param5( p, STATE_MVP_MATRIX, 0, 0, 3,
|
register_matrix_param5( p, STATE_MVP_MATRIX_TRANSPOSE, 0, 0, 3,
|
||||||
STATE_MATRIX_TRANSPOSE, mvp );
|
0, mvp );
|
||||||
emit_transpose_matrix_transform_vec4( p, hpos, mvp, pos );
|
emit_transpose_matrix_transform_vec4( p, hpos, mvp, pos );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1490,8 +1490,8 @@ static void build_texture_transform( struct tnl_program *p )
|
|||||||
emit_matrix_transform_vec4( p, out, texmat, in );
|
emit_matrix_transform_vec4( p, out, texmat, in );
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
register_matrix_param5( p, STATE_TEXTURE_MATRIX, i, 0, 3,
|
register_matrix_param5( p, STATE_TEXTURE_MATRIX_TRANSPOSE, i, 0, 3,
|
||||||
STATE_MATRIX_TRANSPOSE, texmat );
|
0, texmat );
|
||||||
emit_transpose_matrix_transform_vec4( p, out, texmat, in );
|
emit_transpose_matrix_transform_vec4( p, out, texmat, in );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -45,6 +45,31 @@
|
|||||||
|
|
||||||
#define ONE_DIV_SQRT_LN2 (1.201122408786449815)
|
#define ONE_DIV_SQRT_LN2 (1.201122408786449815)
|
||||||
|
|
||||||
|
static ALWAYS_INLINE void
|
||||||
|
copy_matrix(float *value, const float *m, unsigned firstRow, unsigned lastRow)
|
||||||
|
{
|
||||||
|
unsigned i, row;
|
||||||
|
|
||||||
|
assert(firstRow < 4);
|
||||||
|
assert(lastRow < 4);
|
||||||
|
|
||||||
|
for (i = 0, row = firstRow; row <= lastRow; row++) {
|
||||||
|
value[i++] = m[row + 0];
|
||||||
|
value[i++] = m[row + 4];
|
||||||
|
value[i++] = m[row + 8];
|
||||||
|
value[i++] = m[row + 12];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static ALWAYS_INLINE void
|
||||||
|
copy_matrix_transposed(float *value, const float *m, unsigned firstRow, unsigned lastRow)
|
||||||
|
{
|
||||||
|
assert(firstRow < 4);
|
||||||
|
assert(lastRow < 4);
|
||||||
|
|
||||||
|
memcpy(value, &m[firstRow * 4],
|
||||||
|
(lastRow - firstRow + 1) * 4 * sizeof(GLfloat));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Use the list of tokens in the state[] array to find global GL state
|
* Use the list of tokens in the state[] array to find global GL state
|
||||||
@@ -284,77 +309,136 @@ fetch_state(struct gl_context *ctx, const gl_state_index16 state[],
|
|||||||
value[2] = ctx->Point.Params[2];
|
value[2] = ctx->Point.Params[2];
|
||||||
value[3] = 1.0F;
|
value[3] = 1.0F;
|
||||||
return;
|
return;
|
||||||
case STATE_MODELVIEW_MATRIX:
|
/* state[0] = modelview, projection, texture, etc. */
|
||||||
case STATE_PROJECTION_MATRIX:
|
/* state[1] = which texture matrix or program matrix */
|
||||||
case STATE_MVP_MATRIX:
|
/* state[2] = first row to fetch */
|
||||||
case STATE_TEXTURE_MATRIX:
|
/* state[3] = last row to fetch */
|
||||||
case STATE_PROGRAM_MATRIX:
|
case STATE_MODELVIEW_MATRIX: {
|
||||||
{
|
const GLmatrix *matrix = ctx->ModelviewMatrixStack.Top;
|
||||||
/* state[0] = modelview, projection, texture, etc. */
|
copy_matrix(value, matrix->m, state[2], state[3]);
|
||||||
/* state[1] = which texture matrix or program matrix */
|
|
||||||
/* state[2] = first row to fetch */
|
|
||||||
/* state[3] = last row to fetch */
|
|
||||||
/* state[4] = transpose, inverse or invtrans */
|
|
||||||
const GLmatrix *matrix;
|
|
||||||
const gl_state_index mat = state[0];
|
|
||||||
const GLuint index = (GLuint) state[1];
|
|
||||||
const GLuint firstRow = (GLuint) state[2];
|
|
||||||
const GLuint lastRow = (GLuint) state[3];
|
|
||||||
const gl_state_index modifier = state[4];
|
|
||||||
const GLfloat *m;
|
|
||||||
GLuint row, i;
|
|
||||||
assert(firstRow < 4);
|
|
||||||
assert(lastRow < 4);
|
|
||||||
if (mat == STATE_MODELVIEW_MATRIX) {
|
|
||||||
matrix = ctx->ModelviewMatrixStack.Top;
|
|
||||||
}
|
|
||||||
else if (mat == STATE_PROJECTION_MATRIX) {
|
|
||||||
matrix = ctx->ProjectionMatrixStack.Top;
|
|
||||||
}
|
|
||||||
else if (mat == STATE_MVP_MATRIX) {
|
|
||||||
matrix = &ctx->_ModelProjectMatrix;
|
|
||||||
}
|
|
||||||
else if (mat == STATE_TEXTURE_MATRIX) {
|
|
||||||
assert(index < ARRAY_SIZE(ctx->TextureMatrixStack));
|
|
||||||
matrix = ctx->TextureMatrixStack[index].Top;
|
|
||||||
}
|
|
||||||
else if (mat == STATE_PROGRAM_MATRIX) {
|
|
||||||
assert(index < ARRAY_SIZE(ctx->ProgramMatrixStack));
|
|
||||||
matrix = ctx->ProgramMatrixStack[index].Top;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
unreachable("Bad matrix name in fetch_state()");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (modifier == STATE_MATRIX_INVERSE ||
|
|
||||||
modifier == STATE_MATRIX_INVTRANS) {
|
|
||||||
/* Be sure inverse is up to date:
|
|
||||||
*/
|
|
||||||
_math_matrix_analyse( (GLmatrix*) matrix );
|
|
||||||
m = matrix->inv;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
m = matrix->m;
|
|
||||||
}
|
|
||||||
if (modifier == STATE_MATRIX_TRANSPOSE ||
|
|
||||||
modifier == STATE_MATRIX_INVTRANS) {
|
|
||||||
for (i = 0, row = firstRow; row <= lastRow; row++) {
|
|
||||||
value[i++] = m[row * 4 + 0];
|
|
||||||
value[i++] = m[row * 4 + 1];
|
|
||||||
value[i++] = m[row * 4 + 2];
|
|
||||||
value[i++] = m[row * 4 + 3];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
for (i = 0, row = firstRow; row <= lastRow; row++) {
|
|
||||||
value[i++] = m[row + 0];
|
|
||||||
value[i++] = m[row + 4];
|
|
||||||
value[i++] = m[row + 8];
|
|
||||||
value[i++] = m[row + 12];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
case STATE_MODELVIEW_MATRIX_INVERSE: {
|
||||||
|
const GLmatrix *matrix = ctx->ModelviewMatrixStack.Top;
|
||||||
|
_math_matrix_analyse((GLmatrix*)matrix); /* Be sure inverse is up to date: */
|
||||||
|
copy_matrix(value, matrix->inv, state[2], state[3]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
case STATE_MODELVIEW_MATRIX_TRANSPOSE: {
|
||||||
|
const GLmatrix *matrix = ctx->ModelviewMatrixStack.Top;
|
||||||
|
copy_matrix_transposed(value, matrix->m, state[2], state[3]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
case STATE_MODELVIEW_MATRIX_INVTRANS: {
|
||||||
|
const GLmatrix *matrix = ctx->ModelviewMatrixStack.Top;
|
||||||
|
_math_matrix_analyse((GLmatrix*)matrix); /* Be sure inverse is up to date: */
|
||||||
|
copy_matrix_transposed(value, matrix->inv, state[2], state[3]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
case STATE_PROJECTION_MATRIX: {
|
||||||
|
const GLmatrix *matrix = ctx->ProjectionMatrixStack.Top;
|
||||||
|
copy_matrix(value, matrix->m, state[2], state[3]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
case STATE_PROJECTION_MATRIX_INVERSE: {
|
||||||
|
const GLmatrix *matrix = ctx->ProjectionMatrixStack.Top;
|
||||||
|
_math_matrix_analyse((GLmatrix*)matrix); /* Be sure inverse is up to date: */
|
||||||
|
copy_matrix(value, matrix->inv, state[2], state[3]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
case STATE_PROJECTION_MATRIX_TRANSPOSE: {
|
||||||
|
const GLmatrix *matrix = ctx->ProjectionMatrixStack.Top;
|
||||||
|
copy_matrix_transposed(value, matrix->m, state[2], state[3]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
case STATE_PROJECTION_MATRIX_INVTRANS: {
|
||||||
|
const GLmatrix *matrix = ctx->ProjectionMatrixStack.Top;
|
||||||
|
_math_matrix_analyse((GLmatrix*)matrix); /* Be sure inverse is up to date: */
|
||||||
|
copy_matrix_transposed(value, matrix->inv, state[2], state[3]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
case STATE_MVP_MATRIX: {
|
||||||
|
const GLmatrix *matrix = &ctx->_ModelProjectMatrix;
|
||||||
|
copy_matrix(value, matrix->m, state[2], state[3]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
case STATE_MVP_MATRIX_INVERSE: {
|
||||||
|
const GLmatrix *matrix = &ctx->_ModelProjectMatrix;
|
||||||
|
_math_matrix_analyse((GLmatrix*)matrix); /* Be sure inverse is up to date: */
|
||||||
|
copy_matrix(value, matrix->inv, state[2], state[3]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
case STATE_MVP_MATRIX_TRANSPOSE: {
|
||||||
|
const GLmatrix *matrix = &ctx->_ModelProjectMatrix;
|
||||||
|
copy_matrix_transposed(value, matrix->m, state[2], state[3]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
case STATE_MVP_MATRIX_INVTRANS: {
|
||||||
|
const GLmatrix *matrix = &ctx->_ModelProjectMatrix;
|
||||||
|
_math_matrix_analyse((GLmatrix*)matrix); /* Be sure inverse is up to date: */
|
||||||
|
copy_matrix_transposed(value, matrix->inv, state[2], state[3]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
case STATE_TEXTURE_MATRIX: {
|
||||||
|
const GLuint index = (GLuint) state[1];
|
||||||
|
assert(index < ARRAY_SIZE(ctx->TextureMatrixStack));
|
||||||
|
const GLmatrix *matrix = ctx->TextureMatrixStack[index].Top;
|
||||||
|
copy_matrix(value, matrix->m, state[2], state[3]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
case STATE_TEXTURE_MATRIX_INVERSE: {
|
||||||
|
const GLuint index = (GLuint) state[1];
|
||||||
|
assert(index < ARRAY_SIZE(ctx->TextureMatrixStack));
|
||||||
|
const GLmatrix *matrix = ctx->TextureMatrixStack[index].Top;
|
||||||
|
_math_matrix_analyse((GLmatrix*)matrix); /* Be sure inverse is up to date: */
|
||||||
|
copy_matrix(value, matrix->inv, state[2], state[3]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
case STATE_TEXTURE_MATRIX_TRANSPOSE: {
|
||||||
|
const GLuint index = (GLuint) state[1];
|
||||||
|
assert(index < ARRAY_SIZE(ctx->TextureMatrixStack));
|
||||||
|
const GLmatrix *matrix = ctx->TextureMatrixStack[index].Top;
|
||||||
|
copy_matrix_transposed(value, matrix->m, state[2], state[3]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
case STATE_TEXTURE_MATRIX_INVTRANS: {
|
||||||
|
const GLuint index = (GLuint) state[1];
|
||||||
|
assert(index < ARRAY_SIZE(ctx->TextureMatrixStack));
|
||||||
|
const GLmatrix *matrix = ctx->TextureMatrixStack[index].Top;
|
||||||
|
_math_matrix_analyse((GLmatrix*)matrix); /* Be sure inverse is up to date: */
|
||||||
|
copy_matrix_transposed(value, matrix->inv, state[2], state[3]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
case STATE_PROGRAM_MATRIX: {
|
||||||
|
const GLuint index = (GLuint) state[1];
|
||||||
|
assert(index < ARRAY_SIZE(ctx->ProgramMatrixStack));
|
||||||
|
const GLmatrix *matrix = ctx->ProgramMatrixStack[index].Top;
|
||||||
|
copy_matrix(value, matrix->m, state[2], state[3]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
case STATE_PROGRAM_MATRIX_INVERSE: {
|
||||||
|
const GLuint index = (GLuint) state[1];
|
||||||
|
assert(index < ARRAY_SIZE(ctx->ProgramMatrixStack));
|
||||||
|
const GLmatrix *matrix = ctx->ProgramMatrixStack[index].Top;
|
||||||
|
_math_matrix_analyse((GLmatrix*)matrix); /* Be sure inverse is up to date: */
|
||||||
|
copy_matrix(value, matrix->inv, state[2], state[3]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
case STATE_PROGRAM_MATRIX_TRANSPOSE: {
|
||||||
|
const GLuint index = (GLuint) state[1];
|
||||||
|
assert(index < ARRAY_SIZE(ctx->ProgramMatrixStack));
|
||||||
|
const GLmatrix *matrix = ctx->ProgramMatrixStack[index].Top;
|
||||||
|
copy_matrix_transposed(value, matrix->m, state[2], state[3]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
case STATE_PROGRAM_MATRIX_INVTRANS: {
|
||||||
|
const GLuint index = (GLuint) state[1];
|
||||||
|
assert(index < ARRAY_SIZE(ctx->ProgramMatrixStack));
|
||||||
|
const GLmatrix *matrix = ctx->ProgramMatrixStack[index].Top;
|
||||||
|
_math_matrix_analyse((GLmatrix*)matrix); /* Be sure inverse is up to date: */
|
||||||
|
copy_matrix_transposed(value, matrix->inv, state[2], state[3]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
case STATE_NUM_SAMPLES:
|
case STATE_NUM_SAMPLES:
|
||||||
val[0].i = MAX2(1, _mesa_geometric_samples(ctx->DrawBuffer));
|
val[0].i = MAX2(1, _mesa_geometric_samples(ctx->DrawBuffer));
|
||||||
return;
|
return;
|
||||||
@@ -685,14 +769,29 @@ _mesa_program_state_flags(const gl_state_index16 state[STATE_LENGTH])
|
|||||||
return _NEW_POINT;
|
return _NEW_POINT;
|
||||||
|
|
||||||
case STATE_MODELVIEW_MATRIX:
|
case STATE_MODELVIEW_MATRIX:
|
||||||
|
case STATE_MODELVIEW_MATRIX_INVERSE:
|
||||||
|
case STATE_MODELVIEW_MATRIX_TRANSPOSE:
|
||||||
|
case STATE_MODELVIEW_MATRIX_INVTRANS:
|
||||||
return _NEW_MODELVIEW;
|
return _NEW_MODELVIEW;
|
||||||
case STATE_PROJECTION_MATRIX:
|
case STATE_PROJECTION_MATRIX:
|
||||||
|
case STATE_PROJECTION_MATRIX_INVERSE:
|
||||||
|
case STATE_PROJECTION_MATRIX_TRANSPOSE:
|
||||||
|
case STATE_PROJECTION_MATRIX_INVTRANS:
|
||||||
return _NEW_PROJECTION;
|
return _NEW_PROJECTION;
|
||||||
case STATE_MVP_MATRIX:
|
case STATE_MVP_MATRIX:
|
||||||
|
case STATE_MVP_MATRIX_INVERSE:
|
||||||
|
case STATE_MVP_MATRIX_TRANSPOSE:
|
||||||
|
case STATE_MVP_MATRIX_INVTRANS:
|
||||||
return _NEW_MODELVIEW | _NEW_PROJECTION;
|
return _NEW_MODELVIEW | _NEW_PROJECTION;
|
||||||
case STATE_TEXTURE_MATRIX:
|
case STATE_TEXTURE_MATRIX:
|
||||||
|
case STATE_TEXTURE_MATRIX_INVERSE:
|
||||||
|
case STATE_TEXTURE_MATRIX_TRANSPOSE:
|
||||||
|
case STATE_TEXTURE_MATRIX_INVTRANS:
|
||||||
return _NEW_TEXTURE_MATRIX;
|
return _NEW_TEXTURE_MATRIX;
|
||||||
case STATE_PROGRAM_MATRIX:
|
case STATE_PROGRAM_MATRIX:
|
||||||
|
case STATE_PROGRAM_MATRIX_INVERSE:
|
||||||
|
case STATE_PROGRAM_MATRIX_TRANSPOSE:
|
||||||
|
case STATE_PROGRAM_MATRIX_INVTRANS:
|
||||||
return _NEW_TRACK_MATRIX;
|
return _NEW_TRACK_MATRIX;
|
||||||
|
|
||||||
case STATE_NUM_SAMPLES:
|
case STATE_NUM_SAMPLES:
|
||||||
@@ -812,26 +911,63 @@ append_token(char *dst, gl_state_index k)
|
|||||||
case STATE_MODELVIEW_MATRIX:
|
case STATE_MODELVIEW_MATRIX:
|
||||||
append(dst, "matrix.modelview");
|
append(dst, "matrix.modelview");
|
||||||
break;
|
break;
|
||||||
|
case STATE_MODELVIEW_MATRIX_INVERSE:
|
||||||
|
append(dst, "matrix.modelview.inverse");
|
||||||
|
break;
|
||||||
|
case STATE_MODELVIEW_MATRIX_TRANSPOSE:
|
||||||
|
append(dst, "matrix.modelview.transpose");
|
||||||
|
break;
|
||||||
|
case STATE_MODELVIEW_MATRIX_INVTRANS:
|
||||||
|
append(dst, "matrix.modelview.invtrans");
|
||||||
|
break;
|
||||||
case STATE_PROJECTION_MATRIX:
|
case STATE_PROJECTION_MATRIX:
|
||||||
append(dst, "matrix.projection");
|
append(dst, "matrix.projection");
|
||||||
break;
|
break;
|
||||||
|
case STATE_PROJECTION_MATRIX_INVERSE:
|
||||||
|
append(dst, "matrix.projection.inverse");
|
||||||
|
break;
|
||||||
|
case STATE_PROJECTION_MATRIX_TRANSPOSE:
|
||||||
|
append(dst, "matrix.projection.transpose");
|
||||||
|
break;
|
||||||
|
case STATE_PROJECTION_MATRIX_INVTRANS:
|
||||||
|
append(dst, "matrix.projection.invtrans");
|
||||||
|
break;
|
||||||
case STATE_MVP_MATRIX:
|
case STATE_MVP_MATRIX:
|
||||||
append(dst, "matrix.mvp");
|
append(dst, "matrix.mvp");
|
||||||
break;
|
break;
|
||||||
|
case STATE_MVP_MATRIX_INVERSE:
|
||||||
|
append(dst, "matrix.mvp.inverse");
|
||||||
|
break;
|
||||||
|
case STATE_MVP_MATRIX_TRANSPOSE:
|
||||||
|
append(dst, "matrix.mvp.transpose");
|
||||||
|
break;
|
||||||
|
case STATE_MVP_MATRIX_INVTRANS:
|
||||||
|
append(dst, "matrix.mvp.invtrans");
|
||||||
|
break;
|
||||||
case STATE_TEXTURE_MATRIX:
|
case STATE_TEXTURE_MATRIX:
|
||||||
append(dst, "matrix.texture");
|
append(dst, "matrix.texture");
|
||||||
break;
|
break;
|
||||||
|
case STATE_TEXTURE_MATRIX_INVERSE:
|
||||||
|
append(dst, "matrix.texture.inverse");
|
||||||
|
break;
|
||||||
|
case STATE_TEXTURE_MATRIX_TRANSPOSE:
|
||||||
|
append(dst, "matrix.texture.transpose");
|
||||||
|
break;
|
||||||
|
case STATE_TEXTURE_MATRIX_INVTRANS:
|
||||||
|
append(dst, "matrix.texture.invtrans");
|
||||||
|
break;
|
||||||
case STATE_PROGRAM_MATRIX:
|
case STATE_PROGRAM_MATRIX:
|
||||||
append(dst, "matrix.program");
|
append(dst, "matrix.program");
|
||||||
break;
|
break;
|
||||||
case STATE_MATRIX_INVERSE:
|
case STATE_PROGRAM_MATRIX_INVERSE:
|
||||||
append(dst, ".inverse");
|
append(dst, "matrix.program.inverse");
|
||||||
break;
|
break;
|
||||||
case STATE_MATRIX_TRANSPOSE:
|
case STATE_PROGRAM_MATRIX_TRANSPOSE:
|
||||||
append(dst, ".transpose");
|
append(dst, "matrix.program.transpose");
|
||||||
|
break;
|
||||||
|
case STATE_PROGRAM_MATRIX_INVTRANS:
|
||||||
|
append(dst, "matrix.program.invtrans");
|
||||||
break;
|
break;
|
||||||
case STATE_MATRIX_INVTRANS:
|
|
||||||
append(dst, ".invtrans");
|
|
||||||
break;
|
break;
|
||||||
case STATE_AMBIENT:
|
case STATE_AMBIENT:
|
||||||
append(dst, ".ambient");
|
append(dst, ".ambient");
|
||||||
@@ -1032,10 +1168,25 @@ _mesa_program_state_string(const gl_state_index16 state[STATE_LENGTH])
|
|||||||
append(str, ".plane");
|
append(str, ".plane");
|
||||||
break;
|
break;
|
||||||
case STATE_MODELVIEW_MATRIX:
|
case STATE_MODELVIEW_MATRIX:
|
||||||
|
case STATE_MODELVIEW_MATRIX_INVERSE:
|
||||||
|
case STATE_MODELVIEW_MATRIX_TRANSPOSE:
|
||||||
|
case STATE_MODELVIEW_MATRIX_INVTRANS:
|
||||||
case STATE_PROJECTION_MATRIX:
|
case STATE_PROJECTION_MATRIX:
|
||||||
|
case STATE_PROJECTION_MATRIX_INVERSE:
|
||||||
|
case STATE_PROJECTION_MATRIX_TRANSPOSE:
|
||||||
|
case STATE_PROJECTION_MATRIX_INVTRANS:
|
||||||
case STATE_MVP_MATRIX:
|
case STATE_MVP_MATRIX:
|
||||||
|
case STATE_MVP_MATRIX_INVERSE:
|
||||||
|
case STATE_MVP_MATRIX_TRANSPOSE:
|
||||||
|
case STATE_MVP_MATRIX_INVTRANS:
|
||||||
case STATE_TEXTURE_MATRIX:
|
case STATE_TEXTURE_MATRIX:
|
||||||
|
case STATE_TEXTURE_MATRIX_INVERSE:
|
||||||
|
case STATE_TEXTURE_MATRIX_TRANSPOSE:
|
||||||
|
case STATE_TEXTURE_MATRIX_INVTRANS:
|
||||||
case STATE_PROGRAM_MATRIX:
|
case STATE_PROGRAM_MATRIX:
|
||||||
|
case STATE_PROGRAM_MATRIX_INVERSE:
|
||||||
|
case STATE_PROGRAM_MATRIX_TRANSPOSE:
|
||||||
|
case STATE_PROGRAM_MATRIX_INVTRANS:
|
||||||
{
|
{
|
||||||
/* state[0] = modelview, projection, texture, etc. */
|
/* state[0] = modelview, projection, texture, etc. */
|
||||||
/* state[1] = which texture matrix or program matrix */
|
/* state[1] = which texture matrix or program matrix */
|
||||||
@@ -1046,13 +1197,10 @@ _mesa_program_state_string(const gl_state_index16 state[STATE_LENGTH])
|
|||||||
const GLuint index = (GLuint) state[1];
|
const GLuint index = (GLuint) state[1];
|
||||||
const GLuint firstRow = (GLuint) state[2];
|
const GLuint firstRow = (GLuint) state[2];
|
||||||
const GLuint lastRow = (GLuint) state[3];
|
const GLuint lastRow = (GLuint) state[3];
|
||||||
const gl_state_index modifier = state[4];
|
|
||||||
if (index ||
|
if (index ||
|
||||||
mat == STATE_TEXTURE_MATRIX ||
|
(mat >= STATE_TEXTURE_MATRIX &&
|
||||||
mat == STATE_PROGRAM_MATRIX)
|
mat <= STATE_PROGRAM_MATRIX_INVTRANS))
|
||||||
append_index(str, index);
|
append_index(str, index);
|
||||||
if (modifier)
|
|
||||||
append_token(str, modifier);
|
|
||||||
if (firstRow == lastRow)
|
if (firstRow == lastRow)
|
||||||
sprintf(tmp, ".row[%d]", firstRow);
|
sprintf(tmp, ".row[%d]", firstRow);
|
||||||
else
|
else
|
||||||
|
@@ -67,13 +67,29 @@ typedef enum gl_state_index_ {
|
|||||||
STATE_POINT_ATTENUATION,
|
STATE_POINT_ATTENUATION,
|
||||||
|
|
||||||
STATE_MODELVIEW_MATRIX,
|
STATE_MODELVIEW_MATRIX,
|
||||||
|
STATE_MODELVIEW_MATRIX_INVERSE,
|
||||||
|
STATE_MODELVIEW_MATRIX_TRANSPOSE,
|
||||||
|
STATE_MODELVIEW_MATRIX_INVTRANS,
|
||||||
|
|
||||||
STATE_PROJECTION_MATRIX,
|
STATE_PROJECTION_MATRIX,
|
||||||
|
STATE_PROJECTION_MATRIX_INVERSE,
|
||||||
|
STATE_PROJECTION_MATRIX_TRANSPOSE,
|
||||||
|
STATE_PROJECTION_MATRIX_INVTRANS,
|
||||||
|
|
||||||
STATE_MVP_MATRIX,
|
STATE_MVP_MATRIX,
|
||||||
|
STATE_MVP_MATRIX_INVERSE,
|
||||||
|
STATE_MVP_MATRIX_TRANSPOSE,
|
||||||
|
STATE_MVP_MATRIX_INVTRANS,
|
||||||
|
|
||||||
STATE_TEXTURE_MATRIX,
|
STATE_TEXTURE_MATRIX,
|
||||||
|
STATE_TEXTURE_MATRIX_INVERSE,
|
||||||
|
STATE_TEXTURE_MATRIX_TRANSPOSE,
|
||||||
|
STATE_TEXTURE_MATRIX_INVTRANS,
|
||||||
|
|
||||||
STATE_PROGRAM_MATRIX,
|
STATE_PROGRAM_MATRIX,
|
||||||
STATE_MATRIX_INVERSE,
|
STATE_PROGRAM_MATRIX_INVERSE,
|
||||||
STATE_MATRIX_TRANSPOSE,
|
STATE_PROGRAM_MATRIX_TRANSPOSE,
|
||||||
STATE_MATRIX_INVTRANS,
|
STATE_PROGRAM_MATRIX_INVTRANS,
|
||||||
|
|
||||||
STATE_AMBIENT,
|
STATE_AMBIENT,
|
||||||
STATE_DIFFUSE,
|
STATE_DIFFUSE,
|
||||||
|
@@ -42,6 +42,13 @@
|
|||||||
#include "util/u_math.h"
|
#include "util/u_math.h"
|
||||||
#include "util/u_memory.h"
|
#include "util/u_memory.h"
|
||||||
|
|
||||||
|
enum {
|
||||||
|
STATE_MATRIX_NO_MODIFIER,
|
||||||
|
STATE_MATRIX_INVERSE,
|
||||||
|
STATE_MATRIX_TRANSPOSE,
|
||||||
|
STATE_MATRIX_INVTRANS,
|
||||||
|
};
|
||||||
|
|
||||||
extern void *yy_scan_string(char *);
|
extern void *yy_scan_string(char *);
|
||||||
extern void yy_delete_buffer(void *);
|
extern void yy_delete_buffer(void *);
|
||||||
|
|
||||||
@@ -1456,21 +1463,19 @@ statePointProperty: SIZE_TOK
|
|||||||
|
|
||||||
stateMatrixRow: stateMatrixItem ROW '[' stateMatrixRowNum ']'
|
stateMatrixRow: stateMatrixItem ROW '[' stateMatrixRowNum ']'
|
||||||
{
|
{
|
||||||
$$[0] = $1[0];
|
$$[0] = $1[0] + $1[2];
|
||||||
$$[1] = $1[1];
|
$$[1] = $1[1];
|
||||||
$$[2] = $4;
|
$$[2] = $4;
|
||||||
$$[3] = $4;
|
$$[3] = $4;
|
||||||
$$[4] = $1[2];
|
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
stateMatrixRows: stateMatrixItem optMatrixRows
|
stateMatrixRows: stateMatrixItem optMatrixRows
|
||||||
{
|
{
|
||||||
$$[0] = $1[0];
|
$$[0] = $1[0] + $1[2];
|
||||||
$$[1] = $1[1];
|
$$[1] = $1[1];
|
||||||
$$[2] = $2[2];
|
$$[2] = $2[2];
|
||||||
$$[3] = $2[3];
|
$$[3] = $2[3];
|
||||||
$$[4] = $1[2];
|
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
@@ -1507,7 +1512,7 @@ stateMatrixItem: MATRIX stateMatrixName stateOptMatModifier
|
|||||||
|
|
||||||
stateOptMatModifier:
|
stateOptMatModifier:
|
||||||
{
|
{
|
||||||
$$ = 0;
|
$$ = STATE_MATRIX_NO_MODIFIER;
|
||||||
}
|
}
|
||||||
| stateMatModifier
|
| stateMatModifier
|
||||||
{
|
{
|
||||||
@@ -2338,11 +2343,8 @@ initialize_symbol_from_state(struct gl_program *prog,
|
|||||||
/* If we are adding a STATE_MATRIX that has multiple rows, we need to
|
/* If we are adding a STATE_MATRIX that has multiple rows, we need to
|
||||||
* unroll it and call add_state_reference() for each row
|
* unroll it and call add_state_reference() for each row
|
||||||
*/
|
*/
|
||||||
if ((state_tokens[0] == STATE_MODELVIEW_MATRIX ||
|
if (state_tokens[0] >= STATE_MODELVIEW_MATRIX &&
|
||||||
state_tokens[0] == STATE_PROJECTION_MATRIX ||
|
state_tokens[0] <= STATE_PROGRAM_MATRIX_INVTRANS
|
||||||
state_tokens[0] == STATE_MVP_MATRIX ||
|
|
||||||
state_tokens[0] == STATE_TEXTURE_MATRIX ||
|
|
||||||
state_tokens[0] == STATE_PROGRAM_MATRIX)
|
|
||||||
&& (state_tokens[2] != state_tokens[3])) {
|
&& (state_tokens[2] != state_tokens[3])) {
|
||||||
int row;
|
int row;
|
||||||
const int first_row = state_tokens[2];
|
const int first_row = state_tokens[2];
|
||||||
|
@@ -126,10 +126,10 @@ insert_mvp_mad_code(struct gl_context *ctx, struct gl_program *vprog)
|
|||||||
* XXX we should check if these state vars are already declared.
|
* XXX we should check if these state vars are already declared.
|
||||||
*/
|
*/
|
||||||
static const gl_state_index16 mvpState[4][STATE_LENGTH] = {
|
static const gl_state_index16 mvpState[4][STATE_LENGTH] = {
|
||||||
{ STATE_MVP_MATRIX, 0, 0, 0, STATE_MATRIX_TRANSPOSE },
|
{ STATE_MVP_MATRIX_TRANSPOSE, 0, 0, 0, 0 },
|
||||||
{ STATE_MVP_MATRIX, 0, 1, 1, STATE_MATRIX_TRANSPOSE },
|
{ STATE_MVP_MATRIX_TRANSPOSE, 0, 1, 1, 0 },
|
||||||
{ STATE_MVP_MATRIX, 0, 2, 2, STATE_MATRIX_TRANSPOSE },
|
{ STATE_MVP_MATRIX_TRANSPOSE, 0, 2, 2, 0 },
|
||||||
{ STATE_MVP_MATRIX, 0, 3, 3, STATE_MATRIX_TRANSPOSE },
|
{ STATE_MVP_MATRIX_TRANSPOSE, 0, 3, 3, 0 },
|
||||||
};
|
};
|
||||||
GLint mvpRef[4];
|
GLint mvpRef[4];
|
||||||
|
|
||||||
|
@@ -110,10 +110,25 @@ get_variable(lower_builtin_state *state, nir_deref_path *path,
|
|||||||
/* we need to fixup the array index slot: */
|
/* we need to fixup the array index slot: */
|
||||||
switch (tokens[0]) {
|
switch (tokens[0]) {
|
||||||
case STATE_MODELVIEW_MATRIX:
|
case STATE_MODELVIEW_MATRIX:
|
||||||
|
case STATE_MODELVIEW_MATRIX_INVERSE:
|
||||||
|
case STATE_MODELVIEW_MATRIX_TRANSPOSE:
|
||||||
|
case STATE_MODELVIEW_MATRIX_INVTRANS:
|
||||||
case STATE_PROJECTION_MATRIX:
|
case STATE_PROJECTION_MATRIX:
|
||||||
|
case STATE_PROJECTION_MATRIX_INVERSE:
|
||||||
|
case STATE_PROJECTION_MATRIX_TRANSPOSE:
|
||||||
|
case STATE_PROJECTION_MATRIX_INVTRANS:
|
||||||
case STATE_MVP_MATRIX:
|
case STATE_MVP_MATRIX:
|
||||||
|
case STATE_MVP_MATRIX_INVERSE:
|
||||||
|
case STATE_MVP_MATRIX_TRANSPOSE:
|
||||||
|
case STATE_MVP_MATRIX_INVTRANS:
|
||||||
case STATE_TEXTURE_MATRIX:
|
case STATE_TEXTURE_MATRIX:
|
||||||
|
case STATE_TEXTURE_MATRIX_INVERSE:
|
||||||
|
case STATE_TEXTURE_MATRIX_TRANSPOSE:
|
||||||
|
case STATE_TEXTURE_MATRIX_INVTRANS:
|
||||||
case STATE_PROGRAM_MATRIX:
|
case STATE_PROGRAM_MATRIX:
|
||||||
|
case STATE_PROGRAM_MATRIX_INVERSE:
|
||||||
|
case STATE_PROGRAM_MATRIX_TRANSPOSE:
|
||||||
|
case STATE_PROGRAM_MATRIX_INVTRANS:
|
||||||
case STATE_LIGHT:
|
case STATE_LIGHT:
|
||||||
case STATE_LIGHTPROD:
|
case STATE_LIGHTPROD:
|
||||||
case STATE_TEXGEN:
|
case STATE_TEXGEN:
|
||||||
|
Reference in New Issue
Block a user