nv40: do full swtnl fallback when edge flags present.

This isn't necessary, with some effort we can do this on the hw.  However,
until I encounter something "real" that uses them there's not a lot of
point.
This commit is contained in:
Ben Skeggs 2008-04-28 15:42:19 +10:00
parent 2193578851
commit 58b1bcaa09
5 changed files with 18 additions and 6 deletions

View file

@ -32,11 +32,6 @@ nv40_destroy(struct pipe_context *pipe)
FREE(nv40);
}
static void
nv40_set_edgeflags(struct pipe_context *pipe, const unsigned *bitfield)
{
}
struct pipe_context *
nv40_create(struct pipe_screen *pscreen, unsigned pctx_id)
{
@ -58,7 +53,6 @@ nv40_create(struct pipe_screen *pscreen, unsigned pctx_id)
nv40->pipe.winsys = ws;
nv40->pipe.screen = pscreen;
nv40->pipe.destroy = nv40_destroy;
nv40->pipe.set_edgeflags = nv40_set_edgeflags;
nv40->pipe.draw_arrays = nv40_draw_arrays;
nv40->pipe.draw_elements = nv40_draw_elements;
nv40->pipe.clear = nv40_clear;

View file

@ -155,6 +155,7 @@ struct nv40_context {
unsigned vtxbuf_nr;
struct pipe_vertex_element vtxelt[PIPE_MAX_ATTRIBS];
unsigned vtxelt_nr;
const unsigned *edgeflags;
};
static INLINE struct nv40_context *

View file

@ -680,6 +680,16 @@ nv40_set_vertex_elements(struct pipe_context *pipe, unsigned count,
nv40->draw_dirty |= NV40_NEW_ARRAYS;
}
static void
nv40_set_edgeflags(struct pipe_context *pipe, const unsigned *bitfield)
{
struct nv40_context *nv40 = nv40_context(pipe);
nv40->edgeflags = bitfield;
nv40->dirty |= NV40_NEW_ARRAYS;
nv40->draw_dirty |= NV40_NEW_ARRAYS;
}
void
nv40_init_state_functions(struct nv40_context *nv40)
{
@ -719,6 +729,7 @@ nv40_init_state_functions(struct nv40_context *nv40)
nv40->pipe.set_scissor_state = nv40_set_scissor_state;
nv40->pipe.set_viewport_state = nv40_set_viewport_state;
nv40->pipe.set_edgeflags = nv40_set_edgeflags;
nv40->pipe.set_vertex_buffers = nv40_set_vertex_buffers;
nv40->pipe.set_vertex_elements = nv40_set_vertex_elements;
}

View file

@ -167,6 +167,7 @@ nv40_state_validate_swtnl(struct nv40_context *nv40)
draw_set_viewport_state(draw, &nv40->viewport);
if (nv40->draw_dirty & NV40_NEW_ARRAYS) {
draw_set_edgeflags(draw, nv40->edgeflags);
draw_set_vertex_buffers(draw, nv40->vtxbuf_nr, nv40->vtxbuf);
draw_set_vertex_elements(draw, nv40->vtxelt_nr, nv40->vtxelt);
}

View file

@ -488,6 +488,11 @@ nv40_vbo_validate(struct nv40_context *nv40)
unsigned vb_flags = NOUVEAU_BO_VRAM | NOUVEAU_BO_GART | NOUVEAU_BO_RD;
int hw;
if (nv40->edgeflags) {
nv40->fallback_swtnl |= NV40_NEW_ARRAYS;
return FALSE;
}
vtxbuf = so_new(20, 18);
so_method(vtxbuf, curie, NV40TCL_VTXBUF_ADDRESS(0), nv40->vtxelt_nr);
vtxfmt = so_new(17, 0);