nvfx: so->RING_3D: scissor

This commit is contained in:
Luca Barbieri 2010-02-23 15:05:54 +01:00
parent 6558797f99
commit 5c89cb0f6c
2 changed files with 10 additions and 13 deletions

View file

@ -83,5 +83,7 @@ nvfx_create(struct pipe_screen *pscreen, void *priv)
draw_enable_point_sprites(nvfx->draw, FALSE);
draw_set_rasterize_stage(nvfx->draw, nvfx_draw_render_stage(nvfx));
/* set these to that we init them on first validation */
nvfx->state.scissor_enabled = ~0;
return &nvfx->pipe;
}

View file

@ -3,27 +3,23 @@
static boolean
nvfx_state_scissor_validate(struct nvfx_context *nvfx)
{
struct nouveau_channel *chan = nvfx->screen->base.channel;
struct pipe_rasterizer_state *rast = &nvfx->rasterizer->pipe;
struct pipe_scissor_state *s = &nvfx->scissor;
struct nouveau_stateobj *so;
if (nvfx->state.hw[NVFX_STATE_SCISSOR] &&
(rast->scissor == 0 && nvfx->state.scissor_enabled == 0))
if ((rast->scissor == 0 && nvfx->state.scissor_enabled == 0))
return FALSE;
nvfx->state.scissor_enabled = rast->scissor;
so = so_new(1, 2, 0);
so_method(so, nvfx->screen->eng3d, NV34TCL_SCISSOR_HORIZ, 2);
WAIT_RING(chan, 3);
OUT_RING(chan, RING_3D(NV34TCL_SCISSOR_HORIZ, 2));
if (nvfx->state.scissor_enabled) {
so_data (so, ((s->maxx - s->minx) << 16) | s->minx);
so_data (so, ((s->maxy - s->miny) << 16) | s->miny);
OUT_RING(chan, ((s->maxx - s->minx) << 16) | s->minx);
OUT_RING(chan, ((s->maxy - s->miny) << 16) | s->miny);
} else {
so_data (so, 4096 << 16);
so_data (so, 4096 << 16);
OUT_RING(chan, 4096 << 16);
OUT_RING(chan, 4096 << 16);
}
so_ref(so, &nvfx->state.hw[NVFX_STATE_SCISSOR]);
so_ref(NULL, &so);
return TRUE;
}
@ -31,6 +27,5 @@ struct nvfx_state_entry nvfx_state_scissor = {
.validate = nvfx_state_scissor_validate,
.dirty = {
.pipe = NVFX_NEW_SCISSOR | NVFX_NEW_RAST,
.hw = NVFX_STATE_SCISSOR
}
};