diff options
| author | Brian Paul <brianp@vmware.com> | 2009-01-16 13:33:19 -0700 | 
|---|---|---|
| committer | Brian Paul <brianp@vmware.com> | 2009-01-16 13:33:19 -0700 | 
| commit | a61a1a8181f05e07de1c0bccad109f4ad529a298 (patch) | |
| tree | 38b8c85b04de5a7c7b9771aa6f43968c5a4ddc5f | |
| parent | 345a08a77fa16f58ef956c896f1bf5f4cf118243 (diff) | |
i965: fix polygon culling bug when rendering to a texture/FBO
Since we use an inverted viewport transformation for render to texture, that
inverts front/back polygon orientation.
Now glCullFace(GL_FRONT / GL_BACK) works correctly.
| -rw-r--r-- | src/mesa/drivers/dri/i965/brw_sf_state.c | 25 | 
1 files changed, 13 insertions, 12 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_sf_state.c b/src/mesa/drivers/dri/i965/brw_sf_state.c index 741a7c53c4..242b7047a1 100644 --- a/src/mesa/drivers/dri/i965/brw_sf_state.c +++ b/src/mesa/drivers/dri/i965/brw_sf_state.c @@ -42,22 +42,15 @@ static void upload_sf_vp(struct brw_context *brw)     GLcontext *ctx = &brw->intel.ctx;     const GLfloat depth_scale = 1.0F / ctx->DrawBuffer->_DepthMaxF;     struct brw_sf_viewport sfv; -   struct intel_renderbuffer *irb = -      intel_renderbuffer(ctx->DrawBuffer->_ColorDrawBuffers[0]);     GLfloat y_scale, y_bias;     memset(&sfv, 0, sizeof(sfv)); -   if (ctx->DrawBuffer->Name) { -      /* User-created FBO */ -      if (irb && !irb->RenderToTexture) { -	 y_scale = -1.0; -	 y_bias = ctx->DrawBuffer->Height; -      } else { -	 y_scale = 1.0; -	 y_bias = 0; -      } -   } else { +   if (intel_rendering_to_texture(ctx)) { +      y_scale = 1.0; +      y_bias = 0; +   } +   else {        y_scale = -1.0;        y_bias = ctx->DrawBuffer->Height;     } @@ -120,6 +113,7 @@ struct brw_sf_unit_key {     GLboolean scissor, line_smooth, point_sprite, point_attenuated;     float line_width;     float point_size; +   GLboolean render_to_texture;  };  static void @@ -150,6 +144,8 @@ sf_unit_populate_key(struct brw_context *brw, struct brw_sf_unit_key *key)     key->point_sprite = brw->attribs.Point->PointSprite;     key->point_size = brw->attribs.Point->Size;     key->point_attenuated = brw->attribs.Point->_Attenuated; + +   key->render_to_texture = intel_rendering_to_texture(&brw->intel.ctx);  }  static dri_bo * @@ -196,6 +192,11 @@ sf_unit_create_from_key(struct brw_context *brw, struct brw_sf_unit_key *key,     else        sf.sf5.front_winding = BRW_FRONTWINDING_CW; +   /* The viewport is inverted for rendering to texture, and that inverts +    * polygon front/back orientation. +    */ +   sf.sf5.front_winding ^= key->render_to_texture; +     switch (key->cull_face) {     case GL_FRONT:        sf.sf6.cull_mode = BRW_CULLMODE_FRONT;  | 
