blob: b32a77dcc4688a79214cf4b5fb8637e46617021a [file] [log] [blame]
Tom Stellarda75c6162012-01-06 17:38:37 -05001/*
2 * Copyright 2010 Jerome Glisse <glisse@freedesktop.org>
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * on the rights to use, copy, modify, merge, publish, distribute, sub
8 * license, and/or sell copies of the Software, and to permit persons to whom
9 * the Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
13 * Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
19 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
20 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
21 * USE OR OTHER DEALINGS IN THE SOFTWARE.
22 */
Marek Olšák72097032014-01-22 18:50:36 +010023
Andreas Hartmetz786af2f2014-01-04 18:44:33 +010024#include "si_pipe.h"
Marek Olšák72097032014-01-22 18:50:36 +010025#include "si_public.h"
Marek Olšák5ab25bb2016-10-17 12:30:42 +020026#include "si_shader_internal.h"
Marek Olšák955505f2014-08-07 21:14:31 +020027#include "sid.h"
Marek Olšák72097032014-01-22 18:50:36 +010028
Christian König5b2855b2013-04-03 10:18:35 +020029#include "radeon/radeon_uvd.h"
Samuel Pitoiset9cc328e2017-05-16 10:49:20 +020030#include "util/hash_table.h"
Marek Olšák72097032014-01-22 18:50:36 +010031#include "util/u_memory.h"
Bas Nieuwenhuizenaabc7d62016-03-10 21:23:49 +010032#include "util/u_suballoc.h"
Marek Olšák322eb132017-03-27 16:53:19 +020033#include "util/u_tests.h"
Nicolai Hähnle53485c22017-06-28 17:37:53 +020034#include "util/xmlconfig.h"
Marek Olšák72097032014-01-22 18:50:36 +010035#include "vl/vl_decoder.h"
Marek Olšák28a03be2016-06-30 01:15:19 +020036#include "../ddebug/dd_util.h"
Tom Stellarda75c6162012-01-06 17:38:37 -050037
Nicolai Hähnleacd09382017-05-16 02:04:48 +020038#include "compiler/nir/nir.h"
39
Tom Stellarda75c6162012-01-06 17:38:37 -050040/*
41 * pipe_context
42 */
Andreas Hartmetzeb0ddb62014-01-07 03:07:55 +010043static void si_destroy_context(struct pipe_context *context)
Tom Stellarda75c6162012-01-06 17:38:37 -050044{
Andreas Hartmetz8662e662014-01-11 16:00:50 +010045 struct si_context *sctx = (struct si_context *)context;
Marek Olšák59b35562014-09-19 00:16:12 +020046 int i;
Tom Stellarda75c6162012-01-06 17:38:37 -050047
Marek Olšákebb9c7d2016-06-21 15:52:03 +020048 /* Unreference the framebuffer normally to disable related logic
49 * properly.
50 */
51 struct pipe_framebuffer_state fb = {};
Marek Olšák24306c02017-05-24 18:17:38 +020052 if (context->set_framebuffer_state)
53 context->set_framebuffer_state(context, &fb);
Bas Nieuwenhuizencbe34212016-05-31 13:44:03 +020054
Andreas Hartmetz8662e662014-01-11 16:00:50 +010055 si_release_all_descriptors(sctx);
Marek Olšákc8e70e62013-08-06 06:42:22 +020056
Bas Nieuwenhuizenaabc7d62016-03-10 21:23:49 +010057 if (sctx->ce_suballocator)
58 u_suballocator_destroy(sctx->ce_suballocator);
59
Marek Olšákedb59ef2017-05-15 23:45:57 +020060 r600_resource_reference(&sctx->ce_ram_saved_buffer, NULL);
Marek Olšák711623f2014-09-18 21:40:02 +020061 pipe_resource_reference(&sctx->esgs_ring, NULL);
62 pipe_resource_reference(&sctx->gsvs_ring, NULL);
Marek Olšákb6f4fdf2015-02-22 17:25:37 +010063 pipe_resource_reference(&sctx->tf_ring, NULL);
Bas Nieuwenhuizend27ff7d2016-05-02 09:54:11 +020064 pipe_resource_reference(&sctx->tess_offchip_ring, NULL);
Andreas Hartmetz8662e662014-01-11 16:00:50 +010065 pipe_resource_reference(&sctx->null_const_buf.buffer, NULL);
Marek Olšáka9971e82015-08-30 14:13:10 +020066 r600_resource_reference(&sctx->border_color_buffer, NULL);
67 free(sctx->border_color_table);
Tom Stellard2397a722014-12-10 09:13:59 -050068 r600_resource_reference(&sctx->scratch_buffer, NULL);
Bas Nieuwenhuizenba1f66a2016-04-02 13:04:18 +020069 r600_resource_reference(&sctx->compute_scratch_buffer, NULL);
Marek Olšák79bd1d42017-06-07 00:16:46 +020070 r600_resource_reference(&sctx->wait_mem_scratch, NULL);
Michel Dänzer9ccaa242012-09-07 16:09:08 +020071
Marek Olšák638fa802014-12-31 00:42:22 +010072 si_pm4_free_state(sctx, sctx->init_config, ~0);
Marek Olšákb1c5f3f2015-11-08 13:34:44 +010073 if (sctx->init_config_gs_rings)
74 si_pm4_free_state(sctx, sctx->init_config_gs_rings, ~0);
Jan Vesely47b390f2016-05-17 09:25:44 -040075 for (i = 0; i < ARRAY_SIZE(sctx->vgt_shader_config); i++)
Marek Olšák59b35562014-09-19 00:16:12 +020076 si_pm4_delete_state(sctx, vgt_shader_config, sctx->vgt_shader_config[i]);
Michel Dänzer404b29d2013-11-21 16:45:28 +090077
Marek Olšák9b54ce32015-10-07 01:48:18 +020078 if (sctx->fixed_func_tcs_shader.cso)
79 sctx->b.b.delete_tcs_state(&sctx->b.b, sctx->fixed_func_tcs_shader.cso);
Marek Olšák6d6208a2015-05-06 19:34:09 +020080 if (sctx->custom_dsa_flush)
81 sctx->b.b.delete_depth_stencil_alpha_state(&sctx->b.b, sctx->custom_dsa_flush);
82 if (sctx->custom_blend_resolve)
83 sctx->b.b.delete_blend_state(&sctx->b.b, sctx->custom_blend_resolve);
Marek Olšák7d67cbe2017-06-06 16:28:59 +020084 if (sctx->custom_blend_fmask_decompress)
85 sctx->b.b.delete_blend_state(&sctx->b.b, sctx->custom_blend_fmask_decompress);
86 if (sctx->custom_blend_eliminate_fastclear)
87 sctx->b.b.delete_blend_state(&sctx->b.b, sctx->custom_blend_eliminate_fastclear);
Bas Nieuwenhuizen1e48ec72015-10-21 00:10:41 +020088 if (sctx->custom_blend_dcc_decompress)
89 sctx->b.b.delete_blend_state(&sctx->b.b, sctx->custom_blend_dcc_decompress);
Tom Stellarda75c6162012-01-06 17:38:37 -050090
Marek Olšák6d6208a2015-05-06 19:34:09 +020091 if (sctx->blitter)
92 util_blitter_destroy(sctx->blitter);
Tom Stellarda75c6162012-01-06 17:38:37 -050093
Andreas Hartmetz8662e662014-01-11 16:00:50 +010094 r600_common_context_cleanup(&sctx->b);
Michel Dänzerd64adc32015-03-26 11:32:59 +090095
Michel Dänzerd64adc32015-03-26 11:32:59 +090096 LLVMDisposeTargetMachine(sctx->tm);
Michel Dänzerd64adc32015-03-26 11:32:59 +090097
Marek Olšák2c14a6d2015-08-19 11:53:25 +020098 r600_resource_reference(&sctx->trace_buf, NULL);
99 r600_resource_reference(&sctx->last_trace_buf, NULL);
Nicolai Hähnlead843842016-06-20 16:30:29 +0200100 radeon_clear_saved_cs(&sctx->last_gfx);
101
Samuel Pitoiset77bbdcd2017-05-16 10:11:54 +0200102 pb_slabs_deinit(&sctx->bindless_descriptor_slabs);
103 util_dynarray_fini(&sctx->bindless_descriptors);
104
Samuel Pitoiset9cc328e2017-05-16 10:49:20 +0200105 _mesa_hash_table_destroy(sctx->tex_handles, NULL);
106 _mesa_hash_table_destroy(sctx->img_handles, NULL);
107
108 util_dynarray_fini(&sctx->resident_tex_handles);
109 util_dynarray_fini(&sctx->resident_img_handles);
Samuel Pitoiset6ff68632017-06-14 13:55:12 +0200110 util_dynarray_fini(&sctx->resident_tex_needs_color_decompress);
111 util_dynarray_fini(&sctx->resident_img_needs_color_decompress);
Samuel Pitoiset06ed2512017-06-14 13:55:11 +0200112 util_dynarray_fini(&sctx->resident_tex_needs_depth_decompress);
Andreas Hartmetz8662e662014-01-11 16:00:50 +0100113 FREE(sctx);
Tom Stellarda75c6162012-01-06 17:38:37 -0500114}
115
Marek Olšákbf2c3422015-04-30 17:02:38 +0200116static enum pipe_reset_status
117si_amdgpu_get_reset_status(struct pipe_context *ctx)
118{
119 struct si_context *sctx = (struct si_context *)ctx;
120
121 return sctx->b.ws->ctx_query_reset_status(sctx->b.ctx);
122}
123
Marek Olšák28a03be2016-06-30 01:15:19 +0200124/* Apitrace profiling:
125 * 1) qapitrace : Tools -> Profile: Measure CPU & GPU times
126 * 2) In the middle panel, zoom in (mouse wheel) on some bad draw call
127 * and remember its number.
128 * 3) In Mesa, enable queries and performance counters around that draw
129 * call and print the results.
130 * 4) glretrace --benchmark --markers ..
131 */
132static void si_emit_string_marker(struct pipe_context *ctx,
133 const char *string, int len)
134{
135 struct si_context *sctx = (struct si_context *)ctx;
136
137 dd_parse_apitrace_marker(string, len, &sctx->apitrace_call_number);
138}
139
Marek Olšák6781a2a2016-06-11 18:53:15 +0200140static LLVMTargetMachineRef
141si_create_llvm_target_machine(struct si_screen *sscreen)
142{
143 const char *triple = "amdgcn--";
Marek Olšák2beb31b2017-04-07 18:30:28 +0200144 char features[256];
145
146 snprintf(features, sizeof(features),
Marek Olšákfacfab22017-07-05 23:33:13 +0200147 "+DumpCode,+vgpr-spilling,-fp32-denormals,+fp64-denormals%s%s%s",
Marek Olšák2beb31b2017-04-07 18:30:28 +0200148 sscreen->b.chip_class >= GFX9 ? ",+xnack" : ",-xnack",
Marek Olšákfacfab22017-07-05 23:33:13 +0200149 sscreen->llvm_has_working_vgpr_indexing ? "" : ",-promote-alloca",
Marek Olšák2beb31b2017-04-07 18:30:28 +0200150 sscreen->b.debug_flags & DBG_SI_SCHED ? ",+si-scheduler" : "");
Marek Olšák6781a2a2016-06-11 18:53:15 +0200151
Marek Olšák4560f2b2017-07-04 22:38:37 +0200152 return LLVMCreateTargetMachine(ac_get_llvm_target(triple), triple,
Marek Olšák6781a2a2016-06-11 18:53:15 +0200153 r600_get_llvm_processor_name(sscreen->b.family),
Marek Olšák2beb31b2017-04-07 18:30:28 +0200154 features,
Marek Olšák6781a2a2016-06-11 18:53:15 +0200155 LLVMCodeGenLevelDefault,
156 LLVMRelocDefault,
157 LLVMCodeModelDefault);
158}
159
Marek Olšák0fc21ec2015-07-25 18:40:59 +0200160static struct pipe_context *si_create_context(struct pipe_screen *screen,
Marek Olšák1c8f7d32017-03-02 01:28:51 +0100161 unsigned flags)
Tom Stellarda75c6162012-01-06 17:38:37 -0500162{
Andreas Hartmetz8662e662014-01-11 16:00:50 +0100163 struct si_context *sctx = CALLOC_STRUCT(si_context);
Andreas Hartmetzaa7ae4f2014-01-11 16:01:11 +0100164 struct si_screen* sscreen = (struct si_screen *)screen;
Marek Olšákdd72c322014-04-11 22:14:27 +0200165 struct radeon_winsys *ws = sscreen->b.ws;
Marek Olšák4569bf92013-10-30 20:44:23 +0100166 int shader, i;
Tom Stellarda75c6162012-01-06 17:38:37 -0500167
Edward O'Callaghan13eb5f52015-12-04 22:08:22 +1100168 if (!sctx)
Tom Stellarda75c6162012-01-06 17:38:37 -0500169 return NULL;
170
Marek Olšák027ad712016-07-01 00:10:15 +0200171 if (flags & PIPE_CONTEXT_DEBUG)
172 sscreen->record_llvm_ir = true; /* racy but not critical */
173
Marek Olšák4e5c70e2014-01-21 18:01:01 +0100174 sctx->b.b.screen = screen; /* this must be set first */
Marek Olšák8b548592017-02-26 18:48:28 +0100175 sctx->b.b.priv = NULL;
Andreas Hartmetz8662e662014-01-11 16:00:50 +0100176 sctx->b.b.destroy = si_destroy_context;
Marek Olšák28a03be2016-06-30 01:15:19 +0200177 sctx->b.b.emit_string_marker = si_emit_string_marker;
Grazvydas Ignotas3206d4e2015-08-10 00:42:32 +0300178 sctx->b.set_atom_dirty = (void *)si_set_atom_dirty;
Marek Olšák4e5c70e2014-01-21 18:01:01 +0100179 sctx->screen = sscreen; /* Easy accessing of screen/winsys. */
Marek Olšákbe6dc872015-08-15 12:46:17 +0200180 sctx->is_debug = (flags & PIPE_CONTEXT_DEBUG) != 0;
Tom Stellarda75c6162012-01-06 17:38:37 -0500181
Marek Olšák700de072016-07-16 21:52:20 +0200182 if (!r600_common_context_init(&sctx->b, &sscreen->b, flags))
Marek Olšák4e5c70e2014-01-21 18:01:01 +0100183 goto fail;
Tom Stellarda75c6162012-01-06 17:38:37 -0500184
Marek Olšákbf2c3422015-04-30 17:02:38 +0200185 if (sscreen->b.info.drm_major == 3)
186 sctx->b.b.get_device_reset_status = si_amdgpu_get_reset_status;
187
Andreas Hartmetz8662e662014-01-11 16:00:50 +0100188 si_init_blit_functions(sctx);
Andreas Hartmetz8662e662014-01-11 16:00:50 +0100189 si_init_compute_functions(sctx);
Marek Olšák2d3ae152015-07-25 01:25:07 +0200190 si_init_cp_dma_functions(sctx);
Marek Olšák110873e2015-08-15 23:56:22 +0200191 si_init_debug_functions(sctx);
Tom Stellarda75c6162012-01-06 17:38:37 -0500192
Leo Liuc23ffaf2017-04-17 12:14:00 -0400193 if (sscreen->b.info.has_hw_decode) {
Andreas Hartmetz8662e662014-01-11 16:00:50 +0100194 sctx->b.b.create_video_codec = si_uvd_create_decoder;
195 sctx->b.b.create_video_buffer = si_video_buffer_create;
Christian König5b2855b2013-04-03 10:18:35 +0200196 } else {
Andreas Hartmetz8662e662014-01-11 16:00:50 +0100197 sctx->b.b.create_video_codec = vl_create_decoder;
198 sctx->b.b.create_video_buffer = vl_video_buffer_create;
Christian König5b2855b2013-04-03 10:18:35 +0200199 }
Tom Stellarda75c6162012-01-06 17:38:37 -0500200
Marek Olšák81401542016-03-11 15:24:05 +0100201 sctx->b.gfx.cs = ws->cs_create(sctx->b.ctx, RING_GFX,
202 si_context_gfx_flush, sctx);
Bas Nieuwenhuizen8fee75d2016-04-13 22:31:17 +0200203
Marek Olšák49c798e2016-08-19 01:37:34 +0200204 /* SI + AMDGPU + CE = GPU hang */
205 if (!(sscreen->b.debug_flags & DBG_NO_CE) && ws->cs_add_const_ib &&
Marek Olšák31f988a2016-12-07 23:01:56 +0100206 sscreen->b.chip_class != SI &&
207 /* These can't use CE due to a power gating bug in the kernel. */
208 sscreen->b.family != CHIP_CARRIZO &&
Marek Olšákc66fc612017-05-13 00:40:34 +0200209 sscreen->b.family != CHIP_STONEY) {
Bas Nieuwenhuizen8fee75d2016-04-13 22:31:17 +0200210 sctx->ce_ib = ws->cs_add_const_ib(sctx->b.gfx.cs);
211 if (!sctx->ce_ib)
212 goto fail;
213
214 if (ws->cs_add_const_preamble_ib) {
215 sctx->ce_preamble_ib =
216 ws->cs_add_const_preamble_ib(sctx->b.gfx.cs);
217
218 if (!sctx->ce_preamble_ib)
219 goto fail;
220 }
Bas Nieuwenhuizenaabc7d62016-03-10 21:23:49 +0100221
222 sctx->ce_suballocator =
Marek Olšák45240ce2017-02-15 20:44:24 +0100223 u_suballocator_create(&sctx->b.b, 1024 * 1024, 0,
224 PIPE_USAGE_DEFAULT,
225 R600_RESOURCE_FLAG_UNMAPPABLE, false);
Bas Nieuwenhuizenaabc7d62016-03-10 21:23:49 +0100226 if (!sctx->ce_suballocator)
227 goto fail;
Bas Nieuwenhuizen8fee75d2016-04-13 22:31:17 +0200228 }
229
Marek Olšák6cc8f6c2015-11-07 14:00:30 +0100230 sctx->b.gfx.flush = si_context_gfx_flush;
Marek Olšákc8e70e62013-08-06 06:42:22 +0200231
Marek Olšáka9971e82015-08-30 14:13:10 +0200232 /* Border colors. */
233 sctx->border_color_table = malloc(SI_MAX_BORDER_COLORS *
234 sizeof(*sctx->border_color_table));
235 if (!sctx->border_color_table)
236 goto fail;
237
238 sctx->border_color_buffer = (struct r600_resource*)
Marek Olšák29144d02016-10-24 23:26:39 +0200239 pipe_buffer_create(screen, 0, PIPE_USAGE_DEFAULT,
Marek Olšáka9971e82015-08-30 14:13:10 +0200240 SI_MAX_BORDER_COLORS *
241 sizeof(*sctx->border_color_table));
242 if (!sctx->border_color_buffer)
243 goto fail;
244
245 sctx->border_color_map =
Marek Olšákcf811fa2015-12-07 00:00:59 +0100246 ws->buffer_map(sctx->border_color_buffer->buf,
Marek Olšáka9971e82015-08-30 14:13:10 +0200247 NULL, PIPE_TRANSFER_WRITE);
248 if (!sctx->border_color_map)
249 goto fail;
250
Andreas Hartmetz8662e662014-01-11 16:00:50 +0100251 si_init_all_descriptors(sctx);
Marek Olšák0aa24462015-07-16 14:42:38 +0200252 si_init_state_functions(sctx);
253 si_init_shader_functions(sctx);
Marek Olšák5f99c492017-01-25 02:47:15 +0100254 si_init_ia_multi_vgt_param_table(sctx);
Tom Stellarda75c6162012-01-06 17:38:37 -0500255
Marek Olšák498a40c2016-04-22 22:03:24 +0200256 if (sctx->b.chip_class >= CIK)
257 cik_init_sdma_functions(sctx);
258 else
259 si_init_dma_functions(sctx);
260
Marek Olšákd13d2fd2014-09-06 17:07:50 +0200261 if (sscreen->b.debug_flags & DBG_FORCE_DMA)
262 sctx->b.b.resource_copy_region = sctx->b.dma_copy;
263
Andreas Hartmetz8662e662014-01-11 16:00:50 +0100264 sctx->blitter = util_blitter_create(&sctx->b.b);
265 if (sctx->blitter == NULL)
Marek Olšáka81c3e02013-08-14 01:04:39 +0200266 goto fail;
Marek Olšákdb51ab62014-08-18 00:55:40 +0200267 sctx->blitter->draw_rectangle = r600_draw_rectangle;
Tom Stellarda75c6162012-01-06 17:38:37 -0500268
Marek Olšák74aa6482015-08-29 15:05:53 +0200269 sctx->sample_mask.sample_mask = 0xffff;
270
Marek Olšák9eb3b9d2013-08-31 00:13:43 +0200271 /* these must be last */
Andreas Hartmetz8662e662014-01-11 16:00:50 +0100272 si_begin_new_cs(sctx);
Marek Olšák4569bf92013-10-30 20:44:23 +0100273
Marek Olšák79bd1d42017-06-07 00:16:46 +0200274 if (sctx->b.chip_class >= GFX9) {
275 sctx->wait_mem_scratch = (struct r600_resource*)
276 pipe_buffer_create(screen, 0, PIPE_USAGE_DEFAULT, 4);
277 if (!sctx->wait_mem_scratch)
278 goto fail;
279
280 /* Initialize the memory. */
281 struct radeon_winsys_cs *cs = sctx->b.gfx.cs;
282 radeon_emit(cs, PKT3(PKT3_WRITE_DATA, 3, 0));
283 radeon_emit(cs, S_370_DST_SEL(V_370_MEMORY_SYNC) |
284 S_370_WR_CONFIRM(1) |
285 S_370_ENGINE_SEL(V_370_ME));
286 radeon_emit(cs, sctx->wait_mem_scratch->gpu_address);
287 radeon_emit(cs, sctx->wait_mem_scratch->gpu_address >> 32);
288 radeon_emit(cs, sctx->wait_mem_number);
289 }
290
Marek Olšák2c13abb2016-08-18 15:25:51 +0200291 /* CIK cannot unbind a constant buffer (S_BUFFER_LOAD doesn't skip loads
292 * if NUM_RECORDS == 0). We need to use a dummy buffer instead. */
Andreas Hartmetz8662e662014-01-11 16:00:50 +0100293 if (sctx->b.chip_class == CIK) {
Marek Olšák45240ce2017-02-15 20:44:24 +0100294 sctx->null_const_buf.buffer =
295 r600_aligned_buffer_create(screen,
296 R600_RESOURCE_FLAG_UNMAPPABLE,
297 PIPE_USAGE_DEFAULT, 16,
298 sctx->screen->b.info.tcc_cache_line_size);
Marek Olšákae418a72015-09-10 19:25:14 +0200299 if (!sctx->null_const_buf.buffer)
300 goto fail;
Andreas Hartmetz8662e662014-01-11 16:00:50 +0100301 sctx->null_const_buf.buffer_size = sctx->null_const_buf.buffer->width0;
Marek Olšák4569bf92013-10-30 20:44:23 +0100302
303 for (shader = 0; shader < SI_NUM_SHADERS; shader++) {
Marek Olšákee2a8182014-07-07 23:27:19 +0200304 for (i = 0; i < SI_NUM_CONST_BUFFERS; i++) {
Andreas Hartmetz8662e662014-01-11 16:00:50 +0100305 sctx->b.b.set_constant_buffer(&sctx->b.b, shader, i,
306 &sctx->null_const_buf);
Marek Olšák4569bf92013-10-30 20:44:23 +0100307 }
308 }
309
Marek Olšák2c13abb2016-08-18 15:25:51 +0200310 si_set_rw_buffer(sctx, SI_HS_CONST_DEFAULT_TESS_LEVELS,
311 &sctx->null_const_buf);
Marek Olšák4a10d612017-06-09 18:46:07 +0200312 si_set_rw_buffer(sctx, SI_VS_CONST_INSTANCE_DIVISORS,
313 &sctx->null_const_buf);
Marek Olšák2c13abb2016-08-18 15:25:51 +0200314 si_set_rw_buffer(sctx, SI_VS_CONST_CLIP_PLANES,
315 &sctx->null_const_buf);
316 si_set_rw_buffer(sctx, SI_PS_CONST_POLY_STIPPLE,
317 &sctx->null_const_buf);
318 si_set_rw_buffer(sctx, SI_PS_CONST_SAMPLE_POSITIONS,
319 &sctx->null_const_buf);
320
Marek Olšák4569bf92013-10-30 20:44:23 +0100321 /* Clear the NULL constant buffer, because loads should return zeros. */
Andreas Hartmetz8662e662014-01-11 16:00:50 +0100322 sctx->b.clear_buffer(&sctx->b.b, sctx->null_const_buf.buffer, 0,
Marek Olšákf564b612016-04-22 10:26:28 +0200323 sctx->null_const_buf.buffer->width0, 0,
324 R600_COHERENCY_SHADER);
Marek Olšák4569bf92013-10-30 20:44:23 +0100325 }
326
Marek Olšák26b69ad2016-06-08 14:34:11 +0200327 uint64_t max_threads_per_block;
328 screen->get_compute_param(screen, PIPE_SHADER_IR_TGSI,
329 PIPE_COMPUTE_CAP_MAX_THREADS_PER_BLOCK,
330 &max_threads_per_block);
331
332 /* The maximum number of scratch waves. Scratch space isn't divided
333 * evenly between CUs. The number is only a function of the number of CUs.
334 * We can decrease the constant to decrease the scratch buffer size.
335 *
336 * sctx->scratch_waves must be >= the maximum posible size of
337 * 1 threadgroup, so that the hw doesn't hang from being unable
338 * to start any.
339 *
340 * The recommended value is 4 per CU at most. Higher numbers don't
341 * bring much benefit, but they still occupy chip resources (think
342 * async compute). I've seen ~2% performance difference between 4 and 32.
Tom Stellard2397a722014-12-10 09:13:59 -0500343 */
Marek Olšák26b69ad2016-06-08 14:34:11 +0200344 sctx->scratch_waves = MAX2(32 * sscreen->b.info.num_good_compute_units,
345 max_threads_per_block / 64);
Tom Stellard2397a722014-12-10 09:13:59 -0500346
Marek Olšák6781a2a2016-06-11 18:53:15 +0200347 sctx->tm = si_create_llvm_target_machine(sscreen);
Michel Dänzerd64adc32015-03-26 11:32:59 +0900348
Samuel Pitoiset77bbdcd2017-05-16 10:11:54 +0200349 /* Create a slab allocator for all bindless descriptors. */
350 if (!pb_slabs_init(&sctx->bindless_descriptor_slabs, 6, 6, 1, sctx,
351 si_bindless_descriptor_can_reclaim_slab,
352 si_bindless_descriptor_slab_alloc,
353 si_bindless_descriptor_slab_free))
354 goto fail;
355
356 util_dynarray_init(&sctx->bindless_descriptors, NULL);
357
Samuel Pitoiset9cc328e2017-05-16 10:49:20 +0200358 /* Bindless handles. */
359 sctx->tex_handles = _mesa_hash_table_create(NULL, _mesa_hash_pointer,
360 _mesa_key_pointer_equal);
361 sctx->img_handles = _mesa_hash_table_create(NULL, _mesa_hash_pointer,
362 _mesa_key_pointer_equal);
363
364 util_dynarray_init(&sctx->resident_tex_handles, NULL);
365 util_dynarray_init(&sctx->resident_img_handles, NULL);
Samuel Pitoiset6ff68632017-06-14 13:55:12 +0200366 util_dynarray_init(&sctx->resident_tex_needs_color_decompress, NULL);
367 util_dynarray_init(&sctx->resident_img_needs_color_decompress, NULL);
Samuel Pitoiset06ed2512017-06-14 13:55:11 +0200368 util_dynarray_init(&sctx->resident_tex_needs_depth_decompress, NULL);
Samuel Pitoiset9cc328e2017-05-16 10:49:20 +0200369
Andreas Hartmetz8662e662014-01-11 16:00:50 +0100370 return &sctx->b.b;
Marek Olšáka81c3e02013-08-14 01:04:39 +0200371fail:
Marek Olšáka9971e82015-08-30 14:13:10 +0200372 fprintf(stderr, "radeonsi: Failed to create a context.\n");
Andreas Hartmetz8662e662014-01-11 16:00:50 +0100373 si_destroy_context(&sctx->b.b);
Marek Olšáka81c3e02013-08-14 01:04:39 +0200374 return NULL;
Tom Stellarda75c6162012-01-06 17:38:37 -0500375}
376
Marek Olšák1c8f7d32017-03-02 01:28:51 +0100377static struct pipe_context *si_pipe_create_context(struct pipe_screen *screen,
378 void *priv, unsigned flags)
379{
380 struct si_screen *sscreen = (struct si_screen *)screen;
Marek Olšák5fb80a12017-07-09 23:44:57 +0200381 struct pipe_context *ctx;
382
383 if (sscreen->b.debug_flags & DBG_CHECK_VM)
384 flags |= PIPE_CONTEXT_DEBUG;
385
386 ctx = si_create_context(screen, flags);
Marek Olšák1c8f7d32017-03-02 01:28:51 +0100387
388 if (!(flags & PIPE_CONTEXT_PREFER_THREADED))
389 return ctx;
390
391 /* Clover (compute-only) is unsupported.
392 *
393 * Since the threaded context creates shader states from the non-driver
394 * thread, asynchronous compilation is required for create_{shader}_-
395 * state not to use pipe_context. Debug contexts (ddebug) disable
396 * asynchronous compilation, so don't use the threaded context with
397 * those.
398 */
399 if (flags & (PIPE_CONTEXT_COMPUTE_ONLY | PIPE_CONTEXT_DEBUG))
400 return ctx;
401
402 /* When shaders are logged to stderr, asynchronous compilation is
403 * disabled too. */
404 if (sscreen->b.debug_flags & (DBG_VS | DBG_TCS | DBG_TES | DBG_GS |
405 DBG_PS | DBG_CS))
406 return ctx;
407
408 return threaded_context_create(ctx, &sscreen->b.pool_transfers,
409 r600_replace_buffer_storage,
410 &((struct si_context*)ctx)->b.tc);
411}
412
Tom Stellarda75c6162012-01-06 17:38:37 -0500413/*
414 * pipe_screen
415 */
Nicolai Hähnle7a0e5432016-09-14 09:43:42 +0200416static bool si_have_tgsi_compute(struct si_screen *sscreen)
417{
418 /* Old kernels disallowed some register writes for SI
419 * that are used for indirect dispatches. */
Marek Olšák12beef02017-04-25 02:18:10 +0200420 return (sscreen->b.chip_class >= CIK ||
Nicolai Hähnle7a0e5432016-09-14 09:43:42 +0200421 sscreen->b.info.drm_major == 3 ||
422 (sscreen->b.info.drm_major == 2 &&
423 sscreen->b.info.drm_minor >= 45));
424}
Tom Stellarda75c6162012-01-06 17:38:37 -0500425
Andreas Hartmetzeb0ddb62014-01-07 03:07:55 +0100426static int si_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
Tom Stellarda75c6162012-01-06 17:38:37 -0500427{
Andreas Hartmetzaa7ae4f2014-01-11 16:01:11 +0100428 struct si_screen *sscreen = (struct si_screen *)pscreen;
Tom Stellarda75c6162012-01-06 17:38:37 -0500429
430 switch (param) {
431 /* Supported features (boolean caps). */
Marek Olšák2c8ee2e2017-02-11 17:21:04 +0100432 case PIPE_CAP_ACCELERATED:
Tom Stellarda75c6162012-01-06 17:38:37 -0500433 case PIPE_CAP_TWO_SIDED_STENCIL:
Tom Stellard69a92182012-04-14 17:37:37 -0400434 case PIPE_CAP_MAX_DUAL_SOURCE_RENDER_TARGETS:
Tom Stellarda75c6162012-01-06 17:38:37 -0500435 case PIPE_CAP_ANISOTROPIC_FILTER:
436 case PIPE_CAP_POINT_SPRITE:
437 case PIPE_CAP_OCCLUSION_QUERY:
438 case PIPE_CAP_TEXTURE_SHADOW_MAP:
439 case PIPE_CAP_TEXTURE_MIRROR_CLAMP:
440 case PIPE_CAP_BLEND_EQUATION_SEPARATE:
441 case PIPE_CAP_TEXTURE_SWIZZLE:
Tom Stellarda75c6162012-01-06 17:38:37 -0500442 case PIPE_CAP_DEPTH_CLIP_DISABLE:
443 case PIPE_CAP_SHADER_STENCIL_EXPORT:
444 case PIPE_CAP_VERTEX_ELEMENT_INSTANCE_DIVISOR:
445 case PIPE_CAP_MIXED_COLORBUFFER_FORMATS:
446 case PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT:
447 case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER:
Marek Olšák39583782014-11-17 20:51:56 +0100448 case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER:
Tom Stellarda75c6162012-01-06 17:38:37 -0500449 case PIPE_CAP_SM3:
450 case PIPE_CAP_SEAMLESS_CUBE_MAP:
451 case PIPE_CAP_PRIMITIVE_RESTART:
452 case PIPE_CAP_CONDITIONAL_RENDER:
453 case PIPE_CAP_TEXTURE_BARRIER:
454 case PIPE_CAP_INDEP_BLEND_ENABLE:
455 case PIPE_CAP_INDEP_BLEND_FUNC:
456 case PIPE_CAP_SEAMLESS_CUBE_MAP_PER_TEXTURE:
457 case PIPE_CAP_VERTEX_COLOR_UNCLAMPED:
Marek Olšák437ab1d2012-04-24 15:19:31 +0200458 case PIPE_CAP_USER_CONSTANT_BUFFERS:
Fredrik Höglundaf372122012-06-18 22:50:02 +0200459 case PIPE_CAP_START_INSTANCE:
Michel Dänzerd0f51fe2012-09-05 18:27:02 +0200460 case PIPE_CAP_NPOT_TEXTURES:
Ilia Mirkin12d39b42013-10-04 04:32:15 -0400461 case PIPE_CAP_MIXED_FRAMEBUFFER_SIZES:
Ilia Mirkin9515d652016-08-20 22:40:33 -0400462 case PIPE_CAP_MIXED_COLOR_DEPTH_BITS:
Marek Olšák5bc871a2015-10-07 02:36:38 +0200463 case PIPE_CAP_VERTEX_COLOR_CLAMPED:
Marek Olšák208d1ed2015-10-07 01:47:00 +0200464 case PIPE_CAP_FRAGMENT_COLOR_CLAMPED:
Marek Olšák3e10ab62013-03-14 17:18:43 +0100465 case PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER:
Christian Könige4ed5872013-03-21 18:02:52 +0100466 case PIPE_CAP_TGSI_INSTANCEID:
Tom Stellard302f53d2012-10-25 13:50:10 -0400467 case PIPE_CAP_COMPUTE:
Marek Olšákdbeedbb2013-10-31 15:08:49 +0100468 case PIPE_CAP_TEXTURE_BUFFER_OBJECTS:
Ilia Mirkin32b71242014-07-03 11:15:18 -0400469 case PIPE_CAP_TGSI_VS_LAYER_VIEWPORT:
Marek Olšák8739c602014-01-22 00:08:11 +0100470 case PIPE_CAP_QUERY_PIPELINE_STATISTICS:
Marek Olšák6381dd72014-01-27 21:46:21 +0100471 case PIPE_CAP_BUFFER_MAP_PERSISTENT_COHERENT:
Marek Olšák2484daa2014-04-22 21:23:29 +0200472 case PIPE_CAP_CUBE_MAP_ARRAY:
Marek Olšákf98a7d82014-05-07 13:15:41 +0200473 case PIPE_CAP_SAMPLE_SHADING:
Marek Olšák2a7b57a2014-04-24 03:03:43 +0200474 case PIPE_CAP_DRAW_INDIRECT:
Mathias Fröhlich56088132014-09-14 15:17:07 +0200475 case PIPE_CAP_CLIP_HALFZ:
Marek Olšákff804222014-11-08 16:03:13 +0100476 case PIPE_CAP_TGSI_VS_WINDOW_SPACE_POSITION:
Ilia Mirkin7c211a12015-02-01 09:01:50 -0500477 case PIPE_CAP_POLYGON_OFFSET_CLAMP:
Axel Davyeb1c12d2015-01-17 14:30:17 +0100478 case PIPE_CAP_MULTISAMPLE_Z_RESOLVE:
Marek Olšákf5832f32015-03-15 18:53:50 +0100479 case PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION:
Marek Olšáke4339bc2015-05-09 19:36:17 +0200480 case PIPE_CAP_TGSI_TEXCOORD:
Dave Airliebb9d59a2015-07-17 05:35:30 +0100481 case PIPE_CAP_TGSI_FS_FINE_DERIVATIVE:
Edward O'Callaghan82546722015-07-27 11:01:47 +1000482 case PIPE_CAP_CONDITIONAL_RENDER_INVERTED:
Marek Olšák44dc1d32015-08-10 19:37:01 +0200483 case PIPE_CAP_TEXTURE_FLOAT_LINEAR:
484 case PIPE_CAP_TEXTURE_HALF_FLOAT_LINEAR:
Marek Olšák9b54ce32015-10-07 01:48:18 +0200485 case PIPE_CAP_SHAREABLE_SHADERS:
Marek Olšák97f58fb2015-08-10 02:23:21 +0200486 case PIPE_CAP_DEPTH_BOUNDS_TEST:
Marek Olšák12321962015-03-17 14:46:04 +0100487 case PIPE_CAP_SAMPLER_VIEW_TARGET:
Marek Olšáke6d38462015-09-06 16:26:21 +0200488 case PIPE_CAP_TEXTURE_QUERY_LOD:
489 case PIPE_CAP_TEXTURE_GATHER_SM5:
Ilia Mirkin72ebd532015-09-18 19:08:35 -0400490 case PIPE_CAP_TGSI_TXQS:
Marek Olšák814b7d12015-09-28 23:50:12 +0200491 case PIPE_CAP_FORCE_PERSAMPLE_INTERP:
Marek Olšákce9db162015-08-24 01:19:35 +0200492 case PIPE_CAP_COPY_BETWEEN_COMPRESSED_AND_PLAIN_FORMATS:
Marek Olšák4ea0feb2016-01-02 23:09:58 +0100493 case PIPE_CAP_TGSI_FS_POSITION_IS_SYSVAL:
494 case PIPE_CAP_TGSI_FS_FACE_IS_INTEGER_SYSVAL:
Nicolai Hähnle321140d2016-01-14 09:41:04 -0500495 case PIPE_CAP_INVALIDATE_BUFFER:
Nicolai Hähnle7dd31b82016-01-26 10:29:50 -0500496 case PIPE_CAP_SURFACE_REINTERPRET_BLOCKS:
Marek Olšák635555a2016-02-02 02:09:36 +0100497 case PIPE_CAP_QUERY_MEMORY_INFO:
Marek Olšák100796c2016-02-10 21:48:59 +0100498 case PIPE_CAP_TGSI_PACK_HALF_FLOAT:
Edward O'Callaghan483a6862016-01-02 05:53:57 +1100499 case PIPE_CAP_FRAMEBUFFER_NO_ATTACHMENT:
Bas Nieuwenhuizen126da232016-04-03 21:49:44 +0200500 case PIPE_CAP_ROBUST_BUFFER_ACCESS_BEHAVIOR:
Marek Olšák70a25472016-06-10 03:03:11 +0200501 case PIPE_CAP_GENERATE_MIPMAP:
Axel Davybe7957b2016-06-14 22:41:50 +0200502 case PIPE_CAP_POLYGON_OFFSET_UNITS_UNSCALED:
Marek Olšák28a03be2016-06-30 01:15:19 +0200503 case PIPE_CAP_STRING_MARKER:
Marek Olšák739d5262016-08-04 19:04:02 +0200504 case PIPE_CAP_CLEAR_TEXTURE:
Dave Airlief235dc02016-05-13 16:49:02 +1000505 case PIPE_CAP_CULL_DISTANCE:
Nicolai Hähnle789119d2016-10-06 23:10:22 +0200506 case PIPE_CAP_TGSI_ARRAY_COMPONENTS:
Nicolai Hähnle611166b2016-11-18 20:49:54 +0100507 case PIPE_CAP_TGSI_CAN_READ_OUTPUTS:
Nicolai Hähnlec5e76a22017-01-24 21:22:32 +0100508 case PIPE_CAP_GLSL_OPTIMIZE_CONSERVATIVELY:
Marek Olšák2c8ee2e2017-02-11 17:21:04 +0100509 case PIPE_CAP_STREAM_OUTPUT_PAUSE_RESUME:
510 case PIPE_CAP_STREAM_OUTPUT_INTERLEAVE_BUFFERS:
Marek Olšák7e1faa72017-03-05 00:15:31 +0100511 case PIPE_CAP_DOUBLES:
Marek Olšák0550f3d2017-03-07 02:19:47 +0100512 case PIPE_CAP_TGSI_TEX_TXF_LZ:
Nicolai Hähnle2ac03e92017-04-13 22:16:26 +0200513 case PIPE_CAP_TGSI_TES_LAYER_VIEWPORT:
Samuel Pitoiset65d1e4d2017-02-27 13:15:38 +0100514 case PIPE_CAP_BINDLESS_TEXTURE:
Marek Olšák465bb472017-07-10 16:06:08 +0200515 case PIPE_CAP_QUERY_TIMESTAMP:
516 case PIPE_CAP_QUERY_TIME_ELAPSED:
Nicolai Hähnle01f15982017-06-25 18:31:11 +0200517 case PIPE_CAP_NIR_SAMPLERS_AS_DEREF:
Nicolai Hähnle78476cf2017-07-26 19:37:21 +0200518 case PIPE_CAP_QUERY_SO_OVERFLOW:
Samuel Pitoiset65d1e4d2017-02-27 13:15:38 +0100519 return 1;
520
Nicolai Hähnlea020cb32017-01-27 10:35:13 +0100521 case PIPE_CAP_INT64:
Ilia Mirkinb0900332017-02-04 22:31:29 -0500522 case PIPE_CAP_INT64_DIVMOD:
Nicolai Hähnlecd3f3862017-03-30 08:55:22 +0200523 case PIPE_CAP_TGSI_CLOCK:
Marek Olšák70dcb732017-04-30 01:18:43 +0200524 case PIPE_CAP_CAN_BIND_CONST_BUFFER_AS_VERTEX:
Marek Olšák50189372017-05-15 16:30:30 +0200525 case PIPE_CAP_ALLOW_MAPPED_BUFFERS_DURING_EXECUTION:
Marek Olšák12beef02017-04-25 02:18:10 +0200526 return 1;
Nicolai Hähnlea020cb32017-01-27 10:35:13 +0100527
Nicolai Hähnle02112c32017-03-29 20:29:37 +0200528 case PIPE_CAP_TGSI_VOTE:
529 return HAVE_LLVM >= 0x0400;
530
Nicolai Hähnle9e1b2e42017-03-30 11:19:39 +0200531 case PIPE_CAP_TGSI_BALLOT:
532 return HAVE_LLVM >= 0x0500;
533
Marek Olšák7713d592015-02-10 16:02:54 +0100534 case PIPE_CAP_RESOURCE_FROM_USER_MEMORY:
535 return !SI_BIG_ENDIAN && sscreen->b.info.has_userptr;
536
Marek Olšák914365c2015-04-29 15:27:50 +0200537 case PIPE_CAP_DEVICE_RESET_STATUS_QUERY:
Marek Olšákbf2c3422015-04-30 17:02:38 +0200538 return (sscreen->b.info.drm_major == 2 &&
539 sscreen->b.info.drm_minor >= 43) ||
540 sscreen->b.info.drm_major == 3;
Marek Olšák914365c2015-04-29 15:27:50 +0200541
Marek Olšák2f1c4492013-07-30 22:29:30 +0200542 case PIPE_CAP_TEXTURE_MULTISAMPLE:
Marek Olšák751e8692013-11-20 13:48:19 +0100543 /* 2D tiling on CIK is supported since DRM 2.35.0 */
Marek Olšáka66d9342014-07-08 02:50:57 +0200544 return sscreen->b.chip_class < CIK ||
Marek Olšák8ba70e02015-04-16 20:35:27 +0200545 (sscreen->b.info.drm_major == 2 &&
546 sscreen->b.info.drm_minor >= 35) ||
547 sscreen->b.info.drm_major == 3;
Marek Olšák2f1c4492013-07-30 22:29:30 +0200548
Marek Olšákc9f2af32012-10-28 17:52:48 +0100549 case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT:
Marek Olšákde5094d2014-03-09 22:29:20 +0100550 return R600_MAP_BUFFER_ALIGNMENT;
Marek Olšákc9f2af32012-10-28 17:52:48 +0100551
Marek Olšák1b749dc2012-04-24 17:31:17 +0200552 case PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT:
Marek Olšáke2198422014-03-09 20:05:54 +0100553 case PIPE_CAP_TEXTURE_BUFFER_OFFSET_ALIGNMENT:
Marek Olšáke6d38462015-09-06 16:26:21 +0200554 case PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS:
Marek Olšák2c8ee2e2017-02-11 17:21:04 +0100555 case PIPE_CAP_MAX_STREAM_OUTPUT_BUFFERS:
556 case PIPE_CAP_MAX_VERTEX_STREAMS:
Nicolai Hähnle9e9a2bb2016-04-13 09:11:44 -0500557 case PIPE_CAP_SHADER_BUFFER_OFFSET_ALIGNMENT:
Marek Olšák12beef02017-04-25 02:18:10 +0200558 return 4;
Marek Olšák1b749dc2012-04-24 17:31:17 +0200559
Tom Stellarda75c6162012-01-06 17:38:37 -0500560 case PIPE_CAP_GLSL_FEATURE_LEVEL:
Nicolai Hähnledfe237a2017-05-16 01:51:41 +0200561 if (sscreen->b.debug_flags & DBG_NIR)
562 return 140; /* no geometry and tessellation shaders yet */
Nicolai Hähnle1f951212016-10-06 22:57:55 +0200563 if (si_have_tgsi_compute(sscreen))
Nicolai Hähnle84a74be2016-10-07 18:21:51 +0200564 return 450;
Marek Olšák12beef02017-04-25 02:18:10 +0200565 return 420;
Marek Olšákdbeedbb2013-10-31 15:08:49 +0100566
Marek Olšákdbeedbb2013-10-31 15:08:49 +0100567 case PIPE_CAP_MAX_TEXTURE_BUFFER_SIZE:
Marek Olšák8a4ace42016-07-01 00:17:36 +0200568 return MIN2(sscreen->b.info.max_alloc_size, INT_MAX);
Tom Stellarda75c6162012-01-06 17:38:37 -0500569
Marek Olšák9b91e0b2017-02-10 01:15:21 +0100570 case PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY:
571 case PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY:
572 case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY:
573 /* SI doesn't support unaligned loads.
574 * CIK needs DRM 2.50.0 on radeon. */
575 return sscreen->b.chip_class == SI ||
576 (sscreen->b.info.drm_major == 2 &&
577 sscreen->b.info.drm_minor < 50);
578
Nicolai Hähnle570e50a2017-02-02 21:11:05 +0100579 case PIPE_CAP_SPARSE_BUFFER_PAGE_SIZE:
Marek Olšák353b60c2017-06-16 21:07:49 +0200580 /* TODO: GFX9 hangs. */
581 if (sscreen->b.chip_class >= GFX9)
582 return 0;
Nicolai Hähnle570e50a2017-02-02 21:11:05 +0100583 /* Disable on SI due to VM faults in CP DMA. Enable once these
584 * faults are mitigated in software.
585 */
586 if (sscreen->b.chip_class >= CIK &&
587 sscreen->b.info.drm_major == 3 &&
588 sscreen->b.info.drm_minor >= 13)
589 return RADEON_SPARSE_PAGE_SIZE;
590 return 0;
591
Tom Stellarda75c6162012-01-06 17:38:37 -0500592 /* Unsupported features. */
Marek Olšák2c8ee2e2017-02-11 17:21:04 +0100593 case PIPE_CAP_BUFFER_SAMPLER_VIEW_RGBA_ONLY:
Tom Stellarda75c6162012-01-06 17:38:37 -0500594 case PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT:
Tom Stellarda75c6162012-01-06 17:38:37 -0500595 case PIPE_CAP_TGSI_CAN_COMPACT_CONSTANTS:
Marek Olšák2a311b12012-04-24 01:23:33 +0200596 case PIPE_CAP_USER_VERTEX_BUFFERS:
Dave Airlie76ba50a2013-11-27 19:47:51 +1000597 case PIPE_CAP_FAKE_SW_MSAA:
Ilia Mirkind95df4f2014-04-26 23:44:57 -0400598 case PIPE_CAP_TEXTURE_GATHER_OFFSETS:
Roland Scheideggerade8b262014-12-12 04:13:43 +0100599 case PIPE_CAP_VERTEXID_NOBASE:
Kenneth Graunke70048eb2016-05-20 21:05:34 -0700600 case PIPE_CAP_PRIMITIVE_RESTART_FOR_PATCHES:
Ilia Mirkin07fcb062016-06-11 15:26:45 -0400601 case PIPE_CAP_MAX_WINDOW_RECTANGLES:
Rob Clark026a7222016-04-01 16:10:42 -0400602 case PIPE_CAP_NATIVE_FENCE_FD:
Ilia Mirkinee3ebe62017-01-01 23:10:00 -0500603 case PIPE_CAP_TGSI_FS_FBFETCH:
Ilia Mirkin6e409382017-01-16 22:14:38 -0500604 case PIPE_CAP_TGSI_MUL_ZERO_WINS:
Marek Olšák2c8ee2e2017-02-11 17:21:04 +0100605 case PIPE_CAP_UMA:
Lyudeffe2bd62017-03-16 18:00:05 -0400606 case PIPE_CAP_POLYGON_MODE_FILL_RECTANGLE:
Lyude467af442017-05-24 15:42:39 -0400607 case PIPE_CAP_POST_DEPTH_COVERAGE:
Timothy Arceri4e4042d2017-08-03 13:54:45 +1000608 case PIPE_CAP_MEMOBJ:
Tom Stellarda75c6162012-01-06 17:38:37 -0500609 return 0;
610
Nicolai Hähnle7a0e5432016-09-14 09:43:42 +0200611 case PIPE_CAP_QUERY_BUFFER_OBJECT:
612 return si_have_tgsi_compute(sscreen);
613
Nicolai Hähnlee4cb3af2016-07-28 17:01:54 +0100614 case PIPE_CAP_DRAW_PARAMETERS:
615 case PIPE_CAP_MULTI_DRAW_INDIRECT:
616 case PIPE_CAP_MULTI_DRAW_INDIRECT_PARAMS:
617 return sscreen->has_draw_indirect_multi;
618
Marek Olšákbac12c82015-02-22 18:46:53 +0100619 case PIPE_CAP_MAX_SHADER_PATCH_VARYINGS:
620 return 30;
621
Marek Olšák164de0d2013-10-30 21:44:07 +0100622 case PIPE_CAP_TEXTURE_BORDER_COLOR_QUIRK:
Marek Olšákd60f72a2016-10-15 15:24:45 +0200623 return sscreen->b.chip_class <= VI ?
624 PIPE_QUIRK_TEXTURE_BORDER_COLOR_SWIZZLE_R600 : 0;
Marek Olšák164de0d2013-10-30 21:44:07 +0100625
Tom Stellarda75c6162012-01-06 17:38:37 -0500626 /* Stream output. */
Tom Stellarda75c6162012-01-06 17:38:37 -0500627 case PIPE_CAP_MAX_STREAM_OUTPUT_SEPARATE_COMPONENTS:
628 case PIPE_CAP_MAX_STREAM_OUTPUT_INTERLEAVED_COMPONENTS:
Marek Olšák2c8ee2e2017-02-11 17:21:04 +0100629 return 32*4;
Tom Stellarda75c6162012-01-06 17:38:37 -0500630
Grigori Goronzyd34d5fd2014-02-09 22:56:20 +0100631 /* Geometry shader output. */
632 case PIPE_CAP_MAX_GEOMETRY_OUTPUT_VERTICES:
633 return 1024;
634 case PIPE_CAP_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS:
635 return 4095;
636
Timothy Arceri89e68062014-08-19 21:09:58 -1000637 case PIPE_CAP_MAX_VERTEX_ATTRIB_STRIDE:
638 return 2048;
639
Tom Stellarda75c6162012-01-06 17:38:37 -0500640 /* Texturing. */
641 case PIPE_CAP_MAX_TEXTURE_2D_LEVELS:
Tom Stellarda75c6162012-01-06 17:38:37 -0500642 case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:
Marek Olšák4f1f3232014-03-09 20:03:57 +0100643 return 15; /* 16384 */
644 case PIPE_CAP_MAX_TEXTURE_3D_LEVELS:
645 /* textures support 8192, but layered rendering supports 2048 */
646 return 12;
Tom Stellarda75c6162012-01-06 17:38:37 -0500647 case PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS:
Marek Olšák4f1f3232014-03-09 20:03:57 +0100648 /* textures support 8192, but layered rendering supports 2048 */
649 return 2048;
Tom Stellarda75c6162012-01-06 17:38:37 -0500650
Marek Olšák2c8ee2e2017-02-11 17:21:04 +0100651 /* Viewports and render targets. */
Marek Olšáka62cd692013-09-21 19:45:08 +0200652 case PIPE_CAP_MAX_VIEWPORTS:
Marek Olšák2ca55662016-04-10 04:26:50 +0200653 return R600_MAX_VIEWPORTS;
Józef Kucia14608ef2016-07-19 13:07:26 +0200654 case PIPE_CAP_VIEWPORT_SUBPIXEL_BITS:
Marek Olšák2c8ee2e2017-02-11 17:21:04 +0100655 case PIPE_CAP_MAX_RENDER_TARGETS:
Józef Kucia14608ef2016-07-19 13:07:26 +0200656 return 8;
Marek Olšáka62cd692013-09-21 19:45:08 +0200657
Ilia Mirkinc2f9ad52014-04-09 14:58:53 -0400658 case PIPE_CAP_MIN_TEXTURE_GATHER_OFFSET:
Tom Stellarda75c6162012-01-06 17:38:37 -0500659 case PIPE_CAP_MIN_TEXEL_OFFSET:
Marek Olšákc7b5a5c2014-06-06 03:00:18 +0200660 return -32;
Tom Stellarda75c6162012-01-06 17:38:37 -0500661
Ilia Mirkinc2f9ad52014-04-09 14:58:53 -0400662 case PIPE_CAP_MAX_TEXTURE_GATHER_OFFSET:
Tom Stellarda75c6162012-01-06 17:38:37 -0500663 case PIPE_CAP_MAX_TEXEL_OFFSET:
Marek Olšákc7b5a5c2014-06-06 03:00:18 +0200664 return 31;
665
Tom Stellard4e90bc92013-07-09 21:21:39 -0700666 case PIPE_CAP_ENDIANNESS:
667 return PIPE_ENDIAN_LITTLE;
Emil Velikovde014432014-08-14 20:57:29 +0100668
669 case PIPE_CAP_VENDOR_ID:
Marek Olšákec74dee2016-02-25 22:32:26 +0100670 return ATI_VENDOR_ID;
Emil Velikovde014432014-08-14 20:57:29 +0100671 case PIPE_CAP_DEVICE_ID:
672 return sscreen->b.info.pci_id;
Emil Velikovde014432014-08-14 20:57:29 +0100673 case PIPE_CAP_VIDEO_MEMORY:
674 return sscreen->b.info.vram_size >> 20;
Marek Olšákdcb2b772016-02-29 20:22:37 +0100675 case PIPE_CAP_PCI_GROUP:
676 return sscreen->b.info.pci_domain;
677 case PIPE_CAP_PCI_BUS:
678 return sscreen->b.info.pci_bus;
679 case PIPE_CAP_PCI_DEVICE:
680 return sscreen->b.info.pci_dev;
681 case PIPE_CAP_PCI_FUNCTION:
682 return sscreen->b.info.pci_func;
Tom Stellarda75c6162012-01-06 17:38:37 -0500683 }
684 return 0;
685}
686
Brian Paul637e5712017-03-05 12:13:02 -0700687static int si_get_shader_param(struct pipe_screen* pscreen,
688 enum pipe_shader_type shader,
689 enum pipe_shader_cap param)
Tom Stellarda75c6162012-01-06 17:38:37 -0500690{
Bas Nieuwenhuizen464cef52016-03-19 15:16:50 +0100691 struct si_screen *sscreen = (struct si_screen *)pscreen;
692
Tom Stellarda75c6162012-01-06 17:38:37 -0500693 switch(shader)
694 {
695 case PIPE_SHADER_FRAGMENT:
696 case PIPE_SHADER_VERTEX:
Tom Stellarda75c6162012-01-06 17:38:37 -0500697 case PIPE_SHADER_GEOMETRY:
Marek Olšákbac12c82015-02-22 18:46:53 +0100698 case PIPE_SHADER_TESS_CTRL:
699 case PIPE_SHADER_TESS_EVAL:
Marek Olšákbac12c82015-02-22 18:46:53 +0100700 break;
Tom Stellard302f53d2012-10-25 13:50:10 -0400701 case PIPE_SHADER_COMPUTE:
702 switch (param) {
703 case PIPE_SHADER_CAP_PREFERRED_IR:
Tom Stellard1f4e48d2014-09-25 18:11:24 -0700704 return PIPE_SHADER_IR_NATIVE;
Samuel Pitoiset5e09ac72016-02-03 18:57:58 +0100705
Bas Nieuwenhuizen464cef52016-03-19 15:16:50 +0100706 case PIPE_SHADER_CAP_SUPPORTED_IRS: {
707 int ir = 1 << PIPE_SHADER_IR_NATIVE;
Samuel Pitoiset5e09ac72016-02-03 18:57:58 +0100708
Nicolai Hähnle7a0e5432016-09-14 09:43:42 +0200709 if (si_have_tgsi_compute(sscreen))
Bas Nieuwenhuizen464cef52016-03-19 15:16:50 +0100710 ir |= 1 << PIPE_SHADER_IR_TGSI;
711
712 return ir;
713 }
Tom Stellardda85ab42015-02-26 23:25:14 +0000714
Tom Stellard72969e02014-08-07 15:31:17 -0400715 case PIPE_SHADER_CAP_MAX_CONST_BUFFER_SIZE: {
716 uint64_t max_const_buffer_size;
Bas Nieuwenhuizen1a5c8c22016-03-25 02:06:50 +0100717 pscreen->get_compute_param(pscreen, PIPE_SHADER_IR_TGSI,
Tom Stellard72969e02014-08-07 15:31:17 -0400718 PIPE_COMPUTE_CAP_MAX_MEM_ALLOC_SIZE,
719 &max_const_buffer_size);
Marek Olšák8a4ace42016-07-01 00:17:36 +0200720 return MIN2(max_const_buffer_size, INT_MAX);
Tom Stellard72969e02014-08-07 15:31:17 -0400721 }
Tom Stellard302f53d2012-10-25 13:50:10 -0400722 default:
Tom Stellard4c53d2a2015-03-21 00:27:16 +0000723 /* If compute shaders don't require a special value
724 * for this cap, we can return the same value we
725 * do for other shader types. */
726 break;
Tom Stellard302f53d2012-10-25 13:50:10 -0400727 }
Tom Stellard4c53d2a2015-03-21 00:27:16 +0000728 break;
Tom Stellarda75c6162012-01-06 17:38:37 -0500729 default:
Tom Stellarda75c6162012-01-06 17:38:37 -0500730 return 0;
731 }
732
Tom Stellarda75c6162012-01-06 17:38:37 -0500733 switch (param) {
Marek Olšák4e00e202016-11-04 12:41:34 +0100734 /* Shader limits. */
Tom Stellarda75c6162012-01-06 17:38:37 -0500735 case PIPE_SHADER_CAP_MAX_INSTRUCTIONS:
736 case PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS:
737 case PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS:
738 case PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS:
Tom Stellarda75c6162012-01-06 17:38:37 -0500739 case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH:
Marek Olšák3f6e0062016-11-04 12:31:53 +0100740 return 16384;
Tom Stellarda75c6162012-01-06 17:38:37 -0500741 case PIPE_SHADER_CAP_MAX_INPUTS:
Marek Olšák22b8a772017-02-16 11:39:01 +0100742 return shader == PIPE_SHADER_VERTEX ? SI_MAX_ATTRIBS : 32;
Marek Olšák5f5b83c2014-10-01 20:28:17 +0200743 case PIPE_SHADER_CAP_MAX_OUTPUTS:
744 return shader == PIPE_SHADER_FRAGMENT ? 8 : 32;
Tom Stellarda75c6162012-01-06 17:38:37 -0500745 case PIPE_SHADER_CAP_MAX_TEMPS:
746 return 256; /* Max native temporaries. */
Marek Olšák04f2c882014-07-24 20:32:08 +0200747 case PIPE_SHADER_CAP_MAX_CONST_BUFFER_SIZE:
748 return 4096 * sizeof(float[4]); /* actually only memory limits this */
Tom Stellarda75c6162012-01-06 17:38:37 -0500749 case PIPE_SHADER_CAP_MAX_CONST_BUFFERS:
Marek Olšák0954d5e2016-04-19 02:14:53 +0200750 return SI_NUM_CONST_BUFFERS;
Tom Stellarda75c6162012-01-06 17:38:37 -0500751 case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
Roland Scheidegger2983c032013-11-26 02:30:41 +0100752 case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:
Marek Olšák0954d5e2016-04-19 02:14:53 +0200753 return SI_NUM_SAMPLERS;
Ilia Mirkin266d0012015-09-26 20:27:42 -0400754 case PIPE_SHADER_CAP_MAX_SHADER_BUFFERS:
Marek Olšák12beef02017-04-25 02:18:10 +0200755 return SI_NUM_SHADER_BUFFERS;
Edward O'Callaghan5219eb12016-01-11 00:50:32 +1100756 case PIPE_SHADER_CAP_MAX_SHADER_IMAGES:
Marek Olšák12beef02017-04-25 02:18:10 +0200757 return SI_NUM_IMAGES;
Marek Olšák4e00e202016-11-04 12:41:34 +0100758 case PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HINT:
759 return 32;
760 case PIPE_SHADER_CAP_PREFERRED_IR:
Nicolai Hähnledfe237a2017-05-16 01:51:41 +0200761 if (sscreen->b.debug_flags & DBG_NIR &&
762 (shader == PIPE_SHADER_VERTEX ||
763 shader == PIPE_SHADER_FRAGMENT))
764 return PIPE_SHADER_IR_NIR;
Marek Olšák4e00e202016-11-04 12:41:34 +0100765 return PIPE_SHADER_IR_TGSI;
Marek Olšák74e39de2016-10-28 23:08:50 +0200766 case PIPE_SHADER_CAP_LOWER_IF_THRESHOLD:
767 return 3;
Marek Olšák4e00e202016-11-04 12:41:34 +0100768
769 /* Supported boolean features. */
770 case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
771 case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED:
Marek Olšák4e00e202016-11-04 12:41:34 +0100772 case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
773 case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
774 case PIPE_SHADER_CAP_INTEGERS:
775 case PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED:
776 case PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE:
Samuel Pitoiset0bceefc2017-04-25 00:31:48 +0200777 case PIPE_SHADER_CAP_TGSI_SKIP_MERGE_REGISTERS:
Marek Olšák4e00e202016-11-04 12:41:34 +0100778 return 1;
779
Marek Olšák4e00e202016-11-04 12:41:34 +0100780 case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:
Marek Olšákfacfab22017-07-05 23:33:13 +0200781 /* TODO: Indirect indexing of GS inputs is unimplemented. */
782 return shader != PIPE_SHADER_GEOMETRY &&
783 (sscreen->llvm_has_working_vgpr_indexing ||
784 /* TCS and TES load inputs directly from LDS or
785 * offchip memory, so indirect indexing is trivial. */
786 shader == PIPE_SHADER_TESS_CTRL ||
787 shader == PIPE_SHADER_TESS_EVAL);
788
789 case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR:
790 return sscreen->llvm_has_working_vgpr_indexing ||
791 /* TCS stores outputs directly to memory. */
792 shader == PIPE_SHADER_TESS_CTRL;
Marek Olšák4e00e202016-11-04 12:41:34 +0100793
794 /* Unsupported boolean features. */
Marek Olšák4e00e202016-11-04 12:41:34 +0100795 case PIPE_SHADER_CAP_SUBROUTINES:
796 case PIPE_SHADER_CAP_SUPPORTED_IRS:
797 case PIPE_SHADER_CAP_TGSI_DROUND_SUPPORTED:
798 case PIPE_SHADER_CAP_TGSI_DFRACEXP_DLDEXP_SUPPORTED:
799 return 0;
Tom Stellarda75c6162012-01-06 17:38:37 -0500800 }
801 return 0;
802}
803
Nicolai Hähnleacd09382017-05-16 02:04:48 +0200804static const struct nir_shader_compiler_options nir_options = {
805 .vertex_id_zero_based = true,
806 .lower_scmp = true,
807 .lower_flrp32 = true,
808 .lower_fsat = true,
809 .lower_fdiv = true,
810 .lower_sub = true,
811 .lower_pack_snorm_2x16 = true,
812 .lower_pack_snorm_4x8 = true,
813 .lower_pack_unorm_2x16 = true,
814 .lower_pack_unorm_4x8 = true,
815 .lower_unpack_snorm_2x16 = true,
816 .lower_unpack_snorm_4x8 = true,
817 .lower_unpack_unorm_2x16 = true,
818 .lower_unpack_unorm_4x8 = true,
819 .lower_extract_byte = true,
820 .lower_extract_word = true,
821 .max_unroll_iterations = 32,
822 .native_integers = true,
823};
824
825static const void *
826si_get_compiler_options(struct pipe_screen *screen,
827 enum pipe_shader_ir ir,
828 enum pipe_shader_type shader)
829{
830 assert(ir == PIPE_SHADER_IR_NIR);
831 return &nir_options;
832}
833
Andreas Hartmetzeb0ddb62014-01-07 03:07:55 +0100834static void si_destroy_screen(struct pipe_screen* pscreen)
Tom Stellarda75c6162012-01-06 17:38:37 -0500835{
Andreas Hartmetzaa7ae4f2014-01-11 16:01:11 +0100836 struct si_screen *sscreen = (struct si_screen *)pscreen;
Marek Olšák70de4332016-01-27 00:29:53 +0100837 struct si_shader_part *parts[] = {
838 sscreen->vs_prologs,
Marek Olšákeb109192016-01-27 00:38:03 +0100839 sscreen->tcs_epilogs,
Nicolai Hähnle908f92a2016-10-31 12:50:09 +0100840 sscreen->gs_prologs,
Marek Olšák4636d9b2016-02-15 23:57:54 +0100841 sscreen->ps_prologs,
Marek Olšáke79bb742016-01-27 00:50:29 +0100842 sscreen->ps_epilogs
Marek Olšák70de4332016-01-27 00:29:53 +0100843 };
844 unsigned i;
Tom Stellarda75c6162012-01-06 17:38:37 -0500845
Marek Olšákac330d42014-04-09 00:26:32 +0200846 if (!sscreen->b.ws->unref(sscreen->b.ws))
Christian König48711282013-09-25 13:59:56 +0200847 return;
848
Marek Olšáke9c69532017-03-03 00:24:03 +0100849 util_queue_destroy(&sscreen->shader_compiler_queue);
Marek Olšák86cc8092017-05-31 13:18:53 +0200850 util_queue_destroy(&sscreen->shader_compiler_queue_low_priority);
Marek Olšák5c92c212016-06-11 19:57:40 +0200851
852 for (i = 0; i < ARRAY_SIZE(sscreen->tm); i++)
853 if (sscreen->tm[i])
854 LLVMDisposeTargetMachine(sscreen->tm[i]);
855
Marek Olšák86cc8092017-05-31 13:18:53 +0200856 for (i = 0; i < ARRAY_SIZE(sscreen->tm_low_priority); i++)
857 if (sscreen->tm_low_priority[i])
858 LLVMDisposeTargetMachine(sscreen->tm_low_priority[i]);
859
Marek Olšák70de4332016-01-27 00:29:53 +0100860 /* Free shader parts. */
861 for (i = 0; i < ARRAY_SIZE(parts); i++) {
862 while (parts[i]) {
863 struct si_shader_part *part = parts[i];
864
865 parts[i] = part->next;
866 radeon_shader_binary_clean(&part->binary);
867 FREE(part);
868 }
869 }
Timothy Arceribe188282017-03-05 12:32:04 +1100870 mtx_destroy(&sscreen->shader_parts_mutex);
Marek Olšákff360a52016-02-11 15:49:34 +0100871 si_destroy_shader_cache(sscreen);
Tom Stellarde28f9d02015-01-07 13:49:12 -0500872 r600_destroy_common_screen(&sscreen->b);
Tom Stellarda75c6162012-01-06 17:38:37 -0500873}
874
Marek Olšák06083042015-10-19 02:45:56 +0200875static bool si_init_gs_info(struct si_screen *sscreen)
876{
877 switch (sscreen->b.family) {
878 case CHIP_OLAND:
879 case CHIP_HAINAN:
880 case CHIP_KAVERI:
881 case CHIP_KABINI:
882 case CHIP_MULLINS:
883 case CHIP_ICELAND:
884 case CHIP_CARRIZO:
Alex Deucher830e57b2015-10-23 18:31:57 -0400885 case CHIP_STONEY:
Marek Olšák06083042015-10-19 02:45:56 +0200886 sscreen->gs_table_depth = 16;
887 return true;
888 case CHIP_TAHITI:
889 case CHIP_PITCAIRN:
890 case CHIP_VERDE:
891 case CHIP_BONAIRE:
892 case CHIP_HAWAII:
893 case CHIP_TONGA:
894 case CHIP_FIJI:
Sonny Jiang42e442d2015-11-04 16:13:07 -0500895 case CHIP_POLARIS10:
896 case CHIP_POLARIS11:
Junwei Zhang018ead42016-12-19 13:51:25 -0500897 case CHIP_POLARIS12:
Marek Olšákc9b004a2016-10-15 14:17:56 +0200898 case CHIP_VEGA10:
Marek Olšák76221812017-02-27 22:26:10 +0100899 case CHIP_RAVEN:
Marek Olšák06083042015-10-19 02:45:56 +0200900 sscreen->gs_table_depth = 32;
901 return true;
902 default:
903 return false;
904 }
905}
906
Marek Olšákad8af992016-07-31 00:46:09 +0200907static void si_handle_env_var_force_family(struct si_screen *sscreen)
908{
909 const char *family = debug_get_option("SI_FORCE_FAMILY", NULL);
910 unsigned i;
911
912 if (!family)
913 return;
914
915 for (i = CHIP_TAHITI; i < CHIP_LAST; i++) {
916 if (!strcmp(family, r600_get_llvm_processor_name(i))) {
917 /* Override family and chip_class. */
918 sscreen->b.family = sscreen->b.info.family = i;
919
Marek Olšák68d6d092016-10-15 13:57:59 +0200920 if (i >= CHIP_VEGA10)
921 sscreen->b.chip_class = sscreen->b.info.chip_class = GFX9;
922 else if (i >= CHIP_TONGA)
Marek Olšákad8af992016-07-31 00:46:09 +0200923 sscreen->b.chip_class = sscreen->b.info.chip_class = VI;
924 else if (i >= CHIP_BONAIRE)
925 sscreen->b.chip_class = sscreen->b.info.chip_class = CIK;
926 else
927 sscreen->b.chip_class = sscreen->b.info.chip_class = SI;
928
929 /* Don't submit any IBs. */
930 setenv("RADEON_NOOP", "1", 1);
931 return;
932 }
933 }
934
935 fprintf(stderr, "radeonsi: Unknown family: %s\n", family);
936 exit(1);
937}
938
Marek Olšák322eb132017-03-27 16:53:19 +0200939static void si_test_vmfault(struct si_screen *sscreen)
940{
941 struct pipe_context *ctx = sscreen->b.aux_context;
942 struct si_context *sctx = (struct si_context *)ctx;
943 struct pipe_resource *buf =
944 pipe_buffer_create(&sscreen->b.b, 0, PIPE_USAGE_DEFAULT, 64);
945
946 if (!buf) {
947 puts("Buffer allocation failed.");
948 exit(1);
949 }
950
951 r600_resource(buf)->gpu_address = 0; /* cause a VM fault */
952
953 if (sscreen->b.debug_flags & DBG_TEST_VMFAULT_CP) {
954 si_copy_buffer(sctx, buf, buf, 0, 4, 4, 0);
955 ctx->flush(ctx, NULL, 0);
956 puts("VM fault test: CP - done.");
957 }
958 if (sscreen->b.debug_flags & DBG_TEST_VMFAULT_SDMA) {
959 sctx->b.dma_clear_buffer(ctx, buf, 0, 4, 0);
960 ctx->flush(ctx, NULL, 0);
961 puts("VM fault test: SDMA - done.");
962 }
963 if (sscreen->b.debug_flags & DBG_TEST_VMFAULT_SHADER) {
964 util_test_constant_buffer(ctx, buf);
965 puts("VM fault test: Shader - done.");
966 }
967 exit(0);
968}
969
Marek Olšáka98a04e2017-06-21 00:38:06 +0200970struct pipe_screen *radeonsi_screen_create(struct radeon_winsys *ws,
Nicolai Hähnlebc7f41e2017-06-28 14:47:32 +0200971 const struct pipe_screen_config *config)
Tom Stellarda75c6162012-01-06 17:38:37 -0500972{
Andreas Hartmetzaa7ae4f2014-01-11 16:01:11 +0100973 struct si_screen *sscreen = CALLOC_STRUCT(si_screen);
Marek Olšák86cc8092017-05-31 13:18:53 +0200974 unsigned num_threads, num_compiler_threads, num_compiler_threads_lowprio, i;
Michel Dänzerd64adc32015-03-26 11:32:59 +0900975
Edward O'Callaghan13eb5f52015-12-04 22:08:22 +1100976 if (!sscreen) {
Tom Stellarda75c6162012-01-06 17:38:37 -0500977 return NULL;
978 }
979
Marek Olšák09fc5d62013-09-22 21:47:35 +0200980 /* Set functions first. */
Marek Olšák1c8f7d32017-03-02 01:28:51 +0100981 sscreen->b.b.context_create = si_pipe_create_context;
Andreas Hartmetzaa7ae4f2014-01-11 16:01:11 +0100982 sscreen->b.b.destroy = si_destroy_screen;
Andreas Hartmetzaa7ae4f2014-01-11 16:01:11 +0100983 sscreen->b.b.get_param = si_get_param;
984 sscreen->b.b.get_shader_param = si_get_shader_param;
Nicolai Hähnleacd09382017-05-16 02:04:48 +0200985 sscreen->b.b.get_compiler_options = si_get_compiler_options;
Tom Stellard7b4592a2014-01-28 06:51:50 -0800986 sscreen->b.b.resource_create = r600_resource_create_common;
Marek Olšák09fc5d62013-09-22 21:47:35 +0200987
Marek Olšákec74dee2016-02-25 22:32:26 +0100988 si_init_screen_state_functions(sscreen);
989
Nicolai Hähnlebc7f41e2017-06-28 14:47:32 +0200990 if (!r600_common_screen_init(&sscreen->b, ws, config->flags) ||
Marek Olšákff360a52016-02-11 15:49:34 +0100991 !si_init_gs_info(sscreen) ||
992 !si_init_shader_cache(sscreen)) {
Andreas Hartmetzaa7ae4f2014-01-11 16:01:11 +0100993 FREE(sscreen);
Marek Olšák1bb77f82013-09-22 22:12:18 +0200994 return NULL;
995 }
Tom Stellarda75c6162012-01-06 17:38:37 -0500996
Nicolai Hähnle53485c22017-06-28 17:37:53 +0200997 if (driQueryOptionb(config->options, "radeonsi_enable_sisched"))
998 sscreen->b.debug_flags |= DBG_SI_SCHED;
999
Marek Olšák6f2947f2017-05-27 12:13:34 +02001000 /* Only enable as many threads as we have target machines, but at most
1001 * the number of CPUs - 1 if there is more than one.
1002 */
Marek Olšák86cc8092017-05-31 13:18:53 +02001003 num_threads = sysconf(_SC_NPROCESSORS_ONLN);
1004 num_threads = MAX2(1, num_threads - 1);
1005 num_compiler_threads = MIN2(num_threads, ARRAY_SIZE(sscreen->tm));
1006 num_compiler_threads_lowprio =
1007 MIN2(num_threads, ARRAY_SIZE(sscreen->tm_low_priority));
Marek Olšáke9c69532017-03-03 00:24:03 +01001008
1009 if (!util_queue_init(&sscreen->shader_compiler_queue, "si_shader",
Marek Olšák9f320e02017-07-10 22:16:26 +02001010 32, num_compiler_threads,
1011 UTIL_QUEUE_INIT_RESIZE_IF_FULL)) {
Marek Olšáke9c69532017-03-03 00:24:03 +01001012 si_destroy_shader_cache(sscreen);
1013 FREE(sscreen);
1014 return NULL;
1015 }
1016
Marek Olšák86cc8092017-05-31 13:18:53 +02001017 if (!util_queue_init(&sscreen->shader_compiler_queue_low_priority,
1018 "si_shader_low",
Marek Olšáked2b3f52017-07-24 23:56:30 +02001019 32, num_compiler_threads_lowprio,
Marek Olšákecec21a2017-07-17 16:03:29 -04001020 UTIL_QUEUE_INIT_RESIZE_IF_FULL |
1021 UTIL_QUEUE_INIT_USE_MINIMUM_PRIORITY)) {
Marek Olšák86cc8092017-05-31 13:18:53 +02001022 si_destroy_shader_cache(sscreen);
1023 FREE(sscreen);
1024 return NULL;
1025 }
1026
Marek Olšákad8af992016-07-31 00:46:09 +02001027 si_handle_env_var_force_family(sscreen);
1028
Marek Olšák3eacbc522016-06-21 21:29:39 +02001029 if (!debug_get_bool_option("RADEON_DISABLE_PERFCOUNTERS", false))
Nicolai Hähnlead220062015-11-25 15:30:03 +01001030 si_init_perfcounters(sscreen);
1031
Marek Olšákdd56d042016-06-28 14:11:12 +02001032 /* Hawaii has a bug with offchip buffers > 256 that can be worked
1033 * around by setting 4K granularity.
1034 */
1035 sscreen->tess_offchip_block_dw_size =
1036 sscreen->b.family == CHIP_HAWAII ? 4096 : 8192;
1037
Marek Olšákeff81cb2016-06-28 14:19:04 +02001038 sscreen->has_distributed_tess =
1039 sscreen->b.chip_class >= VI &&
1040 sscreen->b.info.max_se >= 2;
1041
Nicolai Hähnle96bbb622016-07-29 17:59:11 +01001042 sscreen->has_draw_indirect_multi =
1043 (sscreen->b.family >= CHIP_POLARIS10) ||
1044 (sscreen->b.chip_class == VI &&
1045 sscreen->b.info.pfp_fw_version >= 121 &&
1046 sscreen->b.info.me_fw_version >= 87) ||
1047 (sscreen->b.chip_class == CIK &&
1048 sscreen->b.info.pfp_fw_version >= 211 &&
1049 sscreen->b.info.me_fw_version >= 173) ||
1050 (sscreen->b.chip_class == SI &&
Nicolai Hähnle65fbaab2017-07-25 16:47:27 +02001051 sscreen->b.info.pfp_fw_version >= 79 &&
1052 sscreen->b.info.me_fw_version >= 142);
Nicolai Hähnle96bbb622016-07-29 17:59:11 +01001053
Marek Olšák12beef02017-04-25 02:18:10 +02001054 sscreen->has_ds_bpermute = sscreen->b.chip_class >= VI;
Marek Olšák829bd772017-02-27 23:17:07 +01001055 sscreen->has_msaa_sample_loc_bug = (sscreen->b.family >= CHIP_POLARIS10 &&
1056 sscreen->b.family <= CHIP_POLARIS12) ||
Marek Olšák76221812017-02-27 22:26:10 +01001057 sscreen->b.family == CHIP_VEGA10 ||
1058 sscreen->b.family == CHIP_RAVEN;
Marek Olšákfacfab22017-07-05 23:33:13 +02001059 /* While it would be nice not to have this flag, we are constrained
1060 * by the reality that LLVM 5.0 doesn't have working VGPR indexing
1061 * on GFX9.
1062 */
1063 sscreen->llvm_has_working_vgpr_indexing = sscreen->b.chip_class <= VI;
Marek Olšák829bd772017-02-27 23:17:07 +01001064
Andreas Hartmetzaa7ae4f2014-01-11 16:01:11 +01001065 sscreen->b.has_cp_dma = true;
Marek Olšáka66d9342014-07-08 02:50:57 +02001066 sscreen->b.has_streamout = true;
Marek Olšák6d21fd52016-11-06 20:08:24 +01001067
1068 /* Some chips have RB+ registers, but don't support RB+. Those must
1069 * always disable it.
1070 */
1071 if (sscreen->b.family == CHIP_STONEY ||
1072 sscreen->b.chip_class >= GFX9) {
1073 sscreen->b.has_rbplus = true;
1074
1075 sscreen->b.rbplus_allowed =
1076 !(sscreen->b.debug_flags & DBG_NO_RB_PLUS) &&
Marek Olšák76221812017-02-27 22:26:10 +01001077 (sscreen->b.family == CHIP_STONEY ||
1078 sscreen->b.family == CHIP_RAVEN);
Marek Olšák6d21fd52016-11-06 20:08:24 +01001079 }
1080
Timothy Arceri75b47dd2017-03-05 12:00:15 +11001081 (void) mtx_init(&sscreen->shader_parts_mutex, mtx_plain);
Marek Olšák9aaf28d2016-01-28 01:29:59 +01001082 sscreen->use_monolithic_shaders =
Marek Olšák9aaf28d2016-01-28 01:29:59 +01001083 (sscreen->b.debug_flags & DBG_MONOLITHIC_SHADERS) != 0;
Marek Olšákbba39d82013-11-28 15:09:35 +01001084
Nicolai Hähnle8e4de002016-09-15 16:24:17 +02001085 sscreen->b.barrier_flags.cp_to_L2 = SI_CONTEXT_INV_SMEM_L1 |
Marek Olšákd7141d82017-06-06 12:13:40 +02001086 SI_CONTEXT_INV_VMEM_L1;
1087 if (sscreen->b.chip_class <= VI)
1088 sscreen->b.barrier_flags.cp_to_L2 |= SI_CONTEXT_INV_GLOBAL_L2;
1089
Nicolai Hähnle8e4de002016-09-15 16:24:17 +02001090 sscreen->b.barrier_flags.compute_to_L2 = SI_CONTEXT_CS_PARTIAL_FLUSH;
1091
Marek Olšák3eacbc522016-06-21 21:29:39 +02001092 if (debug_get_bool_option("RADEON_DUMP_SHADERS", false))
Andreas Hartmetzaa7ae4f2014-01-11 16:01:11 +01001093 sscreen->b.debug_flags |= DBG_FS | DBG_VS | DBG_GS | DBG_PS | DBG_CS;
Marek Olšák0cb9de12013-09-22 15:34:12 +02001094
Marek Olšák5c92c212016-06-11 19:57:40 +02001095 for (i = 0; i < num_compiler_threads; i++)
1096 sscreen->tm[i] = si_create_llvm_target_machine(sscreen);
Marek Olšák86cc8092017-05-31 13:18:53 +02001097 for (i = 0; i < num_compiler_threads_lowprio; i++)
1098 sscreen->tm_low_priority[i] = si_create_llvm_target_machine(sscreen);
Marek Olšák5c92c212016-06-11 19:57:40 +02001099
Marek Olšákb893bbf2013-10-03 16:39:50 +02001100 /* Create the auxiliary context. This must be done last. */
Marek Olšák1c8f7d32017-03-02 01:28:51 +01001101 sscreen->b.aux_context = si_create_context(&sscreen->b.b, 0);
Marek Olšákb893bbf2013-10-03 16:39:50 +02001102
Marek Olšák3af28e52014-09-05 20:15:16 +02001103 if (sscreen->b.debug_flags & DBG_TEST_DMA)
1104 r600_test_dma(&sscreen->b);
1105
Marek Olšák322eb132017-03-27 16:53:19 +02001106 if (sscreen->b.debug_flags & (DBG_TEST_VMFAULT_CP |
1107 DBG_TEST_VMFAULT_SDMA |
1108 DBG_TEST_VMFAULT_SHADER))
1109 si_test_vmfault(sscreen);
1110
Andreas Hartmetzaa7ae4f2014-01-11 16:01:11 +01001111 return &sscreen->b.b;
Tom Stellarda75c6162012-01-06 17:38:37 -05001112}