1 #include "nv50_context.h"
2 #include "nouveau/nouveau_stateobj.h"
5 nv50_state_validate_fb(struct nv50_context
*nv50
)
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;
12 for (i
= 0; i
< fb
->num_cbufs
; i
++) {
14 w
= fb
->cbufs
[i
]->width
;
15 h
= fb
->cbufs
[i
]->height
;
18 assert(w
!= fb
->cbufs
[i
]->width
);
19 assert(h
!= fb
->cbufs
[i
]->height
);
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
);
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
:
35 case PIPE_FORMAT_R5G6B5_UNORM
:
41 pf_sprint_name(fmt
, fb
->cbufs
[i
]->format
);
42 NOUVEAU_ERR("AIIII unknown format %s\n", fmt
);
47 so_data(so
, 0x00000040);
48 so_data(so
, 0x00000000);
54 h
= fb
->zsbuf
->height
;
57 assert(w
!= fb
->zsbuf
->width
);
58 assert(h
!= fb
->zsbuf
->height
);
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
:
73 pf_sprint_name(fmt
, fb
->zsbuf
->format
);
74 NOUVEAU_ERR("AIIII unknown format %s\n", fmt
);
79 so_data(so
, 0x00000040);
80 so_data(so
, 0x00000000);
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);
90 so_emit(nv50
->screen
->nvws
, so
);
95 nv50_state_validate(struct nv50_context
*nv50
)
97 struct nouveau_winsys
*nvws
= nv50
->screen
->nvws
;
98 struct nouveau_grobj
*tesla
= nv50
->screen
->tesla
;
99 struct nouveau_stateobj
*so
;
102 if (nv50
->dirty
& NV50_NEW_FRAMEBUFFER
)
103 nv50_state_validate_fb(nv50
);
105 if (nv50
->dirty
& NV50_NEW_BLEND
)
106 so_emit(nvws
, nv50
->blend
->so
);
108 if (nv50
->dirty
& NV50_NEW_ZSA
)
109 so_emit(nvws
, nv50
->zsa
->so
);
111 if (nv50
->dirty
& NV50_NEW_RASTERIZER
)
112 so_emit(nvws
, nv50
->rasterizer
->so
);
114 if (nv50
->dirty
& NV50_NEW_BLEND_COLOUR
) {
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]));
125 if (nv50
->dirty
& NV50_NEW_STIPPLE
) {
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
]);
134 if (nv50
->dirty
& NV50_NEW_SCISSOR
) {
136 so_method(so
, tesla
, NV50TCL_SCISSOR_HORIZ
, 2);
137 so_data (so
, (nv50
->scissor
.maxx
<< 16) |
139 so_data (so
, (nv50
->scissor
.maxy
<< 16) |
145 if (nv50
->dirty
& NV50_NEW_VIEWPORT
) {
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]));