nv50_context.h revision 32cd1a0345eaf1f4da8a60a4ac2145ff51383d59
1#ifndef __NV50_CONTEXT_H__
2#define __NV50_CONTEXT_H__
3
4#include "pipe/p_context.h"
5#include "pipe/p_defines.h"
6#include "pipe/p_state.h"
7#include "pipe/p_compiler.h"
8
9#include "util/u_memory.h"
10#include "util/u_math.h"
11
12#include "draw/draw_vertex.h"
13
14#include "nouveau/nouveau_winsys.h"
15#include "nouveau/nouveau_gldefs.h"
16#include "nouveau/nouveau_stateobj.h"
17
18#include "nv50_screen.h"
19#include "nv50_program.h"
20
21#define NOUVEAU_ERR(fmt, args...) \
22	fprintf(stderr, "%s:%d -  "fmt, __func__, __LINE__, ##args);
23#define NOUVEAU_MSG(fmt, args...) \
24	fprintf(stderr, "nouveau: "fmt, ##args);
25
26/* Constant buffer assignment */
27#define NV50_CB_PMISC		0
28#define NV50_CB_PVP		1
29#define NV50_CB_PFP		2
30#define NV50_CB_PGP		3
31#define NV50_CB_TIC		4
32#define NV50_CB_TSC		5
33#define NV50_CB_PUPLOAD         6
34
35#define NV50_NEW_BLEND		(1 << 0)
36#define NV50_NEW_ZSA		(1 << 1)
37#define NV50_NEW_BLEND_COLOUR	(1 << 2)
38#define NV50_NEW_STIPPLE	(1 << 3)
39#define NV50_NEW_SCISSOR	(1 << 4)
40#define NV50_NEW_VIEWPORT	(1 << 5)
41#define NV50_NEW_RASTERIZER	(1 << 6)
42#define NV50_NEW_FRAMEBUFFER	(1 << 7)
43#define NV50_NEW_VERTPROG	(1 << 8)
44#define NV50_NEW_VERTPROG_CB	(1 << 9)
45#define NV50_NEW_FRAGPROG	(1 << 10)
46#define NV50_NEW_FRAGPROG_CB	(1 << 11)
47#define NV50_NEW_ARRAYS		(1 << 12)
48#define NV50_NEW_SAMPLER	(1 << 13)
49#define NV50_NEW_TEXTURE	(1 << 14)
50
51struct nv50_blend_stateobj {
52	struct pipe_blend_state pipe;
53	struct nouveau_stateobj *so;
54};
55
56struct nv50_zsa_stateobj {
57	struct pipe_depth_stencil_alpha_state pipe;
58	struct nouveau_stateobj *so;
59};
60
61struct nv50_rasterizer_stateobj {
62	struct pipe_rasterizer_state pipe;
63	struct nouveau_stateobj *so;
64};
65
66struct nv50_miptree_level {
67	struct pipe_buffer **image;
68	int *image_offset;
69	unsigned image_dirty_cpu[512/32];
70	unsigned image_dirty_gpu[512/32];
71};
72
73struct nv50_miptree {
74	struct pipe_texture base;
75	struct pipe_buffer *buffer;
76
77	struct nv50_miptree_level level[PIPE_MAX_TEXTURE_LEVELS];
78	int image_nr;
79	int total_size;
80};
81
82static INLINE struct nv50_miptree *
83nv50_miptree(struct pipe_texture *pt)
84{
85	return (struct nv50_miptree *)pt;
86}
87
88struct nv50_surface {
89	struct pipe_surface base;
90};
91
92static INLINE struct nv50_surface *
93nv50_surface(struct pipe_surface *pt)
94{
95	return (struct nv50_surface *)pt;
96}
97
98static INLINE struct pipe_buffer *
99nv50_surface_buffer(struct pipe_surface *surface)
100{
101	struct nv50_miptree *mt = (struct nv50_miptree *)surface->texture;
102	return mt->buffer;
103}
104
105struct nv50_state {
106	unsigned dirty;
107
108	struct nouveau_stateobj *fb;
109	struct nouveau_stateobj *blend;
110	struct nouveau_stateobj *blend_colour;
111	struct nouveau_stateobj *zsa;
112	struct nouveau_stateobj *rast;
113	struct nouveau_stateobj *stipple;
114	struct nouveau_stateobj *scissor;
115	unsigned scissor_enabled;
116	struct nouveau_stateobj *viewport;
117	unsigned viewport_bypass;
118	struct nouveau_stateobj *tsc_upload;
119	struct nouveau_stateobj *tic_upload;
120	struct nouveau_stateobj *vertprog;
121	struct nouveau_stateobj *fragprog;
122	struct nouveau_stateobj *vtxfmt;
123	struct nouveau_stateobj *vtxbuf;
124};
125
126struct nv50_context {
127	struct pipe_context pipe;
128
129	struct nv50_screen *screen;
130	unsigned pctx_id;
131
132	struct draw_context *draw;
133
134	struct nv50_state state;
135
136	unsigned dirty;
137	struct nv50_blend_stateobj *blend;
138	struct nv50_zsa_stateobj *zsa;
139	struct nv50_rasterizer_stateobj *rasterizer;
140	struct pipe_blend_color blend_colour;
141	struct pipe_poly_stipple stipple;
142	struct pipe_scissor_state scissor;
143	struct pipe_viewport_state viewport;
144	struct pipe_framebuffer_state framebuffer;
145	struct nv50_program *vertprog;
146	struct nv50_program *fragprog;
147	struct pipe_buffer *constbuf[PIPE_SHADER_TYPES];
148	struct pipe_vertex_buffer vtxbuf[PIPE_MAX_ATTRIBS];
149	unsigned vtxbuf_nr;
150	struct pipe_vertex_element vtxelt[PIPE_MAX_ATTRIBS];
151	unsigned vtxelt_nr;
152	unsigned *sampler[PIPE_MAX_SAMPLERS];
153	unsigned sampler_nr;
154	struct nv50_miptree *miptree[PIPE_MAX_SAMPLERS];
155	unsigned miptree_nr;
156};
157
158static INLINE struct nv50_context *
159nv50_context(struct pipe_context *pipe)
160{
161	return (struct nv50_context *)pipe;
162}
163
164extern void nv50_init_surface_functions(struct nv50_context *nv50);
165extern void nv50_init_state_functions(struct nv50_context *nv50);
166extern void nv50_init_query_functions(struct nv50_context *nv50);
167
168extern void nv50_screen_init_miptree_functions(struct pipe_screen *pscreen);
169
170extern int
171nv50_surface_do_copy(struct nv50_screen *screen, struct pipe_surface *dst,
172		     int dx, int dy, struct pipe_surface *src, int sx, int sy,
173		     int w, int h);
174
175/* nv50_draw.c */
176extern struct draw_stage *nv50_draw_render_stage(struct nv50_context *nv50);
177
178/* nv50_vbo.c */
179extern boolean nv50_draw_arrays(struct pipe_context *, unsigned mode,
180				unsigned start, unsigned count);
181extern boolean nv50_draw_elements(struct pipe_context *pipe,
182				  struct pipe_buffer *indexBuffer,
183				  unsigned indexSize,
184				  unsigned mode, unsigned start,
185				  unsigned count);
186extern void nv50_vbo_validate(struct nv50_context *nv50);
187
188/* nv50_clear.c */
189extern void nv50_clear(struct pipe_context *pipe, struct pipe_surface *ps,
190		       unsigned clearValue);
191
192/* nv50_program.c */
193extern void nv50_vertprog_validate(struct nv50_context *nv50);
194extern void nv50_fragprog_validate(struct nv50_context *nv50);
195extern void nv50_program_destroy(struct nv50_context *nv50, struct nv50_program *p);
196
197/* nv50_state_validate.c */
198extern boolean nv50_state_validate(struct nv50_context *nv50);
199
200/* nv50_tex.c */
201extern void nv50_tex_validate(struct nv50_context *);
202
203/* nv50_miptree.c */
204extern void nv50_miptree_sync(struct pipe_screen *, struct nv50_miptree *,
205			      unsigned level, unsigned image);
206
207#endif
208