1 /* 2 * Copyright 2012 Advanced Micro Devices, Inc. 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 * Christian Knig <christian.koenig (at) amd.com> 25 */ 26 27 #ifndef SI_STATE_H 28 #define SI_STATE_H 29 30 #include "si_pm4.h" 31 #include "radeon/r600_pipe_common.h" 32 33 #define SI_NUM_GRAPHICS_SHADERS (PIPE_SHADER_TESS_EVAL+1) 34 #define SI_NUM_SHADERS (PIPE_SHADER_COMPUTE+1) 35 36 #define SI_MAX_ATTRIBS 16 37 #define SI_NUM_VERTEX_BUFFERS SI_MAX_ATTRIBS 38 #define SI_NUM_SAMPLERS 32 /* OpenGL textures units per shader */ 39 #define SI_NUM_CONST_BUFFERS 16 40 #define SI_NUM_IMAGES 16 41 #define SI_NUM_SHADER_BUFFERS 16 42 43 struct si_screen; 44 struct si_shader; 45 46 struct si_state_blend { 47 struct si_pm4_state pm4; 48 uint32_t cb_target_mask; 49 bool alpha_to_coverage; 50 bool alpha_to_one; 51 bool dual_src_blend; 52 /* Set 0xf or 0x0 (4 bits) per render target if the following is 53 * true. ANDed with spi_shader_col_format. 54 */ 55 unsigned blend_enable_4bit; 56 unsigned need_src_alpha_4bit; 57 }; 58 59 struct si_state_rasterizer { 60 struct si_pm4_state pm4; 61 /* poly offset states for 16-bit, 24-bit, and 32-bit zbuffers */ 62 struct si_pm4_state pm4_poly_offset[3]; 63 bool flatshade; 64 bool two_side; 65 bool multisample_enable; 66 bool force_persample_interp; 67 bool line_stipple_enable; 68 unsigned sprite_coord_enable; 69 unsigned pa_sc_line_stipple; 70 unsigned pa_cl_clip_cntl; 71 unsigned clip_plane_enable; 72 bool poly_stipple_enable; 73 bool line_smooth; 74 bool poly_smooth; 75 bool uses_poly_offset; 76 bool clamp_fragment_color; 77 bool rasterizer_discard; 78 bool scissor_enable; 79 bool clip_halfz; 80 }; 81 82 struct si_dsa_stencil_ref_part { 83 uint8_t valuemask[2]; 84 uint8_t writemask[2]; 85 }; 86 87 struct si_state_dsa { 88 struct si_pm4_state pm4; 89 unsigned alpha_func; 90 struct si_dsa_stencil_ref_part stencil_ref; 91 }; 92 93 struct si_stencil_ref { 94 struct r600_atom atom; 95 struct pipe_stencil_ref state; 96 struct si_dsa_stencil_ref_part dsa_part; 97 }; 98 99 struct si_vertex_element 100 { 101 unsigned count; 102 unsigned first_vb_use_mask; 103 104 /* Two bits per attribute indicating the size of each vector component 105 * in bytes if the size 3-workaround must be applied. 106 */ 107 uint32_t fix_size3; 108 uint64_t fix_fetch; 109 110 uint32_t rsrc_word3[SI_MAX_ATTRIBS]; 111 uint32_t format_size[SI_MAX_ATTRIBS]; 112 struct pipe_vertex_element elements[SI_MAX_ATTRIBS]; 113 }; 114 115 union si_state { 116 struct { 117 struct si_state_blend *blend; 118 struct si_state_rasterizer *rasterizer; 119 struct si_state_dsa *dsa; 120 struct si_pm4_state *poly_offset; 121 struct si_pm4_state *ls; 122 struct si_pm4_state *hs; 123 struct si_pm4_state *es; 124 struct si_pm4_state *gs; 125 struct si_pm4_state *vgt_shader_config; 126 struct si_pm4_state *vs; 127 struct si_pm4_state *ps; 128 } named; 129 struct si_pm4_state *array[0]; 130 }; 131 132 union si_state_atoms { 133 struct { 134 /* The order matters. */ 135 struct r600_atom *render_cond; 136 struct r600_atom *streamout_begin; 137 struct r600_atom *streamout_enable; /* must be after streamout_begin */ 138 struct r600_atom *framebuffer; 139 struct r600_atom *msaa_sample_locs; 140 struct r600_atom *db_render_state; 141 struct r600_atom *msaa_config; 142 struct r600_atom *sample_mask; 143 struct r600_atom *cb_render_state; 144 struct r600_atom *blend_color; 145 struct r600_atom *clip_regs; 146 struct r600_atom *clip_state; 147 struct r600_atom *shader_userdata; 148 struct r600_atom *scissors; 149 struct r600_atom *viewports; 150 struct r600_atom *stencil_ref; 151 struct r600_atom *spi_map; 152 } s; 153 struct r600_atom *array[0]; 154 }; 155 156 #define SI_NUM_ATOMS (sizeof(union si_state_atoms)/sizeof(struct r600_atom*)) 157 158 struct si_shader_data { 159 struct r600_atom atom; 160 uint32_t sh_base[SI_NUM_SHADERS]; 161 }; 162 163 /* Private read-write buffer slots. */ 164 enum { 165 SI_HS_RING_TESS_FACTOR, 166 SI_HS_RING_TESS_OFFCHIP, 167 168 SI_ES_RING_ESGS, 169 SI_GS_RING_ESGS, 170 171 SI_RING_GSVS, 172 173 SI_VS_STREAMOUT_BUF0, 174 SI_VS_STREAMOUT_BUF1, 175 SI_VS_STREAMOUT_BUF2, 176 SI_VS_STREAMOUT_BUF3, 177 178 SI_HS_CONST_DEFAULT_TESS_LEVELS, 179 SI_VS_CONST_CLIP_PLANES, 180 SI_PS_CONST_POLY_STIPPLE, 181 SI_PS_CONST_SAMPLE_POSITIONS, 182 183 SI_NUM_RW_BUFFERS, 184 }; 185 186 /* Indices into sctx->descriptors, laid out so that gfx and compute pipelines 187 * are contiguous: 188 * 189 * 0 - rw buffers 190 * 1 - vertex const buffers 191 * 2 - vertex shader buffers 192 * ... 193 * 5 - fragment const buffers 194 * ... 195 * 21 - compute const buffers 196 * ... 197 */ 198 #define SI_SHADER_DESCS_CONST_BUFFERS 0 199 #define SI_SHADER_DESCS_SHADER_BUFFERS 1 200 #define SI_SHADER_DESCS_SAMPLERS 2 201 #define SI_SHADER_DESCS_IMAGES 3 202 #define SI_NUM_SHADER_DESCS 4 203 204 #define SI_DESCS_RW_BUFFERS 0 205 #define SI_DESCS_FIRST_SHADER 1 206 #define SI_DESCS_FIRST_COMPUTE (SI_DESCS_FIRST_SHADER + \ 207 PIPE_SHADER_COMPUTE * SI_NUM_SHADER_DESCS) 208 #define SI_NUM_DESCS (SI_DESCS_FIRST_SHADER + \ 209 SI_NUM_SHADERS * SI_NUM_SHADER_DESCS) 210 211 /* This represents descriptors in memory, such as buffer resources, 212 * image resources, and sampler states. 213 */ 214 struct si_descriptors { 215 /* The list of descriptors in malloc'd memory. */ 216 uint32_t *list; 217 /* The list in mapped GPU memory. */ 218 uint32_t *gpu_list; 219 /* The size of one descriptor. */ 220 unsigned element_dw_size; 221 /* The maximum number of descriptors. */ 222 unsigned num_elements; 223 224 /* The buffer where the descriptors have been uploaded. */ 225 struct r600_resource *buffer; 226 unsigned buffer_offset; 227 228 /* Offset in CE RAM */ 229 unsigned ce_offset; 230 231 /* elements of the list that are changed and need to be uploaded */ 232 unsigned dirty_mask; 233 234 /* Whether the CE ram is dirty and needs to be reinitialized entirely 235 * before we can do partial updates. */ 236 bool ce_ram_dirty; 237 238 /* The shader userdata offset within a shader where the 64-bit pointer to the descriptor 239 * array will be stored. */ 240 unsigned shader_userdata_offset; 241 }; 242 243 struct si_sampler_views { 244 struct pipe_sampler_view *views[SI_NUM_SAMPLERS]; 245 struct si_sampler_state *sampler_states[SI_NUM_SAMPLERS]; 246 247 /* The i-th bit is set if that element is enabled (non-NULL resource). */ 248 unsigned enabled_mask; 249 }; 250 251 struct si_buffer_resources { 252 enum radeon_bo_usage shader_usage; /* READ, WRITE, or READWRITE */ 253 enum radeon_bo_priority priority; 254 struct pipe_resource **buffers; /* this has num_buffers elements */ 255 256 /* The i-th bit is set if that element is enabled (non-NULL resource). */ 257 unsigned enabled_mask; 258 }; 259 260 #define si_pm4_block_idx(member) \ 261 (offsetof(union si_state, named.member) / sizeof(struct si_pm4_state *)) 262 263 #define si_pm4_state_changed(sctx, member) \ 264 ((sctx)->queued.named.member != (sctx)->emitted.named.member) 265 266 #define si_pm4_bind_state(sctx, member, value) \ 267 do { \ 268 (sctx)->queued.named.member = (value); \ 269 } while(0) 270 271 #define si_pm4_delete_state(sctx, member, value) \ 272 do { \ 273 if ((sctx)->queued.named.member == (value)) { \ 274 (sctx)->queued.named.member = NULL; \ 275 } \ 276 si_pm4_free_state(sctx, (struct si_pm4_state *)(value), \ 277 si_pm4_block_idx(member)); \ 278 } while(0) 279 280 /* si_descriptors.c */ 281 void si_ce_reinitialize_all_descriptors(struct si_context *sctx); 282 void si_ce_enable_loads(struct radeon_winsys_cs *ib); 283 void si_set_mutable_tex_desc_fields(struct r600_texture *tex, 284 const struct radeon_surf_level *base_level_info, 285 unsigned base_level, unsigned first_level, 286 unsigned block_width, bool is_stencil, 287 uint32_t *state); 288 void si_get_pipe_constant_buffer(struct si_context *sctx, uint shader, 289 uint slot, struct pipe_constant_buffer *cbuf); 290 void si_get_shader_buffers(struct si_context *sctx, uint shader, 291 uint start_slot, uint count, 292 struct pipe_shader_buffer *sbuf); 293 void si_set_ring_buffer(struct pipe_context *ctx, uint slot, 294 struct pipe_resource *buffer, 295 unsigned stride, unsigned num_records, 296 bool add_tid, bool swizzle, 297 unsigned element_size, unsigned index_stride, uint64_t offset); 298 void si_init_all_descriptors(struct si_context *sctx); 299 bool si_upload_vertex_buffer_descriptors(struct si_context *sctx); 300 bool si_upload_graphics_shader_descriptors(struct si_context *sctx); 301 bool si_upload_compute_shader_descriptors(struct si_context *sctx); 302 void si_release_all_descriptors(struct si_context *sctx); 303 void si_all_descriptors_begin_new_cs(struct si_context *sctx); 304 void si_upload_const_buffer(struct si_context *sctx, struct r600_resource **rbuffer, 305 const uint8_t *ptr, unsigned size, uint32_t *const_offset); 306 void si_update_all_texture_descriptors(struct si_context *sctx); 307 void si_shader_change_notify(struct si_context *sctx); 308 void si_update_compressed_colortex_masks(struct si_context *sctx); 309 void si_emit_graphics_shader_userdata(struct si_context *sctx, 310 struct r600_atom *atom); 311 void si_emit_compute_shader_userdata(struct si_context *sctx); 312 void si_set_rw_buffer(struct si_context *sctx, 313 uint slot, const struct pipe_constant_buffer *input); 314 /* si_state.c */ 315 struct si_shader_selector; 316 317 void si_init_atom(struct si_context *sctx, struct r600_atom *atom, 318 struct r600_atom **list_elem, 319 void (*emit_func)(struct si_context *ctx, struct r600_atom *state)); 320 void si_init_state_functions(struct si_context *sctx); 321 void si_init_screen_state_functions(struct si_screen *sscreen); 322 void 323 si_make_buffer_descriptor(struct si_screen *screen, struct r600_resource *buf, 324 enum pipe_format format, 325 unsigned offset, unsigned size, 326 uint32_t *state); 327 void 328 si_make_texture_descriptor(struct si_screen *screen, 329 struct r600_texture *tex, 330 bool sampler, 331 enum pipe_texture_target target, 332 enum pipe_format pipe_format, 333 const unsigned char state_swizzle[4], 334 unsigned first_level, unsigned last_level, 335 unsigned first_layer, unsigned last_layer, 336 unsigned width, unsigned height, unsigned depth, 337 uint32_t *state, 338 uint32_t *fmask_state); 339 struct pipe_sampler_view * 340 si_create_sampler_view_custom(struct pipe_context *ctx, 341 struct pipe_resource *texture, 342 const struct pipe_sampler_view *state, 343 unsigned width0, unsigned height0, 344 unsigned force_level); 345 346 /* si_state_shader.c */ 347 bool si_update_shaders(struct si_context *sctx); 348 void si_init_shader_functions(struct si_context *sctx); 349 bool si_init_shader_cache(struct si_screen *sscreen); 350 void si_destroy_shader_cache(struct si_screen *sscreen); 351 void si_init_shader_selector_async(void *job, int thread_index); 352 353 /* si_state_draw.c */ 354 void si_emit_cache_flush(struct si_context *sctx); 355 void si_ce_pre_draw_synchronization(struct si_context *sctx); 356 void si_ce_post_draw_synchronization(struct si_context *sctx); 357 void si_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *dinfo); 358 void si_trace_emit(struct si_context *sctx); 359 360 361 static inline unsigned 362 si_tile_mode_index(struct r600_texture *rtex, unsigned level, bool stencil) 363 { 364 if (stencil) 365 return rtex->surface.stencil_tiling_index[level]; 366 else 367 return rtex->surface.tiling_index[level]; 368 } 369 370 #endif 371