aboutsummaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/nv50/nv50_state_validate.c
diff options
context:
space:
mode:
authorBen Skeggs <[email protected]>2008-03-12 03:54:53 +1100
committerBen Skeggs <[email protected]>2008-03-12 03:54:53 +1100
commit2fee5f76483feb301546b24c26eea699732ffb57 (patch)
tree327bfe8dc976b2af11355f1c36cc2100f69d676d /src/gallium/drivers/nv50/nv50_state_validate.c
parent06bd7d78b979df66915b161157f2b6b1c09ad285 (diff)
nv50: scissor/viewport/blend colour/stipple
Diffstat (limited to 'src/gallium/drivers/nv50/nv50_state_validate.c')
-rw-r--r--src/gallium/drivers/nv50/nv50_state_validate.c49
1 files changed, 49 insertions, 0 deletions
diff --git a/src/gallium/drivers/nv50/nv50_state_validate.c b/src/gallium/drivers/nv50/nv50_state_validate.c
index 786987c76ad..8920b6f49b0 100644
--- a/src/gallium/drivers/nv50/nv50_state_validate.c
+++ b/src/gallium/drivers/nv50/nv50_state_validate.c
@@ -5,12 +5,61 @@ boolean
nv50_state_validate(struct nv50_context *nv50)
{
struct nouveau_winsys *nvws = nv50->screen->nvws;
+ struct nouveau_grobj *tesla = nv50->screen->tesla;
+ struct nouveau_stateobj *so;
+ unsigned i;
if (nv50->dirty & NV50_NEW_BLEND)
so_emit(nvws, nv50->blend->so);
+
if (nv50->dirty & NV50_NEW_ZSA)
so_emit(nvws, nv50->zsa->so);
+ if (nv50->dirty & NV50_NEW_BLEND_COLOUR) {
+ so = so_new(5, 0);
+ so_method(so, tesla, NV50TCL_BLEND_COLOR(0), 8);
+ so_data (so, fui(nv50->blend_colour.color[3]));
+ so_data (so, fui(nv50->blend_colour.color[0]));
+ so_data (so, fui(nv50->blend_colour.color[1]));
+ so_data (so, fui(nv50->blend_colour.color[2]));
+ so_emit(nvws, so);
+ so_ref(NULL, &so);
+ }
+
+ if (nv50->dirty & NV50_NEW_STIPPLE) {
+ so = so_new(33, 0);
+ so_method(so, tesla, NV50TCL_POLYGON_STIPPLE_PATTERN(0), 32);
+ for (i = 0; i < 32; i++)
+ so_data(so, nv50->stipple.stipple[i]);
+ so_emit(nvws, so);
+ so_ref(NULL, &so);
+ }
+
+ if (nv50->dirty & NV50_NEW_SCISSOR) {
+ so = so_new(3, 0);
+ so_method(so, tesla, NV50TCL_SCISSOR_HORIZ, 2);
+ so_data (so, (nv50->scissor.maxx << 16) |
+ nv50->scissor.minx);
+ so_data (so, (nv50->scissor.maxy << 16) |
+ nv50->scissor.miny);
+ so_emit(nvws, so);
+ so_ref(NULL, &so);
+ }
+
+ if (nv50->dirty & NV50_NEW_VIEWPORT) {
+ so = so_new(8, 0);
+ so_method(so, tesla, NV50TCL_VIEWPORT_UNK0(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_UNK1(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_emit(nvws, so);
+ so_ref(NULL, &so);
+ }
+
nv50->dirty = 0;
return TRUE;
}