nv30_context.h revision c7086277546d065eb94ba8dbeca1620605f167ea
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
79struct nv30_rasterizer_state {
80	struct pipe_rasterizer_state pipe;
81	struct nouveau_stateobj *so;
82};
83
84struct nv30_zsa_state {
85	struct pipe_depth_stencil_alpha_state pipe;
86	struct nouveau_stateobj *so;
87};
88
89struct nv30_blend_state {
90	struct pipe_blend_state pipe;
91	struct nouveau_stateobj *so;
92};
93
94
95struct nv30_state {
96	unsigned scissor_enabled;
97	unsigned stipple_enabled;
98	unsigned viewport_bypass;
99	unsigned fp_samplers;
100
101	uint64_t dirty;
102	struct nouveau_stateobj *hw[NV30_STATE_MAX];
103};
104
105struct nv30_context {
106	struct pipe_context pipe;
107
108	struct nouveau_winsys *nvws;
109	struct nv30_screen *screen;
110	unsigned pctx_id;
111
112	struct draw_context *draw;
113
114	/* HW state derived from pipe states */
115	struct nv30_state state;
116
117	struct nv30_sampler_state *tex_sampler[PIPE_MAX_SAMPLERS];
118	struct nv30_miptree *tex_miptree[PIPE_MAX_SAMPLERS];
119	unsigned dirty_samplers;
120	unsigned fp_samplers;
121	unsigned vp_samplers;
122
123	/* Context state */
124	unsigned dirty;
125	struct pipe_scissor_state scissor;
126	unsigned stipple[32];
127	struct pipe_buffer *constbuf[PIPE_SHADER_TYPES];
128	unsigned constbuf_nr[PIPE_SHADER_TYPES];
129	struct nv30_rasterizer_state *rasterizer;
130	struct nv30_zsa_state *zsa;
131	struct nv30_blend_state *blend;
132	struct pipe_blend_color blend_colour;
133	struct pipe_viewport_state viewport;
134	struct pipe_framebuffer_state framebuffer;
135	unsigned nr_samplers;
136	unsigned nr_textures;
137
138	uint32_t rt_enable;
139	struct pipe_buffer *rt[2];
140	struct pipe_buffer *zeta;
141
142	/*struct {
143		struct pipe_buffer *buffer;
144		uint32_t format;
145	} tex[16];*/
146
147	unsigned vb_enable;
148	struct {
149		struct pipe_buffer *buffer;
150		unsigned delta;
151	} vb[16];
152
153	struct {
154		struct nv30_vertex_program *active;
155		struct nv30_vertex_program *current;
156	} vertprog;
157
158	struct {
159		struct nv30_fragment_program *active;
160		struct nv30_fragment_program *current;
161	} fragprog;
162
163	struct pipe_vertex_buffer  vtxbuf[PIPE_MAX_ATTRIBS];
164	struct pipe_vertex_element vtxelt[PIPE_MAX_ATTRIBS];
165};
166
167static INLINE struct nv30_context *
168nv30_context(struct pipe_context *pipe)
169{
170	return (struct nv30_context *)pipe;
171}
172
173struct nv30_state_entry {
174	boolean (*validate)(struct nv30_context *nv30);
175	struct {
176		unsigned pipe;
177		unsigned hw;
178	} dirty;
179};
180
181extern void nv30_init_state_functions(struct nv30_context *nv30);
182extern void nv30_init_surface_functions(struct nv30_context *nv30);
183extern void nv30_init_query_functions(struct nv30_context *nv30);
184
185extern void nv30_screen_init_miptree_functions(struct pipe_screen *pscreen);
186
187/* nv30_draw.c */
188extern struct draw_stage *nv30_draw_render_stage(struct nv30_context *nv30);
189
190/* nv30_vertprog.c */
191extern void nv30_vertprog_translate(struct nv30_context *,
192				    struct nv30_vertex_program *);
193extern void nv30_vertprog_bind(struct nv30_context *,
194			       struct nv30_vertex_program *);
195extern void nv30_vertprog_destroy(struct nv30_context *,
196				  struct nv30_vertex_program *);
197
198/* nv30_fragprog.c */
199extern void nv30_fragprog_translate(struct nv30_context *,
200				    struct nv30_fragment_program *);
201extern void nv30_fragprog_bind(struct nv30_context *,
202			       struct nv30_fragment_program *);
203extern void nv30_fragprog_destroy(struct nv30_context *,
204				  struct nv30_fragment_program *);
205
206/* nv30_fragtex.c */
207extern void nv30_fragtex_bind(struct nv30_context *);
208
209/* nv30_state.c and friends */
210extern boolean nv30_state_validate(struct nv30_context *nv30);
211extern void nv30_emit_hw_state(struct nv30_context *nv30);
212extern void nv30_state_tex_update(struct nv30_context *nv30);
213extern struct nv30_state_entry nv30_state_rasterizer;
214extern struct nv30_state_entry nv30_state_scissor;
215extern struct nv30_state_entry nv30_state_stipple;
216extern struct nv30_state_entry nv30_state_blend;
217extern struct nv30_state_entry nv30_state_blend_colour;
218extern struct nv30_state_entry nv30_state_zsa;
219extern struct nv30_state_entry nv30_state_viewport;
220extern struct nv30_state_entry nv30_state_framebuffer;
221extern struct nv30_state_entry nv30_state_fragtex;
222
223/* nv30_vbo.c */
224extern boolean nv30_draw_arrays(struct pipe_context *, unsigned mode,
225				unsigned start, unsigned count);
226extern boolean nv30_draw_elements(struct pipe_context *pipe,
227				  struct pipe_buffer *indexBuffer,
228				  unsigned indexSize,
229				  unsigned mode, unsigned start,
230				  unsigned count);
231
232/* nv30_clear.c */
233extern void nv30_clear(struct pipe_context *pipe, struct pipe_surface *ps,
234		       unsigned clearValue);
235
236#endif
237