On Thu, Apr 2, 2015 at 12:30 PM, <mathias.froehl...@gmx.net> wrote: > From: Mathias Froehlich <mathias.froehl...@web.de> > > Hi Brian, > > Thanks for the review! > The Patch with unneeded parentheses removed. > Ok, to push? > > Greetings > > Mathias > > > 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 <bri...@vmware.com> > 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 4fc90c3..74b1da3 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);
This appears to crash nouveau_vieux on startup. See https://bugs.freedesktop.org/show_bug.cgi?id=91570 . I suspect that ctx->DrawBuffer is null. What's the proper way to handle that situation -- predicate on a drawbuffer being bound? Or make sure that something is bound to the drawbuffer before we call tnl_wakeup? > + } > } > > > 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 1cd3981..d4b45ba 100644 > --- a/src/mesa/tnl/t_rasterpos.c > +++ b/src/mesa/tnl/t_rasterpos.c > @@ -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) { > -- > 2.1.0 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev