965: fix off-by-one in scissor rect
[mesa.git] / src / mesa / pipe / i965simple / brw_sf_state.c
index 7b6ee215eb80d7f576f171e0571ee513a8c2273d..9acd3ea61b2611b92e877ee5f6878f7b8f42e756 100644 (file)
 #include "brw_context.h"
 #include "brw_state.h"
 #include "brw_defines.h"
+#include "pipe/p_util.h"
 
-#if 0
 static void upload_sf_vp(struct brw_context *brw)
 {
-   GLcontext *ctx = &brw->intel.ctx;
    struct brw_sf_viewport sfv;
-   struct intel_renderbuffer *irb =
-      intel_renderbuffer(ctx->DrawBuffer->_ColorDrawBuffers[0][0]);
-   float y_scale, y_bias;
-   int x, y, w, h, x1, x2, y1, y2;
-   int draw_h = ctx->DrawBuffer->Height;
 
    memset(&sfv, 0, sizeof(sfv));
 
-   if (ctx->DrawBuffer->Name) {
-      /* User-created FBO */
-      if (irb && !irb->RenderToTexture) {
-        y_scale = -1.0;
-        y_bias = draw_h;
-      } else {
-        y_scale = 1.0;
-        y_bias = 0;
-      }
-   } else {
-      if (brw->intel.driDrawable != NULL) {
-        y_scale = -1.0;
-        y_bias = draw_h;
-      } else {
-        y_scale = 1.0;
-        y_bias = 0;
-      }
-   }
 
-   /* _NEW_VIEWPORT, BRW_NEW_METAOPS */
-
-   if (!brw->metaops.active) {
-      const float *v = brw->intel.ctx.Viewport._WindowMap.m;
-
-      sfv.viewport.m00 = v[MAT_SX];
-      sfv.viewport.m11 = v[MAT_SY] * y_scale;
-      sfv.viewport.m22 = v[MAT_SZ] * brw->intel.depth_scale;
-      sfv.viewport.m30 = v[MAT_TX];
-      sfv.viewport.m31 = v[MAT_TY] * y_scale + y_bias;
-      sfv.viewport.m32 = v[MAT_TZ] * brw->intel.depth_scale;
-   } else {
-      sfv.viewport.m00 =   1;
-      sfv.viewport.m11 = - 1;
-      sfv.viewport.m22 =   1;
-      sfv.viewport.m30 =   0;
-      sfv.viewport.m31 =   brw->intel.driDrawable->h;
-      sfv.viewport.m32 =   0;
-   }
+   /* BRW_NEW_VIEWPORT */
+   {
+      const float *scale = brw->attribs.Viewport.scale;
+      const float *trans = brw->attribs.Viewport.translate;
 
-   /* _NEW_SCISSOR */
-   x = brw->attribs.Scissor->X;
-   y = brw->attribs.Scissor->Y;
-   w = brw->attribs.Scissor->Width;
-   h = brw->attribs.Scissor->Height;
-
-   if (ctx->DrawBuffer->Name == 0) {
-      x1 = x;
-      y1 = draw_h - (y + h);
-      x2 = x + w - 1;
-      y2 = y1 + h - 1;
-   } else {
-      /* FBO has non-inverted coords. */
-      x1 = x;
-      y1 = y;
-      x2 = x + w - 1;
-      y2 = y + h - 1;
+      sfv.viewport.m00 = scale[0];
+      sfv.viewport.m11 = scale[1];
+      sfv.viewport.m22 = scale[2]; 
+      sfv.viewport.m30 = trans[0];
+      sfv.viewport.m31 = trans[1];
+      sfv.viewport.m32 = trans[2];
    }
 
-   sfv.scissor.xmin = CLAMP(x1, 0, ctx->DrawBuffer->Width - 1);
-   sfv.scissor.xmax = CLAMP(y1, 0, ctx->DrawBuffer->Height - 1);
-   sfv.scissor.ymin = CLAMP(x2, 0, ctx->DrawBuffer->Width - 1);
-   sfv.scissor.ymax = CLAMP(y2, 0, ctx->DrawBuffer->Height - 1);
+   /* _NEW_SCISSOR */
+   sfv.scissor.xmin = brw->attribs.Scissor.minx;
+   sfv.scissor.xmax = brw->attribs.Scissor.maxx - 1;
+   sfv.scissor.ymin = brw->attribs.Scissor.miny;
+   sfv.scissor.ymax = brw->attribs.Scissor.maxy - 1;
 
    brw->sf.vp_gs_offset = brw_cache_data( &brw->cache[BRW_SF_VP], &sfv );
 }
 
 const struct brw_tracked_state brw_sf_vp = {
    .dirty = {
-      .mesa  = (_NEW_VIEWPORT |
-               _NEW_SCISSOR),
-      .brw   = BRW_NEW_METAOPS,
+      .brw   = (BRW_NEW_SCISSOR |
+               BRW_NEW_VIEWPORT),
       .cache = 0
    },
    .update = upload_sf_vp
@@ -130,7 +80,7 @@ static void upload_sf_unit( struct brw_context *brw )
    memset(&sf, 0, sizeof(sf));
 
    /* CACHE_NEW_SF_PROG */
-   sf.thread0.grf_reg_count = ALIGN(brw->sf.prog_data->total_grf, 16) / 16 - 1;
+   sf.thread0.grf_reg_count = align(brw->sf.prog_data->total_grf, 16) / 16 - 1;
    sf.thread0.kernel_start_pointer = brw->sf.prog_gs_offset >> 6;
    sf.thread3.urb_entry_read_length = brw->sf.prog_data->urb_read_length;
 
@@ -151,19 +101,19 @@ static void upload_sf_unit( struct brw_context *brw )
 
    /* CACHE_NEW_SF_VP */
    sf.sf5.sf_viewport_state_offset = brw->sf.vp_gs_offset >> 5;
-
    sf.sf5.viewport_transform = 1;
 
-   /* _NEW_SCISSOR */
-   if (brw->attribs.Scissor->Enabled)
+   /* BRW_NEW_RASTER */
+   if (brw->attribs.Raster->scissor)
       sf.sf6.scissor = 1;
 
-   /* _NEW_POLYGON */
+#if 0
    if (brw->attribs.Polygon->FrontFace == GL_CCW)
       sf.sf5.front_winding = BRW_FRONTWINDING_CCW;
    else
       sf.sf5.front_winding = BRW_FRONTWINDING_CW;
 
+
    if (brw->attribs.Polygon->CullFlag) {
       switch (brw->attribs.Polygon->CullFaceMode) {
       case GL_FRONT:
@@ -182,25 +132,24 @@ static void upload_sf_unit( struct brw_context *brw )
    }
    else
       sf.sf6.cull_mode = BRW_CULLMODE_NONE;
+#else
+   sf.sf5.front_winding = BRW_FRONTWINDING_CCW;
+   sf.sf6.cull_mode = BRW_CULLMODE_NONE;
+#endif
 
-
-   /* _NEW_LINE */
-   /* XXX use ctx->Const.Min/MaxLineWidth here */
-   sf.sf6.line_width = CLAMP(brw->attribs.Line->Width, 1.0, 5.0) * (1<<1);
+   sf.sf6.line_width = CLAMP(brw->attribs.Raster->line_width, 1.0, 5.0) * (1<<1);
 
    sf.sf6.line_endcap_aa_region_width = 1;
-   if (brw->attribs.Line->SmoothFlag)
+   if (brw->attribs.Raster->line_smooth)
       sf.sf6.aa_enable = 1;
    else if (sf.sf6.line_width <= 0x2)
        sf.sf6.line_width = 0;
 
-   /* _NEW_POINT */
    sf.sf6.point_rast_rule = 1; /* opengl conventions */
-   /* XXX clamp max depends on AA vs. non-AA */
 
-   sf.sf7.sprite_point = brw->attribs.Point->PointSprite;
-   sf.sf7.point_size = CLAMP(brw->attribs.Point->Size, 1.0, 255.0) * (1<<3);
-   sf.sf7.use_point_size_state = !brw->attribs.Point->_Attenuated;
+   sf.sf7.sprite_point = brw->attribs.Raster->point_sprite;
+   sf.sf7.point_size = CLAMP(brw->attribs.Raster->line_width, 1.0, 255.0) * (1<<3);
+   sf.sf7.use_point_size_state = !brw->attribs.Raster->point_size_per_vertex;
 
    /* might be BRW_NEW_PRIMITIVE if we have to adjust pv for polygons:
     */
@@ -220,12 +169,8 @@ static void upload_sf_unit( struct brw_context *brw )
 
 const struct brw_tracked_state brw_sf_unit = {
    .dirty = {
-      .mesa  = (_NEW_POLYGON |
-               _NEW_LINE |
-               _NEW_POINT |
-               _NEW_SCISSOR),
-      .brw   = (BRW_NEW_URB_FENCE |
-               BRW_NEW_METAOPS),
+      .brw   = (BRW_NEW_RASTERIZER |
+               BRW_NEW_URB_FENCE),
       .cache = (CACHE_NEW_SF_VP |
                CACHE_NEW_SF_PROG)
    },
@@ -233,4 +178,3 @@ const struct brw_tracked_state brw_sf_unit = {
 };
 
 
-#endif