diff options
Diffstat (limited to 'src/mesa/drivers/dri/glamo/glamo_state.c')
-rw-r--r-- | src/mesa/drivers/dri/glamo/glamo_state.c | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/src/mesa/drivers/dri/glamo/glamo_state.c b/src/mesa/drivers/dri/glamo/glamo_state.c index 0bd585a3f3..4046c24aaf 100644 --- a/src/mesa/drivers/dri/glamo/glamo_state.c +++ b/src/mesa/drivers/dri/glamo/glamo_state.c @@ -51,6 +51,10 @@ #include "main/context.h" #include "main/framebuffer.h" +#include "main/api_arrayelt.h" +#include "swrast/swrast.h" +#include "swrast_setup/swrast_setup.h" +#include "tnl/tnl.h" #include "glamo_fbo.h" #include "glamo_state.h" @@ -183,9 +187,80 @@ static void glamoViewport(GLcontext *ctx, GLint x, GLint y, } +static void glamoUploadMatrix(struct glamo_context *gCtx, uint16_t mreg, + GLfloat *matrix) +{ + int i; + char *type; + + switch ( mreg ) { + case G3D_MATRIX_MVP : + type = "MVP"; break; + case G3D_MATRIX_MV : + type = "MV"; break; + case G3D_MATRIX_IMVP : + type = "inverse MVP"; break; + default : + type = "unknown"; break; + } + printf("Uploading %s matrix...\n", type); + + glamoDRMStartBurst(gCtx, mreg); + if ( mreg != G3D_MATRIX_IMVP ) { + for ( i=0; i<16; i++ ) { + glamoDRMAddData(gCtx, float7s16(matrix[i]), 4); + } + } else { + /* Normal matrix needs special treatment */ + for ( i=0; i<3; i++ ) { + glamoDRMAddData(gCtx, float7s16(matrix[4*i]), 4); + glamoDRMAddData(gCtx, float7s16(matrix[4*i+1]), 4); + glamoDRMAddData(gCtx, float7s16(matrix[4*i+2]), 4); + } + } + glamoDRMDispatch(gCtx); +} + + +GLboolean glamoValidateState(GLcontext *ctx, GLuint new_state) +{ + struct glamo_context *gCtx = GLAMO_CONTEXT(ctx); + + if ( new_state & (_NEW_MODELVIEW|_NEW_PROJECTION) ) { + + glamoUploadMatrix(gCtx, G3D_MATRIX_MVP, + ctx->_ModelProjectMatrix.m); + + /* FIXME: The following two aren't needed unless lighting + * is in use... */ + glamoUploadMatrix(gCtx, G3D_MATRIX_MV, + ctx->ModelviewMatrixStack.Top->m); + _math_matrix_alloc_inv(&(ctx->_ModelProjectMatrix)); + _math_matrix_analyse(&(ctx->_ModelProjectMatrix)); + glamoUploadMatrix(gCtx, G3D_MATRIX_IMVP, + ctx->_ModelProjectMatrix.inv); + } + + gCtx->new_state = 0; + return GL_TRUE; +} + + static void glamoUpdateState(GLcontext *ctx, GLbitfield new_state) { + struct glamo_context *gCtx = GLAMO_CONTEXT(ctx); + printf("glamoUpdateState\n"); + + _swrast_InvalidateState(ctx, new_state); + _swsetup_InvalidateState(ctx, new_state); + _vbo_InvalidateState(ctx, new_state); + _tnl_InvalidateState(ctx, new_state); + _ae_invalidate_state(ctx, new_state); + + /* Make a note that some state has changed, + * so that it can be sent to the GPU later. */ + gCtx->new_state |= new_state; } |