i965: fix polygon face orientation when rendering to FBO

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.
(cherry picked from commit 6dceeb2eb8)
This commit is contained in:
Robert Ellison 2009-03-11 16:27:38 -06:00 committed by Ian Romanick
parent 9feb26584a
commit 918e5221ef
2 changed files with 18 additions and 4 deletions

View 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,

View file

@ -2376,8 +2376,16 @@ struct gl_renderbuffer_attachment
*/
struct gl_framebuffer
{
_glthread_Mutex Mutex; /**< for thread safety */
GLuint Name; /* if zero, this is a window system framebuffer */
_glthread_Mutex Mutex; /**< for thread safety */
/**
* 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;