tnl: Maintain the _WindowMap matrix in TNLcontext v2.
authorMathias Froehlich <Mathias.Froehlich@web.de>
Sun, 29 Mar 2015 16:57:45 +0000 (18:57 +0200)
committerMathias Froehlich <Mathias.Froehlich@gmx.net>
Sun, 5 Apr 2015 06:01:47 +0000 (08:01 +0200)
This is the only real user of _WindowMap which has the depth
buffer scaling multiplied in. Maintain the _WindowMap of the
one and only viewport inside TNLcontext.

v2:
Remove unneeded parentheses.

Reviewed-by: Brian Paul <brianp@vmware.com>
Signed-off-by: Mathias Froehlich <Mathias.Froehlich@web.de>
src/mesa/swrast_setup/ss_context.c
src/mesa/tnl/t_context.c
src/mesa/tnl/t_context.h
src/mesa/tnl/t_rasterpos.c

index 4fc90c3967ec46ef023a3748323bd114473a0126..74b1da342c7c83bb95db49aded937d322f3c8b78 100644 (file)
@@ -167,7 +167,7 @@ setup_vertex_format(struct gl_context *ctx)
          EMIT_ATTR( _TNL_ATTRIB_POINTSIZE, EMIT_1F, pointSize );
 
       _tnl_install_attrs( ctx, map, e,
-                          ctx->ViewportArray[0]._WindowMap.m,
+                          tnl->_WindowMap.m,
                           sizeof(SWvertex) );
 
       swsetup->last_index_bitset = index_bitset;
@@ -265,7 +265,8 @@ _swsetup_Wakeup( struct gl_context *ctx )
 void 
 _swsetup_Translate( struct gl_context *ctx, const void *vertex, SWvertex *dest )
 {
-   const GLfloat *m = ctx->ViewportArray[0]._WindowMap.m;
+   TNLcontext *tnl = TNL_CONTEXT(ctx);
+   const GLfloat *m = tnl->_WindowMap.m;
    GLfloat tmp[4];
    GLuint i;
 
index bc705d7a3504270843eb38123d666e4bee5ddd76..5b9dd54d75a834e7f55f888f41c814802e5f95c4 100644 (file)
@@ -35,6 +35,7 @@
 #include "math/m_translate.h"
 #include "math/m_xform.h"
 #include "main/state.h"
+#include "main/viewport.h"
 
 #include "tnl.h"
 #include "t_context.h"
@@ -69,6 +70,8 @@ _tnl_CreateContext( struct gl_context *ctx )
       _tnl_install_pipeline( ctx, _tnl_default_pipeline );
    }
 
+   _math_matrix_ctr(&tnl->_WindowMap);
+
    tnl->NeedNdcCoords = GL_TRUE;
    tnl->AllowVertexFog = GL_TRUE;
    tnl->AllowPixelFog = GL_TRUE;
@@ -108,6 +111,8 @@ _tnl_DestroyContext( struct gl_context *ctx )
    struct tnl_shine_tab *s, *tmps;
    TNLcontext *tnl = TNL_CONTEXT(ctx);
 
+   _math_matrix_dtr(&tnl->_WindowMap);
+
    /* Free lighting shininess exponentiation table */
    foreach_s( s, tmps, tnl->_ShineTabList ) {
       free( s );
@@ -182,6 +187,13 @@ _tnl_InvalidateState( struct gl_context *ctx, GLuint new_state )
          }
       }
    }
+
+   if (new_state & (_NEW_VIEWPORT | _NEW_BUFFERS)) {
+      double scale[3], translate[3];
+      _mesa_get_viewport_xform(ctx, 0, scale, translate);
+      _math_matrix_viewport(&tnl->_WindowMap, scale, translate,
+                            ctx->DrawBuffer->_DepthMaxF);
+   }
 }
 
 
index e89a7f83677b1d7bac78fde3fc46056d6a553062..e7adb5f533e1ef6566ffc77a6abfdba940125fd2 100644 (file)
@@ -514,6 +514,7 @@ typedef struct
    /* Clipspace/ndc/window vertex managment:
     */
    struct tnl_clipspace clipspace;
+   GLmatrix _WindowMap;
 
    /* Probably need a better configuration mechanism:
     */
index 1cd398108f12f6d714e4c183c78a385081c8f2e6..d4b45bac9ac2c1d5666509d71495ff5fb9b47963 100644 (file)
@@ -30,6 +30,7 @@
 #include "main/macros.h"
 #include "util/simple_list.h"
 #include "main/mtypes.h"
+#include "main/viewport.h"
 
 #include "math/m_matrix.h"
 #include "tnl/tnl.h"
@@ -377,6 +378,7 @@ _tnl_RasterPos(struct gl_context *ctx, const GLfloat vObj[4])
       GLfloat eye[4], clip[4], ndc[3], d;
       GLfloat *norm, eyenorm[3];
       GLfloat *objnorm = ctx->Current.Attrib[VERT_ATTRIB_NORMAL];
+      double scale[3], translate[3];
 
       /* apply modelview matrix:  eye = MV * obj */
       TRANSFORM_POINT( eye, ctx->ModelviewMatrixStack.Top->m, vObj );
@@ -409,13 +411,10 @@ _tnl_RasterPos(struct gl_context *ctx, const GLfloat vObj[4])
       ndc[1] = clip[1] * d;
       ndc[2] = clip[2] * d;
       /* wincoord = viewport_mapping(ndc) */
-      ctx->Current.RasterPos[0] = (ndc[0] * ctx->ViewportArray[0]._WindowMap.m[MAT_SX]
-                                   + ctx->ViewportArray[0]._WindowMap.m[MAT_TX]);
-      ctx->Current.RasterPos[1] = (ndc[1] * ctx->ViewportArray[0]._WindowMap.m[MAT_SY]
-                                   + ctx->ViewportArray[0]._WindowMap.m[MAT_TY]);
-      ctx->Current.RasterPos[2] = (ndc[2] * ctx->ViewportArray[0]._WindowMap.m[MAT_SZ]
-                                   + ctx->ViewportArray[0]._WindowMap.m[MAT_TZ])
-                                  / ctx->DrawBuffer->_DepthMaxF;
+      _mesa_get_viewport_xform(ctx, 0, scale, translate);
+      ctx->Current.RasterPos[0] = ndc[0] * scale[0] + translate[0];
+      ctx->Current.RasterPos[1] = ndc[1] * scale[1] + translate[1];
+      ctx->Current.RasterPos[2] = ndc[2] * scale[2] + translate[2];
       ctx->Current.RasterPos[3] = clip[3];
 
       if (ctx->Transform.DepthClamp) {