nv30, nv40: unify all structures and headers, except shaders
[mesa.git] / src / gallium / drivers / nv30 / nv30_state_emit.c
index 40fed621b24037062bc1b0858eb0f73af9bea877..6df93618da8c8e2d1b16082f7197547591f2190b 100644 (file)
@@ -1,7 +1,7 @@
 #include "nv30_context.h"
-#include "nv30_state.h"
+#include "nvfx_state.h"
 
-static struct nv30_state_entry *render_states[] = {
+static struct nvfx_state_entry *render_states[] = {
        &nv30_state_framebuffer,
        &nv30_state_rasterizer,
        &nv30_state_scissor,
@@ -12,103 +12,106 @@ static struct nv30_state_entry *render_states[] = {
        &nv30_state_blend,
        &nv30_state_blend_colour,
        &nv30_state_zsa,
+       &nv30_state_sr,
        &nv30_state_viewport,
        &nv30_state_vbo,
        NULL
 };
 
 static void
-nv30_state_do_validate(struct nv30_context *nv30,
-                      struct nv30_state_entry **states)
+nv30_state_do_validate(struct nvfx_context *nvfx,
+                      struct nvfx_state_entry **states)
 {
-       const struct pipe_framebuffer_state *fb = &nv30->framebuffer;
-       unsigned i;
-
-       for (i = 0; i < fb->num_cbufs; i++)
-               fb->cbufs[i]->status = PIPE_SURFACE_STATUS_DEFINED;
-       if (fb->zsbuf)
-               fb->zsbuf->status = PIPE_SURFACE_STATUS_DEFINED;
-
        while (*states) {
-               struct nv30_state_entry *e = *states;
+               struct nvfx_state_entry *e = *states;
 
-               if (nv30->dirty & e->dirty.pipe) {
-                       if (e->validate(nv30)) {
-                               nv30->state.dirty |= (1ULL << e->dirty.hw);
-                       }
+               if (nvfx->dirty & e->dirty.pipe) {
+                       if (e->validate(nvfx))
+                               nvfx->state.dirty |= (1ULL << e->dirty.hw);
                }
 
                states++;
        }
-       nv30->dirty = 0;
+       nvfx->dirty = 0;
 }
 
 void
-nv30_state_emit(struct nv30_context *nv30)
+nv30_state_emit(struct nvfx_context *nvfx)
 {
-       struct nv30_state *state = &nv30->state;
-       struct nv30_screen *screen = nv30->screen;
-       unsigned i, samplers;
-       uint64 states;
+       struct nouveau_channel *chan = nvfx->screen->base.channel;
+       struct nvfx_state *state = &nvfx->state;
+       struct nvfx_screen *screen = nvfx->screen;
+       unsigned i;
+       uint64_t states;
 
-       if (nv30->pctx_id != screen->cur_pctx) {
-               for (i = 0; i < NV30_STATE_MAX; i++) {
+       /* XXX: racy!
+        */
+       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);
                }
 
-               screen->cur_pctx = nv30->pctx_id;
+               screen->cur_ctx = nvfx;
        }
 
        for (i = 0, states = state->dirty; states; i++) {
                if (!(states & (1ULL << i)))
                        continue;
-               so_ref (state->hw[i], &nv30->screen->state[i]);
+               so_ref (state->hw[i], &nvfx->screen->state[i]);
                if (state->hw[i])
-                       so_emit(nv30->nvws, nv30->screen->state[i]);
+                       so_emit(chan, nvfx->screen->state[i]);
                states &= ~(1ULL << i);
        }
 
        state->dirty = 0;
+}
+
+void
+nv30_state_flush_notify(struct nouveau_channel *chan)
+{
+       struct nvfx_context *nvfx = chan->user_private;
+       struct nvfx_state *state = &nvfx->state;
+       unsigned i, samplers;
 
-       so_emit_reloc_markers(nv30->nvws, state->hw[NV30_STATE_FB]);
+       so_emit_reloc_markers(chan, state->hw[NVFX_STATE_FB]);
        for (i = 0, samplers = state->fp_samplers; i < 16 && samplers; i++) {
                if (!(samplers & (1 << i)))
                        continue;
-               so_emit_reloc_markers(nv30->nvws,
-                                     state->hw[NV30_STATE_FRAGTEX0+i]);
+               so_emit_reloc_markers(chan,
+                                     state->hw[NVFX_STATE_FRAGTEX0+i]);
                samplers &= ~(1ULL << i);
        }
-       so_emit_reloc_markers(nv30->nvws, state->hw[NV30_STATE_FRAGPROG]);
-       if (state->hw[NV30_STATE_VTXBUF] /*&& nv30->render_mode == HW*/)
-               so_emit_reloc_markers(nv30->nvws, state->hw[NV30_STATE_VTXBUF]);
+       so_emit_reloc_markers(chan, state->hw[NVFX_STATE_FRAGPROG]);
+       if (state->hw[NVFX_STATE_VTXBUF] /*&& nvfx->render_mode == HW*/)
+               so_emit_reloc_markers(chan, state->hw[NVFX_STATE_VTXBUF]);
 }
 
 boolean
-nv30_state_validate(struct nv30_context *nv30)
+nv30_state_validate(struct nvfx_context *nvfx)
 {
 #if 0
-       boolean was_sw = nv30->fallback_swtnl ? TRUE : FALSE;
+       boolean was_sw = nvfx->fallback_swtnl ? TRUE : FALSE;
 
-       if (nv30->render_mode != HW) {
+       if (nvfx->render_mode != HW) {
                /* Don't even bother trying to go back to hw if none
                 * of the states that caused swtnl previously have changed.
                 */
-               if ((nv30->fallback_swtnl & nv30->dirty)
-                               != nv30->fallback_swtnl)
+               if ((nvfx->fallback_swtnl & nvfx->dirty)
+                               != nvfx->fallback_swtnl)
                        return FALSE;
 
                /* Attempt to go to hwtnl again */
-               nv30->pipe.flush(&nv30->pipe, 0, NULL);
-               nv30->dirty |= (NV30_NEW_VIEWPORT |
-                               NV30_NEW_VERTPROG |
-                               NV30_NEW_ARRAYS);
-               nv30->render_mode = HW;
+               nvfx->pipe.flush(&nvfx->pipe, 0, NULL);
+               nvfx->dirty |= (NVFX_NEW_VIEWPORT |
+                               NVFX_NEW_VERTPROG |
+                               NVFX_NEW_ARRAYS);
+               nvfx->render_mode = HW;
        }
 #endif
-       nv30_state_do_validate(nv30, render_states);
+       nv30_state_do_validate(nvfx, render_states);
 #if 0
-       if (nv30->fallback_swtnl || nv30->fallback_swrast)
+       if (nvfx->fallback_swtnl || nvfx->fallback_swrast)
                return FALSE;
        
        if (was_sw)