Merge remote branch 'upstream/gallium-0.1' into nouveau-gallium-0.1
[mesa.git] / src / gallium / drivers / nv50 / nv50_state_validate.c
1 #include "nv50_context.h"
2 #include "nouveau/nouveau_stateobj.h"
3
4 static void
5 nv50_state_validate_fb(struct nv50_context *nv50)
6 {
7 struct nouveau_grobj *tesla = nv50->screen->tesla;
8 struct nouveau_stateobj *so = so_new(128, 18);
9 struct pipe_framebuffer_state *fb = &nv50->framebuffer;
10 unsigned i, w, h, gw = 0;
11
12 for (i = 0; i < fb->num_cbufs; i++) {
13 if (!gw) {
14 w = fb->cbufs[i]->width;
15 h = fb->cbufs[i]->height;
16 gw = 1;
17 } else {
18 assert(w != fb->cbufs[i]->width);
19 assert(h != fb->cbufs[i]->height);
20 }
21
22 so_method(so, tesla, NV50TCL_RT_HORIZ(i), 2);
23 so_data (so, fb->cbufs[i]->width);
24 so_data (so, fb->cbufs[i]->height);
25
26 so_method(so, tesla, NV50TCL_RT_ADDRESS_HIGH(i), 5);
27 so_reloc (so, fb->cbufs[i]->buffer, fb->cbufs[i]->offset,
28 NOUVEAU_BO_VRAM | NOUVEAU_BO_HIGH, 0, 0);
29 so_reloc (so, fb->cbufs[i]->buffer, fb->cbufs[i]->offset,
30 NOUVEAU_BO_VRAM | NOUVEAU_BO_LOW, 0, 0);
31 switch (fb->cbufs[i]->format) {
32 case PIPE_FORMAT_A8R8G8B8_UNORM:
33 so_data(so, 0xcf);
34 break;
35 case PIPE_FORMAT_R5G6B5_UNORM:
36 so_data(so, 0xe8);
37 break;
38 default:
39 {
40 char fmt[128];
41 pf_sprint_name(fmt, fb->cbufs[i]->format);
42 NOUVEAU_ERR("AIIII unknown format %s\n", fmt);
43 }
44 so_data(so, 0xe6);
45 break;
46 }
47 so_data(so, 0x00000040);
48 so_data(so, 0x00000000);
49 }
50
51 if (fb->zsbuf) {
52 if (!gw) {
53 w = fb->zsbuf->width;
54 h = fb->zsbuf->height;
55 gw = 1;
56 } else {
57 assert(w != fb->zsbuf->width);
58 assert(h != fb->zsbuf->height);
59 }
60
61 so_method(so, tesla, NV50TCL_RT_ADDRESS_HIGH(i), 5);
62 so_reloc (so, fb->zsbuf->buffer, fb->zsbuf->offset,
63 NOUVEAU_BO_VRAM | NOUVEAU_BO_HIGH, 0, 0);
64 so_reloc (so, fb->zsbuf->buffer, fb->zsbuf->offset,
65 NOUVEAU_BO_VRAM | NOUVEAU_BO_LOW, 0, 0);
66 switch (fb->zsbuf->format) {
67 case PIPE_FORMAT_Z24S8_UNORM:
68 so_data(so, 0x16);
69 break;
70 default:
71 {
72 char fmt[128];
73 pf_sprint_name(fmt, fb->zsbuf->format);
74 NOUVEAU_ERR("AIIII unknown format %s\n", fmt);
75 }
76 so_data(so, 0x16);
77 break;
78 }
79 so_data(so, 0x00000040);
80 so_data(so, 0x00000000);
81 }
82
83 so_method(so, tesla, NV50TCL_VIEWPORT_HORIZ, 2);
84 so_data (so, w << 16);
85 so_data (so, h << 16);
86 so_method(so, tesla, 0xff0, 2);
87 so_data (so, w << 16);
88 so_data (so, h << 16);
89
90 so_emit(nv50->screen->nvws, so);
91 so_ref(NULL, &so);
92 }
93
94 boolean
95 nv50_state_validate(struct nv50_context *nv50)
96 {
97 struct nouveau_winsys *nvws = nv50->screen->nvws;
98 struct nouveau_grobj *tesla = nv50->screen->tesla;
99 struct nouveau_stateobj *so;
100 unsigned i;
101
102 if (nv50->dirty & NV50_NEW_FRAMEBUFFER)
103 nv50_state_validate_fb(nv50);
104
105 if (nv50->dirty & NV50_NEW_BLEND)
106 so_emit(nvws, nv50->blend->so);
107
108 if (nv50->dirty & NV50_NEW_ZSA)
109 so_emit(nvws, nv50->zsa->so);
110
111 if (nv50->dirty & NV50_NEW_RASTERIZER)
112 so_emit(nvws, nv50->rasterizer->so);
113
114 if (nv50->dirty & NV50_NEW_BLEND_COLOUR) {
115 so = so_new(5, 0);
116 so_method(so, tesla, NV50TCL_BLEND_COLOR(0), 8);
117 so_data (so, fui(nv50->blend_colour.color[3]));
118 so_data (so, fui(nv50->blend_colour.color[0]));
119 so_data (so, fui(nv50->blend_colour.color[1]));
120 so_data (so, fui(nv50->blend_colour.color[2]));
121 so_emit(nvws, so);
122 so_ref(NULL, &so);
123 }
124
125 if (nv50->dirty & NV50_NEW_STIPPLE) {
126 so = so_new(33, 0);
127 so_method(so, tesla, NV50TCL_POLYGON_STIPPLE_PATTERN(0), 32);
128 for (i = 0; i < 32; i++)
129 so_data(so, nv50->stipple.stipple[i]);
130 so_emit(nvws, so);
131 so_ref(NULL, &so);
132 }
133
134 if (nv50->dirty & NV50_NEW_SCISSOR) {
135 so = so_new(3, 0);
136 so_method(so, tesla, NV50TCL_SCISSOR_HORIZ, 2);
137 so_data (so, (nv50->scissor.maxx << 16) |
138 nv50->scissor.minx);
139 so_data (so, (nv50->scissor.maxy << 16) |
140 nv50->scissor.miny);
141 so_emit(nvws, so);
142 so_ref(NULL, &so);
143 }
144
145 if (nv50->dirty & NV50_NEW_VIEWPORT) {
146 so = so_new(8, 0);
147 so_method(so, tesla, NV50TCL_VIEWPORT_UNK0(0), 3);
148 so_data (so, fui(nv50->viewport.translate[0]));
149 so_data (so, fui(nv50->viewport.translate[1]));
150 so_data (so, fui(nv50->viewport.translate[2]));
151 so_method(so, tesla, NV50TCL_VIEWPORT_UNK1(0), 3);
152 so_data (so, fui(nv50->viewport.scale[0]));
153 so_data (so, fui(nv50->viewport.scale[1]));
154 so_data (so, fui(nv50->viewport.scale[2]));
155 so_emit(nvws, so);
156 so_ref(NULL, &so);
157 }
158
159 nv50->dirty = 0;
160 return TRUE;
161 }
162