nv30_screen.c \
nv30_state.c \
nv30_state_blend.c \
- nv30_state_emit.c \
nv30_state_fb.c \
nv30_state_rasterizer.c \
nv30_state_scissor.c \
nvfx->pipe.is_buffer_referenced = nouveau_is_buffer_referenced;
screen->base.channel->user_private = nvfx;
- screen->base.channel->flush_notify = nv30_state_flush_notify;
+ screen->base.channel->flush_notify = nvfx_state_flush_notify;
nvfx->is_nv4x = screen->is_nv4x;
extern void nv30_fragtex_bind(struct nvfx_context *);
/* nv30_state.c and friends */
-extern boolean nv30_state_validate(struct nvfx_context *nvfx);
-extern void nv30_state_emit(struct nvfx_context *nvfx);
-extern void nv30_state_flush_notify(struct nouveau_channel *chan);
extern struct nvfx_state_entry nv30_state_rasterizer;
extern struct nvfx_state_entry nv30_state_scissor;
extern struct nvfx_state_entry nv30_state_stipple;
+++ /dev/null
-#include "nv30_context.h"
-#include "nvfx_state.h"
-
-static struct nvfx_state_entry *render_states[] = {
- &nv30_state_framebuffer,
- &nv30_state_rasterizer,
- &nv30_state_scissor,
- &nv30_state_stipple,
- &nv30_state_fragprog,
- &nv30_state_fragtex,
- &nv30_state_vertprog,
- &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 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
-nv30_state_emit(struct nvfx_context *nvfx)
-{
- 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;
-
- /* 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_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);
- }
-
- 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(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
-nv30_state_validate(struct nvfx_context *nvfx)
-{
-#if 0
- 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;
- }
-#endif
- nv30_state_do_validate(nvfx, render_states);
-#if 0
- if (nvfx->fallback_swtnl || nvfx->fallback_swrast)
- return FALSE;
-
- if (was_sw)
- NOUVEAU_ERR("swtnl->hw\n");
-#endif
- return TRUE;
-}
unsigned restart = 0;
nv30_vbo_set_idxbuf(nvfx, NULL, 0);
- if (FORCE_SWTNL || !nv30_state_validate(nvfx)) {
+ if (FORCE_SWTNL || !nvfx_state_validate(nvfx)) {
/*return nv30_draw_elements_swtnl(pipe, NULL, 0,
mode, start, count);*/
return;
while (count) {
unsigned vc, nr;
- nv30_state_emit(nvfx);
+ nvfx_state_emit(nvfx);
vc = nouveau_vbuf_split(AVAIL_RING(chan), 6, 256,
mode, start, count, &restart);
uint8_t *elts = (uint8_t *)ib + start;
unsigned vc, push, restart = 0;
- nv30_state_emit(nvfx);
+ nvfx_state_emit(nvfx);
vc = nouveau_vbuf_split(AVAIL_RING(chan), 6, 2,
mode, start, count, &restart);
uint16_t *elts = (uint16_t *)ib + start;
unsigned vc, push, restart = 0;
- nv30_state_emit(nvfx);
+ nvfx_state_emit(nvfx);
vc = nouveau_vbuf_split(AVAIL_RING(chan), 6, 2,
mode, start, count, &restart);
uint32_t *elts = (uint32_t *)ib + start;
unsigned vc, push, restart = 0;
- nv30_state_emit(nvfx);
+ nvfx_state_emit(nvfx);
vc = nouveau_vbuf_split(AVAIL_RING(chan), 5, 1,
mode, start, count, &restart);
while (count) {
unsigned nr, vc;
- nv30_state_emit(nvfx);
+ nvfx_state_emit(nvfx);
vc = nouveau_vbuf_split(AVAIL_RING(chan), 6, 256,
mode, start, count, &restart);
boolean idxbuf;
idxbuf = nv30_vbo_set_idxbuf(nvfx, indexBuffer, indexSize);
- if (FORCE_SWTNL || !nv30_state_validate(nvfx)) {
+ if (FORCE_SWTNL || !nvfx_state_validate(nvfx)) {
/*return nv30_draw_elements_swtnl(pipe, NULL, 0,
mode, start, count);*/
return;
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 \
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;
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;
assert(0);
}
FIRE_RING(chan);
- nv40_state_emit(nvfx);
+ nvfx_state_emit(nvfx);
}
/* Switch primitive modes if necessary */
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,
+++ /dev/null
-#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;
-}
-
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;
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);
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);
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);
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);
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);
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;
C_SOURCES = \
nvfx_clear.c \
+ nvfx_state_emit.c \
nvfx_transfer.c
include ../../Makefile.template
extern void nvfx_clear(struct pipe_context *pipe, unsigned buffers,
const float *rgba, double depth, unsigned stencil);
+/* nvfx_state_emit.c */
+extern void nvfx_state_flush_notify(struct nouveau_channel *chan);
+extern boolean nvfx_state_validate(struct nvfx_context *nvfx);
+extern boolean nvfx_state_validate_swtnl(struct nvfx_context *nvfx);
+extern void nvfx_state_emit(struct nvfx_context *nvfx);
+
/* nvfx_transfer.c */
extern void nvfx_init_transfer_functions(struct nvfx_context *nvfx);
--- /dev/null
+#include "nv30/nv30_context.h"
+#include "nv40/nv40_context.h"
+#include "nvfx_state.h"
+#include "draw/draw_context.h"
+
+#define RENDER_STATES(name, nvxx, vbo) \
+static struct nvfx_state_entry *name##_render_states[] = { \
+ &nvxx##_state_framebuffer, \
+ &nvxx##_state_rasterizer, \
+ &nvxx##_state_scissor, \
+ &nvxx##_state_stipple, \
+ &nvxx##_state_fragprog, \
+ &nvxx##_state_fragtex, \
+ &nvxx##_state_vertprog, \
+ &nvxx##_state_blend, \
+ &nvxx##_state_blend_colour, \
+ &nvxx##_state_zsa, \
+ &nvxx##_state_sr, \
+ &nvxx##_state_viewport, \
+ &nvxx##_state_##vbo, \
+ NULL \
+}
+
+RENDER_STATES(nv30, nv30, vbo);
+RENDER_STATES(nv30_swtnl, nv30, vbo); /* TODO: replace with vtxfmt once draw is unified */
+RENDER_STATES(nv40, nv40, vbo);
+RENDER_STATES(nv40_swtnl, nv40, vtxfmt);
+
+static void
+nvfx_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
+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);
+ }
+
+ 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);
+ }
+
+ /* 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);
+ }
+ }
+ state->dirty = 0;
+}
+
+void
+nvfx_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
+nvfx_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;
+ }
+
+ if(!nvfx->is_nv4x)
+ nvfx_state_do_validate(nvfx, nv30_render_states);
+ else
+ nvfx_state_do_validate(nvfx, nv40_render_states);
+
+ if (nvfx->fallback_swtnl || nvfx->fallback_swrast)
+ return FALSE;
+
+ if (was_sw)
+ NOUVEAU_ERR("swtnl->hw\n");
+
+ return TRUE;
+}
+
+boolean
+nvfx_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);
+ }
+
+ if(!nvfx->is_nv4x)
+ nvfx_state_do_validate(nvfx, nv30_swtnl_render_states);
+ else
+ nvfx_state_do_validate(nvfx, nv40_swtnl_render_states);
+
+ if (nvfx->fallback_swrast) {
+ NOUVEAU_ERR("swtnl->swrast 0x%08x\n", nvfx->fallback_swrast);
+ return FALSE;
+ }
+
+ nvfx->draw_dirty = 0;
+ return TRUE;
+}