nv50: get clear-scissor working

This commit is contained in:
Ben Skeggs 2008-07-11 01:53:28 +10:00
parent add89c7845
commit 7a81ffa115
2 changed files with 36 additions and 9 deletions

View file

@ -86,6 +86,7 @@ struct nv50_state {
struct nouveau_stateobj *scissor;
unsigned scissor_enabled;
struct nouveau_stateobj *viewport;
unsigned viewport_bypass;
struct nouveau_stateobj *tsc_upload;
struct nouveau_stateobj *tic_upload;
struct nouveau_stateobj *vertprog;

View file

@ -228,17 +228,43 @@ nv50_state_validate(struct nv50_context *nv50)
scissor_uptodate:
if (nv50->dirty & NV50_NEW_VIEWPORT) {
so = so_new(8, 0);
so_method(so, tesla, NV50TCL_VIEWPORT_UNK1(0), 3);
so_data (so, fui(nv50->viewport.translate[0]));
so_data (so, fui(nv50->viewport.translate[1]));
so_data (so, fui(nv50->viewport.translate[2]));
so_method(so, tesla, NV50TCL_VIEWPORT_UNK0(0), 3);
so_data (so, fui(nv50->viewport.scale[0]));
so_data (so, fui(-nv50->viewport.scale[1]));
so_data (so, fui(nv50->viewport.scale[2]));
unsigned bypass;
if (!nv50->rasterizer->pipe.bypass_clipping)
bypass = 0;
else
bypass = 1;
if (nv50->state.viewport &&
(bypass || !(nv50->dirty & NV50_NEW_VIEWPORT)) &&
nv50->state.viewport_bypass == bypass)
goto viewport_uptodate;
nv50->state.viewport_bypass = bypass;
so = so_new(12, 0);
if (!bypass) {
so_method(so, tesla, NV50TCL_VIEWPORT_UNK1(0), 3);
so_data (so, fui(nv50->viewport.translate[0]));
so_data (so, fui(nv50->viewport.translate[1]));
so_data (so, fui(nv50->viewport.translate[2]));
so_method(so, tesla, NV50TCL_VIEWPORT_UNK0(0), 3);
so_data (so, fui(nv50->viewport.scale[0]));
so_data (so, fui(-nv50->viewport.scale[1]));
so_data (so, fui(nv50->viewport.scale[2]));
so_method(so, tesla, 0x192c, 1);
so_data (so, 1);
so_method(so, tesla, 0x0f90, 1);
so_data (so, 0);
} else {
so_method(so, tesla, 0x192c, 1);
so_data (so, 0);
so_method(so, tesla, 0x0f90, 1);
so_data (so, 1);
}
so_ref(so, &nv50->state.viewport);
}
viewport_uptodate:
if (nv50->dirty & NV50_NEW_SAMPLER) {
int i;