• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2013 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  *      Marek Olšák <marek.olsak@amd.com>
25  */
26 
27 /* Resource binding slots and sampler states (each described with 8 or
28  * 4 dwords) are stored in lists in memory which is accessed by shaders
29  * using scalar load instructions.
30  *
31  * This file is responsible for managing such lists. It keeps a copy of all
32  * descriptors in CPU memory and re-uploads a whole list if some slots have
33  * been changed.
34  *
35  * This code is also reponsible for updating shader pointers to those lists.
36  *
37  * Note that CP DMA can't be used for updating the lists, because a GPU hang
38  * could leave the list in a mid-IB state and the next IB would get wrong
39  * descriptors and the whole context would be unusable at that point.
40  * (Note: The register shadowing can't be used due to the same reason)
41  *
42  * Also, uploading descriptors to newly allocated memory doesn't require
43  * a KCACHE flush.
44  *
45  *
46  * Possible scenarios for one 16 dword image+sampler slot:
47  *
48  *       | Image        | w/ FMASK   | Buffer       | NULL
49  * [ 0: 3] Image[0:3]   | Image[0:3] | Null[0:3]    | Null[0:3]
50  * [ 4: 7] Image[4:7]   | Image[4:7] | Buffer[0:3]  | 0
51  * [ 8:11] Null[0:3]    | Fmask[0:3] | Null[0:3]    | Null[0:3]
52  * [12:15] Sampler[0:3] | Fmask[4:7] | Sampler[0:3] | Sampler[0:3]
53  *
54  * FMASK implies MSAA, therefore no sampler state.
55  * Sampler states are never unbound except when FMASK is bound.
56  */
57 
58 #include "radeon/r600_cs.h"
59 #include "si_pipe.h"
60 #include "sid.h"
61 
62 #include "util/u_format.h"
63 #include "util/u_memory.h"
64 #include "util/u_upload_mgr.h"
65 
66 
67 /* NULL image and buffer descriptor for textures (alpha = 1) and images
68  * (alpha = 0).
69  *
70  * For images, all fields must be zero except for the swizzle, which
71  * supports arbitrary combinations of 0s and 1s. The texture type must be
72  * any valid type (e.g. 1D). If the texture type isn't set, the hw hangs.
73  *
74  * For buffers, all fields must be zero. If they are not, the hw hangs.
75  *
76  * This is the only reason why the buffer descriptor must be in words [4:7].
77  */
78 static uint32_t null_texture_descriptor[8] = {
79 	0,
80 	0,
81 	0,
82 	S_008F1C_DST_SEL_W(V_008F1C_SQ_SEL_1) |
83 	S_008F1C_TYPE(V_008F1C_SQ_RSRC_IMG_1D)
84 	/* the rest must contain zeros, which is also used by the buffer
85 	 * descriptor */
86 };
87 
88 static uint32_t null_image_descriptor[8] = {
89 	0,
90 	0,
91 	0,
92 	S_008F1C_TYPE(V_008F1C_SQ_RSRC_IMG_1D)
93 	/* the rest must contain zeros, which is also used by the buffer
94 	 * descriptor */
95 };
96 
si_init_descriptors(struct si_descriptors * desc,unsigned shader_userdata_index,unsigned element_dw_size,unsigned num_elements,const uint32_t * null_descriptor,unsigned * ce_offset)97 static void si_init_descriptors(struct si_descriptors *desc,
98 				unsigned shader_userdata_index,
99 				unsigned element_dw_size,
100 				unsigned num_elements,
101 				const uint32_t *null_descriptor,
102 				unsigned *ce_offset)
103 {
104 	int i;
105 
106 	assert(num_elements <= sizeof(desc->dirty_mask)*8);
107 
108 	desc->list = CALLOC(num_elements, element_dw_size * 4);
109 	desc->element_dw_size = element_dw_size;
110 	desc->num_elements = num_elements;
111 	desc->dirty_mask = num_elements == 32 ? ~0u : (1u << num_elements) - 1;
112 	desc->shader_userdata_offset = shader_userdata_index * 4;
113 
114 	if (ce_offset) {
115 		desc->ce_offset = *ce_offset;
116 
117 		/* make sure that ce_offset stays 32 byte aligned */
118 		*ce_offset += align(element_dw_size * num_elements * 4, 32);
119 	}
120 
121 	/* Initialize the array to NULL descriptors if the element size is 8. */
122 	if (null_descriptor) {
123 		assert(element_dw_size % 8 == 0);
124 		for (i = 0; i < num_elements * element_dw_size / 8; i++)
125 			memcpy(desc->list + i * 8, null_descriptor,
126 			       8 * 4);
127 	}
128 }
129 
si_release_descriptors(struct si_descriptors * desc)130 static void si_release_descriptors(struct si_descriptors *desc)
131 {
132 	r600_resource_reference(&desc->buffer, NULL);
133 	FREE(desc->list);
134 }
135 
si_ce_upload(struct si_context * sctx,unsigned ce_offset,unsigned size,unsigned * out_offset,struct r600_resource ** out_buf)136 static bool si_ce_upload(struct si_context *sctx, unsigned ce_offset, unsigned size,
137 			 unsigned *out_offset, struct r600_resource **out_buf) {
138 	uint64_t va;
139 
140 	u_suballocator_alloc(sctx->ce_suballocator, size, 64, out_offset,
141 			     (struct pipe_resource**)out_buf);
142 	if (!out_buf)
143 			return false;
144 
145 	va = (*out_buf)->gpu_address + *out_offset;
146 
147 	radeon_emit(sctx->ce_ib, PKT3(PKT3_DUMP_CONST_RAM, 3, 0));
148 	radeon_emit(sctx->ce_ib, ce_offset);
149 	radeon_emit(sctx->ce_ib, size / 4);
150 	radeon_emit(sctx->ce_ib, va);
151 	radeon_emit(sctx->ce_ib, va >> 32);
152 
153 	radeon_add_to_buffer_list(&sctx->b, &sctx->b.gfx, *out_buf,
154 	                       RADEON_USAGE_READWRITE, RADEON_PRIO_DESCRIPTORS);
155 
156 	sctx->ce_need_synchronization = true;
157 	return true;
158 }
159 
si_ce_reinitialize_descriptors(struct si_context * sctx,struct si_descriptors * desc)160 static void si_ce_reinitialize_descriptors(struct si_context *sctx,
161                                            struct si_descriptors *desc)
162 {
163 	if (desc->buffer) {
164 		struct r600_resource *buffer = (struct r600_resource*)desc->buffer;
165 		unsigned list_size = desc->num_elements * desc->element_dw_size * 4;
166 		uint64_t va = buffer->gpu_address + desc->buffer_offset;
167 		struct radeon_winsys_cs *ib = sctx->ce_preamble_ib;
168 
169 		if (!ib)
170 			ib = sctx->ce_ib;
171 
172 		list_size = align(list_size, 32);
173 
174 		radeon_emit(ib, PKT3(PKT3_LOAD_CONST_RAM, 3, 0));
175 		radeon_emit(ib, va);
176 		radeon_emit(ib, va >> 32);
177 		radeon_emit(ib, list_size / 4);
178 		radeon_emit(ib, desc->ce_offset);
179 
180 		radeon_add_to_buffer_list(&sctx->b, &sctx->b.gfx, desc->buffer,
181 		                    RADEON_USAGE_READ, RADEON_PRIO_DESCRIPTORS);
182 	}
183 	desc->ce_ram_dirty = false;
184 }
185 
si_ce_reinitialize_all_descriptors(struct si_context * sctx)186 void si_ce_reinitialize_all_descriptors(struct si_context *sctx)
187 {
188 	int i;
189 
190 	for (i = 0; i < SI_NUM_DESCS; ++i)
191 		si_ce_reinitialize_descriptors(sctx, &sctx->descriptors[i]);
192 }
193 
si_ce_enable_loads(struct radeon_winsys_cs * ib)194 void si_ce_enable_loads(struct radeon_winsys_cs *ib)
195 {
196 	radeon_emit(ib, PKT3(PKT3_CONTEXT_CONTROL, 1, 0));
197 	radeon_emit(ib, CONTEXT_CONTROL_LOAD_ENABLE(1) |
198 	                CONTEXT_CONTROL_LOAD_CE_RAM(1));
199 	radeon_emit(ib, CONTEXT_CONTROL_SHADOW_ENABLE(1));
200 }
201 
si_upload_descriptors(struct si_context * sctx,struct si_descriptors * desc,struct r600_atom * atom)202 static bool si_upload_descriptors(struct si_context *sctx,
203 				  struct si_descriptors *desc,
204 				  struct r600_atom * atom)
205 {
206 	unsigned list_size = desc->num_elements * desc->element_dw_size * 4;
207 
208 	if (!desc->dirty_mask)
209 		return true;
210 
211 	if (sctx->ce_ib) {
212 		uint32_t const* list = (uint32_t const*)desc->list;
213 
214 		if (desc->ce_ram_dirty)
215 			si_ce_reinitialize_descriptors(sctx, desc);
216 
217 		while(desc->dirty_mask) {
218 			int begin, count;
219 			u_bit_scan_consecutive_range(&desc->dirty_mask, &begin,
220 						     &count);
221 
222 			begin *= desc->element_dw_size;
223 			count *= desc->element_dw_size;
224 
225 			radeon_emit(sctx->ce_ib,
226 			            PKT3(PKT3_WRITE_CONST_RAM, count, 0));
227 			radeon_emit(sctx->ce_ib, desc->ce_offset + begin * 4);
228 			radeon_emit_array(sctx->ce_ib, list + begin, count);
229 		}
230 
231 		if (!si_ce_upload(sctx, desc->ce_offset, list_size,
232 		                           &desc->buffer_offset, &desc->buffer))
233 			return false;
234 	} else {
235 		void *ptr;
236 
237 		u_upload_alloc(sctx->b.uploader, 0, list_size, 256,
238 			&desc->buffer_offset,
239 			(struct pipe_resource**)&desc->buffer, &ptr);
240 		if (!desc->buffer)
241 			return false; /* skip the draw call */
242 
243 		util_memcpy_cpu_to_le32(ptr, desc->list, list_size);
244 		desc->gpu_list = ptr;
245 
246 		radeon_add_to_buffer_list(&sctx->b, &sctx->b.gfx, desc->buffer,
247 	                            RADEON_USAGE_READ, RADEON_PRIO_DESCRIPTORS);
248 	}
249 	desc->dirty_mask = 0;
250 
251 	if (atom)
252 		si_mark_atom_dirty(sctx, atom);
253 
254 	return true;
255 }
256 
257 static void
si_descriptors_begin_new_cs(struct si_context * sctx,struct si_descriptors * desc)258 si_descriptors_begin_new_cs(struct si_context *sctx, struct si_descriptors *desc)
259 {
260 	desc->ce_ram_dirty = true;
261 
262 	if (!desc->buffer)
263 		return;
264 
265 	radeon_add_to_buffer_list(&sctx->b, &sctx->b.gfx, desc->buffer,
266 				  RADEON_USAGE_READ, RADEON_PRIO_DESCRIPTORS);
267 }
268 
269 /* SAMPLER VIEWS */
270 
271 static unsigned
si_sampler_descriptors_idx(unsigned shader)272 si_sampler_descriptors_idx(unsigned shader)
273 {
274 	return SI_DESCS_FIRST_SHADER + shader * SI_NUM_SHADER_DESCS +
275 	       SI_SHADER_DESCS_SAMPLERS;
276 }
277 
278 static struct si_descriptors *
si_sampler_descriptors(struct si_context * sctx,unsigned shader)279 si_sampler_descriptors(struct si_context *sctx, unsigned shader)
280 {
281 	return &sctx->descriptors[si_sampler_descriptors_idx(shader)];
282 }
283 
si_release_sampler_views(struct si_sampler_views * views)284 static void si_release_sampler_views(struct si_sampler_views *views)
285 {
286 	int i;
287 
288 	for (i = 0; i < ARRAY_SIZE(views->views); i++) {
289 		pipe_sampler_view_reference(&views->views[i], NULL);
290 	}
291 }
292 
si_sampler_view_add_buffer(struct si_context * sctx,struct pipe_resource * resource,enum radeon_bo_usage usage,bool is_stencil_sampler,bool check_mem)293 static void si_sampler_view_add_buffer(struct si_context *sctx,
294 				       struct pipe_resource *resource,
295 				       enum radeon_bo_usage usage,
296 				       bool is_stencil_sampler,
297 				       bool check_mem)
298 {
299 	struct r600_resource *rres;
300 	struct r600_texture *rtex;
301 	enum radeon_bo_priority priority;
302 
303 	if (!resource)
304 		return;
305 
306 	if (resource->target != PIPE_BUFFER) {
307 		struct r600_texture *tex = (struct r600_texture*)resource;
308 
309 		if (tex->is_depth && !r600_can_sample_zs(tex, is_stencil_sampler))
310 			resource = &tex->flushed_depth_texture->resource.b.b;
311 	}
312 
313 	rres = (struct r600_resource*)resource;
314 	priority = r600_get_sampler_view_priority(rres);
315 
316 	radeon_add_to_buffer_list_check_mem(&sctx->b, &sctx->b.gfx,
317 					    rres, usage, priority,
318 					    check_mem);
319 
320 	if (resource->target == PIPE_BUFFER)
321 		return;
322 
323 	/* Now add separate DCC or HTILE. */
324 	rtex = (struct r600_texture*)resource;
325 	if (rtex->dcc_separate_buffer) {
326 		radeon_add_to_buffer_list_check_mem(&sctx->b, &sctx->b.gfx,
327 						    rtex->dcc_separate_buffer, usage,
328 						    RADEON_PRIO_DCC, check_mem);
329 	}
330 
331 	if (rtex->htile_buffer &&
332 	    rtex->tc_compatible_htile &&
333 	    !is_stencil_sampler) {
334 		radeon_add_to_buffer_list_check_mem(&sctx->b, &sctx->b.gfx,
335 						    rtex->htile_buffer, usage,
336 						    RADEON_PRIO_HTILE, check_mem);
337 	}
338 }
339 
si_sampler_views_begin_new_cs(struct si_context * sctx,struct si_sampler_views * views)340 static void si_sampler_views_begin_new_cs(struct si_context *sctx,
341 					  struct si_sampler_views *views)
342 {
343 	unsigned mask = views->enabled_mask;
344 
345 	/* Add buffers to the CS. */
346 	while (mask) {
347 		int i = u_bit_scan(&mask);
348 		struct si_sampler_view *sview = (struct si_sampler_view *)views->views[i];
349 
350 		si_sampler_view_add_buffer(sctx, sview->base.texture,
351 					   RADEON_USAGE_READ,
352 					   sview->is_stencil_sampler, false);
353 	}
354 }
355 
356 /* Set buffer descriptor fields that can be changed by reallocations. */
si_set_buf_desc_address(struct r600_resource * buf,uint64_t offset,uint32_t * state)357 static void si_set_buf_desc_address(struct r600_resource *buf,
358 				    uint64_t offset, uint32_t *state)
359 {
360 	uint64_t va = buf->gpu_address + offset;
361 
362 	state[0] = va;
363 	state[1] &= C_008F04_BASE_ADDRESS_HI;
364 	state[1] |= S_008F04_BASE_ADDRESS_HI(va >> 32);
365 }
366 
367 /* Set texture descriptor fields that can be changed by reallocations.
368  *
369  * \param tex			texture
370  * \param base_level_info	information of the level of BASE_ADDRESS
371  * \param base_level		the level of BASE_ADDRESS
372  * \param first_level		pipe_sampler_view.u.tex.first_level
373  * \param block_width		util_format_get_blockwidth()
374  * \param is_stencil		select between separate Z & Stencil
375  * \param state			descriptor to update
376  */
si_set_mutable_tex_desc_fields(struct r600_texture * tex,const struct radeon_surf_level * base_level_info,unsigned base_level,unsigned first_level,unsigned block_width,bool is_stencil,uint32_t * state)377 void si_set_mutable_tex_desc_fields(struct r600_texture *tex,
378 				    const struct radeon_surf_level *base_level_info,
379 				    unsigned base_level, unsigned first_level,
380 				    unsigned block_width, bool is_stencil,
381 				    uint32_t *state)
382 {
383 	uint64_t va;
384 	unsigned pitch = base_level_info->nblk_x * block_width;
385 
386 	if (tex->is_depth && !r600_can_sample_zs(tex, is_stencil)) {
387 		tex = tex->flushed_depth_texture;
388 		is_stencil = false;
389 	}
390 
391 	va = tex->resource.gpu_address + base_level_info->offset;
392 
393 	state[1] &= C_008F14_BASE_ADDRESS_HI;
394 	state[3] &= C_008F1C_TILING_INDEX;
395 	state[4] &= C_008F20_PITCH;
396 	state[6] &= C_008F28_COMPRESSION_EN;
397 
398 	state[0] = va >> 8;
399 	state[1] |= S_008F14_BASE_ADDRESS_HI(va >> 40);
400 	state[3] |= S_008F1C_TILING_INDEX(si_tile_mode_index(tex, base_level,
401 							     is_stencil));
402 	state[4] |= S_008F20_PITCH(pitch - 1);
403 
404 	if (tex->dcc_offset && first_level < tex->surface.num_dcc_levels) {
405 		state[6] |= S_008F28_COMPRESSION_EN(1);
406 		state[7] = ((!tex->dcc_separate_buffer ? tex->resource.gpu_address : 0) +
407 			    tex->dcc_offset +
408 			    base_level_info->dcc_offset) >> 8;
409 	} else if (tex->tc_compatible_htile) {
410 		state[6] |= S_008F28_COMPRESSION_EN(1);
411 		state[7] = tex->htile_buffer->gpu_address >> 8;
412 	}
413 }
414 
si_set_sampler_view(struct si_context * sctx,unsigned shader,unsigned slot,struct pipe_sampler_view * view,bool disallow_early_out)415 static void si_set_sampler_view(struct si_context *sctx,
416 				unsigned shader,
417 				unsigned slot, struct pipe_sampler_view *view,
418 				bool disallow_early_out)
419 {
420 	struct si_sampler_views *views = &sctx->samplers[shader].views;
421 	struct si_sampler_view *rview = (struct si_sampler_view*)view;
422 	struct si_descriptors *descs = si_sampler_descriptors(sctx, shader);
423 	uint32_t *desc = descs->list + slot * 16;
424 
425 	if (views->views[slot] == view && !disallow_early_out)
426 		return;
427 
428 	if (view) {
429 		struct r600_texture *rtex = (struct r600_texture *)view->texture;
430 
431 		assert(rtex); /* views with texture == NULL aren't supported */
432 		pipe_sampler_view_reference(&views->views[slot], view);
433 		memcpy(desc, rview->state, 8*4);
434 
435 		if (rtex->resource.b.b.target == PIPE_BUFFER) {
436 			rtex->resource.bind_history |= PIPE_BIND_SAMPLER_VIEW;
437 
438 			si_set_buf_desc_address(&rtex->resource,
439 						view->u.buf.offset,
440 						desc + 4);
441 		} else {
442 			bool is_separate_stencil =
443 				rtex->db_compatible &&
444 				rview->is_stencil_sampler;
445 
446 			si_set_mutable_tex_desc_fields(rtex,
447 						       rview->base_level_info,
448 						       rview->base_level,
449 						       rview->base.u.tex.first_level,
450 						       rview->block_width,
451 						       is_separate_stencil,
452 						       desc);
453 		}
454 
455 		if (rtex->resource.b.b.target != PIPE_BUFFER &&
456 		    rtex->fmask.size) {
457 			memcpy(desc + 8,
458 			       rview->fmask_state, 8*4);
459 		} else {
460 			/* Disable FMASK and bind sampler state in [12:15]. */
461 			memcpy(desc + 8,
462 			       null_texture_descriptor, 4*4);
463 
464 			if (views->sampler_states[slot])
465 				memcpy(desc + 12,
466 				       views->sampler_states[slot]->val, 4*4);
467 		}
468 
469 		views->enabled_mask |= 1u << slot;
470 
471 		/* Since this can flush, it must be done after enabled_mask is
472 		 * updated. */
473 		si_sampler_view_add_buffer(sctx, view->texture,
474 					   RADEON_USAGE_READ,
475 					   rview->is_stencil_sampler, true);
476 	} else {
477 		pipe_sampler_view_reference(&views->views[slot], NULL);
478 		memcpy(desc, null_texture_descriptor, 8*4);
479 		/* Only clear the lower dwords of FMASK. */
480 		memcpy(desc + 8, null_texture_descriptor, 4*4);
481 		/* Re-set the sampler state if we are transitioning from FMASK. */
482 		if (views->sampler_states[slot])
483 			memcpy(desc + 12,
484 			       views->sampler_states[slot]->val, 4*4);
485 
486 		views->enabled_mask &= ~(1u << slot);
487 	}
488 
489 	descs->dirty_mask |= 1u << slot;
490 	sctx->descriptors_dirty |= 1u << si_sampler_descriptors_idx(shader);
491 }
492 
is_compressed_colortex(struct r600_texture * rtex)493 static bool is_compressed_colortex(struct r600_texture *rtex)
494 {
495 	return rtex->cmask.size || rtex->fmask.size ||
496 	       (rtex->dcc_offset && rtex->dirty_level_mask);
497 }
498 
si_update_compressed_tex_shader_mask(struct si_context * sctx,unsigned shader)499 static void si_update_compressed_tex_shader_mask(struct si_context *sctx,
500 						 unsigned shader)
501 {
502 	struct si_textures_info *samplers = &sctx->samplers[shader];
503 	unsigned shader_bit = 1 << shader;
504 
505 	if (samplers->depth_texture_mask ||
506 	    samplers->compressed_colortex_mask ||
507 	    sctx->images[shader].compressed_colortex_mask)
508 		sctx->compressed_tex_shader_mask |= shader_bit;
509 	else
510 		sctx->compressed_tex_shader_mask &= ~shader_bit;
511 }
512 
si_set_sampler_views(struct pipe_context * ctx,enum pipe_shader_type shader,unsigned start,unsigned count,struct pipe_sampler_view ** views)513 static void si_set_sampler_views(struct pipe_context *ctx,
514 				 enum pipe_shader_type shader, unsigned start,
515                                  unsigned count,
516 				 struct pipe_sampler_view **views)
517 {
518 	struct si_context *sctx = (struct si_context *)ctx;
519 	struct si_textures_info *samplers = &sctx->samplers[shader];
520 	int i;
521 
522 	if (!count || shader >= SI_NUM_SHADERS)
523 		return;
524 
525 	for (i = 0; i < count; i++) {
526 		unsigned slot = start + i;
527 
528 		if (!views || !views[i]) {
529 			samplers->depth_texture_mask &= ~(1u << slot);
530 			samplers->compressed_colortex_mask &= ~(1u << slot);
531 			si_set_sampler_view(sctx, shader, slot, NULL, false);
532 			continue;
533 		}
534 
535 		si_set_sampler_view(sctx, shader, slot, views[i], false);
536 
537 		if (views[i]->texture && views[i]->texture->target != PIPE_BUFFER) {
538 			struct r600_texture *rtex =
539 				(struct r600_texture*)views[i]->texture;
540 			struct si_sampler_view *rview = (struct si_sampler_view *)views[i];
541 
542 			if (rtex->db_compatible &&
543 			    (!rtex->tc_compatible_htile || rview->is_stencil_sampler)) {
544 				samplers->depth_texture_mask |= 1u << slot;
545 			} else {
546 				samplers->depth_texture_mask &= ~(1u << slot);
547 			}
548 			if (is_compressed_colortex(rtex)) {
549 				samplers->compressed_colortex_mask |= 1u << slot;
550 			} else {
551 				samplers->compressed_colortex_mask &= ~(1u << slot);
552 			}
553 
554 			if (rtex->dcc_offset &&
555 			    p_atomic_read(&rtex->framebuffers_bound))
556 				sctx->need_check_render_feedback = true;
557 		} else {
558 			samplers->depth_texture_mask &= ~(1u << slot);
559 			samplers->compressed_colortex_mask &= ~(1u << slot);
560 		}
561 	}
562 
563 	si_update_compressed_tex_shader_mask(sctx, shader);
564 }
565 
566 static void
si_samplers_update_compressed_colortex_mask(struct si_textures_info * samplers)567 si_samplers_update_compressed_colortex_mask(struct si_textures_info *samplers)
568 {
569 	unsigned mask = samplers->views.enabled_mask;
570 
571 	while (mask) {
572 		int i = u_bit_scan(&mask);
573 		struct pipe_resource *res = samplers->views.views[i]->texture;
574 
575 		if (res && res->target != PIPE_BUFFER) {
576 			struct r600_texture *rtex = (struct r600_texture *)res;
577 
578 			if (is_compressed_colortex(rtex)) {
579 				samplers->compressed_colortex_mask |= 1u << i;
580 			} else {
581 				samplers->compressed_colortex_mask &= ~(1u << i);
582 			}
583 		}
584 	}
585 }
586 
587 /* IMAGE VIEWS */
588 
589 static unsigned
si_image_descriptors_idx(unsigned shader)590 si_image_descriptors_idx(unsigned shader)
591 {
592 	return SI_DESCS_FIRST_SHADER + shader * SI_NUM_SHADER_DESCS +
593 	       SI_SHADER_DESCS_IMAGES;
594 }
595 
596 static struct si_descriptors*
si_image_descriptors(struct si_context * sctx,unsigned shader)597 si_image_descriptors(struct si_context *sctx, unsigned shader)
598 {
599 	return &sctx->descriptors[si_image_descriptors_idx(shader)];
600 }
601 
602 static void
si_release_image_views(struct si_images_info * images)603 si_release_image_views(struct si_images_info *images)
604 {
605 	unsigned i;
606 
607 	for (i = 0; i < SI_NUM_IMAGES; ++i) {
608 		struct pipe_image_view *view = &images->views[i];
609 
610 		pipe_resource_reference(&view->resource, NULL);
611 	}
612 }
613 
614 static void
si_image_views_begin_new_cs(struct si_context * sctx,struct si_images_info * images)615 si_image_views_begin_new_cs(struct si_context *sctx, struct si_images_info *images)
616 {
617 	uint mask = images->enabled_mask;
618 
619 	/* Add buffers to the CS. */
620 	while (mask) {
621 		int i = u_bit_scan(&mask);
622 		struct pipe_image_view *view = &images->views[i];
623 
624 		assert(view->resource);
625 
626 		si_sampler_view_add_buffer(sctx, view->resource,
627 					   RADEON_USAGE_READWRITE, false, false);
628 	}
629 }
630 
631 static void
si_disable_shader_image(struct si_context * ctx,unsigned shader,unsigned slot)632 si_disable_shader_image(struct si_context *ctx, unsigned shader, unsigned slot)
633 {
634 	struct si_images_info *images = &ctx->images[shader];
635 
636 	if (images->enabled_mask & (1u << slot)) {
637 		struct si_descriptors *descs = si_image_descriptors(ctx, shader);
638 
639 		pipe_resource_reference(&images->views[slot].resource, NULL);
640 		images->compressed_colortex_mask &= ~(1 << slot);
641 
642 		memcpy(descs->list + slot*8, null_image_descriptor, 8*4);
643 		images->enabled_mask &= ~(1u << slot);
644 		descs->dirty_mask |= 1u << slot;
645 		ctx->descriptors_dirty |= 1u << si_image_descriptors_idx(shader);
646 	}
647 }
648 
649 static void
si_mark_image_range_valid(const struct pipe_image_view * view)650 si_mark_image_range_valid(const struct pipe_image_view *view)
651 {
652 	struct r600_resource *res = (struct r600_resource *)view->resource;
653 
654 	assert(res && res->b.b.target == PIPE_BUFFER);
655 
656 	util_range_add(&res->valid_buffer_range,
657 		       view->u.buf.offset,
658 		       view->u.buf.offset + view->u.buf.size);
659 }
660 
si_set_shader_image(struct si_context * ctx,unsigned shader,unsigned slot,const struct pipe_image_view * view,bool skip_decompress)661 static void si_set_shader_image(struct si_context *ctx,
662 				unsigned shader,
663 				unsigned slot, const struct pipe_image_view *view,
664 				bool skip_decompress)
665 {
666 	struct si_screen *screen = ctx->screen;
667 	struct si_images_info *images = &ctx->images[shader];
668 	struct si_descriptors *descs = si_image_descriptors(ctx, shader);
669 	struct r600_resource *res;
670 	uint32_t *desc = descs->list + slot * 8;
671 
672 	if (!view || !view->resource) {
673 		si_disable_shader_image(ctx, shader, slot);
674 		return;
675 	}
676 
677 	res = (struct r600_resource *)view->resource;
678 
679 	if (&images->views[slot] != view)
680 		util_copy_image_view(&images->views[slot], view);
681 
682 	if (res->b.b.target == PIPE_BUFFER) {
683 		if (view->access & PIPE_IMAGE_ACCESS_WRITE)
684 			si_mark_image_range_valid(view);
685 
686 		si_make_buffer_descriptor(screen, res,
687 					  view->format,
688 					  view->u.buf.offset,
689 					  view->u.buf.size,
690 					  descs->list + slot * 8);
691 		si_set_buf_desc_address(res, view->u.buf.offset, desc + 4);
692 
693 		images->compressed_colortex_mask &= ~(1 << slot);
694 		res->bind_history |= PIPE_BIND_SHADER_IMAGE;
695 	} else {
696 		static const unsigned char swizzle[4] = { 0, 1, 2, 3 };
697 		struct r600_texture *tex = (struct r600_texture *)res;
698 		unsigned level = view->u.tex.level;
699 		unsigned width, height, depth;
700 		bool uses_dcc = tex->dcc_offset &&
701 				level < tex->surface.num_dcc_levels;
702 
703 		assert(!tex->is_depth);
704 		assert(tex->fmask.size == 0);
705 
706 		if (uses_dcc && !skip_decompress &&
707 		    (view->access & PIPE_IMAGE_ACCESS_WRITE ||
708 		     !vi_dcc_formats_compatible(res->b.b.format, view->format))) {
709 			/* If DCC can't be disabled, at least decompress it.
710 			 * The decompression is relatively cheap if the surface
711 			 * has been decompressed already.
712 			 */
713 			if (r600_texture_disable_dcc(&ctx->b, tex))
714 				uses_dcc = false;
715 			else
716 				ctx->b.decompress_dcc(&ctx->b.b, tex);
717 		}
718 
719 		if (is_compressed_colortex(tex)) {
720 			images->compressed_colortex_mask |= 1 << slot;
721 		} else {
722 			images->compressed_colortex_mask &= ~(1 << slot);
723 		}
724 
725 		if (uses_dcc &&
726 		    p_atomic_read(&tex->framebuffers_bound))
727 			ctx->need_check_render_feedback = true;
728 
729 		/* Always force the base level to the selected level.
730 		 *
731 		 * This is required for 3D textures, where otherwise
732 		 * selecting a single slice for non-layered bindings
733 		 * fails. It doesn't hurt the other targets.
734 		 */
735 		width = u_minify(res->b.b.width0, level);
736 		height = u_minify(res->b.b.height0, level);
737 		depth = u_minify(res->b.b.depth0, level);
738 
739 		si_make_texture_descriptor(screen, tex,
740 					   false, res->b.b.target,
741 					   view->format, swizzle,
742 					   0, 0,
743 					   view->u.tex.first_layer,
744 					   view->u.tex.last_layer,
745 					   width, height, depth,
746 					   desc, NULL);
747 		si_set_mutable_tex_desc_fields(tex, &tex->surface.level[level],
748 					       level, level,
749 					       util_format_get_blockwidth(view->format),
750 					       false, desc);
751 	}
752 
753 	images->enabled_mask |= 1u << slot;
754 	descs->dirty_mask |= 1u << slot;
755 	ctx->descriptors_dirty |= 1u << si_image_descriptors_idx(shader);
756 
757 	/* Since this can flush, it must be done after enabled_mask is updated. */
758 	si_sampler_view_add_buffer(ctx, &res->b.b,
759 				   RADEON_USAGE_READWRITE, false, true);
760 }
761 
762 static void
si_set_shader_images(struct pipe_context * pipe,enum pipe_shader_type shader,unsigned start_slot,unsigned count,const struct pipe_image_view * views)763 si_set_shader_images(struct pipe_context *pipe,
764 		     enum pipe_shader_type shader,
765 		     unsigned start_slot, unsigned count,
766 		     const struct pipe_image_view *views)
767 {
768 	struct si_context *ctx = (struct si_context *)pipe;
769 	unsigned i, slot;
770 
771 	assert(shader < SI_NUM_SHADERS);
772 
773 	if (!count)
774 		return;
775 
776 	assert(start_slot + count <= SI_NUM_IMAGES);
777 
778 	if (views) {
779 		for (i = 0, slot = start_slot; i < count; ++i, ++slot)
780 			si_set_shader_image(ctx, shader, slot, &views[i], false);
781 	} else {
782 		for (i = 0, slot = start_slot; i < count; ++i, ++slot)
783 			si_set_shader_image(ctx, shader, slot, NULL, false);
784 	}
785 
786 	si_update_compressed_tex_shader_mask(ctx, shader);
787 }
788 
789 static void
si_images_update_compressed_colortex_mask(struct si_images_info * images)790 si_images_update_compressed_colortex_mask(struct si_images_info *images)
791 {
792 	unsigned mask = images->enabled_mask;
793 
794 	while (mask) {
795 		int i = u_bit_scan(&mask);
796 		struct pipe_resource *res = images->views[i].resource;
797 
798 		if (res && res->target != PIPE_BUFFER) {
799 			struct r600_texture *rtex = (struct r600_texture *)res;
800 
801 			if (is_compressed_colortex(rtex)) {
802 				images->compressed_colortex_mask |= 1 << i;
803 			} else {
804 				images->compressed_colortex_mask &= ~(1 << i);
805 			}
806 		}
807 	}
808 }
809 
810 /* SAMPLER STATES */
811 
si_bind_sampler_states(struct pipe_context * ctx,enum pipe_shader_type shader,unsigned start,unsigned count,void ** states)812 static void si_bind_sampler_states(struct pipe_context *ctx,
813                                    enum pipe_shader_type shader,
814                                    unsigned start, unsigned count, void **states)
815 {
816 	struct si_context *sctx = (struct si_context *)ctx;
817 	struct si_textures_info *samplers = &sctx->samplers[shader];
818 	struct si_descriptors *desc = si_sampler_descriptors(sctx, shader);
819 	struct si_sampler_state **sstates = (struct si_sampler_state**)states;
820 	int i;
821 
822 	if (!count || shader >= SI_NUM_SHADERS)
823 		return;
824 
825 	for (i = 0; i < count; i++) {
826 		unsigned slot = start + i;
827 
828 		if (!sstates[i] ||
829 		    sstates[i] == samplers->views.sampler_states[slot])
830 			continue;
831 
832 #ifdef DEBUG
833 		assert(sstates[i]->magic == SI_SAMPLER_STATE_MAGIC);
834 #endif
835 		samplers->views.sampler_states[slot] = sstates[i];
836 
837 		/* If FMASK is bound, don't overwrite it.
838 		 * The sampler state will be set after FMASK is unbound.
839 		 */
840 		if (samplers->views.views[slot] &&
841 		    samplers->views.views[slot]->texture &&
842 		    samplers->views.views[slot]->texture->target != PIPE_BUFFER &&
843 		    ((struct r600_texture*)samplers->views.views[slot]->texture)->fmask.size)
844 			continue;
845 
846 		memcpy(desc->list + slot * 16 + 12, sstates[i]->val, 4*4);
847 		desc->dirty_mask |= 1u << slot;
848 		sctx->descriptors_dirty |= 1u << si_sampler_descriptors_idx(shader);
849 	}
850 }
851 
852 /* BUFFER RESOURCES */
853 
si_init_buffer_resources(struct si_buffer_resources * buffers,struct si_descriptors * descs,unsigned num_buffers,unsigned shader_userdata_index,enum radeon_bo_usage shader_usage,enum radeon_bo_priority priority,unsigned * ce_offset)854 static void si_init_buffer_resources(struct si_buffer_resources *buffers,
855 				     struct si_descriptors *descs,
856 				     unsigned num_buffers,
857 				     unsigned shader_userdata_index,
858 				     enum radeon_bo_usage shader_usage,
859 				     enum radeon_bo_priority priority,
860 				     unsigned *ce_offset)
861 {
862 	buffers->shader_usage = shader_usage;
863 	buffers->priority = priority;
864 	buffers->buffers = CALLOC(num_buffers, sizeof(struct pipe_resource*));
865 
866 	si_init_descriptors(descs, shader_userdata_index, 4,
867 			    num_buffers, NULL, ce_offset);
868 }
869 
si_release_buffer_resources(struct si_buffer_resources * buffers,struct si_descriptors * descs)870 static void si_release_buffer_resources(struct si_buffer_resources *buffers,
871 					struct si_descriptors *descs)
872 {
873 	int i;
874 
875 	for (i = 0; i < descs->num_elements; i++) {
876 		pipe_resource_reference(&buffers->buffers[i], NULL);
877 	}
878 
879 	FREE(buffers->buffers);
880 }
881 
si_buffer_resources_begin_new_cs(struct si_context * sctx,struct si_buffer_resources * buffers)882 static void si_buffer_resources_begin_new_cs(struct si_context *sctx,
883 					     struct si_buffer_resources *buffers)
884 {
885 	unsigned mask = buffers->enabled_mask;
886 
887 	/* Add buffers to the CS. */
888 	while (mask) {
889 		int i = u_bit_scan(&mask);
890 
891 		radeon_add_to_buffer_list(&sctx->b, &sctx->b.gfx,
892 				      (struct r600_resource*)buffers->buffers[i],
893 				      buffers->shader_usage, buffers->priority);
894 	}
895 }
896 
si_get_buffer_from_descriptors(struct si_buffer_resources * buffers,struct si_descriptors * descs,unsigned idx,struct pipe_resource ** buf,unsigned * offset,unsigned * size)897 static void si_get_buffer_from_descriptors(struct si_buffer_resources *buffers,
898 					   struct si_descriptors *descs,
899 					   unsigned idx, struct pipe_resource **buf,
900 					   unsigned *offset, unsigned *size)
901 {
902 	pipe_resource_reference(buf, buffers->buffers[idx]);
903 	if (*buf) {
904 		struct r600_resource *res = r600_resource(*buf);
905 		const uint32_t *desc = descs->list + idx * 4;
906 		uint64_t va;
907 
908 		*size = desc[2];
909 
910 		assert(G_008F04_STRIDE(desc[1]) == 0);
911 		va = ((uint64_t)desc[1] << 32) | desc[0];
912 
913 		assert(va >= res->gpu_address && va + *size <= res->gpu_address + res->bo_size);
914 		*offset = va - res->gpu_address;
915 	}
916 }
917 
918 /* VERTEX BUFFERS */
919 
si_vertex_buffers_begin_new_cs(struct si_context * sctx)920 static void si_vertex_buffers_begin_new_cs(struct si_context *sctx)
921 {
922 	struct si_descriptors *desc = &sctx->vertex_buffers;
923 	int count = sctx->vertex_elements ? sctx->vertex_elements->count : 0;
924 	int i;
925 
926 	for (i = 0; i < count; i++) {
927 		int vb = sctx->vertex_elements->elements[i].vertex_buffer_index;
928 
929 		if (vb >= ARRAY_SIZE(sctx->vertex_buffer))
930 			continue;
931 		if (!sctx->vertex_buffer[vb].buffer)
932 			continue;
933 
934 		radeon_add_to_buffer_list(&sctx->b, &sctx->b.gfx,
935 				      (struct r600_resource*)sctx->vertex_buffer[vb].buffer,
936 				      RADEON_USAGE_READ, RADEON_PRIO_VERTEX_BUFFER);
937 	}
938 
939 	if (!desc->buffer)
940 		return;
941 	radeon_add_to_buffer_list(&sctx->b, &sctx->b.gfx,
942 			      desc->buffer, RADEON_USAGE_READ,
943 			      RADEON_PRIO_DESCRIPTORS);
944 }
945 
si_upload_vertex_buffer_descriptors(struct si_context * sctx)946 bool si_upload_vertex_buffer_descriptors(struct si_context *sctx)
947 {
948 	struct si_vertex_element *velems = sctx->vertex_elements;
949 	struct si_descriptors *desc = &sctx->vertex_buffers;
950 	unsigned i, count = velems->count;
951 	uint64_t va;
952 	uint32_t *ptr;
953 
954 	if (!sctx->vertex_buffers_dirty || !count || !velems)
955 		return true;
956 
957 	unsigned fix_size3 = velems->fix_size3;
958 	unsigned first_vb_use_mask = velems->first_vb_use_mask;
959 
960 	/* Vertex buffer descriptors are the only ones which are uploaded
961 	 * directly through a staging buffer and don't go through
962 	 * the fine-grained upload path.
963 	 */
964 	u_upload_alloc(sctx->b.uploader, 0, count * 16, 256, &desc->buffer_offset,
965 		       (struct pipe_resource**)&desc->buffer, (void**)&ptr);
966 	if (!desc->buffer)
967 		return false;
968 
969 	radeon_add_to_buffer_list(&sctx->b, &sctx->b.gfx,
970 			      desc->buffer, RADEON_USAGE_READ,
971 			      RADEON_PRIO_DESCRIPTORS);
972 
973 	assert(count <= SI_NUM_VERTEX_BUFFERS);
974 
975 	for (i = 0; i < count; i++) {
976 		struct pipe_vertex_element *ve = &velems->elements[i];
977 		struct pipe_vertex_buffer *vb;
978 		struct r600_resource *rbuffer;
979 		unsigned offset;
980 		unsigned vbo_index = ve->vertex_buffer_index;
981 		uint32_t *desc = &ptr[i*4];
982 
983 		vb = &sctx->vertex_buffer[vbo_index];
984 		rbuffer = (struct r600_resource*)vb->buffer;
985 		if (!rbuffer) {
986 			memset(desc, 0, 16);
987 			continue;
988 		}
989 
990 		offset = vb->buffer_offset + ve->src_offset;
991 		va = rbuffer->gpu_address + offset;
992 
993 		/* Fill in T# buffer resource description */
994 		desc[0] = va;
995 		desc[1] = S_008F04_BASE_ADDRESS_HI(va >> 32) |
996 			  S_008F04_STRIDE(vb->stride);
997 
998 		if (sctx->b.chip_class <= CIK && vb->stride) {
999 			/* Round up by rounding down and adding 1 */
1000 			desc[2] = (vb->buffer->width0 - offset -
1001 				   velems->format_size[i]) /
1002 				  vb->stride + 1;
1003 		} else {
1004 			uint32_t size3;
1005 
1006 			desc[2] = vb->buffer->width0 - offset;
1007 
1008 			/* For attributes of size 3 with byte or short
1009 			 * components, we use a 4-component data format.
1010 			 *
1011 			 * As a consequence, we have to round the buffer size
1012 			 * up so that the hardware sees four components as
1013 			 * being inside the buffer if and only if the first
1014 			 * three components are in the buffer.
1015 			 *
1016 			 * Since the offset and stride are guaranteed to be
1017 			 * 4-byte aligned, this alignment will never cross the
1018 			 * winsys buffer boundary.
1019 			 */
1020 			size3 = (fix_size3 >> (2 * i)) & 3;
1021 			if (vb->stride && size3) {
1022 				assert(offset % 4 == 0 && vb->stride % 4 == 0);
1023 				assert(size3 <= 2);
1024 				desc[2] = align(desc[2], size3 * 2);
1025 			}
1026 		}
1027 
1028 		desc[3] = velems->rsrc_word3[i];
1029 
1030 		if (first_vb_use_mask & (1 << i)) {
1031 			radeon_add_to_buffer_list(&sctx->b, &sctx->b.gfx,
1032 					      (struct r600_resource*)vb->buffer,
1033 					      RADEON_USAGE_READ, RADEON_PRIO_VERTEX_BUFFER);
1034 		}
1035 	}
1036 
1037 	/* Don't flush the const cache. It would have a very negative effect
1038 	 * on performance (confirmed by testing). New descriptors are always
1039 	 * uploaded to a fresh new buffer, so I don't think flushing the const
1040 	 * cache is needed. */
1041 	si_mark_atom_dirty(sctx, &sctx->shader_userdata.atom);
1042 	sctx->vertex_buffers_dirty = false;
1043 	sctx->vertex_buffer_pointer_dirty = true;
1044 	return true;
1045 }
1046 
1047 
1048 /* CONSTANT BUFFERS */
1049 
1050 static unsigned
si_const_buffer_descriptors_idx(unsigned shader)1051 si_const_buffer_descriptors_idx(unsigned shader)
1052 {
1053 	return SI_DESCS_FIRST_SHADER + shader * SI_NUM_SHADER_DESCS +
1054 	       SI_SHADER_DESCS_CONST_BUFFERS;
1055 }
1056 
1057 static struct si_descriptors *
si_const_buffer_descriptors(struct si_context * sctx,unsigned shader)1058 si_const_buffer_descriptors(struct si_context *sctx, unsigned shader)
1059 {
1060 	return &sctx->descriptors[si_const_buffer_descriptors_idx(shader)];
1061 }
1062 
si_upload_const_buffer(struct si_context * sctx,struct r600_resource ** rbuffer,const uint8_t * ptr,unsigned size,uint32_t * const_offset)1063 void si_upload_const_buffer(struct si_context *sctx, struct r600_resource **rbuffer,
1064 			    const uint8_t *ptr, unsigned size, uint32_t *const_offset)
1065 {
1066 	void *tmp;
1067 
1068 	u_upload_alloc(sctx->b.uploader, 0, size, 256, const_offset,
1069 		       (struct pipe_resource**)rbuffer, &tmp);
1070 	if (*rbuffer)
1071 		util_memcpy_cpu_to_le32(tmp, ptr, size);
1072 }
1073 
si_set_constant_buffer(struct si_context * sctx,struct si_buffer_resources * buffers,unsigned descriptors_idx,uint slot,const struct pipe_constant_buffer * input)1074 static void si_set_constant_buffer(struct si_context *sctx,
1075 				   struct si_buffer_resources *buffers,
1076 				   unsigned descriptors_idx,
1077 				   uint slot, const struct pipe_constant_buffer *input)
1078 {
1079 	struct si_descriptors *descs = &sctx->descriptors[descriptors_idx];
1080 	assert(slot < descs->num_elements);
1081 	pipe_resource_reference(&buffers->buffers[slot], NULL);
1082 
1083 	/* CIK cannot unbind a constant buffer (S_BUFFER_LOAD is buggy
1084 	 * with a NULL buffer). We need to use a dummy buffer instead. */
1085 	if (sctx->b.chip_class == CIK &&
1086 	    (!input || (!input->buffer && !input->user_buffer)))
1087 		input = &sctx->null_const_buf;
1088 
1089 	if (input && (input->buffer || input->user_buffer)) {
1090 		struct pipe_resource *buffer = NULL;
1091 		uint64_t va;
1092 
1093 		/* Upload the user buffer if needed. */
1094 		if (input->user_buffer) {
1095 			unsigned buffer_offset;
1096 
1097 			si_upload_const_buffer(sctx,
1098 					       (struct r600_resource**)&buffer, input->user_buffer,
1099 					       input->buffer_size, &buffer_offset);
1100 			if (!buffer) {
1101 				/* Just unbind on failure. */
1102 				si_set_constant_buffer(sctx, buffers, descriptors_idx, slot, NULL);
1103 				return;
1104 			}
1105 			va = r600_resource(buffer)->gpu_address + buffer_offset;
1106 		} else {
1107 			pipe_resource_reference(&buffer, input->buffer);
1108 			va = r600_resource(buffer)->gpu_address + input->buffer_offset;
1109 			/* Only track usage for non-user buffers. */
1110 			r600_resource(buffer)->bind_history |= PIPE_BIND_CONSTANT_BUFFER;
1111 		}
1112 
1113 		/* Set the descriptor. */
1114 		uint32_t *desc = descs->list + slot*4;
1115 		desc[0] = va;
1116 		desc[1] = S_008F04_BASE_ADDRESS_HI(va >> 32) |
1117 			  S_008F04_STRIDE(0);
1118 		desc[2] = input->buffer_size;
1119 		desc[3] = S_008F0C_DST_SEL_X(V_008F0C_SQ_SEL_X) |
1120 			  S_008F0C_DST_SEL_Y(V_008F0C_SQ_SEL_Y) |
1121 			  S_008F0C_DST_SEL_Z(V_008F0C_SQ_SEL_Z) |
1122 			  S_008F0C_DST_SEL_W(V_008F0C_SQ_SEL_W) |
1123 			  S_008F0C_NUM_FORMAT(V_008F0C_BUF_NUM_FORMAT_FLOAT) |
1124 			  S_008F0C_DATA_FORMAT(V_008F0C_BUF_DATA_FORMAT_32);
1125 
1126 		buffers->buffers[slot] = buffer;
1127 		radeon_add_to_buffer_list_check_mem(&sctx->b, &sctx->b.gfx,
1128 						    (struct r600_resource*)buffer,
1129 						    buffers->shader_usage,
1130 						    buffers->priority, true);
1131 		buffers->enabled_mask |= 1u << slot;
1132 	} else {
1133 		/* Clear the descriptor. */
1134 		memset(descs->list + slot*4, 0, sizeof(uint32_t) * 4);
1135 		buffers->enabled_mask &= ~(1u << slot);
1136 	}
1137 
1138 	descs->dirty_mask |= 1u << slot;
1139 	sctx->descriptors_dirty |= 1u << descriptors_idx;
1140 }
1141 
si_set_rw_buffer(struct si_context * sctx,uint slot,const struct pipe_constant_buffer * input)1142 void si_set_rw_buffer(struct si_context *sctx,
1143 		      uint slot, const struct pipe_constant_buffer *input)
1144 {
1145 	si_set_constant_buffer(sctx, &sctx->rw_buffers,
1146 			                        SI_DESCS_RW_BUFFERS, slot, input);
1147 }
1148 
si_pipe_set_constant_buffer(struct pipe_context * ctx,uint shader,uint slot,const struct pipe_constant_buffer * input)1149 static void si_pipe_set_constant_buffer(struct pipe_context *ctx,
1150 					uint shader, uint slot,
1151 					const struct pipe_constant_buffer *input)
1152 {
1153 	struct si_context *sctx = (struct si_context *)ctx;
1154 
1155 	if (shader >= SI_NUM_SHADERS)
1156 		return;
1157 
1158 	si_set_constant_buffer(sctx, &sctx->const_buffers[shader],
1159 			       si_const_buffer_descriptors_idx(shader),
1160 			       slot, input);
1161 }
1162 
si_get_pipe_constant_buffer(struct si_context * sctx,uint shader,uint slot,struct pipe_constant_buffer * cbuf)1163 void si_get_pipe_constant_buffer(struct si_context *sctx, uint shader,
1164 				 uint slot, struct pipe_constant_buffer *cbuf)
1165 {
1166 	cbuf->user_buffer = NULL;
1167 	si_get_buffer_from_descriptors(
1168 		&sctx->const_buffers[shader],
1169 		si_const_buffer_descriptors(sctx, shader),
1170 		slot, &cbuf->buffer, &cbuf->buffer_offset, &cbuf->buffer_size);
1171 }
1172 
1173 /* SHADER BUFFERS */
1174 
1175 static unsigned
si_shader_buffer_descriptors_idx(enum pipe_shader_type shader)1176 si_shader_buffer_descriptors_idx(enum pipe_shader_type shader)
1177 {
1178 	return SI_DESCS_FIRST_SHADER + shader * SI_NUM_SHADER_DESCS +
1179 	       SI_SHADER_DESCS_SHADER_BUFFERS;
1180 }
1181 
1182 static struct si_descriptors *
si_shader_buffer_descriptors(struct si_context * sctx,enum pipe_shader_type shader)1183 si_shader_buffer_descriptors(struct si_context *sctx,
1184 				  enum pipe_shader_type shader)
1185 {
1186 	return &sctx->descriptors[si_shader_buffer_descriptors_idx(shader)];
1187 }
1188 
si_set_shader_buffers(struct pipe_context * ctx,enum pipe_shader_type shader,unsigned start_slot,unsigned count,const struct pipe_shader_buffer * sbuffers)1189 static void si_set_shader_buffers(struct pipe_context *ctx,
1190 				  enum pipe_shader_type shader,
1191 				  unsigned start_slot, unsigned count,
1192 				  const struct pipe_shader_buffer *sbuffers)
1193 {
1194 	struct si_context *sctx = (struct si_context *)ctx;
1195 	struct si_buffer_resources *buffers = &sctx->shader_buffers[shader];
1196 	struct si_descriptors *descs = si_shader_buffer_descriptors(sctx, shader);
1197 	unsigned i;
1198 
1199 	assert(start_slot + count <= SI_NUM_SHADER_BUFFERS);
1200 
1201 	for (i = 0; i < count; ++i) {
1202 		const struct pipe_shader_buffer *sbuffer = sbuffers ? &sbuffers[i] : NULL;
1203 		struct r600_resource *buf;
1204 		unsigned slot = start_slot + i;
1205 		uint32_t *desc = descs->list + slot * 4;
1206 		uint64_t va;
1207 
1208 		if (!sbuffer || !sbuffer->buffer) {
1209 			pipe_resource_reference(&buffers->buffers[slot], NULL);
1210 			memset(desc, 0, sizeof(uint32_t) * 4);
1211 			buffers->enabled_mask &= ~(1u << slot);
1212 			descs->dirty_mask |= 1u << slot;
1213 			sctx->descriptors_dirty |=
1214 				1u << si_shader_buffer_descriptors_idx(shader);
1215 			continue;
1216 		}
1217 
1218 		buf = (struct r600_resource *)sbuffer->buffer;
1219 		va = buf->gpu_address + sbuffer->buffer_offset;
1220 
1221 		desc[0] = va;
1222 		desc[1] = S_008F04_BASE_ADDRESS_HI(va >> 32) |
1223 			  S_008F04_STRIDE(0);
1224 		desc[2] = sbuffer->buffer_size;
1225 		desc[3] = S_008F0C_DST_SEL_X(V_008F0C_SQ_SEL_X) |
1226 			  S_008F0C_DST_SEL_Y(V_008F0C_SQ_SEL_Y) |
1227 			  S_008F0C_DST_SEL_Z(V_008F0C_SQ_SEL_Z) |
1228 			  S_008F0C_DST_SEL_W(V_008F0C_SQ_SEL_W) |
1229 			  S_008F0C_NUM_FORMAT(V_008F0C_BUF_NUM_FORMAT_FLOAT) |
1230 			  S_008F0C_DATA_FORMAT(V_008F0C_BUF_DATA_FORMAT_32);
1231 
1232 		pipe_resource_reference(&buffers->buffers[slot], &buf->b.b);
1233 		radeon_add_to_buffer_list_check_mem(&sctx->b, &sctx->b.gfx, buf,
1234 						    buffers->shader_usage,
1235 						    buffers->priority, true);
1236 		buf->bind_history |= PIPE_BIND_SHADER_BUFFER;
1237 
1238 		buffers->enabled_mask |= 1u << slot;
1239 		descs->dirty_mask |= 1u << slot;
1240 		sctx->descriptors_dirty |=
1241 			1u << si_shader_buffer_descriptors_idx(shader);
1242 
1243 		util_range_add(&buf->valid_buffer_range, sbuffer->buffer_offset,
1244 			       sbuffer->buffer_offset + sbuffer->buffer_size);
1245 	}
1246 }
1247 
si_get_shader_buffers(struct si_context * sctx,uint shader,uint start_slot,uint count,struct pipe_shader_buffer * sbuf)1248 void si_get_shader_buffers(struct si_context *sctx, uint shader,
1249 			   uint start_slot, uint count,
1250 			   struct pipe_shader_buffer *sbuf)
1251 {
1252 	struct si_buffer_resources *buffers = &sctx->shader_buffers[shader];
1253 	struct si_descriptors *descs = si_shader_buffer_descriptors(sctx, shader);
1254 
1255 	for (unsigned i = 0; i < count; ++i) {
1256 		si_get_buffer_from_descriptors(
1257 			buffers, descs, start_slot + i,
1258 			&sbuf[i].buffer, &sbuf[i].buffer_offset,
1259 			&sbuf[i].buffer_size);
1260 	}
1261 }
1262 
1263 /* RING BUFFERS */
1264 
si_set_ring_buffer(struct pipe_context * ctx,uint slot,struct pipe_resource * buffer,unsigned stride,unsigned num_records,bool add_tid,bool swizzle,unsigned element_size,unsigned index_stride,uint64_t offset)1265 void si_set_ring_buffer(struct pipe_context *ctx, uint slot,
1266 			struct pipe_resource *buffer,
1267 			unsigned stride, unsigned num_records,
1268 			bool add_tid, bool swizzle,
1269 			unsigned element_size, unsigned index_stride, uint64_t offset)
1270 {
1271 	struct si_context *sctx = (struct si_context *)ctx;
1272 	struct si_buffer_resources *buffers = &sctx->rw_buffers;
1273 	struct si_descriptors *descs = &sctx->descriptors[SI_DESCS_RW_BUFFERS];
1274 
1275 	/* The stride field in the resource descriptor has 14 bits */
1276 	assert(stride < (1 << 14));
1277 
1278 	assert(slot < descs->num_elements);
1279 	pipe_resource_reference(&buffers->buffers[slot], NULL);
1280 
1281 	if (buffer) {
1282 		uint64_t va;
1283 
1284 		va = r600_resource(buffer)->gpu_address + offset;
1285 
1286 		switch (element_size) {
1287 		default:
1288 			assert(!"Unsupported ring buffer element size");
1289 		case 0:
1290 		case 2:
1291 			element_size = 0;
1292 			break;
1293 		case 4:
1294 			element_size = 1;
1295 			break;
1296 		case 8:
1297 			element_size = 2;
1298 			break;
1299 		case 16:
1300 			element_size = 3;
1301 			break;
1302 		}
1303 
1304 		switch (index_stride) {
1305 		default:
1306 			assert(!"Unsupported ring buffer index stride");
1307 		case 0:
1308 		case 8:
1309 			index_stride = 0;
1310 			break;
1311 		case 16:
1312 			index_stride = 1;
1313 			break;
1314 		case 32:
1315 			index_stride = 2;
1316 			break;
1317 		case 64:
1318 			index_stride = 3;
1319 			break;
1320 		}
1321 
1322 		if (sctx->b.chip_class >= VI && stride)
1323 			num_records *= stride;
1324 
1325 		/* Set the descriptor. */
1326 		uint32_t *desc = descs->list + slot*4;
1327 		desc[0] = va;
1328 		desc[1] = S_008F04_BASE_ADDRESS_HI(va >> 32) |
1329 			  S_008F04_STRIDE(stride) |
1330 			  S_008F04_SWIZZLE_ENABLE(swizzle);
1331 		desc[2] = num_records;
1332 		desc[3] = S_008F0C_DST_SEL_X(V_008F0C_SQ_SEL_X) |
1333 			  S_008F0C_DST_SEL_Y(V_008F0C_SQ_SEL_Y) |
1334 			  S_008F0C_DST_SEL_Z(V_008F0C_SQ_SEL_Z) |
1335 			  S_008F0C_DST_SEL_W(V_008F0C_SQ_SEL_W) |
1336 			  S_008F0C_NUM_FORMAT(V_008F0C_BUF_NUM_FORMAT_FLOAT) |
1337 			  S_008F0C_DATA_FORMAT(V_008F0C_BUF_DATA_FORMAT_32) |
1338 			  S_008F0C_ELEMENT_SIZE(element_size) |
1339 			  S_008F0C_INDEX_STRIDE(index_stride) |
1340 			  S_008F0C_ADD_TID_ENABLE(add_tid);
1341 
1342 		pipe_resource_reference(&buffers->buffers[slot], buffer);
1343 		radeon_add_to_buffer_list(&sctx->b, &sctx->b.gfx,
1344 				      (struct r600_resource*)buffer,
1345 				      buffers->shader_usage, buffers->priority);
1346 		buffers->enabled_mask |= 1u << slot;
1347 	} else {
1348 		/* Clear the descriptor. */
1349 		memset(descs->list + slot*4, 0, sizeof(uint32_t) * 4);
1350 		buffers->enabled_mask &= ~(1u << slot);
1351 	}
1352 
1353 	descs->dirty_mask |= 1u << slot;
1354 	sctx->descriptors_dirty |= 1u << SI_DESCS_RW_BUFFERS;
1355 }
1356 
1357 /* STREAMOUT BUFFERS */
1358 
si_set_streamout_targets(struct pipe_context * ctx,unsigned num_targets,struct pipe_stream_output_target ** targets,const unsigned * offsets)1359 static void si_set_streamout_targets(struct pipe_context *ctx,
1360 				     unsigned num_targets,
1361 				     struct pipe_stream_output_target **targets,
1362 				     const unsigned *offsets)
1363 {
1364 	struct si_context *sctx = (struct si_context *)ctx;
1365 	struct si_buffer_resources *buffers = &sctx->rw_buffers;
1366 	struct si_descriptors *descs = &sctx->descriptors[SI_DESCS_RW_BUFFERS];
1367 	unsigned old_num_targets = sctx->b.streamout.num_targets;
1368 	unsigned i, bufidx;
1369 
1370 	/* We are going to unbind the buffers. Mark which caches need to be flushed. */
1371 	if (sctx->b.streamout.num_targets && sctx->b.streamout.begin_emitted) {
1372 		/* Since streamout uses vector writes which go through TC L2
1373 		 * and most other clients can use TC L2 as well, we don't need
1374 		 * to flush it.
1375 		 *
1376 		 * The only cases which requires flushing it is VGT DMA index
1377 		 * fetching (on <= CIK) and indirect draw data, which are rare
1378 		 * cases. Thus, flag the TC L2 dirtiness in the resource and
1379 		 * handle it at draw call time.
1380 		 */
1381 		for (i = 0; i < sctx->b.streamout.num_targets; i++)
1382 			if (sctx->b.streamout.targets[i])
1383 				r600_resource(sctx->b.streamout.targets[i]->b.buffer)->TC_L2_dirty = true;
1384 
1385 		/* Invalidate the scalar cache in case a streamout buffer is
1386 		 * going to be used as a constant buffer.
1387 		 *
1388 		 * Invalidate TC L1, because streamout bypasses it (done by
1389 		 * setting GLC=1 in the store instruction), but it can contain
1390 		 * outdated data of streamout buffers.
1391 		 *
1392 		 * VS_PARTIAL_FLUSH is required if the buffers are going to be
1393 		 * used as an input immediately.
1394 		 */
1395 		sctx->b.flags |= SI_CONTEXT_INV_SMEM_L1 |
1396 				 SI_CONTEXT_INV_VMEM_L1 |
1397 				 SI_CONTEXT_VS_PARTIAL_FLUSH;
1398 	}
1399 
1400 	/* All readers of the streamout targets need to be finished before we can
1401 	 * start writing to the targets.
1402 	 */
1403 	if (num_targets)
1404 		sctx->b.flags |= SI_CONTEXT_PS_PARTIAL_FLUSH |
1405 		                 SI_CONTEXT_CS_PARTIAL_FLUSH;
1406 
1407 	/* Streamout buffers must be bound in 2 places:
1408 	 * 1) in VGT by setting the VGT_STRMOUT registers
1409 	 * 2) as shader resources
1410 	 */
1411 
1412 	/* Set the VGT regs. */
1413 	r600_set_streamout_targets(ctx, num_targets, targets, offsets);
1414 
1415 	/* Set the shader resources.*/
1416 	for (i = 0; i < num_targets; i++) {
1417 		bufidx = SI_VS_STREAMOUT_BUF0 + i;
1418 
1419 		if (targets[i]) {
1420 			struct pipe_resource *buffer = targets[i]->buffer;
1421 			uint64_t va = r600_resource(buffer)->gpu_address;
1422 
1423 			/* Set the descriptor.
1424 			 *
1425 			 * On VI, the format must be non-INVALID, otherwise
1426 			 * the buffer will be considered not bound and store
1427 			 * instructions will be no-ops.
1428 			 */
1429 			uint32_t *desc = descs->list + bufidx*4;
1430 			desc[0] = va;
1431 			desc[1] = S_008F04_BASE_ADDRESS_HI(va >> 32);
1432 			desc[2] = 0xffffffff;
1433 			desc[3] = S_008F0C_DST_SEL_X(V_008F0C_SQ_SEL_X) |
1434 				  S_008F0C_DST_SEL_Y(V_008F0C_SQ_SEL_Y) |
1435 				  S_008F0C_DST_SEL_Z(V_008F0C_SQ_SEL_Z) |
1436 				  S_008F0C_DST_SEL_W(V_008F0C_SQ_SEL_W) |
1437 				  S_008F0C_DATA_FORMAT(V_008F0C_BUF_DATA_FORMAT_32);
1438 
1439 			/* Set the resource. */
1440 			pipe_resource_reference(&buffers->buffers[bufidx],
1441 						buffer);
1442 			radeon_add_to_buffer_list_check_mem(&sctx->b, &sctx->b.gfx,
1443 							    (struct r600_resource*)buffer,
1444 							    buffers->shader_usage,
1445 							    RADEON_PRIO_SHADER_RW_BUFFER,
1446 							    true);
1447 			r600_resource(buffer)->bind_history |= PIPE_BIND_STREAM_OUTPUT;
1448 
1449 			buffers->enabled_mask |= 1u << bufidx;
1450 		} else {
1451 			/* Clear the descriptor and unset the resource. */
1452 			memset(descs->list + bufidx*4, 0,
1453 			       sizeof(uint32_t) * 4);
1454 			pipe_resource_reference(&buffers->buffers[bufidx],
1455 						NULL);
1456 			buffers->enabled_mask &= ~(1u << bufidx);
1457 		}
1458 		descs->dirty_mask |= 1u << bufidx;
1459 	}
1460 	for (; i < old_num_targets; i++) {
1461 		bufidx = SI_VS_STREAMOUT_BUF0 + i;
1462 		/* Clear the descriptor and unset the resource. */
1463 		memset(descs->list + bufidx*4, 0, sizeof(uint32_t) * 4);
1464 		pipe_resource_reference(&buffers->buffers[bufidx], NULL);
1465 		buffers->enabled_mask &= ~(1u << bufidx);
1466 		descs->dirty_mask |= 1u << bufidx;
1467 	}
1468 
1469 	sctx->descriptors_dirty |= 1u << SI_DESCS_RW_BUFFERS;
1470 }
1471 
si_desc_reset_buffer_offset(struct pipe_context * ctx,uint32_t * desc,uint64_t old_buf_va,struct pipe_resource * new_buf)1472 static void si_desc_reset_buffer_offset(struct pipe_context *ctx,
1473 					uint32_t *desc, uint64_t old_buf_va,
1474 					struct pipe_resource *new_buf)
1475 {
1476 	/* Retrieve the buffer offset from the descriptor. */
1477 	uint64_t old_desc_va =
1478 		desc[0] | ((uint64_t)G_008F04_BASE_ADDRESS_HI(desc[1]) << 32);
1479 
1480 	assert(old_buf_va <= old_desc_va);
1481 	uint64_t offset_within_buffer = old_desc_va - old_buf_va;
1482 
1483 	/* Update the descriptor. */
1484 	si_set_buf_desc_address(r600_resource(new_buf), offset_within_buffer,
1485 				desc);
1486 }
1487 
1488 /* INTERNAL CONST BUFFERS */
1489 
si_set_polygon_stipple(struct pipe_context * ctx,const struct pipe_poly_stipple * state)1490 static void si_set_polygon_stipple(struct pipe_context *ctx,
1491 				   const struct pipe_poly_stipple *state)
1492 {
1493 	struct si_context *sctx = (struct si_context *)ctx;
1494 	struct pipe_constant_buffer cb = {};
1495 	unsigned stipple[32];
1496 	int i;
1497 
1498 	for (i = 0; i < 32; i++)
1499 		stipple[i] = util_bitreverse(state->stipple[i]);
1500 
1501 	cb.user_buffer = stipple;
1502 	cb.buffer_size = sizeof(stipple);
1503 
1504 	si_set_rw_buffer(sctx, SI_PS_CONST_POLY_STIPPLE, &cb);
1505 }
1506 
1507 /* TEXTURE METADATA ENABLE/DISABLE */
1508 
1509 /* CMASK can be enabled (for fast clear) and disabled (for texture export)
1510  * while the texture is bound, possibly by a different context. In that case,
1511  * call this function to update compressed_colortex_masks.
1512  */
si_update_compressed_colortex_masks(struct si_context * sctx)1513 void si_update_compressed_colortex_masks(struct si_context *sctx)
1514 {
1515 	for (int i = 0; i < SI_NUM_SHADERS; ++i) {
1516 		si_samplers_update_compressed_colortex_mask(&sctx->samplers[i]);
1517 		si_images_update_compressed_colortex_mask(&sctx->images[i]);
1518 		si_update_compressed_tex_shader_mask(sctx, i);
1519 	}
1520 }
1521 
1522 /* BUFFER DISCARD/INVALIDATION */
1523 
1524 /** Reset descriptors of buffer resources after \p buf has been invalidated. */
si_reset_buffer_resources(struct si_context * sctx,struct si_buffer_resources * buffers,unsigned descriptors_idx,struct pipe_resource * buf,uint64_t old_va)1525 static void si_reset_buffer_resources(struct si_context *sctx,
1526 				      struct si_buffer_resources *buffers,
1527 				      unsigned descriptors_idx,
1528 				      struct pipe_resource *buf,
1529 				      uint64_t old_va)
1530 {
1531 	struct si_descriptors *descs = &sctx->descriptors[descriptors_idx];
1532 	unsigned mask = buffers->enabled_mask;
1533 
1534 	while (mask) {
1535 		unsigned i = u_bit_scan(&mask);
1536 		if (buffers->buffers[i] == buf) {
1537 			si_desc_reset_buffer_offset(&sctx->b.b,
1538 						    descs->list + i*4,
1539 						    old_va, buf);
1540 			descs->dirty_mask |= 1u << i;
1541 			sctx->descriptors_dirty |= 1u << descriptors_idx;
1542 
1543 			radeon_add_to_buffer_list_check_mem(&sctx->b, &sctx->b.gfx,
1544 							    (struct r600_resource *)buf,
1545 							    buffers->shader_usage,
1546 							    buffers->priority, true);
1547 		}
1548 	}
1549 }
1550 
1551 /* Reallocate a buffer a update all resource bindings where the buffer is
1552  * bound.
1553  *
1554  * This is used to avoid CPU-GPU synchronizations, because it makes the buffer
1555  * idle by discarding its contents. Apps usually tell us when to do this using
1556  * map_buffer flags, for example.
1557  */
si_invalidate_buffer(struct pipe_context * ctx,struct pipe_resource * buf)1558 static void si_invalidate_buffer(struct pipe_context *ctx, struct pipe_resource *buf)
1559 {
1560 	struct si_context *sctx = (struct si_context*)ctx;
1561 	struct r600_resource *rbuffer = r600_resource(buf);
1562 	unsigned i, shader;
1563 	uint64_t old_va = rbuffer->gpu_address;
1564 	unsigned num_elems = sctx->vertex_elements ?
1565 				       sctx->vertex_elements->count : 0;
1566 
1567 	/* Reallocate the buffer in the same pipe_resource. */
1568 	r600_alloc_resource(&sctx->screen->b, rbuffer);
1569 
1570 	/* We changed the buffer, now we need to bind it where the old one
1571 	 * was bound. This consists of 2 things:
1572 	 *   1) Updating the resource descriptor and dirtying it.
1573 	 *   2) Adding a relocation to the CS, so that it's usable.
1574 	 */
1575 
1576 	/* Vertex buffers. */
1577 	if (rbuffer->bind_history & PIPE_BIND_VERTEX_BUFFER) {
1578 		for (i = 0; i < num_elems; i++) {
1579 			int vb = sctx->vertex_elements->elements[i].vertex_buffer_index;
1580 
1581 			if (vb >= ARRAY_SIZE(sctx->vertex_buffer))
1582 				continue;
1583 			if (!sctx->vertex_buffer[vb].buffer)
1584 				continue;
1585 
1586 			if (sctx->vertex_buffer[vb].buffer == buf) {
1587 				sctx->vertex_buffers_dirty = true;
1588 				break;
1589 			}
1590 		}
1591 	}
1592 
1593 	/* Streamout buffers. (other internal buffers can't be invalidated) */
1594 	if (rbuffer->bind_history & PIPE_BIND_STREAM_OUTPUT) {
1595 		for (i = SI_VS_STREAMOUT_BUF0; i <= SI_VS_STREAMOUT_BUF3; i++) {
1596 			struct si_buffer_resources *buffers = &sctx->rw_buffers;
1597 			struct si_descriptors *descs =
1598 				&sctx->descriptors[SI_DESCS_RW_BUFFERS];
1599 
1600 			if (buffers->buffers[i] != buf)
1601 				continue;
1602 
1603 			si_desc_reset_buffer_offset(ctx, descs->list + i*4,
1604 						    old_va, buf);
1605 			descs->dirty_mask |= 1u << i;
1606 			sctx->descriptors_dirty |= 1u << SI_DESCS_RW_BUFFERS;
1607 
1608 			radeon_add_to_buffer_list_check_mem(&sctx->b, &sctx->b.gfx,
1609 							    rbuffer, buffers->shader_usage,
1610 							    RADEON_PRIO_SHADER_RW_BUFFER,
1611 							    true);
1612 
1613 			/* Update the streamout state. */
1614 			if (sctx->b.streamout.begin_emitted)
1615 				r600_emit_streamout_end(&sctx->b);
1616 			sctx->b.streamout.append_bitmask =
1617 					sctx->b.streamout.enabled_mask;
1618 			r600_streamout_buffers_dirty(&sctx->b);
1619 		}
1620 	}
1621 
1622 	/* Constant and shader buffers. */
1623 	if (rbuffer->bind_history & PIPE_BIND_CONSTANT_BUFFER) {
1624 		for (shader = 0; shader < SI_NUM_SHADERS; shader++)
1625 			si_reset_buffer_resources(sctx, &sctx->const_buffers[shader],
1626 						  si_const_buffer_descriptors_idx(shader),
1627 						  buf, old_va);
1628 	}
1629 
1630 	if (rbuffer->bind_history & PIPE_BIND_SHADER_BUFFER) {
1631 		for (shader = 0; shader < SI_NUM_SHADERS; shader++)
1632 			si_reset_buffer_resources(sctx, &sctx->shader_buffers[shader],
1633 						  si_shader_buffer_descriptors_idx(shader),
1634 						  buf, old_va);
1635 	}
1636 
1637 	if (rbuffer->bind_history & PIPE_BIND_SAMPLER_VIEW) {
1638 		/* Texture buffers - update bindings. */
1639 		for (shader = 0; shader < SI_NUM_SHADERS; shader++) {
1640 			struct si_sampler_views *views = &sctx->samplers[shader].views;
1641 			struct si_descriptors *descs =
1642 				si_sampler_descriptors(sctx, shader);
1643 			unsigned mask = views->enabled_mask;
1644 
1645 			while (mask) {
1646 				unsigned i = u_bit_scan(&mask);
1647 				if (views->views[i]->texture == buf) {
1648 					si_desc_reset_buffer_offset(ctx,
1649 								    descs->list +
1650 								    i * 16 + 4,
1651 								    old_va, buf);
1652 					descs->dirty_mask |= 1u << i;
1653 					sctx->descriptors_dirty |=
1654 						1u << si_sampler_descriptors_idx(shader);
1655 
1656 					radeon_add_to_buffer_list_check_mem(&sctx->b, &sctx->b.gfx,
1657 									    rbuffer, RADEON_USAGE_READ,
1658 									    RADEON_PRIO_SAMPLER_BUFFER,
1659 									    true);
1660 				}
1661 			}
1662 		}
1663 	}
1664 
1665 	/* Shader images */
1666 	if (rbuffer->bind_history & PIPE_BIND_SHADER_IMAGE) {
1667 		for (shader = 0; shader < SI_NUM_SHADERS; ++shader) {
1668 			struct si_images_info *images = &sctx->images[shader];
1669 			struct si_descriptors *descs =
1670 				si_image_descriptors(sctx, shader);
1671 			unsigned mask = images->enabled_mask;
1672 
1673 			while (mask) {
1674 				unsigned i = u_bit_scan(&mask);
1675 
1676 				if (images->views[i].resource == buf) {
1677 					if (images->views[i].access & PIPE_IMAGE_ACCESS_WRITE)
1678 						si_mark_image_range_valid(&images->views[i]);
1679 
1680 					si_desc_reset_buffer_offset(
1681 						ctx, descs->list + i * 8 + 4,
1682 						old_va, buf);
1683 					descs->dirty_mask |= 1u << i;
1684 					sctx->descriptors_dirty |=
1685 						1u << si_image_descriptors_idx(shader);
1686 
1687 					radeon_add_to_buffer_list_check_mem(
1688 						&sctx->b, &sctx->b.gfx, rbuffer,
1689 						RADEON_USAGE_READWRITE,
1690 						RADEON_PRIO_SAMPLER_BUFFER, true);
1691 				}
1692 			}
1693 		}
1694 	}
1695 }
1696 
1697 /* Update mutable image descriptor fields of all bound textures. */
si_update_all_texture_descriptors(struct si_context * sctx)1698 void si_update_all_texture_descriptors(struct si_context *sctx)
1699 {
1700 	unsigned shader;
1701 
1702 	for (shader = 0; shader < SI_NUM_SHADERS; shader++) {
1703 		struct si_sampler_views *samplers = &sctx->samplers[shader].views;
1704 		struct si_images_info *images = &sctx->images[shader];
1705 		unsigned mask;
1706 
1707 		/* Images. */
1708 		mask = images->enabled_mask;
1709 		while (mask) {
1710 			unsigned i = u_bit_scan(&mask);
1711 			struct pipe_image_view *view = &images->views[i];
1712 
1713 			if (!view->resource ||
1714 			    view->resource->target == PIPE_BUFFER)
1715 				continue;
1716 
1717 			si_set_shader_image(sctx, shader, i, view, true);
1718 		}
1719 
1720 		/* Sampler views. */
1721 		mask = samplers->enabled_mask;
1722 		while (mask) {
1723 			unsigned i = u_bit_scan(&mask);
1724 			struct pipe_sampler_view *view = samplers->views[i];
1725 
1726 			if (!view ||
1727 			    !view->texture ||
1728 			    view->texture->target == PIPE_BUFFER)
1729 				continue;
1730 
1731 			si_set_sampler_view(sctx, shader, i,
1732 					    samplers->views[i], true);
1733 		}
1734 
1735 		si_update_compressed_tex_shader_mask(sctx, shader);
1736 	}
1737 }
1738 
1739 /* SHADER USER DATA */
1740 
si_mark_shader_pointers_dirty(struct si_context * sctx,unsigned shader)1741 static void si_mark_shader_pointers_dirty(struct si_context *sctx,
1742 					  unsigned shader)
1743 {
1744 	sctx->shader_pointers_dirty |=
1745 		u_bit_consecutive(SI_DESCS_FIRST_SHADER + shader * SI_NUM_SHADER_DESCS,
1746 				  SI_NUM_SHADER_DESCS);
1747 
1748 	if (shader == PIPE_SHADER_VERTEX)
1749 		sctx->vertex_buffer_pointer_dirty = sctx->vertex_buffers.buffer != NULL;
1750 
1751 	si_mark_atom_dirty(sctx, &sctx->shader_userdata.atom);
1752 }
1753 
si_shader_userdata_begin_new_cs(struct si_context * sctx)1754 static void si_shader_userdata_begin_new_cs(struct si_context *sctx)
1755 {
1756 	sctx->shader_pointers_dirty = u_bit_consecutive(0, SI_NUM_DESCS);
1757 	sctx->vertex_buffer_pointer_dirty = sctx->vertex_buffers.buffer != NULL;
1758 	si_mark_atom_dirty(sctx, &sctx->shader_userdata.atom);
1759 }
1760 
1761 /* Set a base register address for user data constants in the given shader.
1762  * This assigns a mapping from PIPE_SHADER_* to SPI_SHADER_USER_DATA_*.
1763  */
si_set_user_data_base(struct si_context * sctx,unsigned shader,uint32_t new_base)1764 static void si_set_user_data_base(struct si_context *sctx,
1765 				  unsigned shader, uint32_t new_base)
1766 {
1767 	uint32_t *base = &sctx->shader_userdata.sh_base[shader];
1768 
1769 	if (*base != new_base) {
1770 		*base = new_base;
1771 
1772 		if (new_base)
1773 			si_mark_shader_pointers_dirty(sctx, shader);
1774 	}
1775 }
1776 
1777 /* This must be called when these shaders are changed from non-NULL to NULL
1778  * and vice versa:
1779  * - geometry shader
1780  * - tessellation control shader
1781  * - tessellation evaluation shader
1782  */
si_shader_change_notify(struct si_context * sctx)1783 void si_shader_change_notify(struct si_context *sctx)
1784 {
1785 	/* VS can be bound as VS, ES, or LS. */
1786 	if (sctx->tes_shader.cso)
1787 		si_set_user_data_base(sctx, PIPE_SHADER_VERTEX,
1788 				      R_00B530_SPI_SHADER_USER_DATA_LS_0);
1789 	else if (sctx->gs_shader.cso)
1790 		si_set_user_data_base(sctx, PIPE_SHADER_VERTEX,
1791 				      R_00B330_SPI_SHADER_USER_DATA_ES_0);
1792 	else
1793 		si_set_user_data_base(sctx, PIPE_SHADER_VERTEX,
1794 				      R_00B130_SPI_SHADER_USER_DATA_VS_0);
1795 
1796 	/* TES can be bound as ES, VS, or not bound. */
1797 	if (sctx->tes_shader.cso) {
1798 		if (sctx->gs_shader.cso)
1799 			si_set_user_data_base(sctx, PIPE_SHADER_TESS_EVAL,
1800 					      R_00B330_SPI_SHADER_USER_DATA_ES_0);
1801 		else
1802 			si_set_user_data_base(sctx, PIPE_SHADER_TESS_EVAL,
1803 					      R_00B130_SPI_SHADER_USER_DATA_VS_0);
1804 	} else {
1805 		si_set_user_data_base(sctx, PIPE_SHADER_TESS_EVAL, 0);
1806 	}
1807 }
1808 
si_emit_shader_pointer(struct si_context * sctx,struct si_descriptors * desc,unsigned sh_base)1809 static void si_emit_shader_pointer(struct si_context *sctx,
1810 				   struct si_descriptors *desc,
1811 				   unsigned sh_base)
1812 {
1813 	struct radeon_winsys_cs *cs = sctx->b.gfx.cs;
1814 	uint64_t va;
1815 
1816 	assert(desc->buffer);
1817 
1818 	va = desc->buffer->gpu_address +
1819 	     desc->buffer_offset;
1820 
1821 	radeon_emit(cs, PKT3(PKT3_SET_SH_REG, 2, 0));
1822 	radeon_emit(cs, (sh_base + desc->shader_userdata_offset - SI_SH_REG_OFFSET) >> 2);
1823 	radeon_emit(cs, va);
1824 	radeon_emit(cs, va >> 32);
1825 }
1826 
si_emit_graphics_shader_userdata(struct si_context * sctx,struct r600_atom * atom)1827 void si_emit_graphics_shader_userdata(struct si_context *sctx,
1828                                       struct r600_atom *atom)
1829 {
1830 	unsigned mask;
1831 	uint32_t *sh_base = sctx->shader_userdata.sh_base;
1832 	struct si_descriptors *descs;
1833 
1834 	descs = &sctx->descriptors[SI_DESCS_RW_BUFFERS];
1835 
1836 	if (sctx->shader_pointers_dirty & (1 << SI_DESCS_RW_BUFFERS)) {
1837 		si_emit_shader_pointer(sctx, descs,
1838 				       R_00B030_SPI_SHADER_USER_DATA_PS_0);
1839 		si_emit_shader_pointer(sctx, descs,
1840 				       R_00B130_SPI_SHADER_USER_DATA_VS_0);
1841 		si_emit_shader_pointer(sctx, descs,
1842 				       R_00B230_SPI_SHADER_USER_DATA_GS_0);
1843 		si_emit_shader_pointer(sctx, descs,
1844 				       R_00B330_SPI_SHADER_USER_DATA_ES_0);
1845 		si_emit_shader_pointer(sctx, descs,
1846 				       R_00B430_SPI_SHADER_USER_DATA_HS_0);
1847 	}
1848 
1849 	mask = sctx->shader_pointers_dirty &
1850 	       u_bit_consecutive(SI_DESCS_FIRST_SHADER,
1851 				 SI_DESCS_FIRST_COMPUTE - SI_DESCS_FIRST_SHADER);
1852 
1853 	while (mask) {
1854 		unsigned i = u_bit_scan(&mask);
1855 		unsigned shader = (i - SI_DESCS_FIRST_SHADER) / SI_NUM_SHADER_DESCS;
1856 		unsigned base = sh_base[shader];
1857 
1858 		if (base)
1859 			si_emit_shader_pointer(sctx, descs + i, base);
1860 	}
1861 	sctx->shader_pointers_dirty &=
1862 		~u_bit_consecutive(SI_DESCS_RW_BUFFERS, SI_DESCS_FIRST_COMPUTE);
1863 
1864 	if (sctx->vertex_buffer_pointer_dirty) {
1865 		si_emit_shader_pointer(sctx, &sctx->vertex_buffers,
1866 				       sh_base[PIPE_SHADER_VERTEX]);
1867 		sctx->vertex_buffer_pointer_dirty = false;
1868 	}
1869 }
1870 
si_emit_compute_shader_userdata(struct si_context * sctx)1871 void si_emit_compute_shader_userdata(struct si_context *sctx)
1872 {
1873 	unsigned base = R_00B900_COMPUTE_USER_DATA_0;
1874 	struct si_descriptors *descs = sctx->descriptors;
1875 	unsigned compute_mask =
1876 		u_bit_consecutive(SI_DESCS_FIRST_COMPUTE, SI_NUM_SHADER_DESCS);
1877 	unsigned mask = sctx->shader_pointers_dirty & compute_mask;
1878 
1879 	while (mask) {
1880 		unsigned i = u_bit_scan(&mask);
1881 
1882 		si_emit_shader_pointer(sctx, descs + i, base);
1883 	}
1884 	sctx->shader_pointers_dirty &= ~compute_mask;
1885 }
1886 
1887 /* INIT/DEINIT/UPLOAD */
1888 
si_init_all_descriptors(struct si_context * sctx)1889 void si_init_all_descriptors(struct si_context *sctx)
1890 {
1891 	int i;
1892 	unsigned ce_offset = 0;
1893 
1894 	for (i = 0; i < SI_NUM_SHADERS; i++) {
1895 		si_init_buffer_resources(&sctx->const_buffers[i],
1896 					 si_const_buffer_descriptors(sctx, i),
1897 					 SI_NUM_CONST_BUFFERS, SI_SGPR_CONST_BUFFERS,
1898 					 RADEON_USAGE_READ, RADEON_PRIO_CONST_BUFFER,
1899 					 &ce_offset);
1900 		si_init_buffer_resources(&sctx->shader_buffers[i],
1901 					 si_shader_buffer_descriptors(sctx, i),
1902 					 SI_NUM_SHADER_BUFFERS, SI_SGPR_SHADER_BUFFERS,
1903 					 RADEON_USAGE_READWRITE, RADEON_PRIO_SHADER_RW_BUFFER,
1904 					 &ce_offset);
1905 
1906 		si_init_descriptors(si_sampler_descriptors(sctx, i),
1907 				    SI_SGPR_SAMPLERS, 16, SI_NUM_SAMPLERS,
1908 				    null_texture_descriptor, &ce_offset);
1909 
1910 		si_init_descriptors(si_image_descriptors(sctx, i),
1911 				    SI_SGPR_IMAGES, 8, SI_NUM_IMAGES,
1912 				    null_image_descriptor, &ce_offset);
1913 	}
1914 
1915 	si_init_buffer_resources(&sctx->rw_buffers,
1916 				 &sctx->descriptors[SI_DESCS_RW_BUFFERS],
1917 				 SI_NUM_RW_BUFFERS, SI_SGPR_RW_BUFFERS,
1918 				 RADEON_USAGE_READWRITE, RADEON_PRIO_SHADER_RINGS,
1919 				 &ce_offset);
1920 	si_init_descriptors(&sctx->vertex_buffers, SI_SGPR_VERTEX_BUFFERS,
1921 			    4, SI_NUM_VERTEX_BUFFERS, NULL, NULL);
1922 
1923 	sctx->descriptors_dirty = u_bit_consecutive(0, SI_NUM_DESCS);
1924 
1925 	assert(ce_offset <= 32768);
1926 
1927 	/* Set pipe_context functions. */
1928 	sctx->b.b.bind_sampler_states = si_bind_sampler_states;
1929 	sctx->b.b.set_shader_images = si_set_shader_images;
1930 	sctx->b.b.set_constant_buffer = si_pipe_set_constant_buffer;
1931 	sctx->b.b.set_polygon_stipple = si_set_polygon_stipple;
1932 	sctx->b.b.set_shader_buffers = si_set_shader_buffers;
1933 	sctx->b.b.set_sampler_views = si_set_sampler_views;
1934 	sctx->b.b.set_stream_output_targets = si_set_streamout_targets;
1935 	sctx->b.invalidate_buffer = si_invalidate_buffer;
1936 
1937 	/* Shader user data. */
1938 	si_init_atom(sctx, &sctx->shader_userdata.atom, &sctx->atoms.s.shader_userdata,
1939 		     si_emit_graphics_shader_userdata);
1940 
1941 	/* Set default and immutable mappings. */
1942 	si_set_user_data_base(sctx, PIPE_SHADER_VERTEX, R_00B130_SPI_SHADER_USER_DATA_VS_0);
1943 	si_set_user_data_base(sctx, PIPE_SHADER_TESS_CTRL, R_00B430_SPI_SHADER_USER_DATA_HS_0);
1944 	si_set_user_data_base(sctx, PIPE_SHADER_GEOMETRY, R_00B230_SPI_SHADER_USER_DATA_GS_0);
1945 	si_set_user_data_base(sctx, PIPE_SHADER_FRAGMENT, R_00B030_SPI_SHADER_USER_DATA_PS_0);
1946 }
1947 
si_upload_graphics_shader_descriptors(struct si_context * sctx)1948 bool si_upload_graphics_shader_descriptors(struct si_context *sctx)
1949 {
1950 	const unsigned mask = u_bit_consecutive(0, SI_DESCS_FIRST_COMPUTE);
1951 	unsigned dirty = sctx->descriptors_dirty & mask;
1952 
1953 	/* Assume nothing will go wrong: */
1954 	sctx->shader_pointers_dirty |= dirty;
1955 
1956 	while (dirty) {
1957 		unsigned i = u_bit_scan(&dirty);
1958 
1959 		if (!si_upload_descriptors(sctx, &sctx->descriptors[i],
1960 					   &sctx->shader_userdata.atom))
1961 			return false;
1962 	}
1963 
1964 	sctx->descriptors_dirty &= ~mask;
1965 	return true;
1966 }
1967 
si_upload_compute_shader_descriptors(struct si_context * sctx)1968 bool si_upload_compute_shader_descriptors(struct si_context *sctx)
1969 {
1970 	/* Does not update rw_buffers as that is not needed for compute shaders
1971 	 * and the input buffer is using the same SGPR's anyway.
1972 	 */
1973 	const unsigned mask = u_bit_consecutive(SI_DESCS_FIRST_COMPUTE,
1974 						SI_NUM_DESCS - SI_DESCS_FIRST_COMPUTE);
1975 	unsigned dirty = sctx->descriptors_dirty & mask;
1976 
1977 	/* Assume nothing will go wrong: */
1978 	sctx->shader_pointers_dirty |= dirty;
1979 
1980 	while (dirty) {
1981 		unsigned i = u_bit_scan(&dirty);
1982 
1983 		if (!si_upload_descriptors(sctx, &sctx->descriptors[i], NULL))
1984 			return false;
1985 	}
1986 
1987 	sctx->descriptors_dirty &= ~mask;
1988 
1989 	return true;
1990 }
1991 
si_release_all_descriptors(struct si_context * sctx)1992 void si_release_all_descriptors(struct si_context *sctx)
1993 {
1994 	int i;
1995 
1996 	for (i = 0; i < SI_NUM_SHADERS; i++) {
1997 		si_release_buffer_resources(&sctx->const_buffers[i],
1998 					    si_const_buffer_descriptors(sctx, i));
1999 		si_release_buffer_resources(&sctx->shader_buffers[i],
2000 					    si_shader_buffer_descriptors(sctx, i));
2001 		si_release_sampler_views(&sctx->samplers[i].views);
2002 		si_release_image_views(&sctx->images[i]);
2003 	}
2004 	si_release_buffer_resources(&sctx->rw_buffers,
2005 				    &sctx->descriptors[SI_DESCS_RW_BUFFERS]);
2006 
2007 	for (i = 0; i < SI_NUM_DESCS; ++i)
2008 		si_release_descriptors(&sctx->descriptors[i]);
2009 	si_release_descriptors(&sctx->vertex_buffers);
2010 }
2011 
si_all_descriptors_begin_new_cs(struct si_context * sctx)2012 void si_all_descriptors_begin_new_cs(struct si_context *sctx)
2013 {
2014 	int i;
2015 
2016 	for (i = 0; i < SI_NUM_SHADERS; i++) {
2017 		si_buffer_resources_begin_new_cs(sctx, &sctx->const_buffers[i]);
2018 		si_buffer_resources_begin_new_cs(sctx, &sctx->shader_buffers[i]);
2019 		si_sampler_views_begin_new_cs(sctx, &sctx->samplers[i].views);
2020 		si_image_views_begin_new_cs(sctx, &sctx->images[i]);
2021 	}
2022 	si_buffer_resources_begin_new_cs(sctx, &sctx->rw_buffers);
2023 	si_vertex_buffers_begin_new_cs(sctx);
2024 
2025 	for (i = 0; i < SI_NUM_DESCS; ++i)
2026 		si_descriptors_begin_new_cs(sctx, &sctx->descriptors[i]);
2027 
2028 	si_shader_userdata_begin_new_cs(sctx);
2029 }
2030