nv40: until gallium is fixed we'll need a fallback for user clip planes

This commit is contained in:
Ben Skeggs 2008-02-18 16:26:33 +11:00
parent f911235f64
commit 112ba3355a
3 changed files with 45 additions and 9 deletions

View file

@ -34,6 +34,9 @@
#define NV40_NEW_VERTPROG (1 << 9)
#define NV40_NEW_FRAGPROG (1 << 10)
#define NV40_NEW_ARRAYS (1 << 11)
#define NV40_NEW_UCP (1 << 12)
#define NV40_FALLBACK_TNL (1 << 0)
struct nv40_channel_context {
struct nouveau_winsys *nvws;
@ -92,9 +95,11 @@ struct nv40_context {
struct {
struct pipe_scissor_state scissor;
unsigned stipple[32];
struct pipe_clip_state clip;
} pipe_state;
struct nv40_state state;
unsigned fallback;
struct nouveau_stateobj *so_framebuffer;
struct nouveau_stateobj *so_fragtex[16];
@ -131,6 +136,14 @@ nv40_context(struct pipe_context *pipe)
return (struct nv40_context *)pipe;
}
struct nv40_state_entry {
boolean (*validate)(struct nv40_context *nv40);
struct {
unsigned pipe;
unsigned hw;
} dirty;
};
extern void nv40_init_state_functions(struct nv40_context *nv40);
extern void nv40_init_surface_functions(struct nv40_context *nv40);
extern void nv40_init_miptree_functions(struct nv40_context *nv40);

View file

@ -561,6 +561,10 @@ static void
nv40_set_clip_state(struct pipe_context *pipe,
const struct pipe_clip_state *clip)
{
struct nv40_context *nv40 = nv40_context(pipe);
nv40->pipe_state.clip = *clip;
nv40->dirty |= NV40_NEW_UCP;
}
static void

View file

@ -79,15 +79,15 @@ nv40_state_stipple_validate(struct nv40_context *nv40)
return TRUE;
}
struct nv40_state_atom {
boolean (*validate)(struct nv40_context *nv40);
struct {
unsigned pipe;
unsigned hw;
} dirty;
};
static boolean
nv40_state_clip_validate(struct nv40_context *nv40)
{
if (nv40->pipe_state.clip.nr)
nv40->fallback |= NV40_FALLBACK_TNL;
return FALSE;
}
static struct nv40_state_atom states[] = {
static struct nv40_state_entry states[] = {
{
.validate = nv40_state_scissor_validate,
.dirty = {
@ -101,13 +101,23 @@ static struct nv40_state_atom states[] = {
.pipe = NV40_NEW_STIPPLE | NV40_NEW_RAST,
.hw = NV40_NEW_STIPPLE,
}
},
{
.validate = nv40_state_clip_validate,
.dirty = {
.pipe = NV40_NEW_UCP,
.hw = 0,
}
}
};
static void
nv40_state_validate(struct nv40_context *nv40)
{
unsigned i;
unsigned i, last_fallback;
last_fallback = nv40->fallback;
nv40->fallback = 0;
for (i = 0; i < sizeof(states) / sizeof(states[0]); i++) {
if (nv40->dirty & states[i].dirty.pipe) {
@ -115,6 +125,15 @@ nv40_state_validate(struct nv40_context *nv40)
nv40->hw_dirty |= states[i].dirty.hw;
}
}
if (nv40->fallback & NV40_FALLBACK_TNL &&
!(last_fallback & NV40_FALLBACK_TNL)) {
NOUVEAU_ERR("XXX: hwtnl->swtnl\n");
} else
if (last_fallback & NV40_FALLBACK_TNL &&
!(nv40->fallback & NV40_FALLBACK_TNL)) {
NOUVEAU_ERR("XXX: swtnl->hwtnl\n");
}
}
void