summaryrefslogtreecommitdiff
path: root/src/mesa/drivers/dri/glamo/glamo_state.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa/drivers/dri/glamo/glamo_state.c')
-rw-r--r--src/mesa/drivers/dri/glamo/glamo_state.c75
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;
}