i965: fix polygon face orientation when rendering to FBO
authorRobert Ellison <papillo@vmware.com>
Wed, 11 Mar 2009 22:27:38 +0000 (16:27 -0600)
committerRobert Ellison <papillo@vmware.com>
Thu, 12 Mar 2009 03:19:45 +0000 (21:19 -0600)
In the i965, the FBO coordinate system is inverted from the standard
OpenGL/Mesa coordinate system; that means that the viewport and the
polygon face orientation have to be inverted if rendering to a FBO.

The viewport was already being handled correctly; but polygon face
was not.  This caused a conform failure when rendering to texture with
two-sided lighting enabled.

This fixes the problem in the i965 driver, and adds to the comment about
the gl_framebuffer "Name" field so that this isn't a surprise to other
driver writers.

src/mesa/drivers/dri/i965/brw_sf.c
src/mesa/main/mtypes.h

index 8c1711538af5de59e8c2729e119565945a43c5f8..c3c85978f4d012d7f1ed8807bf177badfafb0e2c 100644 (file)
@@ -167,8 +167,14 @@ static void upload_sf_prog(struct brw_context *brw)
    key.do_twoside_color = (ctx->Light.Enabled && ctx->Light.Model.TwoSide);
 
    /* _NEW_POLYGON */
-   if (key.do_twoside_color)
-      key.frontface_ccw = (ctx->Polygon.FrontFace == GL_CCW);
+   if (key.do_twoside_color) {
+      /* If we're rendering to a FBO, we have to invert the polygon
+       * face orientation, just as we invert the viewport in
+       * sf_unit_create_from_key().  ctx->DrawBuffer->Name will be
+       * nonzero if we're rendering to such an FBO.
+       */
+      key.frontface_ccw = (ctx->Polygon.FrontFace == GL_CCW) ^ (ctx->DrawBuffer->Name != 0);
+   }
 
    dri_bo_unreference(brw->sf.prog_bo);
    brw->sf.prog_bo = brw_search_cache(&brw->cache, BRW_SF_PROG,
index f2058641911db679286ffee180dfd7fd6df63f5f..9080c83da4e85b2b2bd8d39ad84d9a0b5076f235 100644 (file)
@@ -2236,7 +2236,15 @@ struct gl_renderbuffer_attachment
 struct gl_framebuffer
 {
    _glthread_Mutex Mutex;  /**< for thread safety */
-   GLuint Name;            /**< if zero, this is a window system framebuffer */
+   /**
+    * If zero, this is a window system framebuffer.  If non-zero, this
+    * is a FBO framebuffer; note that for some devices (i.e. those with
+    * a natural pixel coordinate system for FBOs that differs from the 
+    * OpenGL/Mesa coordinate system), this means that both the viewport
+    * and polygon face orientation will have to be inverted.
+    */
+   GLuint Name;
+
    GLint RefCount;
    GLboolean DeletePending;