On 03/31/2015 12:37 AM, mathias.froehl...@gmx.net wrote:
From: Mathias Froehlich <mathias.froehl...@gmx.net>
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.
Signed-off-by: Mathias Froehlich <mathias.froehl...@web.de>
---
src/mesa/swrast_setup/ss_context.c | 5 +++--
src/mesa/tnl/t_context.c | 12 ++++++++++++
src/mesa/tnl/t_context.h | 1 +
src/mesa/tnl/t_rasterpos.c | 13 ++++++-------
4 files changed, 22 insertions(+), 9 deletions(-)
diff --git a/src/mesa/swrast_setup/ss_context.c
b/src/mesa/swrast_setup/ss_context.c
index 0b3b9e4..0b648b3 100644
--- a/src/mesa/swrast_setup/ss_context.c
+++ b/src/mesa/swrast_setup/ss_context.c
@@ -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;
diff --git a/src/mesa/tnl/t_context.c b/src/mesa/tnl/t_context.c
index bc705d7..5b9dd54 100644
--- a/src/mesa/tnl/t_context.c
+++ b/src/mesa/tnl/t_context.c
@@ -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);
+ }
}
diff --git a/src/mesa/tnl/t_context.h b/src/mesa/tnl/t_context.h
index e89a7f8..e7adb5f 100644
--- a/src/mesa/tnl/t_context.h
+++ b/src/mesa/tnl/t_context.h
@@ -514,6 +514,7 @@ typedef struct
/* Clipspace/ndc/window vertex managment:
*/
struct tnl_clipspace clipspace;
+ GLmatrix _WindowMap;
/* Probably need a better configuration mechanism:
*/
diff --git a/src/mesa/tnl/t_rasterpos.c b/src/mesa/tnl/t_rasterpos.c
index 9ecf947..9bdaee8 100644
--- a/src/mesa/tnl/t_rasterpos.c
+++ b/src/mesa/tnl/t_rasterpos.c
@@ -31,6 +31,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"
@@ -378,6 +379,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 );
@@ -410,13 +412,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]);
The parens on those lines aren't needed.
ctx->Current.RasterPos[3] = clip[3];
if (ctx->Transform.DepthClamp) {
Nice clean-up!
For the series, Reviewed-by: Brian Paul <bri...@vmware.com>
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev