nvfx: rework validation logic to use code and avoid stateobjs
authorLuca Barbieri <luca@luca-barbieri.com>
Tue, 23 Feb 2010 15:48:22 +0000 (16:48 +0100)
committerLuca Barbieri <luca@luca-barbieri.com>
Mon, 12 Apr 2010 10:21:25 +0000 (12:21 +0200)
This makes the code faster due to the lack of indirect calls and also
makes it much easier to understand what is actually going on.

18 files changed:
src/gallium/drivers/nvfx/nvfx_context.c
src/gallium/drivers/nvfx/nvfx_context.h
src/gallium/drivers/nvfx/nvfx_draw.c
src/gallium/drivers/nvfx/nvfx_fragprog.c
src/gallium/drivers/nvfx/nvfx_fragtex.c
src/gallium/drivers/nvfx/nvfx_screen.c
src/gallium/drivers/nvfx/nvfx_screen.h
src/gallium/drivers/nvfx/nvfx_state.c
src/gallium/drivers/nvfx/nvfx_state_blend.c
src/gallium/drivers/nvfx/nvfx_state_emit.c
src/gallium/drivers/nvfx/nvfx_state_fb.c
src/gallium/drivers/nvfx/nvfx_state_rasterizer.c
src/gallium/drivers/nvfx/nvfx_state_scissor.c
src/gallium/drivers/nvfx/nvfx_state_stipple.c
src/gallium/drivers/nvfx/nvfx_state_viewport.c
src/gallium/drivers/nvfx/nvfx_state_zsa.c
src/gallium/drivers/nvfx/nvfx_vbo.c
src/gallium/drivers/nvfx/nvfx_vertprog.c

index e7b1486d49691c0e5a801f1aa792b98195631fcb..1faa0af31fb7c4ca961d81b2e5b79817f650297e 100644 (file)
@@ -30,12 +30,6 @@ static void
 nvfx_destroy(struct pipe_context *pipe)
 {
        struct nvfx_context *nvfx = nvfx_context(pipe);
-       unsigned i;
-
-       for (i = 0; i < NVFX_STATE_MAX; i++) {
-               if (nvfx->state.hw[i])
-                       so_ref(NULL, &nvfx->state.hw[i]);
-       }
 
        if (nvfx->draw)
                draw_destroy(nvfx->draw);
index cb9049a448e41b85a4c038b94f4ea4ff126c833f..9d4489da53db36e45b4711b4b41389ffbbcf5c99 100644 (file)
 #define NOUVEAU_MSG(fmt, args...) \
        fprintf(stderr, "nouveau: "fmt, ##args);
 
-enum nvfx_state_index {
-       NVFX_STATE_FB = 0,
-       NVFX_STATE_VIEWPORT = 1,
-       NVFX_STATE_BLEND = 2,
-       NVFX_STATE_RAST = 3,
-       NVFX_STATE_ZSA = 4,
-       NVFX_STATE_BCOL = 5,
-       NVFX_STATE_CLIP = 6,
-       NVFX_STATE_SCISSOR = 7,
-       NVFX_STATE_STIPPLE = 8,
-       NVFX_STATE_FRAGPROG = 9,
-       NVFX_STATE_VERTPROG = 10,
-       NVFX_STATE_FRAGTEX0 = 11,
-       NVFX_STATE_FRAGTEX1 = 12,
-       NVFX_STATE_FRAGTEX2 = 13,
-       NVFX_STATE_FRAGTEX3 = 14,
-       NVFX_STATE_FRAGTEX4 = 15,
-       NVFX_STATE_FRAGTEX5 = 16,
-       NVFX_STATE_FRAGTEX6 = 17,
-       NVFX_STATE_FRAGTEX7 = 18,
-       NVFX_STATE_FRAGTEX8 = 19,
-       NVFX_STATE_FRAGTEX9 = 20,
-       NVFX_STATE_FRAGTEX10 = 21,
-       NVFX_STATE_FRAGTEX11 = 22,
-       NVFX_STATE_FRAGTEX12 = 23,
-       NVFX_STATE_FRAGTEX13 = 24,
-       NVFX_STATE_FRAGTEX14 = 25,
-       NVFX_STATE_FRAGTEX15 = 26,
-       NVFX_STATE_VERTTEX0 = 27,
-       NVFX_STATE_VERTTEX1 = 28,
-       NVFX_STATE_VERTTEX2 = 29,
-       NVFX_STATE_VERTTEX3 = 30,
-       NVFX_STATE_VTXBUF = 31,
-       NVFX_STATE_VTXFMT = 32,
-       NVFX_STATE_VTXATTR = 33,
-       NVFX_STATE_SR = 34,
-       NVFX_STATE_MAX = 35
-};
-
 #include "nvfx_screen.h"
 
 #define NVFX_NEW_BLEND         (1 <<  0)
@@ -106,9 +67,6 @@ struct nvfx_state {
        unsigned scissor_enabled;
        unsigned stipple_enabled;
        unsigned fp_samplers;
-
-       uint64_t dirty;
-       struct nouveau_stateobj *hw[NVFX_STATE_MAX];
 };
 
 struct nvfx_vtxelt_state {
@@ -147,7 +105,6 @@ struct nvfx_context {
                HW, SWTNL, SWRAST
        } render_mode;
        unsigned fallback_swtnl;
-       unsigned fallback_swrast;
 
        /* Context state */
        unsigned dirty, draw_dirty;
@@ -190,14 +147,6 @@ nvfx_context(struct pipe_context *pipe)
        return (struct nvfx_context *)pipe;
 }
 
-struct nvfx_state_entry {
-       boolean (*validate)(struct nvfx_context *nvfx);
-       struct {
-               unsigned pipe;
-               unsigned hw;
-       } dirty;
-};
-
 extern struct nvfx_state_entry nvfx_state_blend;
 extern struct nvfx_state_entry nvfx_state_blend_colour;
 extern struct nvfx_state_entry nvfx_state_fragprog;
@@ -230,18 +179,22 @@ extern void nvfx_draw_elements_swtnl(struct pipe_context *pipe,
                                        struct pipe_resource *idxbuf,
                                        unsigned ib_size, unsigned mode,
                                        unsigned start, unsigned count);
+extern void nvfx_vtxfmt_validate(struct nvfx_context *nvfx);
 
 /* nvfx_fb.c */
+extern void nvfx_state_framebuffer_validate(struct nvfx_context *nvfx);
 void
 nvfx_framebuffer_relocate(struct nvfx_context *nvfx);
 
 /* nvfx_fragprog.c */
 extern void nvfx_fragprog_destroy(struct nvfx_context *,
                                    struct nvfx_fragment_program *);
+extern void nvfx_fragprog_validate(struct nvfx_context *nvfx);
 extern void
 nvfx_fragprog_relocate(struct nvfx_context *nvfx);
 
 /* nvfx_fragtex.c */
+extern void nvfx_fragtex_validate(struct nvfx_context *nvfx);
 extern void
 nvfx_fragtex_relocate(struct nvfx_context *nvfx);
 
@@ -261,6 +214,14 @@ extern void nv40_fragtex_set(struct nvfx_context *nvfx, int unit);
 
 /* nvfx_state.c */
 extern void nvfx_init_state_functions(struct nvfx_context *nvfx);
+extern void nvfx_state_scissor_validate(struct nvfx_context *nvfx);
+extern void nvfx_state_stipple_validate(struct nvfx_context *nvfx);
+extern void nvfx_state_blend_validate(struct nvfx_context *nvfx);
+extern void nvfx_state_blend_colour_validate(struct nvfx_context *nvfx);
+extern void nvfx_state_viewport_validate(struct nvfx_context *nvfx);
+extern void nvfx_state_rasterizer_validate(struct nvfx_context *nvfx);
+extern void nvfx_state_sr_validate(struct nvfx_context *nvfx);
+extern void nvfx_state_zsa_validate(struct nvfx_context *nvfx);
 
 /* nvfx_state_emit.c */
 extern void nvfx_state_relocate(struct nvfx_context *nvfx);
@@ -283,6 +244,7 @@ extern void nvfx_draw_elements(struct pipe_context *pipe,
                                  unsigned count);
 
 /* nvfx_vertprog.c */
+extern boolean nvfx_vertprog_validate(struct nvfx_context *nvfx);
 extern void nvfx_vertprog_destroy(struct nvfx_context *,
                                  struct nvfx_vertex_program *);
 
index 06f5dc39063cea525870f7c011c0e4b79017ff81..2003be102040facdd110005698282cfed860edd7 100644 (file)
@@ -303,8 +303,8 @@ emit_attrib(struct nvfx_context *nvfx, unsigned hw, unsigned emit,
        nvfx->swtnl.draw[a] = draw_out;
 }
 
-static boolean
-nvfx_state_vtxfmt_validate(struct nvfx_context *nvfx)
+void
+nvfx_vtxfmt_validate(struct nvfx_context *nvfx)
 {
        struct nvfx_fragment_program *fp = nvfx->fragprog;
        unsigned colour = 0, texcoords = 0, fog = 0, i;
@@ -348,14 +348,4 @@ nvfx_state_vtxfmt_validate(struct nvfx_context *nvfx)
        }
 
        emit_attrib(nvfx, 0, 0xff, TGSI_SEMANTIC_POSITION, 0);
-
-       return FALSE;
 }
-
-struct nvfx_state_entry nvfx_state_vtxfmt = {
-       .validate = nvfx_state_vtxfmt_validate,
-       .dirty = {
-               .pipe = NVFX_NEW_ARRAYS | NVFX_NEW_FRAGPROG,
-               .hw = 0
-       }
-};
index eb815302485b0ff8ef905221903bee3196ebf8cd..301ad82c08b6e63c48515cfcef93316905fd4305 100644 (file)
@@ -864,7 +864,7 @@ nvfx_fragprog_upload(struct nvfx_context *nvfx,
        }
 }
 
-boolean
+void
 nvfx_fragprog_validate(struct nvfx_context *nvfx)
 {
        struct nouveau_channel* chan = nvfx->screen->base.channel;
@@ -878,7 +878,6 @@ nvfx_fragprog_validate(struct nvfx_context *nvfx)
        if (fp->translated)
                goto update_constants;
 
-       nvfx->fallback_swrast &= ~NVFX_NEW_FRAGPROG;
        nvfx_fragprog_translate(nvfx, fp);
        if (!fp->translated) {
                static unsigned dummy[8] = {1, 0, 0, 0, 1, 0, 0, 0};
@@ -894,7 +893,7 @@ nvfx_fragprog_validate(struct nvfx_context *nvfx)
                fp->insn = malloc(sizeof(dummy));
                memcpy(fp->insn, dummy, sizeof(dummy));
                fp->insn_len = sizeof(dummy) / sizeof(dummy[0]);
-               return FALSE;
+               return;
        }
 
        fp->buffer = pipe_buffer_create(pscreen,
@@ -948,7 +947,6 @@ update_constants:
                OUT_RING(chan, RING_3D(NV34TCL_TX_UNITS_ENABLE, 1));
                OUT_RING(chan, fp->samplers);
        }
-       return TRUE;
 }
 
 void
@@ -977,10 +975,3 @@ nvfx_fragprog_destroy(struct nvfx_context *nvfx,
                FREE(fp->insn);
 }
 
-struct nvfx_state_entry nvfx_state_fragprog = {
-       .validate = nvfx_fragprog_validate,
-       .dirty = {
-               .pipe = NVFX_NEW_FRAGPROG | NVFX_NEW_FRAGCONST,
-               .hw = 0
-       }
-};
index e239235c3f5eb9a4d21b7e3c70d20ef6463beaf4..f5f6b0c0cbd787221f7ce61bbf16169ac1eacc69 100644 (file)
@@ -1,7 +1,7 @@
 #include "nvfx_context.h"
 #include "nvfx_resource.h"
 
-static boolean
+void
 nvfx_fragtex_validate(struct nvfx_context *nvfx)
 {
        struct nouveau_channel* chan = nvfx->screen->base.channel;
@@ -9,7 +9,7 @@ nvfx_fragtex_validate(struct nvfx_context *nvfx)
 
        samplers = nvfx->dirty_samplers;
        if(!samplers)
-               return FALSE;
+               return;
 
        while (samplers) {
                unit = ffs(samplers) - 1;
@@ -29,7 +29,6 @@ nvfx_fragtex_validate(struct nvfx_context *nvfx)
                }
        }
        nvfx->dirty_samplers = 0;
-       return FALSE;
 }
 
 void
@@ -54,11 +53,3 @@ nvfx_fragtex_relocate(struct nvfx_context *nvfx)
                                NV34TCL_TX_FORMAT_DMA0, NV34TCL_TX_FORMAT_DMA1);
        }
 }
-
-struct nvfx_state_entry nvfx_state_fragtex = {
-       .validate = nvfx_fragtex_validate,
-       .dirty = {
-               .pipe = NVFX_NEW_SAMPLER | NVFX_NEW_FRAGPROG,
-               .hw = 0
-       }
-};
index 5bf921db99c0b81ac75341acaa43209db0ad06cb..893086cae85f465046dbde01b5412f1fded43685 100644 (file)
@@ -179,12 +179,6 @@ static void
 nvfx_screen_destroy(struct pipe_screen *pscreen)
 {
        struct nvfx_screen *screen = nvfx_screen(pscreen);
-       unsigned i;
-
-       for (i = 0; i < NVFX_STATE_MAX; i++) {
-               if (screen->state[i])
-                       so_ref(NULL, &screen->state[i]);
-       }
 
        nouveau_resource_destroy(&screen->vp_exec_heap);
        nouveau_resource_destroy(&screen->vp_data_heap);
index 3302e1aa5865d06f28bbe527679715a018519d29..14bd6339206468a84cd3b4269d712e45ac98cbd0 100644 (file)
@@ -27,9 +27,6 @@ struct nvfx_screen {
        /* Vtxprog resources */
        struct nouveau_resource *vp_exec_heap;
        struct nouveau_resource *vp_data_heap;
-
-       /* Current 3D state of channel */
-       struct nouveau_stateobj *state[NVFX_STATE_MAX];
 };
 
 static INLINE struct nvfx_screen *
index 4053f28a651044ef0ac7e1c68fc5bd3314bf6d0e..0f03c2eb3d5a460c89f3edd4f89e1668fe4fd960 100644 (file)
@@ -303,6 +303,23 @@ nvfx_rasterizer_state_bind(struct pipe_context *pipe, void *hwcso)
 {
        struct nvfx_context *nvfx = nvfx_context(pipe);
 
+       if(nvfx->rasterizer && hwcso)
+       {
+               if(!nvfx->rasterizer || ((struct nvfx_rasterizer_state*)hwcso)->pipe.scissor
+                                       != nvfx->rasterizer->pipe.scissor)
+               {
+                       nvfx->dirty |= NVFX_NEW_SCISSOR;
+                       nvfx->draw_dirty |= NVFX_NEW_SCISSOR;
+               }
+
+               if(((struct nvfx_rasterizer_state*)hwcso)->pipe.poly_stipple_enable
+                                       != nvfx->rasterizer->pipe.poly_stipple_enable)
+               {
+                       nvfx->dirty |= NVFX_NEW_STIPPLE;
+                       nvfx->draw_dirty |= NVFX_NEW_STIPPLE;
+               }
+       }
+
        nvfx->rasterizer = hwcso;
        nvfx->dirty |= NVFX_NEW_RAST;
        nvfx->draw_dirty |= NVFX_NEW_RAST;
index f54eabd6428bc86115854d5dab472e08a4870839..fe34e98364cb4cdb42f61b5a34d23ebdf7152232 100644 (file)
@@ -1,21 +1,13 @@
 #include "nvfx_context.h"
 
-static boolean
+void
 nvfx_state_blend_validate(struct nvfx_context *nvfx)
 {
        struct nouveau_channel* chan = nvfx->screen->base.channel;
        sb_emit(chan, nvfx->blend->sb, nvfx->blend->sb_len);
-       return TRUE;
 }
 
-struct nvfx_state_entry nvfx_state_blend = {
-       .validate = nvfx_state_blend_validate,
-       .dirty = {
-               .pipe = NVFX_NEW_BLEND,
-       }
-};
-
-static boolean
+void
 nvfx_state_blend_colour_validate(struct nvfx_context *nvfx)
 {
        struct nouveau_channel* chan = nvfx->screen->base.channel;
@@ -27,12 +19,4 @@ nvfx_state_blend_colour_validate(struct nvfx_context *nvfx)
                       (float_to_ubyte(bcol->color[0]) << 16) |
                       (float_to_ubyte(bcol->color[1]) <<  8) |
                       (float_to_ubyte(bcol->color[2]) <<  0)));
-       return TRUE;
 }
-
-struct nvfx_state_entry nvfx_state_blend_colour = {
-       .validate = nvfx_state_blend_colour_validate,
-       .dirty = {
-               .pipe = NVFX_NEW_BCOL,
-       }
-};
index 2bc7927a6972caa1c7fa6e85c71668fed5bc9c67..4137849bf0bf568546760ef19729f15f43278d13 100644 (file)
@@ -2,86 +2,92 @@
 #include "nvfx_state.h"
 #include "draw/draw_context.h"
 
-#define RENDER_STATES(name, vbo) \
-static struct nvfx_state_entry *name##render_states[] = { \
-       &nvfx_state_framebuffer, \
-       &nvfx_state_rasterizer, \
-       &nvfx_state_scissor, \
-       &nvfx_state_stipple, \
-       &nvfx_state_fragprog, \
-       &nvfx_state_fragtex, \
-       &nvfx_state_vertprog, \
-       &nvfx_state_blend, \
-       &nvfx_state_blend_colour, \
-       &nvfx_state_zsa, \
-       &nvfx_state_sr, \
-       &nvfx_state_viewport, \
-       &nvfx_state_##vbo, \
-       NULL \
-}
-
-RENDER_STATES(, vbo);
-RENDER_STATES(swtnl_, vtxfmt);
-
-static void
-nvfx_state_do_validate(struct nvfx_context *nvfx,
-                      struct nvfx_state_entry **states)
+static boolean
+nvfx_state_validate_common(struct nvfx_context *nvfx)
 {
-       while (*states) {
-               struct nvfx_state_entry *e = *states;
-
-               if (nvfx->dirty & e->dirty.pipe) {
-                       if (e->validate(nvfx))
-                               nvfx->state.dirty |= (1ULL << e->dirty.hw);
+       struct nouveau_channel* chan = nvfx->screen->base.channel;
+       unsigned dirty = nvfx->dirty;
+
+       if(nvfx != nvfx->screen->cur_ctx)
+               dirty = ~0;
+
+       if(nvfx->render_mode == HW)
+       {
+               if(dirty & (NVFX_NEW_VERTPROG | NVFX_NEW_VERTCONST | NVFX_NEW_UCP))
+               {
+                       if(!nvfx_vertprog_validate(nvfx))
+                               return FALSE;
                }
 
-               states++;
+               if(dirty & (NVFX_NEW_ARRAYS))
+               {
+                       if(!nvfx_vbo_validate(nvfx))
+                               return FALSE;
+               }
+       }
+       else
+       {
+               /* TODO: this looks a bit misdesigned */
+               if(dirty & (NVFX_NEW_VERTPROG | NVFX_NEW_UCP))
+                       nvfx_vertprog_validate(nvfx);
+
+               if(dirty & (NVFX_NEW_ARRAYS | NVFX_NEW_FRAGPROG))
+                       nvfx_vtxfmt_validate(nvfx);
        }
-       nvfx->dirty = 0;
-}
 
-void
-nvfx_state_emit(struct nvfx_context *nvfx)
-{
-       struct nvfx_state *state = &nvfx->state;
-       struct nvfx_screen *screen = nvfx->screen;
-       struct nouveau_channel *chan = screen->base.channel;
-       struct nouveau_grobj *eng3d = screen->eng3d;
-       unsigned i;
-       uint64_t states;
-
-       /* XXX: race conditions
-        */
-       if (nvfx != screen->cur_ctx) {
-               for (i = 0; i < NVFX_STATE_MAX; i++) {
-                       if (state->hw[i] && screen->state[i] != state->hw[i])
-                               state->dirty |= (1ULL << i);
-               }
+       if(dirty & NVFX_NEW_FB)
+               nvfx_state_framebuffer_validate(nvfx);
 
-               screen->cur_ctx = nvfx;
-       }
+       if(dirty & NVFX_NEW_RAST)
+               sb_emit(chan, nvfx->rasterizer->sb, nvfx->rasterizer->sb_len);
 
-       for (i = 0, states = state->dirty; states; i++) {
-               if (!(states & (1ULL << i)))
-                       continue;
-               so_ref (state->hw[i], &nvfx->screen->state[i]);
-               if (state->hw[i])
-                       so_emit(chan, nvfx->screen->state[i]);
-               states &= ~(1ULL << i);
-       }
+       if(dirty & NVFX_NEW_SCISSOR)
+               nvfx_state_scissor_validate(nvfx);
+
+       if(dirty & NVFX_NEW_STIPPLE)
+               nvfx_state_stipple_validate(nvfx);
+
+       if(dirty & (NVFX_NEW_FRAGPROG | NVFX_NEW_FRAGCONST))
+               nvfx_fragprog_validate(nvfx);
+
+       if(dirty & NVFX_NEW_SAMPLER)
+               nvfx_fragtex_validate(nvfx);
+
+       if(dirty & NVFX_NEW_BLEND)
+               sb_emit(chan, nvfx->blend->sb, nvfx->blend->sb_len);
+
+       if(dirty & NVFX_NEW_BCOL)
+               nvfx_state_blend_colour_validate(nvfx);
+
+       if(dirty & NVFX_NEW_ZSA)
+               sb_emit(chan, nvfx->zsa->sb, nvfx->zsa->sb_len);
+
+       if(dirty & NVFX_NEW_SR)
+               nvfx_state_sr_validate(nvfx);
+
+/* Having this depend on FB looks wrong, but it seems
+   necessary to make this work on nv3x
+   TODO: find the right fix
+*/
+       if(dirty & (NVFX_NEW_VIEWPORT | NVFX_NEW_FB))
+               nvfx_state_viewport_validate(nvfx);
 
        /* TODO: could nv30 need this or something similar too? */
-       if(nvfx->is_nv4x) {
-               if (state->dirty & ((1ULL << NVFX_STATE_FRAGPROG) |
-                                   (1ULL << NVFX_STATE_FRAGTEX0))) {
-                       BEGIN_RING(chan, eng3d, NV40TCL_TEX_CACHE_CTL, 1);
-                       OUT_RING  (chan, 2);
-                       BEGIN_RING(chan, eng3d, NV40TCL_TEX_CACHE_CTL, 1);
-                       OUT_RING  (chan, 1);
-               }
+       if((dirty & (NVFX_NEW_FRAGPROG | NVFX_NEW_SAMPLER)) && nvfx->is_nv4x) {
+               WAIT_RING(chan, 4);
+               OUT_RING(chan, RING_3D(NV40TCL_TEX_CACHE_CTL, 1));
+               OUT_RING(chan, 2);
+               OUT_RING(chan, RING_3D(NV40TCL_TEX_CACHE_CTL, 1));
+               OUT_RING(chan, 1);
        }
-       state->dirty = 0;
+       nvfx->dirty = 0;
+       return TRUE;
+}
 
+void
+nvfx_state_emit(struct nvfx_context *nvfx)
+{
+       struct nouveau_channel* chan = nvfx->screen->base.channel;
        /* we need to ensure there is enough space to output relocations in one go */
        unsigned max_relocs = 0
              + 16 /* vertex buffers, incl. dma flag */
@@ -119,16 +125,13 @@ nvfx_state_validate(struct nvfx_context *nvfx)
                        return FALSE;
 
                /* Attempt to go to hwtnl again */
-               nvfx->pipe.flush(&nvfx->pipe, 0, NULL);
                nvfx->dirty |= (NVFX_NEW_VIEWPORT |
                                NVFX_NEW_VERTPROG |
                                NVFX_NEW_ARRAYS);
                nvfx->render_mode = HW;
        }
 
-       nvfx_state_do_validate(nvfx, render_states);
-
-       if (nvfx->fallback_swtnl || nvfx->fallback_swrast)
+       if(!nvfx_state_validate_common(nvfx))
                return FALSE;
 
        if (was_sw)
@@ -169,12 +172,7 @@ nvfx_state_validate_swtnl(struct nvfx_context *nvfx)
                draw_set_vertex_elements(draw, nvfx->vtxelt->num_elements, nvfx->vtxelt->pipe);
        }
 
-       nvfx_state_do_validate(nvfx, swtnl_render_states);
-
-       if (nvfx->fallback_swrast) {
-               NOUVEAU_ERR("swtnl->swrast 0x%08x\n", nvfx->fallback_swrast);
-               return FALSE;
-       }
+       nvfx_state_validate_common(nvfx);
 
        nvfx->draw_dirty = 0;
        return TRUE;
index 93bc0a3feef6ee0425e173a42ad1b205b9c1a548..8c215980e23f6b7e511c709e99fb57ce4eeab8f2 100644 (file)
@@ -4,7 +4,7 @@
 
 
 
-static void
+void
 nvfx_state_framebuffer_validate(struct nvfx_context *nvfx)
 {
        struct pipe_framebuffer_state *fb = &nvfx->framebuffer;
@@ -248,11 +248,3 @@ nvfx_framebuffer_relocate(struct nvfx_context *nvfx)
 
        DO_(nvfx->hw_zeta, NV34, ZETA);
 }
-
-struct nvfx_state_entry nvfx_state_framebuffer = {
-       .validate = nvfx_state_framebuffer_validate,
-       .dirty = {
-               .pipe = NVFX_NEW_FB,
-               .hw = NVFX_STATE_FB
-       }
-};
index a5d21e88b2363e40ef6d12718e890390f6a76839..7f14ae85d5a5184773d4562ab567ac7a5e98b36a 100644 (file)
@@ -1,16 +1,9 @@
 #include "nvfx_context.h"
 
-static boolean
+void
 nvfx_state_rasterizer_validate(struct nvfx_context *nvfx)
 {
        struct nouveau_channel* chan = nvfx->screen->base.channel;
        sb_emit(chan, nvfx->rasterizer->sb, nvfx->rasterizer->sb_len);
-       return TRUE;
 }
 
-struct nvfx_state_entry nvfx_state_rasterizer = {
-       .validate = nvfx_state_rasterizer_validate,
-       .dirty = {
-               .pipe = NVFX_NEW_RAST,
-       }
-};
index dd6ae757df7e057138f7a0283de24e68a0b8f08f..9077266120a353bbb7e45a1d9f86070c28aa8993 100644 (file)
@@ -1,6 +1,6 @@
 #include "nvfx_context.h"
 
-static boolean
+void
 nvfx_state_scissor_validate(struct nvfx_context *nvfx)
 {
        struct nouveau_channel *chan = nvfx->screen->base.channel;
@@ -8,7 +8,7 @@ nvfx_state_scissor_validate(struct nvfx_context *nvfx)
        struct pipe_scissor_state *s = &nvfx->scissor;
 
        if ((rast->scissor == 0 && nvfx->state.scissor_enabled == 0))
-               return FALSE;
+               return;
        nvfx->state.scissor_enabled = rast->scissor;
 
        WAIT_RING(chan, 3);
@@ -20,12 +20,4 @@ nvfx_state_scissor_validate(struct nvfx_context *nvfx)
                OUT_RING(chan, 4096 << 16);
                OUT_RING(chan, 4096 << 16);
        }
-       return TRUE;
 }
-
-struct nvfx_state_entry nvfx_state_scissor = {
-       .validate = nvfx_state_scissor_validate,
-       .dirty = {
-               .pipe = NVFX_NEW_SCISSOR | NVFX_NEW_RAST,
-       }
-};
index 828113c4dfe9c381030c4436e87063648bba9791..4da968f093fdb54e7276037632c2a19ecb4eb864 100644 (file)
@@ -1,13 +1,13 @@
 #include "nvfx_context.h"
 
-static boolean
+void
 nvfx_state_stipple_validate(struct nvfx_context *nvfx)
 {
        struct nouveau_channel *chan = nvfx->screen->base.channel;
        struct pipe_rasterizer_state *rast = &nvfx->rasterizer->pipe;
 
        if ((rast->poly_stipple_enable == 0 && nvfx->state.stipple_enabled == 0))
-               return FALSE;
+               return;
 
        if (rast->poly_stipple_enable) {
                unsigned i;
@@ -23,13 +23,4 @@ nvfx_state_stipple_validate(struct nvfx_context *nvfx)
                OUT_RING(chan, RING_3D(NV34TCL_POLYGON_STIPPLE_ENABLE, 1));
                OUT_RING(chan, 0);
        }
-
-       return TRUE;
 }
-
-struct nvfx_state_entry nvfx_state_stipple = {
-       .validate = nvfx_state_stipple_validate,
-       .dirty = {
-               .pipe = NVFX_NEW_STIPPLE | NVFX_NEW_RAST,
-       }
-};
index 73db0984cdb5dbd3c5566f7c15708a018e6e82b2..e983b16f321323175cec5e50d0b6e9ad10fe9aeb 100644 (file)
@@ -1,11 +1,6 @@
 #include "nvfx_context.h"
 
-/* Having this depend on FB and RAST looks wrong, but it seems
-   necessary to make this work on nv3x
-   TODO: find the right fix
-*/
-
-static boolean
+void
 nvfx_state_viewport_validate(struct nvfx_context *nvfx)
 {
        struct nouveau_channel *chan = nvfx->screen->base.channel;
@@ -37,12 +32,4 @@ nvfx_state_viewport_validate(struct nvfx_context *nvfx)
                OUT_RING(chan, RING_3D(0x1d78, 1));
                OUT_RING(chan, nvfx->is_nv4x ? 0x110 : 1);
        }
-       return FALSE;
 }
-
-struct nvfx_state_entry nvfx_state_viewport = {
-       .validate = nvfx_state_viewport_validate,
-       .dirty = {
-               .pipe = NVFX_NEW_VIEWPORT | NVFX_NEW_FB | NVFX_NEW_RAST,
-       }
-};
index ba2261c422848c96af463684f240e612e4eab504..608605d32bd7ef222fb1760e2b64b3d7b917af7b 100644 (file)
@@ -1,21 +1,13 @@
 #include "nvfx_context.h"
 
-static boolean
+void
 nvfx_state_zsa_validate(struct nvfx_context *nvfx)
 {
        struct nouveau_channel* chan = nvfx->screen->base.channel;
        sb_emit(chan, nvfx->zsa->sb, nvfx->zsa->sb_len);
-       return TRUE;
 }
 
-struct nvfx_state_entry nvfx_state_zsa = {
-       .validate = nvfx_state_zsa_validate,
-       .dirty = {
-               .pipe = NVFX_NEW_ZSA,
-       }
-};
-
-static boolean
+void
 nvfx_state_sr_validate(struct nvfx_context *nvfx)
 {
        struct nouveau_channel* chan = nvfx->screen->base.channel;
@@ -26,12 +18,4 @@ nvfx_state_sr_validate(struct nvfx_context *nvfx)
        OUT_RING(chan, sr->ref_value[0]);
        OUT_RING(chan, RING_3D(NV34TCL_STENCIL_BACK_FUNC_REF, 1));
        OUT_RING(chan, sr->ref_value[1]);
-       return TRUE;
 }
-
-struct nvfx_state_entry nvfx_state_sr = {
-       .validate = nvfx_state_sr_validate,
-       .dirty = {
-               .pipe = NVFX_NEW_SR,
-       }
-};
index 49f0cba9688dd11c7876acb31125f9c18c959f30..74de3a799e1e4174565dfaec9687e0791b4f6983 100644 (file)
@@ -575,17 +575,9 @@ nvfx_vbo_validate(struct nvfx_context *nvfx)
        }
 
        nvfx->hw_vtxelt_nr = nvfx->vtxelt->num_elements;
-       return FALSE;
+       return TRUE;
 }
 
-struct nvfx_state_entry nvfx_state_vbo = {
-       .validate = nvfx_vbo_validate,
-       .dirty = {
-               .pipe = NVFX_NEW_ARRAYS,
-               .hw = 0,
-       }
-};
-
 void
 nvfx_vbo_relocate(struct nvfx_context *nvfx)
 {
index 4637212b18eb31a9f0b42ee7efea764cfc35ad1f..6b847f3cbfdee1282ac926bd5cdc884b7d62beb0 100644 (file)
@@ -830,7 +830,7 @@ out_err:
        FREE(vpc);
 }
 
-static boolean
+boolean
 nvfx_vertprog_validate(struct nvfx_context *nvfx)
 {
        struct pipe_context *pipe = &nvfx->pipe;
@@ -1007,7 +1007,7 @@ nvfx_vertprog_validate(struct nvfx_context *nvfx)
                OUT_RING(chan, vp->clip_ctrl);
        }
 
-       return FALSE;
+       return TRUE;
 }
 
 void
@@ -1035,10 +1035,3 @@ nvfx_vertprog_destroy(struct nvfx_context *nvfx, struct nvfx_vertex_program *vp)
 
        vp->ir = vp->or = vp->clip_ctrl = 0;
 }
-
-struct nvfx_state_entry nvfx_state_vertprog = {
-       .validate = nvfx_vertprog_validate,
-       .dirty = {
-               .pipe = NVFX_NEW_VERTPROG | NVFX_NEW_VERTCONST | NVFX_NEW_UCP,
-       }
-};