aboutsummaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/nouveau/nvc0/nvc0_context.h
blob: dacb48411ba0258ceafec94c426293b207f468bb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
#ifndef __NVC0_CONTEXT_H__
#define __NVC0_CONTEXT_H__

#include "pipe/p_context.h"
#include "pipe/p_defines.h"
#include "pipe/p_state.h"

#include "util/list.h"
#include "util/u_memory.h"
#include "util/u_math.h"
#include "util/u_inlines.h"
#include "util/u_dynarray.h"

#include "nvc0/nvc0_winsys.h"
#include "nvc0/nvc0_stateobj.h"
#include "nvc0/nvc0_screen.h"
#include "nvc0/nvc0_program.h"
#include "nvc0/nvc0_resource.h"
#include "nvc0/nvc0_query.h"

#include "nv50/nv50_transfer.h"

#include "nouveau_context.h"
#include "nouveau_debug.h"

#include "nv50/nv50_3ddefs.xml.h"
#include "nvc0/nvc0_3d.xml.h"
#include "nv50/nv50_2d.xml.h"
#include "nvc0/nvc0_m2mf.xml.h"
#include "nvc0/nve4_p2mf.xml.h"
#include "nvc0/nvc0_compute.xml.h"
#include "nvc0/nvc0_macros.h"

/* NOTE: must keep NVC0_NEW_3D_...PROG in consecutive bits in this order */
#define NVC0_NEW_3D_BLEND        (1 << 0)
#define NVC0_NEW_3D_RASTERIZER   (1 << 1)
#define NVC0_NEW_3D_ZSA          (1 << 2)
#define NVC0_NEW_3D_VERTPROG     (1 << 3)
#define NVC0_NEW_3D_TCTLPROG     (1 << 4)
#define NVC0_NEW_3D_TEVLPROG     (1 << 5)
#define NVC0_NEW_3D_GMTYPROG     (1 << 6)
#define NVC0_NEW_3D_FRAGPROG     (1 << 7)
#define NVC0_NEW_3D_BLEND_COLOUR (1 << 8)
#define NVC0_NEW_3D_STENCIL_REF  (1 << 9)
#define NVC0_NEW_3D_CLIP         (1 << 10)
#define NVC0_NEW_3D_SAMPLE_MASK  (1 << 11)
#define NVC0_NEW_3D_FRAMEBUFFER  (1 << 12)
#define NVC0_NEW_3D_STIPPLE      (1 << 13)
#define NVC0_NEW_3D_SCISSOR      (1 << 14)
#define NVC0_NEW_3D_VIEWPORT     (1 << 15)
#define NVC0_NEW_3D_ARRAYS       (1 << 16)
#define NVC0_NEW_3D_VERTEX       (1 << 17)
#define NVC0_NEW_3D_CONSTBUF     (1 << 18)
#define NVC0_NEW_3D_TEXTURES     (1 << 19)
#define NVC0_NEW_3D_SAMPLERS     (1 << 20)
#define NVC0_NEW_3D_TFB_TARGETS  (1 << 21)

#define NVC0_NEW_3D_SURFACES     (1 << 23)
#define NVC0_NEW_3D_MIN_SAMPLES  (1 << 24)
#define NVC0_NEW_3D_TESSFACTOR   (1 << 25)
#define NVC0_NEW_3D_BUFFERS      (1 << 26)
#define NVC0_NEW_3D_DRIVERCONST  (1 << 27)
#define NVC0_NEW_3D_WINDOW_RECTS (1 << 28)

#define NVC0_NEW_3D_SAMPLE_LOCATIONS (1 << 29)

#define NVC0_NEW_CP_PROGRAM   (1 << 0)
#define NVC0_NEW_CP_SURFACES  (1 << 1)
#define NVC0_NEW_CP_TEXTURES  (1 << 2)
#define NVC0_NEW_CP_SAMPLERS  (1 << 3)
#define NVC0_NEW_CP_CONSTBUF  (1 << 4)
#define NVC0_NEW_CP_GLOBALS   (1 << 5)
#define NVC0_NEW_CP_DRIVERCONST (1 << 6)
#define NVC0_NEW_CP_BUFFERS   (1 << 7)

/* 3d bufctx (during draw_vbo, blit_3d) */
#define NVC0_BIND_3D_FB            0
#define NVC0_BIND_3D_VTX           1
#define NVC0_BIND_3D_VTX_TMP       2
#define NVC0_BIND_3D_IDX           3
#define NVC0_BIND_3D_TEX(s, i)  (  4 + 32 * (s) + (i))
#define NVC0_BIND_3D_CB(s, i)   (164 + 16 * (s) + (i))
#define NVC0_BIND_3D_TFB         244
#define NVC0_BIND_3D_SUF         245
#define NVC0_BIND_3D_BUF         246
#define NVC0_BIND_3D_SCREEN      247
#define NVC0_BIND_3D_BINDLESS    248
#define NVC0_BIND_3D_TLS         249
#define NVC0_BIND_3D_TEXT        250
#define NVC0_BIND_3D_COUNT       251

/* compute bufctx (during launch_grid) */
#define NVC0_BIND_CP_CB(i)     (  0 + (i))
#define NVC0_BIND_CP_TEX(i)    ( 16 + (i))
#define NVC0_BIND_CP_SUF         48
#define NVC0_BIND_CP_GLOBAL      49
#define NVC0_BIND_CP_DESC        50
#define NVC0_BIND_CP_SCREEN      51
#define NVC0_BIND_CP_QUERY       52
#define NVC0_BIND_CP_BUF         53
#define NVC0_BIND_CP_TEXT        54
#define NVC0_BIND_CP_BINDLESS    55
#define NVC0_BIND_CP_COUNT       56

/* bufctx for other operations */
#define NVC0_BIND_2D            0
#define NVC0_BIND_M2MF          0
#define NVC0_BIND_FENCE         1

/* 6 user uniform buffers, at 64K each */
#define NVC0_CB_USR_INFO(s)         (s << 16)
#define NVC0_CB_USR_SIZE            (6 << 16)
/* 6 driver constbuts, at 64K each */
#define NVC0_CB_AUX_INFO(s)         NVC0_CB_USR_SIZE + (s << 16)
#define NVC0_CB_AUX_SIZE            (1 << 16)
/* XXX: Figure out what this UNK data is. */
#define NVC0_CB_AUX_UNK_INFO        0x000
#define NVC0_CB_AUX_UNK_SIZE        (8 * 4)
/* 40 textures handles (8 for GM107+ images only), at 1 32-bits integer each */
#define NVC0_CB_AUX_TEX_INFO(i)     0x020 + (i) * 4
#define NVC0_CB_AUX_TEX_SIZE        (40 * 4)
/* 8 sets of 32-bits coordinate offsets */
#define NVC0_CB_AUX_MS_INFO         0x0c0
#define NVC0_CB_AUX_MS_SIZE         (8 * 2 * 4)
/* block/grid size, at 3 32-bits integers each, gridid and work_dim */
#define NVC0_CB_AUX_GRID_INFO(i)    0x100 + (i) * 4 /* CP */
#define NVC0_CB_AUX_GRID_SIZE       (8 * 4)
/* FB texture handle */
#define NVC0_CB_AUX_FB_TEX_INFO     0x100 /* FP */
#define NVC0_CB_AUX_FB_TEX_SIZE     (4)
/* 8 user clip planes, at 4 32-bits floats each */
#define NVC0_CB_AUX_UCP_INFO        0x120
#define NVC0_CB_AUX_UCP_SIZE        (PIPE_MAX_CLIP_PLANES * 4 * 4)
/* 13 ubos, at 4 32-bits integer each */
#define NVC0_CB_AUX_UBO_INFO(i)     0x120 + (i) * 4 * 4 /* CP */
#define NVC0_CB_AUX_UBO_SIZE        ((NVC0_MAX_PIPE_CONSTBUFS - 1) * 4 * 4)
/* 8 sets of 32-bits integer pairs sample offsets */
#define NVC0_CB_AUX_SAMPLE_INFO     0x1a0 /* FP */
/* 256 bytes, though only 64 bytes used before GM200 */
#define NVC0_CB_AUX_SAMPLE_SIZE     (8 * 2 * 4 * 4)
/* draw parameters (index bias, base instance, drawid)
 * be sure to update the indirect draw macros in com9097.mme when changing this
 */
#define NVC0_CB_AUX_DRAW_INFO       0x1a0 /* VP */
/* 32 user buffers, at 4 32-bits integers each */
#define NVC0_CB_AUX_BUF_INFO(i)     0x2a0 + (i) * 4 * 4
#define NVC0_CB_AUX_BUF_SIZE        (NVC0_MAX_BUFFERS * 4 * 4)
/* 8 surfaces, at 16 32-bits integers each */
#define NVC0_CB_AUX_SU_INFO(i)      0x4a0 + (i) * 16 * 4
#define NVC0_CB_AUX_SU_SIZE         (NVC0_MAX_IMAGES * 16 * 4)
/* 1 64-bits address and 1 32-bits sequence
 * be sure to update the shaders in nvc0_query_hw_sm.c when changing this
 */
#define NVC0_CB_AUX_MP_INFO         0x6a0
#define NVC0_CB_AUX_MP_SIZE         3 * 4
/* 512 64-byte blocks for bindless image handles */
#define NVC0_CB_AUX_BINDLESS_INFO(i) 0x6b0 + (i) * 16 * 4
#define NVC0_CB_AUX_BINDLESS_SIZE   (NVE4_IMG_MAX_HANDLES * 16 * 4)
/* 4 32-bits floats for the vertex runout, put at the end */
#define NVC0_CB_AUX_RUNOUT_INFO     NVC0_CB_USR_SIZE + (NVC0_CB_AUX_SIZE * 6)

struct nvc0_blitctx;

bool nvc0_blitctx_create(struct nvc0_context *);
void nvc0_blitctx_destroy(struct nvc0_context *);

struct nvc0_resident {
   struct list_head list;
   uint64_t handle;
   struct nv04_resource *buf;
   uint32_t flags;
};

struct nvc0_context {
   struct nouveau_context base;

   struct nouveau_bufctx *bufctx_3d;
   struct nouveau_bufctx *bufctx;
   struct nouveau_bufctx *bufctx_cp;

   struct nvc0_screen *screen;

   void (*m2mf_copy_rect)(struct nvc0_context *,
                          const struct nv50_m2mf_rect *dst,
                          const struct nv50_m2mf_rect *src,
                          uint32_t nblocksx, uint32_t nblocksy);

   uint32_t dirty_3d; /* dirty flags for 3d state */
   uint32_t dirty_cp; /* dirty flags for compute state */

   struct nvc0_graph_state state;

   struct nvc0_blend_stateobj *blend;
   struct nvc0_rasterizer_stateobj *rast;
   struct nvc0_zsa_stateobj *zsa;
   struct nvc0_vertex_stateobj *vertex;

   struct nvc0_program *vertprog;
   struct nvc0_program *tctlprog;
   struct nvc0_program *tevlprog;
   struct nvc0_program *gmtyprog;
   struct nvc0_program *fragprog;
   struct nvc0_program *compprog;

   struct nvc0_program *tcp_empty;

   struct nvc0_constbuf constbuf[6][NVC0_MAX_PIPE_CONSTBUFS];
   uint16_t constbuf_dirty[6];
   uint16_t constbuf_valid[6];
   uint16_t constbuf_coherent[6];
   bool cb_dirty;

   struct pipe_vertex_buffer vtxbuf[PIPE_MAX_ATTRIBS];
   unsigned num_vtxbufs;
   uint32_t vtxbufs_coherent;
   uint32_t constant_vbos;
   uint32_t vbo_user; /* bitmask of vertex buffers pointing to user memory */
   uint32_t vb_elt_first; /* from pipe_draw_info, for vertex upload */
   uint32_t vb_elt_limit; /* max - min element (count - 1) */
   uint32_t instance_off; /* current base vertex for instanced arrays */
   uint32_t instance_max; /* last instance for current draw call */

   struct pipe_sampler_view *textures[6][PIPE_MAX_SAMPLERS];
   unsigned num_textures[6];
   uint32_t textures_dirty[6];
   uint32_t textures_coherent[6];
   struct nv50_tsc_entry *samplers[6][PIPE_MAX_SAMPLERS];
   unsigned num_samplers[6];
   uint32_t samplers_dirty[6];
   bool seamless_cube_map;
   struct pipe_sampler_view *fbtexture;

   uint32_t tex_handles[6][PIPE_MAX_SAMPLERS]; /* for nve4 */

   struct list_head tex_head;
   struct list_head img_head;

   struct pipe_framebuffer_state framebuffer;
   bool sample_locations_enabled;
   uint8_t sample_locations[2 * 4 * 8];
   struct pipe_blend_color blend_colour;
   struct pipe_stencil_ref stencil_ref;
   struct pipe_poly_stipple stipple;
   struct pipe_scissor_state scissors[NVC0_MAX_VIEWPORTS];
   unsigned scissors_dirty;
   struct pipe_viewport_state viewports[NVC0_MAX_VIEWPORTS];
   unsigned viewports_dirty;
   struct pipe_clip_state clip;
   struct nvc0_window_rect_stateobj window_rect;

   unsigned sample_mask;
   unsigned min_samples;

   float default_tess_outer[4];
   float default_tess_inner[2];

   bool vbo_push_hint;

   uint8_t tfbbuf_dirty;
   struct pipe_stream_output_target *tfbbuf[4];
   unsigned num_tfbbufs;

   struct pipe_query *cond_query;
   bool cond_cond; /* inverted rendering condition */
   uint cond_mode;
   uint32_t cond_condmode; /* the calculated condition */

   struct nvc0_blitctx *blit;

   /* NOTE: some of these surfaces may reference buffers */
   struct pipe_surface *surfaces[2][NVC0_MAX_SURFACE_SLOTS];
   uint16_t surfaces_dirty[2];
   uint16_t surfaces_valid[2];

   struct pipe_shader_buffer buffers[6][NVC0_MAX_BUFFERS];
   uint32_t buffers_dirty[6];
   uint32_t buffers_valid[6];

   struct pipe_image_view images[6][NVC0_MAX_IMAGES];
   struct pipe_sampler_view *images_tic[6][NVC0_MAX_IMAGES]; /* GM107+ */
   uint16_t images_dirty[6];
   uint16_t images_valid[6];

   struct util_dynarray global_residents;

   uint64_t compute_invocations;
};

static inline struct nvc0_context *
nvc0_context(struct pipe_context *pipe)
{
   return (struct nvc0_context *)pipe;
}

static inline unsigned
nvc0_shader_stage(unsigned pipe)
{
   switch (pipe) {
   case PIPE_SHADER_VERTEX: return 0;
   case PIPE_SHADER_TESS_CTRL: return 1;
   case PIPE_SHADER_TESS_EVAL: return 2;
   case PIPE_SHADER_GEOMETRY: return 3;
   case PIPE_SHADER_FRAGMENT: return 4;
   case PIPE_SHADER_COMPUTE: return 5;
   default:
      assert(!"invalid PIPE_SHADER type");
      return 0;
   }
}


/* nvc0_context.c */
struct pipe_context *nvc0_create(struct pipe_screen *, void *, unsigned flags);
void nvc0_bufctx_fence(struct nvc0_context *, struct nouveau_bufctx *,
                       bool on_flush);
void nvc0_default_kick_notify(struct nouveau_pushbuf *);
const void *nvc0_get_sample_locations(unsigned);

/* nvc0_draw.c */
extern struct draw_stage *nvc0_draw_render_stage(struct nvc0_context *);

/* nvc0_program.c */
bool nvc0_program_translate(struct nvc0_program *, uint16_t chipset,
                            struct pipe_debug_callback *);
bool nvc0_program_upload(struct nvc0_context *, struct nvc0_program *);
void nvc0_program_destroy(struct nvc0_context *, struct nvc0_program *);
void nvc0_program_library_upload(struct nvc0_context *);
uint32_t nvc0_program_symbol_offset(const struct nvc0_program *,
                                    uint32_t label);
void nvc0_program_init_tcp_empty(struct nvc0_context *);

/* nvc0_shader_state.c */
void nvc0_vertprog_validate(struct nvc0_context *);
void nvc0_tctlprog_validate(struct nvc0_context *);
void nvc0_tevlprog_validate(struct nvc0_context *);
void nvc0_gmtyprog_validate(struct nvc0_context *);
void nvc0_fragprog_validate(struct nvc0_context *);
void nvc0_compprog_validate(struct nvc0_context *);

void nvc0_tfb_validate(struct nvc0_context *);
void nvc0_layer_validate(struct nvc0_context *);

/* nvc0_state.c */
extern void nvc0_init_state_functions(struct nvc0_context *);

/* nvc0_state_validate.c */
struct nvc0_state_validate {
   void (*func)(struct nvc0_context *);
   uint32_t states;
};

bool nvc0_state_validate(struct nvc0_context *, uint32_t,
                         struct nvc0_state_validate *, int, uint32_t *,
                         struct nouveau_bufctx *);
bool nvc0_state_validate_3d(struct nvc0_context *, uint32_t);

/* nvc0_surface.c */
extern void nvc0_clear(struct pipe_context *, unsigned buffers,
                       const struct pipe_scissor_state *scissor_state,
                       const union pipe_color_union *color,
                       double depth, unsigned stencil);
extern void nvc0_init_surface_functions(struct nvc0_context *);

/* nvc0_tex.c */
bool nvc0_validate_tic(struct nvc0_context *nvc0, int s);
bool nvc0_validate_tsc(struct nvc0_context *nvc0, int s);
bool nve4_validate_tsc(struct nvc0_context *nvc0, int s);
void nvc0_validate_suf(struct nvc0_context *nvc0, int s);
void nvc0_validate_textures(struct nvc0_context *);
void nvc0_validate_samplers(struct nvc0_context *);
void nvc0_upload_tsc0(struct nvc0_context *);
void nve4_set_tex_handles(struct nvc0_context *);
void nvc0_validate_surfaces(struct nvc0_context *);
void nve4_set_surface_info(struct nouveau_pushbuf *,
                           const struct pipe_image_view *,
                           struct nvc0_context *);
void nvc0_mark_image_range_valid(const struct pipe_image_view *);
bool nvc0_update_tic(struct nvc0_context *, struct nv50_tic_entry *,
                     struct nv04_resource *);

struct pipe_sampler_view *
nvc0_create_texture_view(struct pipe_context *,
                         struct pipe_resource *,
                         const struct pipe_sampler_view *,
                         uint32_t flags,
                         enum pipe_texture_target);
struct pipe_sampler_view *
nvc0_create_sampler_view(struct pipe_context *,
                         struct pipe_resource *,
                         const struct pipe_sampler_view *);
struct pipe_sampler_view *
gm107_create_texture_view_from_image(struct pipe_context *,
                                     const struct pipe_image_view *);

void nvc0_init_bindless_functions(struct pipe_context *);

/* nvc0_transfer.c */
void
nvc0_init_transfer_functions(struct nvc0_context *);

void
nvc0_m2mf_push_linear(struct nouveau_context *nv,
                      struct nouveau_bo *dst, unsigned offset, unsigned domain,
                      unsigned size, const void *data);
void
nve4_p2mf_push_linear(struct nouveau_context *nv,
                      struct nouveau_bo *dst, unsigned offset, unsigned domain,
                      unsigned size, const void *data);
void
nvc0_cb_bo_push(struct nouveau_context *,
                struct nouveau_bo *bo, unsigned domain,
                unsigned base, unsigned size,
                unsigned offset, unsigned words, const uint32_t *data);

/* nvc0_vbo.c */
void nvc0_draw_vbo(struct pipe_context *, const struct pipe_draw_info *);

void *
nvc0_vertex_state_create(struct pipe_context *pipe,
                         unsigned num_elements,
                         const struct pipe_vertex_element *elements);
void
nvc0_vertex_state_delete(struct pipe_context *pipe, void *hwcso);

void nvc0_vertex_arrays_validate(struct nvc0_context *);

void nvc0_idxbuf_validate(struct nvc0_context *);

/* nvc0_video.c */
struct pipe_video_codec *
nvc0_create_decoder(struct pipe_context *context,
                    const struct pipe_video_codec *templ);

struct pipe_video_buffer *
nvc0_video_buffer_create(struct pipe_context *pipe,
                         const struct pipe_video_buffer *templat);

/* nvc0_push.c */
void nvc0_push_vbo(struct nvc0_context *, const struct pipe_draw_info *);
void nvc0_push_vbo_indirect(struct nvc0_context *, const struct pipe_draw_info *);

/* nve4_compute.c */
void nve4_launch_grid(struct pipe_context *, const struct pipe_grid_info *);

/* nvc0_compute.c */
void nvc0_launch_grid(struct pipe_context *, const struct pipe_grid_info *);
void nvc0_compute_validate_globals(struct nvc0_context *);
void nvc0_update_compute_invocations_counter(struct nvc0_context *nvc0,
                                             const struct pipe_grid_info *info);

#endif