From 778c64da97272e7508dbcdf0bffdb699d1b04ce0 Mon Sep 17 00:00:00 2001
From: Luca Barbieri <luca@luca-barbieri.com>
Date: Sun, 21 Feb 2010 11:33:15 +0100
Subject: nv30, nv40: non-trivially unify nv[34]0_state_emit.c

The files are the same except for swtnl support on nv40 and for
texture cache flushing on nv40.

Unify them, and use a macro to define 4 versions of render_states,
for all combinations of nvfx and hwtnl/swtnl.
---
 src/gallium/drivers/nv40/Makefile          |   1 -
 src/gallium/drivers/nv40/nv40_context.c    |   2 +-
 src/gallium/drivers/nv40/nv40_context.h    |   4 -
 src/gallium/drivers/nv40/nv40_draw.c       |   6 +-
 src/gallium/drivers/nv40/nv40_state_emit.c | 189 -----------------------------
 src/gallium/drivers/nv40/nv40_vbo.c        |  14 +--
 6 files changed, 11 insertions(+), 205 deletions(-)
 delete mode 100644 src/gallium/drivers/nv40/nv40_state_emit.c

(limited to 'src/gallium/drivers/nv40')

diff --git a/src/gallium/drivers/nv40/Makefile b/src/gallium/drivers/nv40/Makefile
index 8d09ef807f..b0c0c09d51 100644
--- a/src/gallium/drivers/nv40/Makefile
+++ b/src/gallium/drivers/nv40/Makefile
@@ -13,7 +13,6 @@ C_SOURCES = \
 	nv40_screen.c \
 	nv40_state.c \
 	nv40_state_blend.c \
-	nv40_state_emit.c \
 	nv40_state_fb.c \
 	nv40_state_rasterizer.c \
 	nv40_state_scissor.c \
diff --git a/src/gallium/drivers/nv40/nv40_context.c b/src/gallium/drivers/nv40/nv40_context.c
index 9934b582ee..12f57377cd 100644
--- a/src/gallium/drivers/nv40/nv40_context.c
+++ b/src/gallium/drivers/nv40/nv40_context.c
@@ -69,7 +69,7 @@ nv40_create(struct pipe_screen *pscreen, void *priv)
 	nvfx->pipe.is_buffer_referenced = nouveau_is_buffer_referenced;
 
 	screen->base.channel->user_private = nvfx;
-	screen->base.channel->flush_notify = nv40_state_flush_notify;
+	screen->base.channel->flush_notify = nvfx_state_flush_notify;
 
 	nvfx->is_nv4x = screen->is_nv4x;
 
diff --git a/src/gallium/drivers/nv40/nv40_context.h b/src/gallium/drivers/nv40/nv40_context.h
index e7c6d5ad86..0b875bcb06 100644
--- a/src/gallium/drivers/nv40/nv40_context.h
+++ b/src/gallium/drivers/nv40/nv40_context.h
@@ -28,10 +28,6 @@ extern void nv40_fragprog_destroy(struct nvfx_context *,
 extern void nv40_fragtex_bind(struct nvfx_context *);
 
 /* nv40_state.c and friends */
-extern boolean nv40_state_validate(struct nvfx_context *nvfx);
-extern boolean nv40_state_validate_swtnl(struct nvfx_context *nvfx);
-extern void nv40_state_emit(struct nvfx_context *nvfx);
-extern void nv40_state_flush_notify(struct nouveau_channel *chan);
 extern struct nvfx_state_entry nv40_state_rasterizer;
 extern struct nvfx_state_entry nv40_state_scissor;
 extern struct nvfx_state_entry nv40_state_stipple;
diff --git a/src/gallium/drivers/nv40/nv40_draw.c b/src/gallium/drivers/nv40/nv40_draw.c
index cce1c64621..87d2689d54 100644
--- a/src/gallium/drivers/nv40/nv40_draw.c
+++ b/src/gallium/drivers/nv40/nv40_draw.c
@@ -98,7 +98,7 @@ nv40_render_prim(struct draw_stage *stage, struct prim_header *prim,
 			assert(0);
 		}
 		FIRE_RING(chan);
-		nv40_state_emit(nvfx);
+		nvfx_state_emit(nvfx);
 	}
 
 	/* Switch primitive modes if necessary */
@@ -245,10 +245,10 @@ nv40_draw_elements_swtnl(struct pipe_context *pipe,
 	unsigned i;
 	void *map;
 
-	if (!nv40_state_validate_swtnl(nvfx))
+	if (!nvfx_state_validate_swtnl(nvfx))
 		return;
 	nvfx->state.dirty &= ~(1ULL << NVFX_STATE_VTXBUF);
-	nv40_state_emit(nvfx);
+	nvfx_state_emit(nvfx);
 
 	for (i = 0; i < nvfx->vtxbuf_nr; i++) {
 		map = pipe_buffer_map(pscreen, nvfx->vtxbuf[i].buffer,
diff --git a/src/gallium/drivers/nv40/nv40_state_emit.c b/src/gallium/drivers/nv40/nv40_state_emit.c
deleted file mode 100644
index 5c437f9969..0000000000
--- a/src/gallium/drivers/nv40/nv40_state_emit.c
+++ /dev/null
@@ -1,189 +0,0 @@
-#include "nv40_context.h"
-#include "nvfx_state.h"
-#include "draw/draw_context.h"
-
-static struct nvfx_state_entry *render_states[] = {
-	&nv40_state_framebuffer,
-	&nv40_state_rasterizer,
-	&nv40_state_scissor,
-	&nv40_state_stipple,
-	&nv40_state_fragprog,
-	&nv40_state_fragtex,
-	&nv40_state_vertprog,
-	&nv40_state_blend,
-	&nv40_state_blend_colour,
-	&nv40_state_zsa,
-	&nv40_state_sr,
-	&nv40_state_viewport,
-	&nv40_state_vbo,
-	NULL
-};
-
-static struct nvfx_state_entry *swtnl_states[] = {
-	&nv40_state_framebuffer,
-	&nv40_state_rasterizer,
-	&nv40_state_scissor,
-	&nv40_state_stipple,
-	&nv40_state_fragprog,
-	&nv40_state_fragtex,
-	&nv40_state_vertprog,
-	&nv40_state_blend,
-	&nv40_state_blend_colour,
-	&nv40_state_zsa,
-	&nv40_state_sr,
-	&nv40_state_viewport,
-	&nv40_state_vtxfmt,
-	NULL
-};
-
-static void
-nv40_state_do_validate(struct nvfx_context *nvfx,
-		       struct nvfx_state_entry **states)
-{
-	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);
-		}
-
-		states++;
-	}
-	nvfx->dirty = 0;
-}
-
-void
-nv40_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);
-		}
-
-		screen->cur_ctx = nvfx;
-	}
-
-	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 (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);
-	}
-
-	state->dirty = 0;
-}
-
-void
-nv40_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(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(chan,
-				      state->hw[NVFX_STATE_FRAGTEX0+i]);
-		samplers &= ~(1ULL << i);
-	}
-	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
-nv40_state_validate(struct nvfx_context *nvfx)
-{
-	boolean was_sw = nvfx->fallback_swtnl ? TRUE : FALSE;
-
-	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 ((nvfx->fallback_swtnl & nvfx->dirty)
-				!= nvfx->fallback_swtnl)
-			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;
-	}
-
-	nv40_state_do_validate(nvfx, render_states);
-	if (nvfx->fallback_swtnl || nvfx->fallback_swrast)
-		return FALSE;
-	
-	if (was_sw)
-		NOUVEAU_ERR("swtnl->hw\n");
-
-	return TRUE;
-}
-
-boolean
-nv40_state_validate_swtnl(struct nvfx_context *nvfx)
-{
-	struct draw_context *draw = nvfx->draw;
-
-	/* Setup for swtnl */
-	if (nvfx->render_mode == HW) {
-		NOUVEAU_ERR("hw->swtnl 0x%08x\n", nvfx->fallback_swtnl);
-		nvfx->pipe.flush(&nvfx->pipe, 0, NULL);
-		nvfx->dirty |= (NVFX_NEW_VIEWPORT |
-				NVFX_NEW_VERTPROG |
-				NVFX_NEW_ARRAYS);
-		nvfx->render_mode = SWTNL;
-	}
-
-	if (nvfx->draw_dirty & NVFX_NEW_VERTPROG)
-		draw_bind_vertex_shader(draw, nvfx->vertprog->draw);
-
-	if (nvfx->draw_dirty & NVFX_NEW_RAST)
-		draw_set_rasterizer_state(draw, &nvfx->rasterizer->pipe);
-
-	if (nvfx->draw_dirty & NVFX_NEW_UCP)
-		draw_set_clip_state(draw, &nvfx->clip);
-
-	if (nvfx->draw_dirty & NVFX_NEW_VIEWPORT)
-		draw_set_viewport_state(draw, &nvfx->viewport);
-
-	if (nvfx->draw_dirty & NVFX_NEW_ARRAYS) {
-		draw_set_vertex_buffers(draw, nvfx->vtxbuf_nr, nvfx->vtxbuf);
-		draw_set_vertex_elements(draw, nvfx->vtxelt->num_elements, nvfx->vtxelt->pipe);
-	}
-
-	nv40_state_do_validate(nvfx, swtnl_states);
-	if (nvfx->fallback_swrast) {
-		NOUVEAU_ERR("swtnl->swrast 0x%08x\n", nvfx->fallback_swrast);
-		return FALSE;
-	}
-
-	nvfx->draw_dirty = 0;
-	return TRUE;
-}
-
diff --git a/src/gallium/drivers/nv40/nv40_vbo.c b/src/gallium/drivers/nv40/nv40_vbo.c
index 0738d5c93b..456b508d43 100644
--- a/src/gallium/drivers/nv40/nv40_vbo.c
+++ b/src/gallium/drivers/nv40/nv40_vbo.c
@@ -176,7 +176,7 @@ nv40_draw_arrays(struct pipe_context *pipe,
 	unsigned restart;
 
 	nv40_vbo_set_idxbuf(nvfx, NULL, 0);
-	if (FORCE_SWTNL || !nv40_state_validate(nvfx)) {
+	if (FORCE_SWTNL || !nvfx_state_validate(nvfx)) {
 		nv40_draw_elements_swtnl(pipe, NULL, 0,
                                          mode, start, count);
                 return;
@@ -185,7 +185,7 @@ nv40_draw_arrays(struct pipe_context *pipe,
 	while (count) {
 		unsigned vc, nr;
 
-		nv40_state_emit(nvfx);
+		nvfx_state_emit(nvfx);
 
 		vc = nouveau_vbuf_split(AVAIL_RING(chan), 6, 256,
 					mode, start, count, &restart);
@@ -239,7 +239,7 @@ nv40_draw_elements_u08(struct nvfx_context *nvfx, void *ib,
 		uint8_t *elts = (uint8_t *)ib + start;
 		unsigned vc, push, restart;
 
-		nv40_state_emit(nvfx);
+		nvfx_state_emit(nvfx);
 
 		vc = nouveau_vbuf_split(AVAIL_RING(chan), 6, 2,
 					mode, start, count, &restart);
@@ -290,7 +290,7 @@ nv40_draw_elements_u16(struct nvfx_context *nvfx, void *ib,
 		uint16_t *elts = (uint16_t *)ib + start;
 		unsigned vc, push, restart;
 
-		nv40_state_emit(nvfx);
+		nvfx_state_emit(nvfx);
 
 		vc = nouveau_vbuf_split(AVAIL_RING(chan), 6, 2,
 					mode, start, count, &restart);
@@ -341,7 +341,7 @@ nv40_draw_elements_u32(struct nvfx_context *nvfx, void *ib,
 		uint32_t *elts = (uint32_t *)ib + start;
 		unsigned vc, push, restart;
 
-		nv40_state_emit(nvfx);
+		nvfx_state_emit(nvfx);
 
 		vc = nouveau_vbuf_split(AVAIL_RING(chan), 5, 1,
 					mode, start, count, &restart);
@@ -417,7 +417,7 @@ nv40_draw_elements_vbo(struct pipe_context *pipe,
 	while (count) {
 		unsigned nr, vc;
 
-		nv40_state_emit(nvfx);
+		nvfx_state_emit(nvfx);
 
 		vc = nouveau_vbuf_split(AVAIL_RING(chan), 6, 256,
 					mode, start, count, &restart);
@@ -466,7 +466,7 @@ nv40_draw_elements(struct pipe_context *pipe,
 	boolean idxbuf;
 
 	idxbuf = nv40_vbo_set_idxbuf(nvfx, indexBuffer, indexSize);
-	if (FORCE_SWTNL || !nv40_state_validate(nvfx)) {
+	if (FORCE_SWTNL || !nvfx_state_validate(nvfx)) {
 		nv40_draw_elements_swtnl(pipe, NULL, 0,
                                          mode, start, count);
                 return;
-- 
cgit v1.2.3