Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
5564 | serge | 1 | /* |
2 | * Copyright 2010 Jerome Glisse |
||
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 |
||
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 | |||
46 | #define SI_TRACE_CS 0 |
||
47 | #define SI_TRACE_CS_DWORDS 6 |
||
48 | |||
49 | #define SI_MAX_DRAW_CS_DWORDS \ |
||
50 | (/*scratch:*/ 3 + /*derived prim state:*/ 3 + \ |
||
51 | /*draw regs:*/ 16 + /*draw packets:*/ 31) |
||
52 | |||
53 | /* Instruction cache. */ |
||
54 | #define SI_CONTEXT_INV_ICACHE (R600_CONTEXT_PRIVATE_FLAG << 0) |
||
55 | /* Cache used by scalar memory (SMEM) instructions. They also use TC |
||
56 | * as a second level cache, which isn't flushed by this. |
||
57 | * Other names: constant cache, data cache, DCACHE */ |
||
58 | #define SI_CONTEXT_INV_KCACHE (R600_CONTEXT_PRIVATE_FLAG << 1) |
||
59 | /* Caches used by vector memory (VMEM) instructions. |
||
60 | * L1 can optionally be bypassed (GLC=1) and can only be used by shaders. |
||
61 | * L2 is used by shaders and can be used by other blocks (CP, sDMA). */ |
||
62 | #define SI_CONTEXT_INV_TC_L1 (R600_CONTEXT_PRIVATE_FLAG << 2) |
||
63 | #define SI_CONTEXT_INV_TC_L2 (R600_CONTEXT_PRIVATE_FLAG << 3) |
||
64 | /* Framebuffer caches. */ |
||
65 | #define SI_CONTEXT_FLUSH_AND_INV_CB_META (R600_CONTEXT_PRIVATE_FLAG << 4) |
||
66 | #define SI_CONTEXT_FLUSH_AND_INV_DB_META (R600_CONTEXT_PRIVATE_FLAG << 5) |
||
67 | #define SI_CONTEXT_FLUSH_AND_INV_DB (R600_CONTEXT_PRIVATE_FLAG << 6) |
||
68 | #define SI_CONTEXT_FLUSH_AND_INV_CB (R600_CONTEXT_PRIVATE_FLAG << 7) |
||
69 | /* Engine synchronization. */ |
||
70 | #define SI_CONTEXT_VS_PARTIAL_FLUSH (R600_CONTEXT_PRIVATE_FLAG << 8) |
||
71 | #define SI_CONTEXT_PS_PARTIAL_FLUSH (R600_CONTEXT_PRIVATE_FLAG << 9) |
||
72 | #define SI_CONTEXT_CS_PARTIAL_FLUSH (R600_CONTEXT_PRIVATE_FLAG << 10) |
||
73 | #define SI_CONTEXT_VGT_FLUSH (R600_CONTEXT_PRIVATE_FLAG << 11) |
||
74 | #define SI_CONTEXT_VGT_STREAMOUT_SYNC (R600_CONTEXT_PRIVATE_FLAG << 12) |
||
75 | /* Compute only. */ |
||
76 | #define SI_CONTEXT_FLUSH_WITH_INV_L2 (R600_CONTEXT_PRIVATE_FLAG << 13) /* TODO: merge with TC? */ |
||
77 | #define SI_CONTEXT_FLAG_COMPUTE (R600_CONTEXT_PRIVATE_FLAG << 14) |
||
78 | |||
79 | #define SI_CONTEXT_FLUSH_AND_INV_FRAMEBUFFER (SI_CONTEXT_FLUSH_AND_INV_CB | \ |
||
80 | SI_CONTEXT_FLUSH_AND_INV_CB_META | \ |
||
81 | SI_CONTEXT_FLUSH_AND_INV_DB | \ |
||
82 | SI_CONTEXT_FLUSH_AND_INV_DB_META) |
||
83 | |||
84 | struct si_compute; |
||
85 | |||
86 | struct si_screen { |
||
87 | struct r600_common_screen b; |
||
88 | }; |
||
89 | |||
90 | struct si_sampler_view { |
||
91 | struct pipe_sampler_view base; |
||
92 | struct list_head list; |
||
93 | struct r600_resource *resource; |
||
94 | /* [0..7] = image descriptor |
||
95 | * [4..7] = buffer descriptor */ |
||
96 | uint32_t state[8]; |
||
97 | uint32_t fmask_state[8]; |
||
98 | }; |
||
99 | |||
100 | struct si_sampler_state { |
||
101 | uint32_t val[4]; |
||
102 | uint32_t border_color[4]; |
||
103 | }; |
||
104 | |||
105 | struct si_cs_shader_state { |
||
106 | struct si_compute *program; |
||
107 | }; |
||
108 | |||
109 | struct si_textures_info { |
||
110 | struct si_sampler_views views; |
||
111 | struct si_sampler_states states; |
||
112 | uint32_t depth_texture_mask; /* which textures are depth */ |
||
113 | uint32_t compressed_colortex_mask; |
||
114 | }; |
||
115 | |||
116 | struct si_framebuffer { |
||
117 | struct r600_atom atom; |
||
118 | struct pipe_framebuffer_state state; |
||
119 | unsigned nr_samples; |
||
120 | unsigned log_samples; |
||
121 | unsigned cb0_is_integer; |
||
122 | unsigned compressed_cb_mask; |
||
123 | unsigned export_16bpc; |
||
124 | }; |
||
125 | |||
126 | #define SI_NUM_ATOMS(sctx) (sizeof((sctx)->atoms)/sizeof((sctx)->atoms.array[0])) |
||
127 | |||
128 | #define SI_NUM_SHADERS (PIPE_SHADER_GEOMETRY+1) |
||
129 | |||
130 | struct si_context { |
||
131 | struct r600_common_context b; |
||
132 | struct blitter_context *blitter; |
||
133 | void *custom_dsa_flush; |
||
134 | void *custom_blend_resolve; |
||
135 | void *custom_blend_decompress; |
||
136 | void *custom_blend_fastclear; |
||
137 | void *pstipple_sampler_state; |
||
138 | struct si_screen *screen; |
||
139 | struct si_pm4_state *init_config; |
||
140 | |||
141 | union { |
||
142 | struct { |
||
143 | /* The order matters. */ |
||
144 | struct r600_atom *vertex_buffers; |
||
145 | struct r600_atom *const_buffers[SI_NUM_SHADERS]; |
||
146 | struct r600_atom *rw_buffers[SI_NUM_SHADERS]; |
||
147 | struct r600_atom *sampler_views[SI_NUM_SHADERS]; |
||
148 | struct r600_atom *sampler_states[SI_NUM_SHADERS]; |
||
149 | /* Caches must be flushed after resource descriptors are |
||
150 | * updated in memory. */ |
||
151 | struct r600_atom *cache_flush; |
||
152 | struct r600_atom *streamout_begin; |
||
153 | struct r600_atom *streamout_enable; /* must be after streamout_begin */ |
||
154 | struct r600_atom *framebuffer; |
||
155 | struct r600_atom *msaa_sample_locs; |
||
156 | struct r600_atom *db_render_state; |
||
157 | struct r600_atom *msaa_config; |
||
158 | struct r600_atom *clip_regs; |
||
159 | } s; |
||
160 | struct r600_atom *array[0]; |
||
161 | } atoms; |
||
162 | |||
163 | struct si_framebuffer framebuffer; |
||
164 | struct si_vertex_element *vertex_elements; |
||
165 | /* for saving when using blitter */ |
||
166 | struct pipe_stencil_ref stencil_ref; |
||
167 | /* shaders */ |
||
168 | struct si_shader_selector *ps_shader; |
||
169 | struct si_shader_selector *gs_shader; |
||
170 | struct si_shader_selector *vs_shader; |
||
171 | struct si_cs_shader_state cs_shader_state; |
||
172 | /* shader information */ |
||
173 | unsigned sprite_coord_enable; |
||
174 | bool flatshade; |
||
175 | struct si_descriptors vertex_buffers; |
||
176 | struct si_buffer_resources const_buffers[SI_NUM_SHADERS]; |
||
177 | struct si_buffer_resources rw_buffers[SI_NUM_SHADERS]; |
||
178 | struct si_textures_info samplers[SI_NUM_SHADERS]; |
||
179 | struct r600_resource *scratch_buffer; |
||
180 | struct r600_resource *border_color_table; |
||
181 | unsigned border_color_offset; |
||
182 | |||
183 | struct r600_atom clip_regs; |
||
184 | struct r600_atom msaa_sample_locs; |
||
185 | struct r600_atom msaa_config; |
||
186 | int ps_iter_samples; |
||
187 | bool smoothing_enabled; |
||
188 | |||
189 | /* Vertex and index buffers. */ |
||
190 | bool vertex_buffers_dirty; |
||
191 | struct pipe_index_buffer index_buffer; |
||
192 | struct pipe_vertex_buffer vertex_buffer[SI_NUM_VERTEX_BUFFERS]; |
||
193 | |||
194 | /* With rasterizer discard, there doesn't have to be a pixel shader. |
||
195 | * In that case, we bind this one: */ |
||
196 | void *dummy_pixel_shader; |
||
197 | struct si_pm4_state *gs_on; |
||
198 | struct si_pm4_state *gs_off; |
||
199 | struct si_pm4_state *gs_rings; |
||
200 | struct r600_atom cache_flush; |
||
201 | struct pipe_constant_buffer null_const_buf; /* used for set_constant_buffer(NULL) on CIK */ |
||
202 | struct pipe_resource *esgs_ring; |
||
203 | struct pipe_resource *gsvs_ring; |
||
204 | |||
205 | LLVMTargetMachineRef tm; |
||
206 | |||
207 | /* SI state handling */ |
||
208 | union si_state queued; |
||
209 | union si_state emitted; |
||
210 | |||
211 | /* DB render state. */ |
||
212 | struct r600_atom db_render_state; |
||
213 | bool dbcb_depth_copy_enabled; |
||
214 | bool dbcb_stencil_copy_enabled; |
||
215 | unsigned dbcb_copy_sample; |
||
216 | bool db_inplace_flush_enabled; |
||
217 | bool db_depth_clear; |
||
218 | bool db_depth_disable_expclear; |
||
219 | unsigned ps_db_shader_control; |
||
220 | |||
221 | /* Draw state. */ |
||
222 | int last_base_vertex; |
||
223 | int last_start_instance; |
||
224 | int last_sh_base_reg; |
||
225 | int last_primitive_restart_en; |
||
226 | int last_restart_index; |
||
227 | int last_gs_out_prim; |
||
228 | int last_prim; |
||
229 | int last_multi_vgt_param; |
||
230 | int last_rast_prim; |
||
231 | unsigned last_sc_line_stipple; |
||
232 | int current_rast_prim; /* primitive type after TES, GS */ |
||
233 | |||
234 | /* Scratch buffer */ |
||
235 | boolean emit_scratch_reloc; |
||
236 | unsigned scratch_waves; |
||
237 | unsigned spi_tmpring_size; |
||
238 | }; |
||
239 | |||
240 | /* si_blit.c */ |
||
241 | void si_init_blit_functions(struct si_context *sctx); |
||
242 | void si_flush_depth_textures(struct si_context *sctx, |
||
243 | struct si_textures_info *textures); |
||
244 | void si_decompress_color_textures(struct si_context *sctx, |
||
245 | struct si_textures_info *textures); |
||
246 | void si_resource_copy_region(struct pipe_context *ctx, |
||
247 | struct pipe_resource *dst, |
||
248 | unsigned dst_level, |
||
249 | unsigned dstx, unsigned dsty, unsigned dstz, |
||
250 | struct pipe_resource *src, |
||
251 | unsigned src_level, |
||
252 | const struct pipe_box *src_box); |
||
253 | |||
254 | /* si_dma.c */ |
||
255 | void si_dma_copy(struct pipe_context *ctx, |
||
256 | struct pipe_resource *dst, |
||
257 | unsigned dst_level, |
||
258 | unsigned dstx, unsigned dsty, unsigned dstz, |
||
259 | struct pipe_resource *src, |
||
260 | unsigned src_level, |
||
261 | const struct pipe_box *src_box); |
||
262 | |||
263 | /* si_hw_context.c */ |
||
264 | void si_context_gfx_flush(void *context, unsigned flags, |
||
265 | struct pipe_fence_handle **fence); |
||
266 | void si_begin_new_cs(struct si_context *ctx); |
||
267 | void si_need_cs_space(struct si_context *ctx, unsigned num_dw, boolean count_draw_in); |
||
268 | |||
269 | #if SI_TRACE_CS |
||
270 | void si_trace_emit(struct si_context *sctx); |
||
271 | #endif |
||
272 | |||
273 | /* si_compute.c */ |
||
274 | void si_init_compute_functions(struct si_context *sctx); |
||
275 | |||
276 | /* si_uvd.c */ |
||
277 | struct pipe_video_codec *si_uvd_create_decoder(struct pipe_context *context, |
||
278 | const struct pipe_video_codec *templ); |
||
279 | |||
280 | struct pipe_video_buffer *si_video_buffer_create(struct pipe_context *pipe, |
||
281 | const struct pipe_video_buffer *tmpl); |
||
282 | |||
283 | /* |
||
284 | * common helpers |
||
285 | */ |
||
286 | |||
287 | static INLINE struct r600_resource * |
||
288 | si_resource_create_custom(struct pipe_screen *screen, |
||
289 | unsigned usage, unsigned size) |
||
290 | { |
||
291 | assert(size); |
||
292 | return r600_resource(pipe_buffer_create(screen, |
||
293 | PIPE_BIND_CUSTOM, usage, size)); |
||
294 | } |
||
295 | |||
296 | static INLINE void |
||
297 | si_invalidate_draw_sh_constants(struct si_context *sctx) |
||
298 | { |
||
299 | sctx->last_base_vertex = SI_BASE_VERTEX_UNKNOWN; |
||
300 | sctx->last_start_instance = -1; /* reset to an unknown value */ |
||
301 | sctx->last_sh_base_reg = -1; /* reset to an unknown value */ |
||
302 | } |
||
303 | |||
304 | #endif><>><>><>><>><>><>><>><>><>><>><>><>><>><>><> |