Home | History | Annotate | Download | only in nvc0
      1 #ifndef __NVC0_CONTEXT_H__
      2 #define __NVC0_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/list.h"
      9 #include "util/u_memory.h"
     10 #include "util/u_math.h"
     11 #include "util/u_inlines.h"
     12 #include "util/u_dynarray.h"
     13 
     14 #include "nvc0/nvc0_winsys.h"
     15 #include "nvc0/nvc0_stateobj.h"
     16 #include "nvc0/nvc0_screen.h"
     17 #include "nvc0/nvc0_program.h"
     18 #include "nvc0/nvc0_resource.h"
     19 #include "nvc0/nvc0_query.h"
     20 
     21 #include "nv50/nv50_transfer.h"
     22 
     23 #include "nouveau_context.h"
     24 #include "nouveau_debug.h"
     25 
     26 #include "nv50/nv50_3ddefs.xml.h"
     27 #include "nvc0/nvc0_3d.xml.h"
     28 #include "nv50/nv50_2d.xml.h"
     29 #include "nvc0/nvc0_m2mf.xml.h"
     30 #include "nvc0/nve4_p2mf.xml.h"
     31 #include "nvc0/nvc0_compute.xml.h"
     32 #include "nvc0/nvc0_macros.h"
     33 
     34 /* NOTE: must keep NVC0_NEW_3D_...PROG in consecutive bits in this order */
     35 #define NVC0_NEW_3D_BLEND        (1 << 0)
     36 #define NVC0_NEW_3D_RASTERIZER   (1 << 1)
     37 #define NVC0_NEW_3D_ZSA          (1 << 2)
     38 #define NVC0_NEW_3D_VERTPROG     (1 << 3)
     39 #define NVC0_NEW_3D_TCTLPROG     (1 << 4)
     40 #define NVC0_NEW_3D_TEVLPROG     (1 << 5)
     41 #define NVC0_NEW_3D_GMTYPROG     (1 << 6)
     42 #define NVC0_NEW_3D_FRAGPROG     (1 << 7)
     43 #define NVC0_NEW_3D_BLEND_COLOUR (1 << 8)
     44 #define NVC0_NEW_3D_STENCIL_REF  (1 << 9)
     45 #define NVC0_NEW_3D_CLIP         (1 << 10)
     46 #define NVC0_NEW_3D_SAMPLE_MASK  (1 << 11)
     47 #define NVC0_NEW_3D_FRAMEBUFFER  (1 << 12)
     48 #define NVC0_NEW_3D_STIPPLE      (1 << 13)
     49 #define NVC0_NEW_3D_SCISSOR      (1 << 14)
     50 #define NVC0_NEW_3D_VIEWPORT     (1 << 15)
     51 #define NVC0_NEW_3D_ARRAYS       (1 << 16)
     52 #define NVC0_NEW_3D_VERTEX       (1 << 17)
     53 #define NVC0_NEW_3D_CONSTBUF     (1 << 18)
     54 #define NVC0_NEW_3D_TEXTURES     (1 << 19)
     55 #define NVC0_NEW_3D_SAMPLERS     (1 << 20)
     56 #define NVC0_NEW_3D_TFB_TARGETS  (1 << 21)
     57 
     58 #define NVC0_NEW_3D_SURFACES     (1 << 23)
     59 #define NVC0_NEW_3D_MIN_SAMPLES  (1 << 24)
     60 #define NVC0_NEW_3D_TESSFACTOR   (1 << 25)
     61 #define NVC0_NEW_3D_BUFFERS      (1 << 26)
     62 #define NVC0_NEW_3D_DRIVERCONST  (1 << 27)
     63 #define NVC0_NEW_3D_WINDOW_RECTS (1 << 28)
     64 
     65 #define NVC0_NEW_CP_PROGRAM   (1 << 0)
     66 #define NVC0_NEW_CP_SURFACES  (1 << 1)
     67 #define NVC0_NEW_CP_TEXTURES  (1 << 2)
     68 #define NVC0_NEW_CP_SAMPLERS  (1 << 3)
     69 #define NVC0_NEW_CP_CONSTBUF  (1 << 4)
     70 #define NVC0_NEW_CP_GLOBALS   (1 << 5)
     71 #define NVC0_NEW_CP_DRIVERCONST (1 << 6)
     72 #define NVC0_NEW_CP_BUFFERS   (1 << 7)
     73 
     74 /* 3d bufctx (during draw_vbo, blit_3d) */
     75 #define NVC0_BIND_3D_FB            0
     76 #define NVC0_BIND_3D_VTX           1
     77 #define NVC0_BIND_3D_VTX_TMP       2
     78 #define NVC0_BIND_3D_IDX           3
     79 #define NVC0_BIND_3D_TEX(s, i)  (  4 + 32 * (s) + (i))
     80 #define NVC0_BIND_3D_CB(s, i)   (164 + 16 * (s) + (i))
     81 #define NVC0_BIND_3D_TFB         244
     82 #define NVC0_BIND_3D_SUF         245
     83 #define NVC0_BIND_3D_BUF         246
     84 #define NVC0_BIND_3D_SCREEN      247
     85 #define NVC0_BIND_3D_BINDLESS    248
     86 #define NVC0_BIND_3D_TLS         249
     87 #define NVC0_BIND_3D_TEXT        250
     88 #define NVC0_BIND_3D_COUNT       251
     89 
     90 /* compute bufctx (during launch_grid) */
     91 #define NVC0_BIND_CP_CB(i)     (  0 + (i))
     92 #define NVC0_BIND_CP_TEX(i)    ( 16 + (i))
     93 #define NVC0_BIND_CP_SUF         48
     94 #define NVC0_BIND_CP_GLOBAL      49
     95 #define NVC0_BIND_CP_DESC        50
     96 #define NVC0_BIND_CP_SCREEN      51
     97 #define NVC0_BIND_CP_QUERY       52
     98 #define NVC0_BIND_CP_BUF         53
     99 #define NVC0_BIND_CP_TEXT        54
    100 #define NVC0_BIND_CP_BINDLESS    55
    101 #define NVC0_BIND_CP_COUNT       56
    102 
    103 /* bufctx for other operations */
    104 #define NVC0_BIND_2D            0
    105 #define NVC0_BIND_M2MF          0
    106 #define NVC0_BIND_FENCE         1
    107 
    108 /* 6 user uniform buffers, at 64K each */
    109 #define NVC0_CB_USR_INFO(s)         (s << 16)
    110 #define NVC0_CB_USR_SIZE            (6 << 16)
    111 /* 6 driver constbuts, at 64K each */
    112 #define NVC0_CB_AUX_INFO(s)         NVC0_CB_USR_SIZE + (s << 16)
    113 #define NVC0_CB_AUX_SIZE            (1 << 16)
    114 /* XXX: Figure out what this UNK data is. */
    115 #define NVC0_CB_AUX_UNK_INFO        0x000
    116 #define NVC0_CB_AUX_UNK_SIZE        (8 * 4)
    117 /* 40 textures handles (8 for GM107+ images only), at 1 32-bits integer each */
    118 #define NVC0_CB_AUX_TEX_INFO(i)     0x020 + (i) * 4
    119 #define NVC0_CB_AUX_TEX_SIZE        (40 * 4)
    120 /* 8 sets of 32-bits coordinate offsets */
    121 #define NVC0_CB_AUX_MS_INFO         0x0c0
    122 #define NVC0_CB_AUX_MS_SIZE         (8 * 2 * 4)
    123 /* block/grid size, at 3 32-bits integers each, gridid and work_dim */
    124 #define NVC0_CB_AUX_GRID_INFO(i)    0x100 + (i) * 4 /* CP */
    125 #define NVC0_CB_AUX_GRID_SIZE       (8 * 4)
    126 /* FB texture handle */
    127 #define NVC0_CB_AUX_FB_TEX_INFO     0x100 /* FP */
    128 #define NVC0_CB_AUX_FB_TEX_SIZE     (4)
    129 /* 8 user clip planes, at 4 32-bits floats each */
    130 #define NVC0_CB_AUX_UCP_INFO        0x120
    131 #define NVC0_CB_AUX_UCP_SIZE        (PIPE_MAX_CLIP_PLANES * 4 * 4)
    132 /* 13 ubos, at 4 32-bits integer each */
    133 #define NVC0_CB_AUX_UBO_INFO(i)     0x120 + (i) * 4 * 4 /* CP */
    134 #define NVC0_CB_AUX_UBO_SIZE        ((NVC0_MAX_PIPE_CONSTBUFS - 1) * 4 * 4)
    135 /* 8 sets of 32-bits integer pairs sample offsets */
    136 #define NVC0_CB_AUX_SAMPLE_INFO     0x1a0 /* FP */
    137 #define NVC0_CB_AUX_SAMPLE_SIZE     (8 * 4 * 2)
    138 /* draw parameters (index bais, base instance, drawid) */
    139 #define NVC0_CB_AUX_DRAW_INFO       0x1a0 /* VP */
    140 /* 32 user buffers, at 4 32-bits integers each */
    141 #define NVC0_CB_AUX_BUF_INFO(i)     0x220 + (i) * 4 * 4
    142 #define NVC0_CB_AUX_BUF_SIZE        (NVC0_MAX_BUFFERS * 4 * 4)
    143 /* 8 surfaces, at 16 32-bits integers each */
    144 #define NVC0_CB_AUX_SU_INFO(i)      0x420 + (i) * 16 * 4
    145 #define NVC0_CB_AUX_SU_SIZE         (NVC0_MAX_IMAGES * 16 * 4)
    146 /* 1 64-bits address and 1 32-bits sequence */
    147 #define NVC0_CB_AUX_MP_INFO         0x620
    148 #define NVC0_CB_AUX_MP_SIZE         3 * 4
    149 /* 512 64-byte blocks for bindless image handles */
    150 #define NVC0_CB_AUX_BINDLESS_INFO(i) 0x630 + (i) * 16 * 4
    151 #define NVC0_CB_AUX_BINDLESS_SIZE   (NVE4_IMG_MAX_HANDLES * 16 * 4)
    152 /* 4 32-bits floats for the vertex runout, put at the end */
    153 #define NVC0_CB_AUX_RUNOUT_INFO     NVC0_CB_USR_SIZE + (NVC0_CB_AUX_SIZE * 6)
    154 
    155 struct nvc0_blitctx;
    156 
    157 bool nvc0_blitctx_create(struct nvc0_context *);
    158 void nvc0_blitctx_destroy(struct nvc0_context *);
    159 
    160 struct nvc0_resident {
    161    struct list_head list;
    162    uint64_t handle;
    163    struct nv04_resource *buf;
    164    uint32_t flags;
    165 };
    166 
    167 struct nvc0_context {
    168    struct nouveau_context base;
    169 
    170    struct nouveau_bufctx *bufctx_3d;
    171    struct nouveau_bufctx *bufctx;
    172    struct nouveau_bufctx *bufctx_cp;
    173 
    174    struct nvc0_screen *screen;
    175 
    176    void (*m2mf_copy_rect)(struct nvc0_context *,
    177                           const struct nv50_m2mf_rect *dst,
    178                           const struct nv50_m2mf_rect *src,
    179                           uint32_t nblocksx, uint32_t nblocksy);
    180 
    181    uint32_t dirty_3d; /* dirty flags for 3d state */
    182    uint32_t dirty_cp; /* dirty flags for compute state */
    183 
    184    struct nvc0_graph_state state;
    185 
    186    struct nvc0_blend_stateobj *blend;
    187    struct nvc0_rasterizer_stateobj *rast;
    188    struct nvc0_zsa_stateobj *zsa;
    189    struct nvc0_vertex_stateobj *vertex;
    190 
    191    struct nvc0_program *vertprog;
    192    struct nvc0_program *tctlprog;
    193    struct nvc0_program *tevlprog;
    194    struct nvc0_program *gmtyprog;
    195    struct nvc0_program *fragprog;
    196    struct nvc0_program *compprog;
    197 
    198    struct nvc0_program *tcp_empty;
    199 
    200    struct nvc0_constbuf constbuf[6][NVC0_MAX_PIPE_CONSTBUFS];
    201    uint16_t constbuf_dirty[6];
    202    uint16_t constbuf_valid[6];
    203    uint16_t constbuf_coherent[6];
    204    bool cb_dirty;
    205 
    206    struct pipe_vertex_buffer vtxbuf[PIPE_MAX_ATTRIBS];
    207    unsigned num_vtxbufs;
    208    uint32_t vtxbufs_coherent;
    209    uint32_t constant_vbos;
    210    uint32_t vbo_user; /* bitmask of vertex buffers pointing to user memory */
    211    uint32_t vb_elt_first; /* from pipe_draw_info, for vertex upload */
    212    uint32_t vb_elt_limit; /* max - min element (count - 1) */
    213    uint32_t instance_off; /* current base vertex for instanced arrays */
    214    uint32_t instance_max; /* last instance for current draw call */
    215 
    216    struct pipe_sampler_view *textures[6][PIPE_MAX_SAMPLERS];
    217    unsigned num_textures[6];
    218    uint32_t textures_dirty[6];
    219    uint32_t textures_coherent[6];
    220    struct nv50_tsc_entry *samplers[6][PIPE_MAX_SAMPLERS];
    221    unsigned num_samplers[6];
    222    uint32_t samplers_dirty[6];
    223    bool seamless_cube_map;
    224    struct pipe_sampler_view *fbtexture;
    225 
    226    uint32_t tex_handles[6][PIPE_MAX_SAMPLERS]; /* for nve4 */
    227 
    228    struct list_head tex_head;
    229    struct list_head img_head;
    230 
    231    struct pipe_framebuffer_state framebuffer;
    232    struct pipe_blend_color blend_colour;
    233    struct pipe_stencil_ref stencil_ref;
    234    struct pipe_poly_stipple stipple;
    235    struct pipe_scissor_state scissors[NVC0_MAX_VIEWPORTS];
    236    unsigned scissors_dirty;
    237    struct pipe_viewport_state viewports[NVC0_MAX_VIEWPORTS];
    238    unsigned viewports_dirty;
    239    struct pipe_clip_state clip;
    240    struct nvc0_window_rect_stateobj window_rect;
    241 
    242    unsigned sample_mask;
    243    unsigned min_samples;
    244 
    245    float default_tess_outer[4];
    246    float default_tess_inner[2];
    247 
    248    bool vbo_push_hint;
    249 
    250    uint8_t tfbbuf_dirty;
    251    struct pipe_stream_output_target *tfbbuf[4];
    252    unsigned num_tfbbufs;
    253 
    254    struct pipe_query *cond_query;
    255    bool cond_cond; /* inverted rendering condition */
    256    uint cond_mode;
    257    uint32_t cond_condmode; /* the calculated condition */
    258 
    259    struct nvc0_blitctx *blit;
    260 
    261    /* NOTE: some of these surfaces may reference buffers */
    262    struct pipe_surface *surfaces[2][NVC0_MAX_SURFACE_SLOTS];
    263    uint16_t surfaces_dirty[2];
    264    uint16_t surfaces_valid[2];
    265 
    266    struct pipe_shader_buffer buffers[6][NVC0_MAX_BUFFERS];
    267    uint32_t buffers_dirty[6];
    268    uint32_t buffers_valid[6];
    269 
    270    struct pipe_image_view images[6][NVC0_MAX_IMAGES];
    271    struct pipe_sampler_view *images_tic[6][NVC0_MAX_IMAGES]; /* GM107+ */
    272    uint16_t images_dirty[6];
    273    uint16_t images_valid[6];
    274 
    275    struct util_dynarray global_residents;
    276 };
    277 
    278 static inline struct nvc0_context *
    279 nvc0_context(struct pipe_context *pipe)
    280 {
    281    return (struct nvc0_context *)pipe;
    282 }
    283 
    284 static inline unsigned
    285 nvc0_shader_stage(unsigned pipe)
    286 {
    287    switch (pipe) {
    288    case PIPE_SHADER_VERTEX: return 0;
    289    case PIPE_SHADER_TESS_CTRL: return 1;
    290    case PIPE_SHADER_TESS_EVAL: return 2;
    291    case PIPE_SHADER_GEOMETRY: return 3;
    292    case PIPE_SHADER_FRAGMENT: return 4;
    293    case PIPE_SHADER_COMPUTE: return 5;
    294    default:
    295       assert(!"invalid PIPE_SHADER type");
    296       return 0;
    297    }
    298 }
    299 
    300 
    301 /* nvc0_context.c */
    302 struct pipe_context *nvc0_create(struct pipe_screen *, void *, unsigned flags);
    303 void nvc0_bufctx_fence(struct nvc0_context *, struct nouveau_bufctx *,
    304                        bool on_flush);
    305 void nvc0_default_kick_notify(struct nouveau_pushbuf *);
    306 const void *nvc0_get_sample_locations(unsigned);
    307 
    308 /* nvc0_draw.c */
    309 extern struct draw_stage *nvc0_draw_render_stage(struct nvc0_context *);
    310 
    311 /* nvc0_program.c */
    312 bool nvc0_program_translate(struct nvc0_program *, uint16_t chipset,
    313                             struct pipe_debug_callback *);
    314 bool nvc0_program_upload(struct nvc0_context *, struct nvc0_program *);
    315 void nvc0_program_destroy(struct nvc0_context *, struct nvc0_program *);
    316 void nvc0_program_library_upload(struct nvc0_context *);
    317 uint32_t nvc0_program_symbol_offset(const struct nvc0_program *,
    318                                     uint32_t label);
    319 void nvc0_program_init_tcp_empty(struct nvc0_context *);
    320 
    321 /* nvc0_shader_state.c */
    322 void nvc0_vertprog_validate(struct nvc0_context *);
    323 void nvc0_tctlprog_validate(struct nvc0_context *);
    324 void nvc0_tevlprog_validate(struct nvc0_context *);
    325 void nvc0_gmtyprog_validate(struct nvc0_context *);
    326 void nvc0_fragprog_validate(struct nvc0_context *);
    327 void nvc0_compprog_validate(struct nvc0_context *);
    328 
    329 void nvc0_tfb_validate(struct nvc0_context *);
    330 void nvc0_layer_validate(struct nvc0_context *);
    331 
    332 /* nvc0_state.c */
    333 extern void nvc0_init_state_functions(struct nvc0_context *);
    334 
    335 /* nvc0_state_validate.c */
    336 struct nvc0_state_validate {
    337    void (*func)(struct nvc0_context *);
    338    uint32_t states;
    339 };
    340 
    341 bool nvc0_state_validate(struct nvc0_context *, uint32_t,
    342                          struct nvc0_state_validate *, int, uint32_t *,
    343                          struct nouveau_bufctx *);
    344 bool nvc0_state_validate_3d(struct nvc0_context *, uint32_t);
    345 
    346 /* nvc0_surface.c */
    347 extern void nvc0_clear(struct pipe_context *, unsigned buffers,
    348                        const union pipe_color_union *color,
    349                        double depth, unsigned stencil);
    350 extern void nvc0_init_surface_functions(struct nvc0_context *);
    351 
    352 /* nvc0_tex.c */
    353 bool nvc0_validate_tic(struct nvc0_context *nvc0, int s);
    354 bool nvc0_validate_tsc(struct nvc0_context *nvc0, int s);
    355 bool nve4_validate_tsc(struct nvc0_context *nvc0, int s);
    356 void nvc0_validate_suf(struct nvc0_context *nvc0, int s);
    357 void nvc0_validate_textures(struct nvc0_context *);
    358 void nvc0_validate_samplers(struct nvc0_context *);
    359 void nve4_set_tex_handles(struct nvc0_context *);
    360 void nvc0_validate_surfaces(struct nvc0_context *);
    361 void nve4_set_surface_info(struct nouveau_pushbuf *,
    362                            const struct pipe_image_view *,
    363                            struct nvc0_context *);
    364 void nvc0_mark_image_range_valid(const struct pipe_image_view *);
    365 bool nvc0_update_tic(struct nvc0_context *, struct nv50_tic_entry *,
    366                      struct nv04_resource *);
    367 
    368 struct pipe_sampler_view *
    369 nvc0_create_texture_view(struct pipe_context *,
    370                          struct pipe_resource *,
    371                          const struct pipe_sampler_view *,
    372                          uint32_t flags,
    373                          enum pipe_texture_target);
    374 struct pipe_sampler_view *
    375 nvc0_create_sampler_view(struct pipe_context *,
    376                          struct pipe_resource *,
    377                          const struct pipe_sampler_view *);
    378 struct pipe_sampler_view *
    379 gm107_create_texture_view_from_image(struct pipe_context *,
    380                                      const struct pipe_image_view *);
    381 
    382 void nvc0_init_bindless_functions(struct pipe_context *);
    383 
    384 /* nvc0_transfer.c */
    385 void
    386 nvc0_init_transfer_functions(struct nvc0_context *);
    387 
    388 void
    389 nvc0_m2mf_push_linear(struct nouveau_context *nv,
    390                       struct nouveau_bo *dst, unsigned offset, unsigned domain,
    391                       unsigned size, const void *data);
    392 void
    393 nve4_p2mf_push_linear(struct nouveau_context *nv,
    394                       struct nouveau_bo *dst, unsigned offset, unsigned domain,
    395                       unsigned size, const void *data);
    396 void
    397 nvc0_cb_bo_push(struct nouveau_context *,
    398                 struct nouveau_bo *bo, unsigned domain,
    399                 unsigned base, unsigned size,
    400                 unsigned offset, unsigned words, const uint32_t *data);
    401 
    402 /* nvc0_vbo.c */
    403 void nvc0_draw_vbo(struct pipe_context *, const struct pipe_draw_info *);
    404 
    405 void *
    406 nvc0_vertex_state_create(struct pipe_context *pipe,
    407                          unsigned num_elements,
    408                          const struct pipe_vertex_element *elements);
    409 void
    410 nvc0_vertex_state_delete(struct pipe_context *pipe, void *hwcso);
    411 
    412 void nvc0_vertex_arrays_validate(struct nvc0_context *);
    413 
    414 void nvc0_idxbuf_validate(struct nvc0_context *);
    415 
    416 /* nvc0_video.c */
    417 struct pipe_video_codec *
    418 nvc0_create_decoder(struct pipe_context *context,
    419                     const struct pipe_video_codec *templ);
    420 
    421 struct pipe_video_buffer *
    422 nvc0_video_buffer_create(struct pipe_context *pipe,
    423                          const struct pipe_video_buffer *templat);
    424 
    425 /* nvc0_push.c */
    426 void nvc0_push_vbo(struct nvc0_context *, const struct pipe_draw_info *);
    427 
    428 /* nve4_compute.c */
    429 void nve4_launch_grid(struct pipe_context *, const struct pipe_grid_info *);
    430 
    431 /* nvc0_compute.c */
    432 void nvc0_launch_grid(struct pipe_context *, const struct pipe_grid_info *);
    433 void nvc0_compute_validate_globals(struct nvc0_context *);
    434 
    435 #endif
    436