nvc0: provide support for unscaled poly offset units
[mesa.git] / src / gallium / drivers / nouveau / nvc0 / nvc0_state_validate.c
index 05c15ce070a4eaf540270cd852870341c11c6c66..ea0bd23f002b126fd1f3a0c3fd4ea5ca3be558f7 100644 (file)
@@ -671,6 +671,26 @@ nvc0_validate_derived_3(struct nvc0_context *nvc0)
    PUSH_DATA (push, ms);
 }
 
+static void
+nvc0_validate_derived_4(struct nvc0_context *nvc0)
+{
+   struct nouveau_pushbuf *push = nvc0->base.pushbuf;
+   struct pipe_framebuffer_state *fb = &nvc0->framebuffer;
+   struct pipe_rasterizer_state *rast = &nvc0->rast->pipe;
+
+   if (!rast)
+      return;
+
+   if (rast->offset_units_unscaled) {
+      BEGIN_NVC0(push, NVC0_3D(POLYGON_OFFSET_UNITS), 1);
+      if (fb->zsbuf && fb->zsbuf->format == PIPE_FORMAT_Z16_UNORM)
+         PUSH_DATAf(push, rast->offset_units * (1 << 16));
+      else
+         PUSH_DATAf(push, rast->offset_units * (1 << 24));
+   }
+}
+
+
 static void
 nvc0_validate_tess_state(struct nvc0_context *nvc0)
 {
@@ -754,6 +774,7 @@ validate_list_3d[] = {
                                    NVC0_NEW_3D_RASTERIZER },
     { nvc0_validate_derived_2,     NVC0_NEW_3D_ZSA | NVC0_NEW_3D_FRAMEBUFFER },
     { nvc0_validate_derived_3,     NVC0_NEW_3D_BLEND | NVC0_NEW_3D_FRAMEBUFFER },
+    { nvc0_validate_derived_4,     NVC0_NEW_3D_RASTERIZER | NVC0_NEW_3D_FRAMEBUFFER },
     { nvc0_validate_clip,          NVC0_NEW_3D_CLIP | NVC0_NEW_3D_RASTERIZER |
                                    NVC0_NEW_3D_VERTPROG |
                                    NVC0_NEW_3D_TEVLPROG |