OSDN Git Service

radeonsi: rework polygon stippling to use constant buffer instead of texture
[android-x86/external-mesa.git] / src / gallium / drivers / radeonsi / si_pipe.h
1 /*
2  * Copyright 2010 Jerome Glisse <glisse@freedesktop.org>
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * on the rights to use, copy, modify, merge, publish, distribute, sub
8  * license, and/or sell copies of the Software, and to permit persons to whom
9  * the Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice (including the next
12  * paragraph) shall be included in all copies or substantial portions of the
13  * Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
18  * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
19  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
20  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
21  * USE OR OTHER DEALINGS IN THE SOFTWARE.
22  *
23  * Authors:
24  *      Jerome Glisse
25  */
26 #ifndef SI_PIPE_H
27 #define SI_PIPE_H
28
29 #include "si_state.h"
30
31 #include <llvm-c/TargetMachine.h>
32
33 #ifdef PIPE_ARCH_BIG_ENDIAN
34 #define SI_BIG_ENDIAN 1
35 #else
36 #define SI_BIG_ENDIAN 0
37 #endif
38
39 /* The base vertex and primitive restart can be any number, but we must pick
40  * one which will mean "unknown" for the purpose of state tracking and
41  * the number shouldn't be a commonly-used one. */
42 #define SI_BASE_VERTEX_UNKNOWN INT_MIN
43 #define SI_RESTART_INDEX_UNKNOWN INT_MIN
44 #define SI_NUM_SMOOTH_AA_SAMPLES 8
45 #define SI_GS_PER_ES 128
46
47 /* Instruction cache. */
48 #define SI_CONTEXT_INV_ICACHE           (R600_CONTEXT_PRIVATE_FLAG << 0)
49 /* SMEM L1, other names: KCACHE, constant cache, DCACHE, data cache */
50 #define SI_CONTEXT_INV_SMEM_L1          (R600_CONTEXT_PRIVATE_FLAG << 1)
51 /* VMEM L1 can optionally be bypassed (GLC=1). Other names: TC L1 */
52 #define SI_CONTEXT_INV_VMEM_L1          (R600_CONTEXT_PRIVATE_FLAG << 2)
53 /* Used by everything except CB/DB, can be bypassed (SLC=1). Other names: TC L2 */
54 #define SI_CONTEXT_INV_GLOBAL_L2        (R600_CONTEXT_PRIVATE_FLAG << 3)
55 /* Framebuffer caches. */
56 #define SI_CONTEXT_FLUSH_AND_INV_CB_META (R600_CONTEXT_PRIVATE_FLAG << 4)
57 #define SI_CONTEXT_FLUSH_AND_INV_DB_META (R600_CONTEXT_PRIVATE_FLAG << 5)
58 #define SI_CONTEXT_FLUSH_AND_INV_DB     (R600_CONTEXT_PRIVATE_FLAG << 6)
59 #define SI_CONTEXT_FLUSH_AND_INV_CB     (R600_CONTEXT_PRIVATE_FLAG << 7)
60 /* Engine synchronization. */
61 #define SI_CONTEXT_VS_PARTIAL_FLUSH     (R600_CONTEXT_PRIVATE_FLAG << 8)
62 #define SI_CONTEXT_PS_PARTIAL_FLUSH     (R600_CONTEXT_PRIVATE_FLAG << 9)
63 #define SI_CONTEXT_CS_PARTIAL_FLUSH     (R600_CONTEXT_PRIVATE_FLAG << 10)
64 #define SI_CONTEXT_VGT_FLUSH            (R600_CONTEXT_PRIVATE_FLAG << 11)
65 #define SI_CONTEXT_VGT_STREAMOUT_SYNC   (R600_CONTEXT_PRIVATE_FLAG << 12)
66
67 #define SI_CONTEXT_FLUSH_AND_INV_FRAMEBUFFER (SI_CONTEXT_FLUSH_AND_INV_CB | \
68                                               SI_CONTEXT_FLUSH_AND_INV_CB_META | \
69                                               SI_CONTEXT_FLUSH_AND_INV_DB | \
70                                               SI_CONTEXT_FLUSH_AND_INV_DB_META)
71
72 #define SI_ENCODE_TRACE_POINT(id)       (0xcafe0000 | ((id) & 0xffff))
73 #define SI_IS_TRACE_POINT(x)            (((x) & 0xcafe0000) == 0xcafe0000)
74 #define SI_GET_TRACE_POINT_ID(x)        ((x) & 0xffff)
75
76 #define SI_MAX_BORDER_COLORS    4096
77
78 struct si_compute;
79 struct hash_table;
80 struct u_suballocator;
81
82 struct si_screen {
83         struct r600_common_screen       b;
84         unsigned                        gs_table_depth;
85
86         /* Whether shaders are monolithic (1-part) or separate (3-part). */
87         bool                            use_monolithic_shaders;
88
89         pipe_mutex                      shader_parts_mutex;
90         struct si_shader_part           *vs_prologs;
91         struct si_shader_part           *vs_epilogs;
92         struct si_shader_part           *tcs_epilogs;
93         struct si_shader_part           *ps_prologs;
94         struct si_shader_part           *ps_epilogs;
95
96         /* Shader cache in memory.
97          *
98          * Design & limitations:
99          * - The shader cache is per screen (= per process), never saved to
100          *   disk, and skips redundant shader compilations from TGSI to bytecode.
101          * - It can only be used with one-variant-per-shader support, in which
102          *   case only the main (typically middle) part of shaders is cached.
103          * - Only VS, TCS, TES, PS are cached, out of which only the hw VS
104          *   variants of VS and TES are cached, so LS and ES aren't.
105          * - GS and CS aren't cached, but it's certainly possible to cache
106          *   those as well.
107          */
108         pipe_mutex                      shader_cache_mutex;
109         struct hash_table               *shader_cache;
110 };
111
112 struct si_blend_color {
113         struct r600_atom                atom;
114         struct pipe_blend_color         state;
115 };
116
117 struct si_sampler_view {
118         struct pipe_sampler_view        base;
119         struct list_head                list;
120         /* [0..7] = image descriptor
121          * [4..7] = buffer descriptor */
122         uint32_t                        state[8];
123         uint32_t                        fmask_state[8];
124         bool is_stencil_sampler;
125 };
126
127 struct si_sampler_state {
128         uint32_t                        val[4];
129 };
130
131 struct si_cs_shader_state {
132         struct si_compute               *program;
133         struct si_compute               *emitted_program;
134         unsigned                        offset;
135         bool                            initialized;
136 };
137
138 struct si_textures_info {
139         struct si_sampler_views         views;
140         uint64_t                        depth_texture_mask; /* which textures are depth */
141         uint64_t                        compressed_colortex_mask;
142 };
143
144 struct si_images_info {
145         struct si_descriptors           desc;
146         struct pipe_image_view          views[SI_NUM_IMAGES];
147         uint32_t                        compressed_colortex_mask;
148 };
149
150 struct si_framebuffer {
151         struct r600_atom                atom;
152         struct pipe_framebuffer_state   state;
153         unsigned                        nr_samples;
154         unsigned                        log_samples;
155         unsigned                        cb0_is_integer;
156         unsigned                        compressed_cb_mask;
157         unsigned                        spi_shader_col_format;
158         unsigned                        spi_shader_col_format_alpha;
159         unsigned                        spi_shader_col_format_blend;
160         unsigned                        spi_shader_col_format_blend_alpha;
161         unsigned                        color_is_int8; /* bitmask */
162         unsigned                        dirty_cbufs;
163         bool                            dirty_zsbuf;
164 };
165
166 struct si_clip_state {
167         struct r600_atom                atom;
168         struct pipe_clip_state          state;
169 };
170
171 struct si_sample_mask {
172         struct r600_atom        atom;
173         uint16_t                sample_mask;
174 };
175
176 /* A shader state consists of the shader selector, which is a constant state
177  * object shared by multiple contexts and shouldn't be modified, and
178  * the current shader variant selected for this context.
179  */
180 struct si_shader_ctx_state {
181         struct si_shader_selector       *cso;
182         struct si_shader                *current;
183 };
184
185 struct si_context {
186         struct r600_common_context      b;
187         struct blitter_context          *blitter;
188         void                            *custom_dsa_flush;
189         void                            *custom_blend_resolve;
190         void                            *custom_blend_decompress;
191         void                            *custom_blend_fastclear;
192         void                            *custom_blend_dcc_decompress;
193         struct si_screen                *screen;
194
195         struct radeon_winsys_cs         *ce_ib;
196         struct radeon_winsys_cs         *ce_preamble_ib;
197         bool                            ce_need_synchronization;
198         struct u_suballocator           *ce_suballocator;
199
200         struct pipe_fence_handle        *last_gfx_fence;
201         struct si_shader_ctx_state      fixed_func_tcs_shader;
202         LLVMTargetMachineRef            tm;
203         bool                            gfx_flush_in_progress;
204
205         /* Atoms (direct states). */
206         union si_state_atoms            atoms;
207         unsigned                        dirty_atoms; /* mask */
208         /* PM4 states (precomputed immutable states) */
209         union si_state                  queued;
210         union si_state                  emitted;
211
212         /* Atom declarations. */
213         struct r600_atom                cache_flush;
214         struct si_framebuffer           framebuffer;
215         struct r600_atom                msaa_sample_locs;
216         struct r600_atom                db_render_state;
217         struct r600_atom                msaa_config;
218         struct si_sample_mask           sample_mask;
219         struct r600_atom                cb_render_state;
220         struct si_blend_color           blend_color;
221         struct r600_atom                clip_regs;
222         struct si_clip_state            clip_state;
223         struct si_shader_data           shader_userdata;
224         struct si_stencil_ref           stencil_ref;
225         struct r600_atom                spi_map;
226
227         /* Precomputed states. */
228         struct si_pm4_state             *init_config;
229         struct si_pm4_state             *init_config_gs_rings;
230         bool                            init_config_has_vgt_flush;
231         struct si_pm4_state             *vgt_shader_config[4];
232
233         /* shaders */
234         struct si_shader_ctx_state      ps_shader;
235         struct si_shader_ctx_state      gs_shader;
236         struct si_shader_ctx_state      vs_shader;
237         struct si_shader_ctx_state      tcs_shader;
238         struct si_shader_ctx_state      tes_shader;
239         struct si_cs_shader_state       cs_shader_state;
240
241         /* shader information */
242         struct si_vertex_element        *vertex_elements;
243         unsigned                        sprite_coord_enable;
244         bool                            flatshade;
245
246         /* shader descriptors */
247         struct si_descriptors           vertex_buffers;
248         struct si_buffer_resources      rw_buffers;
249         struct si_buffer_resources      const_buffers[SI_NUM_SHADERS];
250         struct si_buffer_resources      shader_buffers[SI_NUM_SHADERS];
251         struct si_textures_info         samplers[SI_NUM_SHADERS];
252         struct si_images_info           images[SI_NUM_SHADERS];
253
254         /* other shader resources */
255         struct pipe_constant_buffer     null_const_buf; /* used for set_constant_buffer(NULL) on CIK */
256         struct pipe_resource            *esgs_ring;
257         struct pipe_resource            *gsvs_ring;
258         struct pipe_resource            *tf_ring;
259         union pipe_color_union          *border_color_table; /* in CPU memory, any endian */
260         struct r600_resource            *border_color_buffer;
261         union pipe_color_union          *border_color_map; /* in VRAM (slow access), little endian */
262         unsigned                        border_color_count;
263
264         /* Vertex and index buffers. */
265         bool                            vertex_buffers_dirty;
266         struct pipe_index_buffer        index_buffer;
267         struct pipe_vertex_buffer       vertex_buffer[SI_NUM_VERTEX_BUFFERS];
268
269         /* MSAA config state. */
270         int                             ps_iter_samples;
271         bool                            smoothing_enabled;
272
273         /* DB render state. */
274         bool                    dbcb_depth_copy_enabled;
275         bool                    dbcb_stencil_copy_enabled;
276         unsigned                dbcb_copy_sample;
277         bool                    db_flush_depth_inplace;
278         bool                    db_flush_stencil_inplace;
279         bool                    db_depth_clear;
280         bool                    db_depth_disable_expclear;
281         bool                    db_stencil_clear;
282         bool                    db_stencil_disable_expclear;
283         unsigned                ps_db_shader_control;
284         bool                    occlusion_queries_disabled;
285
286         /* Emitted draw state. */
287         int                     last_base_vertex;
288         int                     last_start_instance;
289         int                     last_sh_base_reg;
290         int                     last_primitive_restart_en;
291         int                     last_restart_index;
292         int                     last_gs_out_prim;
293         int                     last_prim;
294         int                     last_multi_vgt_param;
295         int                     last_ls_hs_config;
296         int                     last_rast_prim;
297         unsigned                last_sc_line_stipple;
298         int                     current_rast_prim; /* primitive type after TES, GS */
299         unsigned                last_gsvs_itemsize;
300
301         /* Scratch buffer */
302         struct r600_resource    *scratch_buffer;
303         boolean                 emit_scratch_reloc;
304         unsigned                scratch_waves;
305         unsigned                spi_tmpring_size;
306
307         struct r600_resource    *compute_scratch_buffer;
308
309         /* Emitted derived tessellation state. */
310         struct si_shader        *last_ls; /* local shader (VS) */
311         struct si_shader_selector *last_tcs;
312         int                     last_num_tcs_input_cp;
313         int                     last_tes_sh_base;
314
315         /* Debug state. */
316         bool                    is_debug;
317         uint32_t                *last_ib;
318         unsigned                last_ib_dw_size;
319         struct r600_resource    *last_trace_buf;
320         struct r600_resource    *trace_buf;
321         unsigned                trace_id;
322         uint64_t                dmesg_timestamp;
323         unsigned                last_bo_count;
324         struct radeon_bo_list_item *last_bo_list;
325 };
326
327 /* cik_sdma.c */
328 void cik_sdma_copy(struct pipe_context *ctx,
329                    struct pipe_resource *dst,
330                    unsigned dst_level,
331                    unsigned dstx, unsigned dsty, unsigned dstz,
332                    struct pipe_resource *src,
333                    unsigned src_level,
334                    const struct pipe_box *src_box);
335
336 /* si_blit.c */
337 void si_init_blit_functions(struct si_context *sctx);
338 void si_decompress_graphics_textures(struct si_context *sctx);
339 void si_decompress_compute_textures(struct si_context *sctx);
340 void si_resource_copy_region(struct pipe_context *ctx,
341                              struct pipe_resource *dst,
342                              unsigned dst_level,
343                              unsigned dstx, unsigned dsty, unsigned dstz,
344                              struct pipe_resource *src,
345                              unsigned src_level,
346                              const struct pipe_box *src_box);
347
348 /* si_cp_dma.c */
349 void si_copy_buffer(struct si_context *sctx,
350                     struct pipe_resource *dst, struct pipe_resource *src,
351                     uint64_t dst_offset, uint64_t src_offset, unsigned size,
352                     bool is_framebuffer);
353 void si_init_cp_dma_functions(struct si_context *sctx);
354
355 /* si_debug.c */
356 void si_init_debug_functions(struct si_context *sctx);
357 void si_check_vm_faults(struct si_context *sctx);
358 bool si_replace_shader(unsigned num, struct radeon_shader_binary *binary);
359
360 /* si_dma.c */
361 void si_dma_copy(struct pipe_context *ctx,
362                  struct pipe_resource *dst,
363                  unsigned dst_level,
364                  unsigned dstx, unsigned dsty, unsigned dstz,
365                  struct pipe_resource *src,
366                  unsigned src_level,
367                  const struct pipe_box *src_box);
368
369 /* si_hw_context.c */
370 void si_context_gfx_flush(void *context, unsigned flags,
371                           struct pipe_fence_handle **fence);
372 void si_begin_new_cs(struct si_context *ctx);
373 void si_need_cs_space(struct si_context *ctx);
374
375 /* si_compute.c */
376 void si_init_compute_functions(struct si_context *sctx);
377
378 /* si_perfcounters.c */
379 void si_init_perfcounters(struct si_screen *screen);
380
381 /* si_uvd.c */
382 struct pipe_video_codec *si_uvd_create_decoder(struct pipe_context *context,
383                                                const struct pipe_video_codec *templ);
384
385 struct pipe_video_buffer *si_video_buffer_create(struct pipe_context *pipe,
386                                                  const struct pipe_video_buffer *tmpl);
387
388 /*
389  * common helpers
390  */
391
392 static inline struct r600_resource *
393 si_resource_create_custom(struct pipe_screen *screen,
394                           unsigned usage, unsigned size)
395 {
396         assert(size);
397         return r600_resource(pipe_buffer_create(screen,
398                 PIPE_BIND_CUSTOM, usage, size));
399 }
400
401 static inline void
402 si_invalidate_draw_sh_constants(struct si_context *sctx)
403 {
404         sctx->last_base_vertex = SI_BASE_VERTEX_UNKNOWN;
405         sctx->last_start_instance = -1; /* reset to an unknown value */
406         sctx->last_sh_base_reg = -1; /* reset to an unknown value */
407 }
408
409 static inline void
410 si_set_atom_dirty(struct si_context *sctx,
411                   struct r600_atom *atom, bool dirty)
412 {
413         unsigned bit = 1 << (atom->id - 1);
414
415         if (dirty)
416                 sctx->dirty_atoms |= bit;
417         else
418                 sctx->dirty_atoms &= ~bit;
419 }
420
421 static inline bool
422 si_is_atom_dirty(struct si_context *sctx,
423                   struct r600_atom *atom)
424 {
425         unsigned bit = 1 << (atom->id - 1);
426
427         return sctx->dirty_atoms & bit;
428 }
429
430 static inline void
431 si_mark_atom_dirty(struct si_context *sctx,
432                    struct r600_atom *atom)
433 {
434         si_set_atom_dirty(sctx, atom, true);
435 }
436
437 #endif