diff options
Diffstat (limited to 'src/gallium/drivers/nv40')
-rw-r--r-- | src/gallium/drivers/nv40/Makefile | 1 | ||||
-rw-r--r-- | src/gallium/drivers/nv40/nv40_context.c | 2 | ||||
-rw-r--r-- | src/gallium/drivers/nv40/nv40_context.h | 4 | ||||
-rw-r--r-- | src/gallium/drivers/nv40/nv40_draw.c | 6 | ||||
-rw-r--r-- | src/gallium/drivers/nv40/nv40_state_emit.c | 189 | ||||
-rw-r--r-- | src/gallium/drivers/nv40/nv40_vbo.c | 14 |
6 files changed, 11 insertions, 205 deletions
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; |