Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
4358 | Serge | 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 | |||
8 | #include "util/u_memory.h" |
||
9 | #include "util/u_math.h" |
||
10 | #include "util/u_inlines.h" |
||
11 | #include "util/u_dynarray.h" |
||
12 | |||
13 | #ifdef NV50_WITH_DRAW_MODULE |
||
14 | #include "draw/draw_vertex.h" |
||
15 | #endif |
||
16 | |||
17 | #include "nv50_debug.h" |
||
18 | #include "nv50_winsys.h" |
||
19 | #include "nv50_stateobj.h" |
||
20 | #include "nv50_screen.h" |
||
21 | #include "nv50_program.h" |
||
22 | #include "nv50_resource.h" |
||
23 | #include "nv50_transfer.h" |
||
24 | |||
25 | #include "nouveau/nouveau_context.h" |
||
26 | #include "nouveau/nv_object.xml.h" |
||
27 | #include "nouveau/nv_m2mf.xml.h" |
||
28 | #include "nv50_3ddefs.xml.h" |
||
29 | #include "nv50_3d.xml.h" |
||
30 | #include "nv50_2d.xml.h" |
||
31 | |||
32 | #define NV50_NEW_BLEND (1 << 0) |
||
33 | #define NV50_NEW_RASTERIZER (1 << 1) |
||
34 | #define NV50_NEW_ZSA (1 << 2) |
||
35 | #define NV50_NEW_VERTPROG (1 << 3) |
||
36 | #define NV50_NEW_GMTYPROG (1 << 6) |
||
37 | #define NV50_NEW_FRAGPROG (1 << 7) |
||
38 | #define NV50_NEW_BLEND_COLOUR (1 << 8) |
||
39 | #define NV50_NEW_STENCIL_REF (1 << 9) |
||
40 | #define NV50_NEW_CLIP (1 << 10) |
||
41 | #define NV50_NEW_SAMPLE_MASK (1 << 11) |
||
42 | #define NV50_NEW_FRAMEBUFFER (1 << 12) |
||
43 | #define NV50_NEW_STIPPLE (1 << 13) |
||
44 | #define NV50_NEW_SCISSOR (1 << 14) |
||
45 | #define NV50_NEW_VIEWPORT (1 << 15) |
||
46 | #define NV50_NEW_ARRAYS (1 << 16) |
||
47 | #define NV50_NEW_VERTEX (1 << 17) |
||
48 | #define NV50_NEW_CONSTBUF (1 << 18) |
||
49 | #define NV50_NEW_TEXTURES (1 << 19) |
||
50 | #define NV50_NEW_SAMPLERS (1 << 20) |
||
51 | #define NV50_NEW_STRMOUT (1 << 21) |
||
52 | #define NV50_NEW_CONTEXT (1 << 31) |
||
53 | |||
54 | #define NV50_BIND_FB 0 |
||
55 | #define NV50_BIND_VERTEX 1 |
||
56 | #define NV50_BIND_VERTEX_TMP 2 |
||
57 | #define NV50_BIND_INDEX 3 |
||
58 | #define NV50_BIND_TEXTURES 4 |
||
59 | #define NV50_BIND_CB(s, i) (5 + 16 * (s) + (i)) |
||
60 | #define NV50_BIND_SO 53 |
||
61 | #define NV50_BIND_SCREEN 54 |
||
62 | #define NV50_BIND_TLS 55 |
||
63 | #define NV50_BIND_COUNT 56 |
||
64 | #define NV50_BIND_2D 0 |
||
65 | #define NV50_BIND_M2MF 0 |
||
66 | #define NV50_BIND_FENCE 1 |
||
67 | |||
68 | #define NV50_CB_TMP 123 |
||
69 | /* fixed constant buffer binding points - low indices for user's constbufs */ |
||
70 | #define NV50_CB_PVP 124 |
||
71 | #define NV50_CB_PGP 126 |
||
72 | #define NV50_CB_PFP 125 |
||
73 | #define NV50_CB_AUX 127 |
||
74 | |||
75 | |||
76 | struct nv50_blitctx; |
||
77 | |||
78 | boolean nv50_blitctx_create(struct nv50_context *); |
||
79 | |||
80 | struct nv50_context { |
||
81 | struct nouveau_context base; |
||
82 | |||
83 | struct nv50_screen *screen; |
||
84 | |||
85 | struct nouveau_bufctx *bufctx_3d; |
||
86 | struct nouveau_bufctx *bufctx; |
||
87 | |||
88 | uint32_t dirty; |
||
89 | |||
90 | struct { |
||
91 | uint32_t instance_elts; /* bitmask of per-instance elements */ |
||
92 | uint32_t instance_base; |
||
93 | uint32_t interpolant_ctrl; |
||
94 | uint32_t semantic_color; |
||
95 | uint32_t semantic_psize; |
||
96 | int32_t index_bias; |
||
97 | boolean uniform_buffer_bound[3]; |
||
98 | boolean prim_restart; |
||
99 | boolean point_sprite; |
||
100 | boolean rt_serialize; |
||
101 | boolean flushed; |
||
102 | boolean rasterizer_discard; |
||
103 | uint8_t tls_required; |
||
104 | boolean new_tls_space; |
||
105 | uint8_t num_vtxbufs; |
||
106 | uint8_t num_vtxelts; |
||
107 | uint8_t num_textures[3]; |
||
108 | uint8_t num_samplers[3]; |
||
109 | uint8_t prim_size; |
||
110 | uint16_t scissor; |
||
111 | } state; |
||
112 | |||
113 | struct nv50_blend_stateobj *blend; |
||
114 | struct nv50_rasterizer_stateobj *rast; |
||
115 | struct nv50_zsa_stateobj *zsa; |
||
116 | struct nv50_vertex_stateobj *vertex; |
||
117 | |||
118 | struct nv50_program *vertprog; |
||
119 | struct nv50_program *gmtyprog; |
||
120 | struct nv50_program *fragprog; |
||
121 | |||
122 | struct nv50_constbuf constbuf[3][NV50_MAX_PIPE_CONSTBUFS]; |
||
123 | uint16_t constbuf_dirty[3]; |
||
124 | uint16_t constbuf_valid[3]; |
||
125 | |||
126 | struct pipe_vertex_buffer vtxbuf[PIPE_MAX_ATTRIBS]; |
||
127 | unsigned num_vtxbufs; |
||
128 | struct pipe_index_buffer idxbuf; |
||
129 | uint32_t vbo_fifo; /* bitmask of vertex elements to be pushed to FIFO */ |
||
130 | uint32_t vbo_user; /* bitmask of vertex buffers pointing to user memory */ |
||
131 | uint32_t vbo_constant; /* bitmask of user buffers with stride 0 */ |
||
132 | uint32_t vb_elt_first; /* from pipe_draw_info, for vertex upload */ |
||
133 | uint32_t vb_elt_limit; /* max - min element (count - 1) */ |
||
134 | uint32_t instance_off; /* base vertex for instanced arrays */ |
||
135 | uint32_t instance_max; /* max instance for current draw call */ |
||
136 | |||
137 | struct pipe_sampler_view *textures[3][PIPE_MAX_SAMPLERS]; |
||
138 | unsigned num_textures[3]; |
||
139 | struct nv50_tsc_entry *samplers[3][PIPE_MAX_SAMPLERS]; |
||
140 | unsigned num_samplers[3]; |
||
141 | |||
142 | uint8_t num_so_targets; |
||
143 | uint8_t so_targets_dirty; |
||
144 | struct pipe_stream_output_target *so_target[4]; |
||
145 | |||
146 | struct pipe_framebuffer_state framebuffer; |
||
147 | struct pipe_blend_color blend_colour; |
||
148 | struct pipe_stencil_ref stencil_ref; |
||
149 | struct pipe_poly_stipple stipple; |
||
150 | struct pipe_scissor_state scissor; |
||
151 | struct pipe_viewport_state viewport; |
||
152 | struct pipe_clip_state clip; |
||
153 | |||
154 | unsigned sample_mask; |
||
155 | |||
156 | boolean vbo_push_hint; |
||
157 | |||
158 | struct pipe_query *cond_query; |
||
159 | boolean cond_cond; |
||
160 | uint cond_mode; |
||
161 | |||
162 | struct nv50_blitctx *blit; |
||
163 | |||
164 | #ifdef NV50_WITH_DRAW_MODULE |
||
165 | struct draw_context *draw; |
||
166 | #endif |
||
167 | }; |
||
168 | |||
169 | static INLINE struct nv50_context * |
||
170 | nv50_context(struct pipe_context *pipe) |
||
171 | { |
||
172 | return (struct nv50_context *)pipe; |
||
173 | } |
||
174 | |||
175 | static INLINE struct nv50_screen * |
||
176 | nv50_context_screen(struct nv50_context *nv50) |
||
177 | { |
||
178 | return nv50_screen(&nv50->base.screen->base); |
||
179 | } |
||
180 | |||
181 | /* return index used in nv50_context arrays for a specific shader type */ |
||
182 | static INLINE unsigned |
||
183 | nv50_context_shader_stage(unsigned pipe) |
||
184 | { |
||
185 | switch (pipe) { |
||
186 | case PIPE_SHADER_VERTEX: return 0; |
||
187 | case PIPE_SHADER_FRAGMENT: return 1; |
||
188 | case PIPE_SHADER_GEOMETRY: return 2; |
||
189 | case PIPE_SHADER_COMPUTE: return 3; |
||
190 | default: |
||
191 | assert(!"invalid/unhandled shader type"); |
||
192 | return 0; |
||
193 | } |
||
194 | } |
||
195 | |||
196 | /* nv50_context.c */ |
||
197 | struct pipe_context *nv50_create(struct pipe_screen *, void *); |
||
198 | |||
199 | void nv50_bufctx_fence(struct nouveau_bufctx *, boolean on_flush); |
||
200 | |||
201 | void nv50_default_kick_notify(struct nouveau_pushbuf *); |
||
202 | |||
203 | /* nv50_draw.c */ |
||
204 | extern struct draw_stage *nv50_draw_render_stage(struct nv50_context *); |
||
205 | |||
206 | /* nv50_query.c */ |
||
207 | void nv50_init_query_functions(struct nv50_context *); |
||
208 | void nv50_query_pushbuf_submit(struct nouveau_pushbuf *, |
||
209 | struct pipe_query *, unsigned result_offset); |
||
210 | void nv84_query_fifo_wait(struct nouveau_pushbuf *, struct pipe_query *); |
||
211 | void nva0_so_target_save_offset(struct pipe_context *, |
||
212 | struct pipe_stream_output_target *, |
||
213 | unsigned index, boolean seralize); |
||
214 | |||
215 | #define NVA0_QUERY_STREAM_OUTPUT_BUFFER_OFFSET (PIPE_QUERY_TYPES + 0) |
||
216 | |||
217 | /* nv50_shader_state.c */ |
||
218 | void nv50_vertprog_validate(struct nv50_context *); |
||
219 | void nv50_gmtyprog_validate(struct nv50_context *); |
||
220 | void nv50_fragprog_validate(struct nv50_context *); |
||
221 | void nv50_fp_linkage_validate(struct nv50_context *); |
||
222 | void nv50_gp_linkage_validate(struct nv50_context *); |
||
223 | void nv50_constbufs_validate(struct nv50_context *); |
||
224 | void nv50_validate_derived_rs(struct nv50_context *); |
||
225 | void nv50_stream_output_validate(struct nv50_context *); |
||
226 | |||
227 | /* nv50_state.c */ |
||
228 | extern void nv50_init_state_functions(struct nv50_context *); |
||
229 | |||
230 | /* nv50_state_validate.c */ |
||
231 | /* @words: check for space before emitting relocs */ |
||
232 | extern boolean nv50_state_validate(struct nv50_context *, uint32_t state_mask, |
||
233 | unsigned space_words); |
||
234 | |||
235 | /* nv50_surface.c */ |
||
236 | extern void nv50_clear(struct pipe_context *, unsigned buffers, |
||
237 | const union pipe_color_union *color, |
||
238 | double depth, unsigned stencil); |
||
239 | extern void nv50_init_surface_functions(struct nv50_context *); |
||
240 | |||
241 | /* nv50_tex.c */ |
||
242 | void nv50_validate_textures(struct nv50_context *); |
||
243 | void nv50_validate_samplers(struct nv50_context *); |
||
244 | |||
245 | struct pipe_sampler_view * |
||
246 | nv50_create_texture_view(struct pipe_context *, |
||
247 | struct pipe_resource *, |
||
248 | const struct pipe_sampler_view *, |
||
249 | uint32_t flags, |
||
250 | enum pipe_texture_target); |
||
251 | struct pipe_sampler_view * |
||
252 | nv50_create_sampler_view(struct pipe_context *, |
||
253 | struct pipe_resource *, |
||
254 | const struct pipe_sampler_view *); |
||
255 | |||
256 | /* nv50_transfer.c */ |
||
257 | void |
||
258 | nv50_m2mf_transfer_rect(struct nv50_context *, |
||
259 | const struct nv50_m2mf_rect *dst, |
||
260 | const struct nv50_m2mf_rect *src, |
||
261 | uint32_t nblocksx, uint32_t nblocksy); |
||
262 | void |
||
263 | nv50_sifc_linear_u8(struct nouveau_context *pipe, |
||
264 | struct nouveau_bo *dst, unsigned offset, unsigned domain, |
||
265 | unsigned size, const void *data); |
||
266 | void |
||
267 | nv50_m2mf_copy_linear(struct nouveau_context *pipe, |
||
268 | struct nouveau_bo *dst, unsigned dstoff, unsigned dstdom, |
||
269 | struct nouveau_bo *src, unsigned srcoff, unsigned srcdom, |
||
270 | unsigned size); |
||
271 | void |
||
272 | nv50_cb_push(struct nouveau_context *nv, |
||
273 | struct nouveau_bo *bo, unsigned domain, |
||
274 | unsigned base, unsigned size, |
||
275 | unsigned offset, unsigned words, const uint32_t *data); |
||
276 | |||
277 | /* nv50_vbo.c */ |
||
278 | void nv50_draw_vbo(struct pipe_context *, const struct pipe_draw_info *); |
||
279 | |||
280 | void * |
||
281 | nv50_vertex_state_create(struct pipe_context *pipe, |
||
282 | unsigned num_elements, |
||
283 | const struct pipe_vertex_element *elements); |
||
284 | void |
||
285 | nv50_vertex_state_delete(struct pipe_context *pipe, void *hwcso); |
||
286 | |||
287 | void nv50_vertex_arrays_validate(struct nv50_context *nv50); |
||
288 | |||
289 | /* nv50_push.c */ |
||
290 | void nv50_push_vbo(struct nv50_context *, const struct pipe_draw_info *); |
||
291 | |||
292 | /* nv84_video.c */ |
||
293 | struct pipe_video_decoder * |
||
294 | nv84_create_decoder(struct pipe_context *context, |
||
295 | enum pipe_video_profile profile, |
||
296 | enum pipe_video_entrypoint entrypoint, |
||
297 | enum pipe_video_chroma_format chroma_format, |
||
298 | unsigned width, unsigned height, |
||
299 | unsigned max_references, |
||
300 | bool expect_chunked_decode); |
||
301 | |||
302 | struct pipe_video_buffer * |
||
303 | nv84_video_buffer_create(struct pipe_context *pipe, |
||
304 | const struct pipe_video_buffer *template); |
||
305 | |||
306 | int |
||
307 | nv84_screen_get_video_param(struct pipe_screen *pscreen, |
||
308 | enum pipe_video_profile profile, |
||
309 | enum pipe_video_cap param); |
||
310 | |||
311 | boolean |
||
312 | nv84_screen_video_supported(struct pipe_screen *screen, |
||
313 | enum pipe_format format, |
||
314 | enum pipe_video_profile profile); |
||
315 | |||
316 | #endif><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><> |