#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;
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];
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);
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
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 = {
.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) {
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