Mesa (gallium-clip-state): nvc0: adapt to new clip state

Christoph Bumiller chrisbmr at kemper.freedesktop.org
Tue Jan 3 22:56:22 UTC 2012


Module: Mesa
Branch: gallium-clip-state
Commit: 3a8ae6ac243bae5970729dc4057fe02d992543dc
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=3a8ae6ac243bae5970729dc4057fe02d992543dc

Author: Christoph Bumiller <e0425955 at student.tuwien.ac.at>
Date:   Tue Jan  3 23:32:36 2012 +0100

nvc0: adapt to new clip state

---

 src/gallium/drivers/nvc0/nvc0_shader_state.c   |   35 ---------
 src/gallium/drivers/nvc0/nvc0_state.c          |   18 ++++--
 src/gallium/drivers/nvc0/nvc0_state_validate.c |   92 ++++++++++++++++--------
 src/gallium/drivers/nvc0/nvc0_stateobj.h       |    2 +-
 src/gallium/drivers/nvc0/nvc0_surface.c        |    7 --
 5 files changed, 77 insertions(+), 77 deletions(-)

diff --git a/src/gallium/drivers/nvc0/nvc0_shader_state.c b/src/gallium/drivers/nvc0/nvc0_shader_state.c
index 446bd94..630ad20 100644
--- a/src/gallium/drivers/nvc0/nvc0_shader_state.c
+++ b/src/gallium/drivers/nvc0/nvc0_shader_state.c
@@ -59,25 +59,6 @@ nvc0_program_update_context_state(struct nvc0_context *nvc0,
    }
 }
 
-static void
-nvc0_program_validate_clip(struct nvc0_context *nvc0, struct nvc0_program *vp)
-{
-   struct nouveau_channel *chan = nvc0->screen->base.channel;
-
-   if (nvc0->vertprog->vp.num_ucps)
-      return;
-
-   if (nvc0->state.clip_enable != vp->vp.clip_enable) {
-      nvc0->state.clip_enable = vp->vp.clip_enable;
-      IMMED_RING(chan, RING_3D(CLIP_DISTANCE_ENABLE), vp->vp.clip_enable);
-   }
-   if (nvc0->state.clip_mode != vp->vp.clip_mode) {
-      nvc0->state.clip_mode = vp->vp.clip_mode;
-      BEGIN_RING(chan, RING_3D(CLIP_DISTANCE_MODE), 1);
-      OUT_RING  (chan, vp->vp.clip_mode);
-   }
-}
-
 static INLINE boolean
 nvc0_program_validate(struct nvc0_context *nvc0, struct nvc0_program *prog)
 {
@@ -101,14 +82,6 @@ nvc0_vertprog_validate(struct nvc0_context *nvc0)
    struct nouveau_channel *chan = nvc0->screen->base.channel;
    struct nvc0_program *vp = nvc0->vertprog;
 
-   if (nvc0->clip.nr > vp->vp.num_ucps) {
-      assert(nvc0->clip.nr <= 6);
-      vp->vp.num_ucps = 6;
-
-      if (vp->translated)
-         nvc0_program_destroy(nvc0, vp);
-   }
-
    if (!nvc0_program_validate(nvc0, vp))
          return;
    nvc0_program_update_context_state(nvc0, vp, 0);
@@ -119,9 +92,6 @@ nvc0_vertprog_validate(struct nvc0_context *nvc0)
    BEGIN_RING(chan, RING_3D(SP_GPR_ALLOC(1)), 1);
    OUT_RING  (chan, vp->max_gpr);
 
-   if (!nvc0->gmtyprog && !nvc0->tevlprog)
-      nvc0_program_validate_clip(nvc0, vp);
-
    // BEGIN_RING(chan, RING_3D_(0x163c), 1);
    // OUT_RING  (chan, 0);
 }
@@ -203,9 +173,6 @@ nvc0_tevlprog_validate(struct nvc0_context *nvc0)
    OUT_RING  (chan, tp->code_base);
    BEGIN_RING(chan, RING_3D(SP_GPR_ALLOC(3)), 1);
    OUT_RING  (chan, tp->max_gpr);
-
-   if (!nvc0->gmtyprog)
-      nvc0_program_validate_clip(nvc0, tp);
 }
 
 void
@@ -233,8 +200,6 @@ nvc0_gmtyprog_validate(struct nvc0_context *nvc0)
    OUT_RING  (chan, gp->max_gpr);
    BEGIN_RING(chan, RING_3D(LAYER), 1);
    OUT_RING  (chan, (gp->hdr[13] & (1 << 9)) ? NVC0_3D_LAYER_USE_GP : 0);
-
-   nvc0_program_validate_clip(nvc0, gp);
 }
 
 void
diff --git a/src/gallium/drivers/nvc0/nvc0_state.c b/src/gallium/drivers/nvc0/nvc0_state.c
index 1e334a0..32b7a8a 100644
--- a/src/gallium/drivers/nvc0/nvc0_state.c
+++ b/src/gallium/drivers/nvc0/nvc0_state.c
@@ -270,6 +270,18 @@ nvc0_rasterizer_state_create(struct pipe_context *pipe,
         SB_DATA    (so, fui(cso->offset_clamp));
     }
 
+    if (cso->depth_clip)
+       reg = NVC0_3D_VIEW_VOLUME_CLIP_CTRL_UNK1_UNK1;
+    else
+       reg =
+          NVC0_3D_VIEW_VOLUME_CLIP_CTRL_UNK1_UNK1 |
+          NVC0_3D_VIEW_VOLUME_CLIP_CTRL_DEPTH_CLAMP_NEAR |
+          NVC0_3D_VIEW_VOLUME_CLIP_CTRL_DEPTH_CLAMP_FAR |
+          NVC0_3D_VIEW_VOLUME_CLIP_CTRL_UNK12_UNK2;
+
+    SB_BEGIN_3D(so, VIEW_VOLUME_CLIP_CTRL, 1);
+    SB_DATA    (so, reg);
+
     assert(so->size <= (sizeof(so->state) / sizeof(so->state[0])));
     return (void *)so;
 }
@@ -647,12 +659,8 @@ nvc0_set_clip_state(struct pipe_context *pipe,
                     const struct pipe_clip_state *clip)
 {
     struct nvc0_context *nvc0 = nvc0_context(pipe);
-    const unsigned size = clip->nr * sizeof(clip->ucp[0]);
-
-    memcpy(&nvc0->clip.ucp[0][0], &clip->ucp[0][0], size);
-    nvc0->clip.nr = clip->nr;
 
-    nvc0->clip.depth_clamp = clip->depth_clamp;
+    memcpy(nvc0->clip.ucp, clip->ucp, sizeof(clip->ucp));
 
     nvc0->dirty |= NVC0_NEW_CLIP;
 }
diff --git a/src/gallium/drivers/nvc0/nvc0_state_validate.c b/src/gallium/drivers/nvc0/nvc0_state_validate.c
index 0dc822a..ed27453 100644
--- a/src/gallium/drivers/nvc0/nvc0_state_validate.c
+++ b/src/gallium/drivers/nvc0/nvc0_state_validate.c
@@ -260,43 +260,74 @@ nvc0_validate_viewport(struct nvc0_context *nvc0)
     OUT_RINGf (chan, zmax);
 }
 
+static INLINE void
+nvc0_upload_uclip_planes(struct nvc0_context *nvc0)
+{
+   struct nouveau_channel *chan = nvc0->screen->base.channel;
+   struct nouveau_bo *bo = nvc0->screen->uniforms;
+
+   MARK_RING (chan, 6 + PIPE_MAX_CLIP_PLANES * 4, 2);
+   BEGIN_RING(chan, RING_3D(CB_SIZE), 3);
+   OUT_RING  (chan, 256);
+   OUT_RELOCh(chan, bo, 5 << 16, NOUVEAU_BO_VRAM | NOUVEAU_BO_RD);
+   OUT_RELOCl(chan, bo, 5 << 16, NOUVEAU_BO_VRAM | NOUVEAU_BO_RD);
+   BEGIN_RING_1I(chan, RING_3D(CB_POS), PIPE_MAX_CLIP_PLANES * 4 + 1);
+   OUT_RING  (chan, 0);
+   OUT_RINGp (chan, &nvc0->clip.ucp[0][0], PIPE_MAX_CLIP_PLANES * 4);
+}
+
+static INLINE void
+nvc0_check_program_ucps(struct nvc0_context *nvc0,
+                        struct nvc0_program *vp, uint8_t mask)
+{
+   const unsigned n = util_logbase2(mask) + 1;
+
+   if (vp->vp.num_ucps >= n)
+      return;
+   nvc0_program_destroy(nvc0, vp);
+
+   vp->vp.num_ucps = n;
+   if (likely(vp == nvc0->vertprog))
+      nvc0_vertprog_validate(nvc0);
+   else
+   if (likely(vp == nvc0->gmtyprog))
+      nvc0_vertprog_validate(nvc0);
+   else
+      nvc0_tevlprog_validate(nvc0);
+}
+
 static void
 nvc0_validate_clip(struct nvc0_context *nvc0)
 {
    struct nouveau_channel *chan = nvc0->screen->base.channel;
-   uint32_t clip;
-
-   if (nvc0->clip.depth_clamp) {
-      clip =
-         NVC0_3D_VIEW_VOLUME_CLIP_CTRL_UNK1_UNK1 |
-         NVC0_3D_VIEW_VOLUME_CLIP_CTRL_DEPTH_CLAMP_NEAR |
-         NVC0_3D_VIEW_VOLUME_CLIP_CTRL_DEPTH_CLAMP_FAR |
-         NVC0_3D_VIEW_VOLUME_CLIP_CTRL_UNK12_UNK2;
-   } else {
-      clip = NVC0_3D_VIEW_VOLUME_CLIP_CTRL_UNK1_UNK1;
-   }
+   struct nvc0_program *vp;
+   uint8_t clip_enable;
 
-   BEGIN_RING(chan, RING_3D(VIEW_VOLUME_CLIP_CTRL), 1);
-   OUT_RING  (chan, clip);
+   if (nvc0->dirty & NVC0_NEW_CLIP)
+      nvc0_upload_uclip_planes(nvc0);
 
-   if (nvc0->clip.nr) {
-      struct nouveau_bo *bo = nvc0->screen->uniforms;
+   vp = nvc0->gmtyprog;
+   if (!vp) {
+      vp = nvc0->tevlprog;
+      if (!vp)
+         vp = nvc0->vertprog;
+   }
+   clip_enable = vp->vp.clip_enable;
 
-      MARK_RING (chan, 6 + nvc0->clip.nr * 4, 2);
-      BEGIN_RING(chan, RING_3D(CB_SIZE), 3);
-      OUT_RING  (chan, 256);
-      OUT_RELOCh(chan, bo, 5 << 16, NOUVEAU_BO_VRAM | NOUVEAU_BO_RD);
-      OUT_RELOCl(chan, bo, 5 << 16, NOUVEAU_BO_VRAM | NOUVEAU_BO_RD);
-      BEGIN_RING_1I(chan, RING_3D(CB_POS), nvc0->clip.nr * 4 + 1);
-      OUT_RING  (chan, 0);
-      OUT_RINGp (chan, &nvc0->clip.ucp[0][0], nvc0->clip.nr * 4);
+   if (!clip_enable) {
+      clip_enable = nvc0->rast->pipe.user_clip_plane_enable;
+      if (unlikely(clip_enable))
+         nvc0_check_program_ucps(nvc0, vp, clip_enable);
    }
 
-   if (nvc0->vertprog->vp.num_ucps) {
-      nvc0->state.clip_mode = 0;
-      nvc0->state.clip_enable = (1 << nvc0->clip.nr) - 1;
-      IMMED_RING(chan, RING_3D(CLIP_DISTANCE_ENABLE), nvc0->state.clip_enable);
-      IMMED_RING(chan, RING_3D(CLIP_DISTANCE_MODE), 0);
+   if (nvc0->state.clip_enable != clip_enable) {
+      nvc0->state.clip_enable = clip_enable;
+      IMMED_RING(chan, RING_3D(CLIP_DISTANCE_ENABLE), clip_enable);
+   }
+   if (nvc0->state.clip_mode != vp->vp.clip_mode) {
+      nvc0->state.clip_mode = vp->vp.clip_mode;
+      BEGIN_RING(chan, RING_3D(CLIP_DISTANCE_MODE), 1);
+      OUT_RING  (chan, vp->vp.clip_mode);
    }
 }
 
@@ -497,7 +528,10 @@ static struct state_validate {
     { nvc0_fragprog_validate,      NVC0_NEW_FRAGPROG },
     { nvc0_validate_derived_1,     NVC0_NEW_FRAGPROG | NVC0_NEW_ZSA |
                                    NVC0_NEW_RASTERIZER },
-    { nvc0_validate_clip,          NVC0_NEW_CLIP },
+    { nvc0_validate_clip,          NVC0_NEW_CLIP | NVC0_NEW_RASTERIZER |
+                                   NVC0_NEW_VERTPROG |
+                                   NVC0_NEW_TEVLPROG |
+                                   NVC0_NEW_GMTYPROG },
     { nvc0_constbufs_validate,     NVC0_NEW_CONSTBUF },
     { nvc0_validate_textures,      NVC0_NEW_TEXTURES },
     { nvc0_validate_samplers,      NVC0_NEW_SAMPLERS },
diff --git a/src/gallium/drivers/nvc0/nvc0_stateobj.h b/src/gallium/drivers/nvc0/nvc0_stateobj.h
index 5c0d0c1..dc5771a 100644
--- a/src/gallium/drivers/nvc0/nvc0_stateobj.h
+++ b/src/gallium/drivers/nvc0/nvc0_stateobj.h
@@ -25,7 +25,7 @@ struct nvc0_blend_stateobj {
 struct nvc0_rasterizer_stateobj {
    struct pipe_rasterizer_state pipe;
    int size;
-   uint32_t state[41];
+   uint32_t state[43];
 };
 
 struct nvc0_zsa_stateobj {
diff --git a/src/gallium/drivers/nvc0/nvc0_surface.c b/src/gallium/drivers/nvc0/nvc0_surface.c
index a2e1a85..46b5da5 100644
--- a/src/gallium/drivers/nvc0/nvc0_surface.c
+++ b/src/gallium/drivers/nvc0/nvc0_surface.c
@@ -461,7 +461,6 @@ struct nvc0_blitctx
       struct pipe_sampler_view *texture;
       struct nv50_tsc_entry *sampler;
       unsigned dirty;
-      unsigned clip_nr;
    } saved;
    struct nvc0_program vp;
    struct nvc0_program fp;
@@ -771,10 +770,6 @@ nvc0_blitctx_pre_blit(struct nvc0_blitctx *blit, struct nvc0_context *nvc0)
    nvc0->tevlprog = NULL;
    nvc0->gmtyprog = NULL;
 
-   blit->saved.clip_nr = nvc0->clip.nr;
-
-   nvc0->clip.nr = 0;
-
    for (s = 0; s <= 4; ++s) {
       blit->saved.num_textures[s] = nvc0->num_textures[s];
       blit->saved.num_samplers[s] = nvc0->num_samplers[s];
@@ -815,8 +810,6 @@ nvc0_blitctx_post_blit(struct nvc0_context *nvc0, struct nvc0_blitctx *blit)
    nvc0->gmtyprog = blit->saved.gp;
    nvc0->fragprog = blit->saved.fp;
 
-   nvc0->clip.nr = blit->saved.clip_nr;
-
    pipe_sampler_view_reference(&nvc0->textures[4][0], NULL);
 
    for (s = 0; s <= 4; ++s) {




More information about the mesa-commit mailing list