From 3d31252d44fb5983a089b9f3488745757772adea Mon Sep 17 00:00:00 2001 From: Brian Date: Thu, 9 Aug 2007 18:24:37 -0600 Subject: move viewport Y inversion to state tracker --- src/mesa/state_tracker/st_atom_viewport.c | 57 ++++++++++++------------------- 1 file changed, 21 insertions(+), 36 deletions(-) (limited to 'src/mesa/state_tracker') diff --git a/src/mesa/state_tracker/st_atom_viewport.c b/src/mesa/state_tracker/st_atom_viewport.c index ac91f628aa..1307cbb6d2 100644 --- a/src/mesa/state_tracker/st_atom_viewport.c +++ b/src/mesa/state_tracker/st_atom_viewport.c @@ -33,9 +33,6 @@ #include "st_atom.h" - - - /** * Update the viewport transformation matrix. Depends on: * - viewport pos/size @@ -45,49 +42,37 @@ static void update_viewport( struct st_context *st ) { GLcontext *ctx = st->ctx; - const GLframebuffer *DrawBuffer = ctx->DrawBuffer; - GLfloat yScale = 1.0; - GLfloat yBias = 0.0; + GLfloat yScale, yBias; - /* _NEW_BUFFERS + /* Negate Y scale to flip image vertically. + * The NDC Y coords prior to viewport transformation are in the range + * [y=-1=bottom, y=1=top] + * Hardware window coords are in the range [y=0=top, y=H-1=bottom] where H + * is the window height. + * Use the viewport transformation to invert Y. */ - if (DrawBuffer) { -#if 0 - if (DrawBuffer->Name) { - /* User created FBO */ - struct st_renderbuffer *irb - = st_renderbuffer(DrawBuffer->_ColorDrawBuffers[0][0]); - if (irb && !irb->RenderToTexture) { - /* y=0=top */ - yScale = -1.0; - yBias = irb->Base.Height; - } - else { - /* y=0=bottom */ - yScale = 1.0; - yBias = 0.0; - } - } - else - { - /* window buffer, y=0=top */ - yScale = -1.0; - yBias = DrawBuffer->Height; - } -#endif + /* _NEW_BUFFERS + */ + if (ctx->DrawBuffer) { + yScale = -1; + yBias = ctx->DrawBuffer->Height ; + } + else { + /* we won't be rendering anything */ + yScale = 1.0; + yBias = 0.0; } + /* _NEW_VIEWPORT + */ { - /* _NEW_VIEWPORT - */ GLfloat x = ctx->Viewport.X; GLfloat y = ctx->Viewport.Y; GLfloat z = ctx->Viewport.Near; GLfloat half_width = ctx->Viewport.Width / 2.0; GLfloat half_height = ctx->Viewport.Height / 2.0; GLfloat half_depth = (ctx->Viewport.Far - ctx->Viewport.Near) / 2.0; - struct pipe_viewport_state vp; vp.scale[0] = half_width; @@ -95,9 +80,9 @@ static void update_viewport( struct st_context *st ) vp.scale[2] = half_depth; vp.scale[3] = 1.0; - vp.translate[0] = (half_width + x); + vp.translate[0] = half_width + x; vp.translate[1] = (half_height + y) * yScale + yBias; - vp.translate[2] = (half_depth + z); + vp.translate[2] = half_depth + z; vp.translate[3] = 0.0; if (memcmp(&vp, &st->state.viewport, sizeof(vp)) != 0) { -- cgit v1.2.3