invert Y axis with the viewport transformation to put things right side up
authorBrian <brian.paul@tungstengraphics.com>
Thu, 9 Aug 2007 23:59:13 +0000 (17:59 -0600)
committerBrian <brian.paul@tungstengraphics.com>
Fri, 10 Aug 2007 00:02:22 +0000 (18:02 -0600)
src/mesa/pipe/i915simple/i915_state.c

index ebc55eb63462c3d74105d1306e47ba86faed49cb..a176165b74a2574c89e36688e438b929e26d997b 100644 (file)
@@ -189,11 +189,24 @@ static void i915_set_viewport_state( struct pipe_context *pipe,
                                     const struct pipe_viewport_state *viewport )
 {
    struct i915_context *i915 = i915_context(pipe);
+   float sy, ty;
 
    i915->viewport = *viewport; /* struct copy */
 
+   /* 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]
+    * Intel 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.
+    */
+   sy = viewport->scale[1];
+   ty = viewport->translate[1];
+   i915->viewport.scale[1] = -sy;
+   i915->viewport.translate[1] = i915->framebuffer.cbufs[0]->height - ty;
+
    /* pass the viewport info to the draw module */
-   draw_set_viewport_state(i915->draw, viewport);
+   draw_set_viewport_state(i915->draw, &i915->viewport);
 
    /* Using tnl/ and vf/ modules is temporary while getting started.
     * Full pipe will have vertex shader, vertex fetch of its own.