nv30_context.h revision 52cf7a6c1ccc987859834b640a5ec0a62f84134a
1#ifndef __NV30_CONTEXT_H__
2#define __NV30_CONTEXT_H__
3
4#include "pipe/p_context.h"
5#include "pipe/p_defines.h"
6#include "pipe/p_state.h"
7
8#include "draw/draw_vertex.h"
9
10#include "nouveau/nouveau_winsys.h"
11#include "nouveau/nouveau_gldefs.h"
12
13#define NOUVEAU_PUSH_CONTEXT(ctx)                                              \
14	struct nv30_screen *ctx = nv30->screen
15#include "nouveau/nouveau_push.h"
16#include "nouveau/nouveau_stateobj.h"
17
18#include "nv30_state.h"
19
20#define NOUVEAU_ERR(fmt, args...) \
21	fprintf(stderr, "%s:%d -  "fmt, __func__, __LINE__, ##args);
22#define NOUVEAU_MSG(fmt, args...) \
23	fprintf(stderr, "nouveau: "fmt, ##args);
24
25enum nv30_state_index {
26	NV30_STATE_FB = 0,
27	NV30_STATE_VIEWPORT = 1,
28	NV30_STATE_BLEND = 2,
29	NV30_STATE_RAST = 3,
30	NV30_STATE_ZSA = 4,
31	NV30_STATE_BCOL = 5,
32	NV30_STATE_CLIP = 6,
33	NV30_STATE_SCISSOR = 7,
34	NV30_STATE_STIPPLE = 8,
35	NV30_STATE_FRAGPROG = 9,
36	NV30_STATE_VERTPROG = 10,
37	NV30_STATE_FRAGTEX0 = 11,
38	NV30_STATE_FRAGTEX1 = 12,
39	NV30_STATE_FRAGTEX2 = 13,
40	NV30_STATE_FRAGTEX3 = 14,
41	NV30_STATE_FRAGTEX4 = 15,
42	NV30_STATE_FRAGTEX5 = 16,
43	NV30_STATE_FRAGTEX6 = 17,
44	NV30_STATE_FRAGTEX7 = 18,
45	NV30_STATE_FRAGTEX8 = 19,
46	NV30_STATE_FRAGTEX9 = 20,
47	NV30_STATE_FRAGTEX10 = 21,
48	NV30_STATE_FRAGTEX11 = 22,
49	NV30_STATE_FRAGTEX12 = 23,
50	NV30_STATE_FRAGTEX13 = 24,
51	NV30_STATE_FRAGTEX14 = 25,
52	NV30_STATE_FRAGTEX15 = 26,
53	NV30_STATE_VERTTEX0 = 27,
54	NV30_STATE_VERTTEX1 = 28,
55	NV30_STATE_VERTTEX2 = 29,
56	NV30_STATE_VERTTEX3 = 30,
57	NV30_STATE_VTXBUF = 31,
58	NV30_STATE_VTXFMT = 32,
59	NV30_STATE_VTXATTR = 33,
60	NV30_STATE_MAX = 34
61};
62
63#include "nv30_screen.h"
64
65#define NV30_NEW_BLEND		(1 <<  0)
66#define NV30_NEW_RAST		(1 <<  1)
67#define NV30_NEW_ZSA		(1 <<  2)
68#define NV30_NEW_SAMPLER	(1 <<  3)
69#define NV30_NEW_FB		(1 <<  4)
70#define NV30_NEW_STIPPLE	(1 <<  5)
71#define NV30_NEW_SCISSOR	(1 <<  6)
72#define NV30_NEW_VIEWPORT	(1 <<  7)
73#define NV30_NEW_BCOL		(1 <<  8)
74#define NV30_NEW_VERTPROG	(1 <<  9)
75#define NV30_NEW_FRAGPROG	(1 << 10)
76#define NV30_NEW_ARRAYS		(1 << 11)
77#define NV30_NEW_UCP		(1 << 12)
78
79/* TODO: rename when removing the old state emitter */
80struct nv30_rasterizer_state_new {
81	struct pipe_rasterizer_state pipe;
82	struct nouveau_stateobj *so;
83};
84
85struct nv30_zsa_state {
86	struct pipe_depth_stencil_alpha_state pipe;
87	struct nouveau_stateobj *so;
88};
89
90/* TODO: rename when removing the old state emitter */
91struct nv30_blend_state_new {
92	struct pipe_blend_state pipe;
93	struct nouveau_stateobj *so;
94};
95
96
97struct nv30_state {
98	unsigned scissor_enabled;
99	unsigned stipple_enabled;
100	unsigned viewport_bypass;
101
102	uint64_t dirty;
103	struct nouveau_stateobj *hw[NV30_STATE_MAX];
104};
105
106struct nv30_context {
107	struct pipe_context pipe;
108
109	struct nouveau_winsys *nvws;
110	struct nv30_screen *screen;
111	unsigned pctx_id;
112
113	struct draw_context *draw;
114
115	/* HW state derived from pipe states */
116	struct nv30_state state;
117	struct pipe_scissor_state scissor;
118
119	uint32_t dirty;
120
121	struct nv30_sampler_state *tex_sampler[PIPE_MAX_SAMPLERS];
122	struct nv30_miptree *tex_miptree[PIPE_MAX_SAMPLERS];
123	unsigned dirty_samplers;
124	unsigned fp_samplers;
125	unsigned vp_samplers;
126
127	/* Context state */
128	struct nv30_blend_state_new *blend;
129	struct pipe_blend_color blend_colour;
130	struct pipe_viewport_state viewport;
131	struct pipe_framebuffer_state framebuffer;
132	struct nv30_rasterizer_state_new *rasterizer;
133	struct nv30_zsa_state *zsa;
134	unsigned stipple[32];
135
136	uint32_t rt_enable;
137	struct pipe_buffer *rt[2];
138	struct pipe_buffer *zeta;
139
140	/*struct {
141		struct pipe_buffer *buffer;
142		uint32_t format;
143	} tex[16];*/
144
145	unsigned vb_enable;
146	struct {
147		struct pipe_buffer *buffer;
148		unsigned delta;
149	} vb[16];
150
151	struct {
152		struct nv30_vertex_program *active;
153
154		struct nv30_vertex_program *current;
155		struct pipe_buffer *constant_buf;
156	} vertprog;
157
158	struct {
159		struct nv30_fragment_program *active;
160
161		struct nv30_fragment_program *current;
162		struct pipe_buffer *constant_buf;
163	} fragprog;
164
165	struct pipe_vertex_buffer  vtxbuf[PIPE_MAX_ATTRIBS];
166	struct pipe_vertex_element vtxelt[PIPE_MAX_ATTRIBS];
167};
168
169static INLINE struct nv30_context *
170nv30_context(struct pipe_context *pipe)
171{
172	return (struct nv30_context *)pipe;
173}
174
175struct nv30_state_entry {
176	boolean (*validate)(struct nv30_context *nv30);
177	struct {
178		unsigned pipe;
179		unsigned hw;
180	} dirty;
181};
182
183extern void nv30_init_state_functions(struct nv30_context *nv30);
184extern void nv30_init_surface_functions(struct nv30_context *nv30);
185extern void nv30_init_query_functions(struct nv30_context *nv30);
186
187extern void nv30_screen_init_miptree_functions(struct pipe_screen *pscreen);
188
189/* nv30_draw.c */
190extern struct draw_stage *nv30_draw_render_stage(struct nv30_context *nv30);
191
192/* nv30_vertprog.c */
193extern void nv30_vertprog_translate(struct nv30_context *,
194				    struct nv30_vertex_program *);
195extern void nv30_vertprog_bind(struct nv30_context *,
196			       struct nv30_vertex_program *);
197extern void nv30_vertprog_destroy(struct nv30_context *,
198				  struct nv30_vertex_program *);
199
200/* nv30_fragprog.c */
201extern void nv30_fragprog_translate(struct nv30_context *,
202				    struct nv30_fragment_program *);
203extern void nv30_fragprog_bind(struct nv30_context *,
204			       struct nv30_fragment_program *);
205extern void nv30_fragprog_destroy(struct nv30_context *,
206				  struct nv30_fragment_program *);
207
208/* nv30_fragtex.c */
209extern void nv30_fragtex_bind(struct nv30_context *);
210
211/* nv30_state.c and friends */
212extern boolean nv30_state_validate(struct nv30_context *nv30);
213extern void nv30_emit_hw_state(struct nv30_context *nv30);
214extern void nv30_state_tex_update(struct nv30_context *nv30);
215extern struct nv30_state_entry nv30_state_blend_colour;
216extern struct nv30_state_entry nv30_state_framebuffer;
217
218/* nv30_vbo.c */
219extern boolean nv30_draw_arrays(struct pipe_context *, unsigned mode,
220				unsigned start, unsigned count);
221extern boolean nv30_draw_elements(struct pipe_context *pipe,
222				  struct pipe_buffer *indexBuffer,
223				  unsigned indexSize,
224				  unsigned mode, unsigned start,
225				  unsigned count);
226
227/* nv30_clear.c */
228extern void nv30_clear(struct pipe_context *pipe, struct pipe_surface *ps,
229		       unsigned clearValue);
230
231#endif
232