blob: 65c0daa5cfba719bcbc0eac8fff0608f6cea0369 [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šák70de4332016-01-27 00:29:53 +010025#include "si_shader.h"
Marek Olšák72097032014-01-22 18:50:36 +010026#include "si_public.h"
Marek Olšák955505f2014-08-07 21:14:31 +020027#include "sid.h"
Marek Olšák72097032014-01-22 18:50:36 +010028
Tom Stellard761e36b2014-10-15 12:24:30 -040029#include "radeon/radeon_llvm_emit.h"
Christian König5b2855b2013-04-03 10:18:35 +020030#include "radeon/radeon_uvd.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šák72097032014-01-22 18:50:36 +010033#include "vl/vl_decoder.h"
Tom Stellarda75c6162012-01-06 17:38:37 -050034
35/*
36 * pipe_context
37 */
Andreas Hartmetzeb0ddb62014-01-07 03:07:55 +010038static void si_destroy_context(struct pipe_context *context)
Tom Stellarda75c6162012-01-06 17:38:37 -050039{
Andreas Hartmetz8662e662014-01-11 16:00:50 +010040 struct si_context *sctx = (struct si_context *)context;
Marek Olšák59b35562014-09-19 00:16:12 +020041 int i;
Tom Stellarda75c6162012-01-06 17:38:37 -050042
Bas Nieuwenhuizencbe34212016-05-31 13:44:03 +020043 si_dec_framebuffer_counters(&sctx->framebuffer.state);
44
Andreas Hartmetz8662e662014-01-11 16:00:50 +010045 si_release_all_descriptors(sctx);
Marek Olšákc8e70e62013-08-06 06:42:22 +020046
Bas Nieuwenhuizenaabc7d62016-03-10 21:23:49 +010047 if (sctx->ce_suballocator)
48 u_suballocator_destroy(sctx->ce_suballocator);
49
Marek Olšák711623f2014-09-18 21:40:02 +020050 pipe_resource_reference(&sctx->esgs_ring, NULL);
51 pipe_resource_reference(&sctx->gsvs_ring, NULL);
Marek Olšákb6f4fdf2015-02-22 17:25:37 +010052 pipe_resource_reference(&sctx->tf_ring, NULL);
Bas Nieuwenhuizend27ff7d2016-05-02 09:54:11 +020053 pipe_resource_reference(&sctx->tess_offchip_ring, NULL);
Andreas Hartmetz8662e662014-01-11 16:00:50 +010054 pipe_resource_reference(&sctx->null_const_buf.buffer, NULL);
Marek Olšáka9971e82015-08-30 14:13:10 +020055 r600_resource_reference(&sctx->border_color_buffer, NULL);
56 free(sctx->border_color_table);
Tom Stellard2397a722014-12-10 09:13:59 -050057 r600_resource_reference(&sctx->scratch_buffer, NULL);
Bas Nieuwenhuizenba1f66a2016-04-02 13:04:18 +020058 r600_resource_reference(&sctx->compute_scratch_buffer, NULL);
Marek Olšákf1be3d82015-06-27 14:03:46 +020059 sctx->b.ws->fence_reference(&sctx->last_gfx_fence, NULL);
Michel Dänzer9ccaa242012-09-07 16:09:08 +020060
Marek Olšák638fa802014-12-31 00:42:22 +010061 si_pm4_free_state(sctx, sctx->init_config, ~0);
Marek Olšákb1c5f3f2015-11-08 13:34:44 +010062 if (sctx->init_config_gs_rings)
63 si_pm4_free_state(sctx, sctx->init_config_gs_rings, ~0);
Jan Vesely47b390f2016-05-17 09:25:44 -040064 for (i = 0; i < ARRAY_SIZE(sctx->vgt_shader_config); i++)
Marek Olšák59b35562014-09-19 00:16:12 +020065 si_pm4_delete_state(sctx, vgt_shader_config, sctx->vgt_shader_config[i]);
Michel Dänzer404b29d2013-11-21 16:45:28 +090066
Marek Olšák9b54ce32015-10-07 01:48:18 +020067 if (sctx->fixed_func_tcs_shader.cso)
68 sctx->b.b.delete_tcs_state(&sctx->b.b, sctx->fixed_func_tcs_shader.cso);
Marek Olšák6d6208a2015-05-06 19:34:09 +020069 if (sctx->custom_dsa_flush)
70 sctx->b.b.delete_depth_stencil_alpha_state(&sctx->b.b, sctx->custom_dsa_flush);
71 if (sctx->custom_blend_resolve)
72 sctx->b.b.delete_blend_state(&sctx->b.b, sctx->custom_blend_resolve);
73 if (sctx->custom_blend_decompress)
74 sctx->b.b.delete_blend_state(&sctx->b.b, sctx->custom_blend_decompress);
75 if (sctx->custom_blend_fastclear)
76 sctx->b.b.delete_blend_state(&sctx->b.b, sctx->custom_blend_fastclear);
Bas Nieuwenhuizen1e48ec72015-10-21 00:10:41 +020077 if (sctx->custom_blend_dcc_decompress)
78 sctx->b.b.delete_blend_state(&sctx->b.b, sctx->custom_blend_dcc_decompress);
Marek Olšák6a5499b2014-03-04 17:49:39 +010079 util_unreference_framebuffer_state(&sctx->framebuffer.state);
Tom Stellarda75c6162012-01-06 17:38:37 -050080
Marek Olšák6d6208a2015-05-06 19:34:09 +020081 if (sctx->blitter)
82 util_blitter_destroy(sctx->blitter);
Tom Stellarda75c6162012-01-06 17:38:37 -050083
Andreas Hartmetz8662e662014-01-11 16:00:50 +010084 r600_common_context_cleanup(&sctx->b);
Michel Dänzerd64adc32015-03-26 11:32:59 +090085
Michel Dänzerd64adc32015-03-26 11:32:59 +090086 LLVMDisposeTargetMachine(sctx->tm);
Michel Dänzerd64adc32015-03-26 11:32:59 +090087
Marek Olšák2c14a6d2015-08-19 11:53:25 +020088 r600_resource_reference(&sctx->trace_buf, NULL);
89 r600_resource_reference(&sctx->last_trace_buf, NULL);
Marek Olšákbe6dc872015-08-15 12:46:17 +020090 free(sctx->last_ib);
Marek Olšákcc92b902015-09-27 01:38:48 +020091 if (sctx->last_bo_list) {
92 for (i = 0; i < sctx->last_bo_count; i++)
93 pb_reference(&sctx->last_bo_list[i].buf, NULL);
94 free(sctx->last_bo_list);
95 }
Andreas Hartmetz8662e662014-01-11 16:00:50 +010096 FREE(sctx);
Tom Stellarda75c6162012-01-06 17:38:37 -050097}
98
Marek Olšákbf2c3422015-04-30 17:02:38 +020099static enum pipe_reset_status
100si_amdgpu_get_reset_status(struct pipe_context *ctx)
101{
102 struct si_context *sctx = (struct si_context *)ctx;
103
104 return sctx->b.ws->ctx_query_reset_status(sctx->b.ctx);
105}
106
Marek Olšák0fc21ec2015-07-25 18:40:59 +0200107static struct pipe_context *si_create_context(struct pipe_screen *screen,
108 void *priv, unsigned flags)
Tom Stellarda75c6162012-01-06 17:38:37 -0500109{
Andreas Hartmetz8662e662014-01-11 16:00:50 +0100110 struct si_context *sctx = CALLOC_STRUCT(si_context);
Andreas Hartmetzaa7ae4f2014-01-11 16:01:11 +0100111 struct si_screen* sscreen = (struct si_screen *)screen;
Marek Olšákdd72c322014-04-11 22:14:27 +0200112 struct radeon_winsys *ws = sscreen->b.ws;
Michel Dänzerd64adc32015-03-26 11:32:59 +0900113 LLVMTargetRef r600_target;
Michel Dänzerd64adc32015-03-26 11:32:59 +0900114 const char *triple = "amdgcn--";
Marek Olšák4569bf92013-10-30 20:44:23 +0100115 int shader, i;
Tom Stellarda75c6162012-01-06 17:38:37 -0500116
Edward O'Callaghan13eb5f52015-12-04 22:08:22 +1100117 if (!sctx)
Tom Stellarda75c6162012-01-06 17:38:37 -0500118 return NULL;
119
Marek Olšák9bd79282015-09-26 03:15:40 +0200120 if (sscreen->b.debug_flags & DBG_CHECK_VM)
121 flags |= PIPE_CONTEXT_DEBUG;
122
Marek Olšák4e5c70e2014-01-21 18:01:01 +0100123 sctx->b.b.screen = screen; /* this must be set first */
Andreas Hartmetz8662e662014-01-11 16:00:50 +0100124 sctx->b.b.priv = priv;
125 sctx->b.b.destroy = si_destroy_context;
Grazvydas Ignotas3206d4e2015-08-10 00:42:32 +0300126 sctx->b.set_atom_dirty = (void *)si_set_atom_dirty;
Marek Olšák4e5c70e2014-01-21 18:01:01 +0100127 sctx->screen = sscreen; /* Easy accessing of screen/winsys. */
Marek Olšákbe6dc872015-08-15 12:46:17 +0200128 sctx->is_debug = (flags & PIPE_CONTEXT_DEBUG) != 0;
Tom Stellarda75c6162012-01-06 17:38:37 -0500129
Marek Olšák4e5c70e2014-01-21 18:01:01 +0100130 if (!r600_common_context_init(&sctx->b, &sscreen->b))
131 goto fail;
Tom Stellarda75c6162012-01-06 17:38:37 -0500132
Marek Olšákbf2c3422015-04-30 17:02:38 +0200133 if (sscreen->b.info.drm_major == 3)
134 sctx->b.b.get_device_reset_status = si_amdgpu_get_reset_status;
135
Andreas Hartmetz8662e662014-01-11 16:00:50 +0100136 si_init_blit_functions(sctx);
Andreas Hartmetz8662e662014-01-11 16:00:50 +0100137 si_init_compute_functions(sctx);
Marek Olšák2d3ae152015-07-25 01:25:07 +0200138 si_init_cp_dma_functions(sctx);
Marek Olšák110873e2015-08-15 23:56:22 +0200139 si_init_debug_functions(sctx);
Tom Stellarda75c6162012-01-06 17:38:37 -0500140
Andreas Hartmetzaa7ae4f2014-01-11 16:01:11 +0100141 if (sscreen->b.info.has_uvd) {
Andreas Hartmetz8662e662014-01-11 16:00:50 +0100142 sctx->b.b.create_video_codec = si_uvd_create_decoder;
143 sctx->b.b.create_video_buffer = si_video_buffer_create;
Christian König5b2855b2013-04-03 10:18:35 +0200144 } else {
Andreas Hartmetz8662e662014-01-11 16:00:50 +0100145 sctx->b.b.create_video_codec = vl_create_decoder;
146 sctx->b.b.create_video_buffer = vl_video_buffer_create;
Christian König5b2855b2013-04-03 10:18:35 +0200147 }
Tom Stellarda75c6162012-01-06 17:38:37 -0500148
Marek Olšák81401542016-03-11 15:24:05 +0100149 sctx->b.gfx.cs = ws->cs_create(sctx->b.ctx, RING_GFX,
150 si_context_gfx_flush, sctx);
Bas Nieuwenhuizen8fee75d2016-04-13 22:31:17 +0200151
152 if (!(sscreen->b.debug_flags & DBG_NO_CE) && ws->cs_add_const_ib) {
153 sctx->ce_ib = ws->cs_add_const_ib(sctx->b.gfx.cs);
154 if (!sctx->ce_ib)
155 goto fail;
156
157 if (ws->cs_add_const_preamble_ib) {
158 sctx->ce_preamble_ib =
159 ws->cs_add_const_preamble_ib(sctx->b.gfx.cs);
160
161 if (!sctx->ce_preamble_ib)
162 goto fail;
163 }
Bas Nieuwenhuizenaabc7d62016-03-10 21:23:49 +0100164
165 sctx->ce_suballocator =
166 u_suballocator_create(&sctx->b.b, 1024 * 1024,
Marek Olšákada3d8f2016-05-31 19:06:45 +0200167 PIPE_BIND_CUSTOM,
Bas Nieuwenhuizenaabc7d62016-03-10 21:23:49 +0100168 PIPE_USAGE_DEFAULT, FALSE);
169 if (!sctx->ce_suballocator)
170 goto fail;
Bas Nieuwenhuizen8fee75d2016-04-13 22:31:17 +0200171 }
172
Marek Olšák6cc8f6c2015-11-07 14:00:30 +0100173 sctx->b.gfx.flush = si_context_gfx_flush;
Marek Olšákc8e70e62013-08-06 06:42:22 +0200174
Marek Olšáka9971e82015-08-30 14:13:10 +0200175 /* Border colors. */
176 sctx->border_color_table = malloc(SI_MAX_BORDER_COLORS *
177 sizeof(*sctx->border_color_table));
178 if (!sctx->border_color_table)
179 goto fail;
180
181 sctx->border_color_buffer = (struct r600_resource*)
182 pipe_buffer_create(screen, PIPE_BIND_CUSTOM, PIPE_USAGE_DEFAULT,
183 SI_MAX_BORDER_COLORS *
184 sizeof(*sctx->border_color_table));
185 if (!sctx->border_color_buffer)
186 goto fail;
187
188 sctx->border_color_map =
Marek Olšákcf811fa2015-12-07 00:00:59 +0100189 ws->buffer_map(sctx->border_color_buffer->buf,
Marek Olšáka9971e82015-08-30 14:13:10 +0200190 NULL, PIPE_TRANSFER_WRITE);
191 if (!sctx->border_color_map)
192 goto fail;
193
Andreas Hartmetz8662e662014-01-11 16:00:50 +0100194 si_init_all_descriptors(sctx);
Marek Olšák0aa24462015-07-16 14:42:38 +0200195 si_init_state_functions(sctx);
196 si_init_shader_functions(sctx);
Tom Stellarda75c6162012-01-06 17:38:37 -0500197
Marek Olšák498a40c2016-04-22 22:03:24 +0200198 if (sctx->b.chip_class >= CIK)
199 cik_init_sdma_functions(sctx);
200 else
201 si_init_dma_functions(sctx);
202
Marek Olšákd13d2fd2014-09-06 17:07:50 +0200203 if (sscreen->b.debug_flags & DBG_FORCE_DMA)
204 sctx->b.b.resource_copy_region = sctx->b.dma_copy;
205
Andreas Hartmetz8662e662014-01-11 16:00:50 +0100206 sctx->blitter = util_blitter_create(&sctx->b.b);
207 if (sctx->blitter == NULL)
Marek Olšáka81c3e02013-08-14 01:04:39 +0200208 goto fail;
Marek Olšákdb51ab62014-08-18 00:55:40 +0200209 sctx->blitter->draw_rectangle = r600_draw_rectangle;
Tom Stellarda75c6162012-01-06 17:38:37 -0500210
Marek Olšák74aa6482015-08-29 15:05:53 +0200211 sctx->sample_mask.sample_mask = 0xffff;
212
Marek Olšák9eb3b9d2013-08-31 00:13:43 +0200213 /* these must be last */
Andreas Hartmetz8662e662014-01-11 16:00:50 +0100214 si_begin_new_cs(sctx);
Marek Olšák62d55c02014-01-22 00:06:32 +0100215 r600_query_init_backend_mask(&sctx->b); /* this emits commands and must be last */
Marek Olšák4569bf92013-10-30 20:44:23 +0100216
217 /* CIK cannot unbind a constant buffer (S_BUFFER_LOAD is buggy
218 * with a NULL buffer). We need to use a dummy buffer instead. */
Andreas Hartmetz8662e662014-01-11 16:00:50 +0100219 if (sctx->b.chip_class == CIK) {
220 sctx->null_const_buf.buffer = pipe_buffer_create(screen, PIPE_BIND_CONSTANT_BUFFER,
Marek Olšákc3211442014-02-03 03:42:17 +0100221 PIPE_USAGE_DEFAULT, 16);
Marek Olšákae418a72015-09-10 19:25:14 +0200222 if (!sctx->null_const_buf.buffer)
223 goto fail;
Andreas Hartmetz8662e662014-01-11 16:00:50 +0100224 sctx->null_const_buf.buffer_size = sctx->null_const_buf.buffer->width0;
Marek Olšák4569bf92013-10-30 20:44:23 +0100225
226 for (shader = 0; shader < SI_NUM_SHADERS; shader++) {
Marek Olšákee2a8182014-07-07 23:27:19 +0200227 for (i = 0; i < SI_NUM_CONST_BUFFERS; i++) {
Andreas Hartmetz8662e662014-01-11 16:00:50 +0100228 sctx->b.b.set_constant_buffer(&sctx->b.b, shader, i,
229 &sctx->null_const_buf);
Marek Olšák4569bf92013-10-30 20:44:23 +0100230 }
231 }
232
233 /* Clear the NULL constant buffer, because loads should return zeros. */
Andreas Hartmetz8662e662014-01-11 16:00:50 +0100234 sctx->b.clear_buffer(&sctx->b.b, sctx->null_const_buf.buffer, 0,
Marek Olšákf564b612016-04-22 10:26:28 +0200235 sctx->null_const_buf.buffer->width0, 0,
236 R600_COHERENCY_SHADER);
Marek Olšák4569bf92013-10-30 20:44:23 +0100237 }
238
Marek Olšák26b69ad2016-06-08 14:34:11 +0200239 uint64_t max_threads_per_block;
240 screen->get_compute_param(screen, PIPE_SHADER_IR_TGSI,
241 PIPE_COMPUTE_CAP_MAX_THREADS_PER_BLOCK,
242 &max_threads_per_block);
243
244 /* The maximum number of scratch waves. Scratch space isn't divided
245 * evenly between CUs. The number is only a function of the number of CUs.
246 * We can decrease the constant to decrease the scratch buffer size.
247 *
248 * sctx->scratch_waves must be >= the maximum posible size of
249 * 1 threadgroup, so that the hw doesn't hang from being unable
250 * to start any.
251 *
252 * The recommended value is 4 per CU at most. Higher numbers don't
253 * bring much benefit, but they still occupy chip resources (think
254 * async compute). I've seen ~2% performance difference between 4 and 32.
Tom Stellard2397a722014-12-10 09:13:59 -0500255 */
Marek Olšák26b69ad2016-06-08 14:34:11 +0200256 sctx->scratch_waves = MAX2(32 * sscreen->b.info.num_good_compute_units,
257 max_threads_per_block / 64);
Tom Stellard2397a722014-12-10 09:13:59 -0500258
Michel Dänzerd64adc32015-03-26 11:32:59 +0900259 /* Initialize LLVM TargetMachine */
260 r600_target = radeon_llvm_get_r600_target(triple);
261 sctx->tm = LLVMCreateTargetMachine(r600_target, triple,
262 r600_get_llvm_processor_name(sscreen->b.family),
Axel Davydda7a842016-01-15 10:47:42 +0100263#if HAVE_LLVM >= 0x0308
264 sscreen->b.debug_flags & DBG_SI_SCHED ?
265 "+DumpCode,+vgpr-spilling,+si-scheduler" :
266#endif
267 "+DumpCode,+vgpr-spilling",
Michel Dänzerd64adc32015-03-26 11:32:59 +0900268 LLVMCodeGenLevelDefault,
269 LLVMRelocDefault,
270 LLVMCodeModelDefault);
Michel Dänzerd64adc32015-03-26 11:32:59 +0900271
Andreas Hartmetz8662e662014-01-11 16:00:50 +0100272 return &sctx->b.b;
Marek Olšáka81c3e02013-08-14 01:04:39 +0200273fail:
Marek Olšáka9971e82015-08-30 14:13:10 +0200274 fprintf(stderr, "radeonsi: Failed to create a context.\n");
Andreas Hartmetz8662e662014-01-11 16:00:50 +0100275 si_destroy_context(&sctx->b.b);
Marek Olšáka81c3e02013-08-14 01:04:39 +0200276 return NULL;
Tom Stellarda75c6162012-01-06 17:38:37 -0500277}
278
279/*
280 * pipe_screen
281 */
Tom Stellarda75c6162012-01-06 17:38:37 -0500282
Andreas Hartmetzeb0ddb62014-01-07 03:07:55 +0100283static int si_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
Tom Stellarda75c6162012-01-06 17:38:37 -0500284{
Andreas Hartmetzaa7ae4f2014-01-11 16:01:11 +0100285 struct si_screen *sscreen = (struct si_screen *)pscreen;
Tom Stellarda75c6162012-01-06 17:38:37 -0500286
287 switch (param) {
288 /* Supported features (boolean caps). */
Tom Stellarda75c6162012-01-06 17:38:37 -0500289 case PIPE_CAP_TWO_SIDED_STENCIL:
Tom Stellard69a92182012-04-14 17:37:37 -0400290 case PIPE_CAP_MAX_DUAL_SOURCE_RENDER_TARGETS:
Tom Stellarda75c6162012-01-06 17:38:37 -0500291 case PIPE_CAP_ANISOTROPIC_FILTER:
292 case PIPE_CAP_POINT_SPRITE:
293 case PIPE_CAP_OCCLUSION_QUERY:
294 case PIPE_CAP_TEXTURE_SHADOW_MAP:
295 case PIPE_CAP_TEXTURE_MIRROR_CLAMP:
296 case PIPE_CAP_BLEND_EQUATION_SEPARATE:
297 case PIPE_CAP_TEXTURE_SWIZZLE:
Tom Stellarda75c6162012-01-06 17:38:37 -0500298 case PIPE_CAP_DEPTH_CLIP_DISABLE:
299 case PIPE_CAP_SHADER_STENCIL_EXPORT:
300 case PIPE_CAP_VERTEX_ELEMENT_INSTANCE_DIVISOR:
301 case PIPE_CAP_MIXED_COLORBUFFER_FORMATS:
302 case PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT:
303 case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER:
Marek Olšák39583782014-11-17 20:51:56 +0100304 case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER:
Tom Stellarda75c6162012-01-06 17:38:37 -0500305 case PIPE_CAP_SM3:
306 case PIPE_CAP_SEAMLESS_CUBE_MAP:
307 case PIPE_CAP_PRIMITIVE_RESTART:
308 case PIPE_CAP_CONDITIONAL_RENDER:
309 case PIPE_CAP_TEXTURE_BARRIER:
310 case PIPE_CAP_INDEP_BLEND_ENABLE:
311 case PIPE_CAP_INDEP_BLEND_FUNC:
312 case PIPE_CAP_SEAMLESS_CUBE_MAP_PER_TEXTURE:
313 case PIPE_CAP_VERTEX_COLOR_UNCLAMPED:
Marek Olšák2a311b12012-04-24 01:23:33 +0200314 case PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY:
315 case PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY:
316 case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY:
Marek Olšák437ab1d2012-04-24 15:19:31 +0200317 case PIPE_CAP_USER_INDEX_BUFFERS:
318 case PIPE_CAP_USER_CONSTANT_BUFFERS:
Fredrik Höglundaf372122012-06-18 22:50:02 +0200319 case PIPE_CAP_START_INSTANCE:
Michel Dänzerd0f51fe2012-09-05 18:27:02 +0200320 case PIPE_CAP_NPOT_TEXTURES:
Ilia Mirkin12d39b42013-10-04 04:32:15 -0400321 case PIPE_CAP_MIXED_FRAMEBUFFER_SIZES:
Marek Olšák5bc871a2015-10-07 02:36:38 +0200322 case PIPE_CAP_VERTEX_COLOR_CLAMPED:
Marek Olšák208d1ed2015-10-07 01:47:00 +0200323 case PIPE_CAP_FRAGMENT_COLOR_CLAMPED:
Marek Olšák3e10ab62013-03-14 17:18:43 +0100324 case PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER:
Christian Könige4ed5872013-03-21 18:02:52 +0100325 case PIPE_CAP_TGSI_INSTANCEID:
Tom Stellard302f53d2012-10-25 13:50:10 -0400326 case PIPE_CAP_COMPUTE:
Marek Olšákdbeedbb2013-10-31 15:08:49 +0100327 case PIPE_CAP_TEXTURE_BUFFER_OBJECTS:
Ilia Mirkin32b71242014-07-03 11:15:18 -0400328 case PIPE_CAP_TGSI_VS_LAYER_VIEWPORT:
Marek Olšák8739c602014-01-22 00:08:11 +0100329 case PIPE_CAP_QUERY_PIPELINE_STATISTICS:
Marek Olšák6381dd72014-01-27 21:46:21 +0100330 case PIPE_CAP_BUFFER_MAP_PERSISTENT_COHERENT:
Marek Olšák2484daa2014-04-22 21:23:29 +0200331 case PIPE_CAP_CUBE_MAP_ARRAY:
Marek Olšákf98a7d82014-05-07 13:15:41 +0200332 case PIPE_CAP_SAMPLE_SHADING:
Marek Olšák2a7b57a2014-04-24 03:03:43 +0200333 case PIPE_CAP_DRAW_INDIRECT:
Mathias Fröhlich56088132014-09-14 15:17:07 +0200334 case PIPE_CAP_CLIP_HALFZ:
Marek Olšákff804222014-11-08 16:03:13 +0100335 case PIPE_CAP_TGSI_VS_WINDOW_SPACE_POSITION:
Ilia Mirkin7c211a12015-02-01 09:01:50 -0500336 case PIPE_CAP_POLYGON_OFFSET_CLAMP:
Axel Davyeb1c12d2015-01-17 14:30:17 +0100337 case PIPE_CAP_MULTISAMPLE_Z_RESOLVE:
Marek Olšákf5832f32015-03-15 18:53:50 +0100338 case PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION:
Marek Olšáke4339bc2015-05-09 19:36:17 +0200339 case PIPE_CAP_TGSI_TEXCOORD:
Dave Airliebb9d59a2015-07-17 05:35:30 +0100340 case PIPE_CAP_TGSI_FS_FINE_DERIVATIVE:
Edward O'Callaghan82546722015-07-27 11:01:47 +1000341 case PIPE_CAP_CONDITIONAL_RENDER_INVERTED:
Marek Olšák44dc1d32015-08-10 19:37:01 +0200342 case PIPE_CAP_TEXTURE_FLOAT_LINEAR:
343 case PIPE_CAP_TEXTURE_HALF_FLOAT_LINEAR:
Marek Olšák9b54ce32015-10-07 01:48:18 +0200344 case PIPE_CAP_SHAREABLE_SHADERS:
Marek Olšák97f58fb2015-08-10 02:23:21 +0200345 case PIPE_CAP_DEPTH_BOUNDS_TEST:
Marek Olšák12321962015-03-17 14:46:04 +0100346 case PIPE_CAP_SAMPLER_VIEW_TARGET:
Marek Olšáke6d38462015-09-06 16:26:21 +0200347 case PIPE_CAP_TEXTURE_QUERY_LOD:
348 case PIPE_CAP_TEXTURE_GATHER_SM5:
Ilia Mirkin72ebd532015-09-18 19:08:35 -0400349 case PIPE_CAP_TGSI_TXQS:
Marek Olšák814b7d12015-09-28 23:50:12 +0200350 case PIPE_CAP_FORCE_PERSAMPLE_INTERP:
Marek Olšákce9db162015-08-24 01:19:35 +0200351 case PIPE_CAP_COPY_BETWEEN_COMPRESSED_AND_PLAIN_FORMATS:
Marek Olšák4ea0feb2016-01-02 23:09:58 +0100352 case PIPE_CAP_TGSI_FS_POSITION_IS_SYSVAL:
353 case PIPE_CAP_TGSI_FS_FACE_IS_INTEGER_SYSVAL:
Nicolai Hähnle321140d2016-01-14 09:41:04 -0500354 case PIPE_CAP_INVALIDATE_BUFFER:
Nicolai Hähnle7dd31b82016-01-26 10:29:50 -0500355 case PIPE_CAP_SURFACE_REINTERPRET_BLOCKS:
Marek Olšák635555a2016-02-02 02:09:36 +0100356 case PIPE_CAP_QUERY_MEMORY_INFO:
Marek Olšák100796c2016-02-10 21:48:59 +0100357 case PIPE_CAP_TGSI_PACK_HALF_FLOAT:
Edward O'Callaghan483a6862016-01-02 05:53:57 +1100358 case PIPE_CAP_FRAMEBUFFER_NO_ATTACHMENT:
Bas Nieuwenhuizen126da232016-04-03 21:49:44 +0200359 case PIPE_CAP_ROBUST_BUFFER_ACCESS_BEHAVIOR:
Marek Olšák70a25472016-06-10 03:03:11 +0200360 case PIPE_CAP_GENERATE_MIPMAP:
Marek Olšákaafb0f92013-08-17 02:47:21 +0200361 return 1;
Marek Olšák21d9a1b2013-08-16 15:21:45 +0200362
Marek Olšák7713d592015-02-10 16:02:54 +0100363 case PIPE_CAP_RESOURCE_FROM_USER_MEMORY:
364 return !SI_BIG_ENDIAN && sscreen->b.info.has_userptr;
365
Marek Olšák914365c2015-04-29 15:27:50 +0200366 case PIPE_CAP_DEVICE_RESET_STATUS_QUERY:
Marek Olšákbf2c3422015-04-30 17:02:38 +0200367 return (sscreen->b.info.drm_major == 2 &&
368 sscreen->b.info.drm_minor >= 43) ||
369 sscreen->b.info.drm_major == 3;
Marek Olšák914365c2015-04-29 15:27:50 +0200370
Marek Olšák2f1c4492013-07-30 22:29:30 +0200371 case PIPE_CAP_TEXTURE_MULTISAMPLE:
Marek Olšák751e8692013-11-20 13:48:19 +0100372 /* 2D tiling on CIK is supported since DRM 2.35.0 */
Marek Olšáka66d9342014-07-08 02:50:57 +0200373 return sscreen->b.chip_class < CIK ||
Marek Olšák8ba70e02015-04-16 20:35:27 +0200374 (sscreen->b.info.drm_major == 2 &&
375 sscreen->b.info.drm_minor >= 35) ||
376 sscreen->b.info.drm_major == 3;
Marek Olšák2f1c4492013-07-30 22:29:30 +0200377
Marek Olšákc9f2af32012-10-28 17:52:48 +0100378 case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT:
Marek Olšákde5094d2014-03-09 22:29:20 +0100379 return R600_MAP_BUFFER_ALIGNMENT;
Marek Olšákc9f2af32012-10-28 17:52:48 +0100380
Marek Olšák1b749dc2012-04-24 17:31:17 +0200381 case PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT:
Marek Olšáke2198422014-03-09 20:05:54 +0100382 case PIPE_CAP_TEXTURE_BUFFER_OFFSET_ALIGNMENT:
Marek Olšáke6d38462015-09-06 16:26:21 +0200383 case PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS:
Marek Olšáke2198422014-03-09 20:05:54 +0100384 return 4;
Nicolai Hähnle9e9a2bb2016-04-13 09:11:44 -0500385 case PIPE_CAP_SHADER_BUFFER_OFFSET_ALIGNMENT:
386 return HAVE_LLVM >= 0x0309 ? 4 : 0;
Marek Olšák1b749dc2012-04-24 17:31:17 +0200387
Tom Stellarda75c6162012-01-06 17:38:37 -0500388 case PIPE_CAP_GLSL_FEATURE_LEVEL:
Bas Nieuwenhuizen2cee0d02016-04-19 00:47:49 +0200389 if (pscreen->get_shader_param(pscreen, PIPE_SHADER_COMPUTE,
390 PIPE_SHADER_CAP_SUPPORTED_IRS) &
391 (1 << PIPE_SHADER_IR_TGSI))
392 return 430;
Nicolai Hähnle10cfd7a2016-03-17 19:53:36 -0500393 return HAVE_LLVM >= 0x0309 ? 420 :
394 HAVE_LLVM >= 0x0307 ? 410 : 330;
Marek Olšákdbeedbb2013-10-31 15:08:49 +0100395
Marek Olšákdbeedbb2013-10-31 15:08:49 +0100396 case PIPE_CAP_MAX_TEXTURE_BUFFER_SIZE:
Andreas Hartmetzaa7ae4f2014-01-11 16:01:11 +0100397 return MIN2(sscreen->b.info.vram_size, 0xFFFFFFFF);
Tom Stellarda75c6162012-01-06 17:38:37 -0500398
Nicolai Hähnle3abb5482016-01-26 10:26:30 -0500399 case PIPE_CAP_BUFFER_SAMPLER_VIEW_RGBA_ONLY:
400 return 0;
401
Tom Stellarda75c6162012-01-06 17:38:37 -0500402 /* Unsupported features. */
Tom Stellarda75c6162012-01-06 17:38:37 -0500403 case PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT:
Tom Stellarda75c6162012-01-06 17:38:37 -0500404 case PIPE_CAP_TGSI_CAN_COMPACT_CONSTANTS:
Marek Olšák2a311b12012-04-24 01:23:33 +0200405 case PIPE_CAP_USER_VERTEX_BUFFERS:
Dave Airlie76ba50a2013-11-27 19:47:51 +1000406 case PIPE_CAP_FAKE_SW_MSAA:
Ilia Mirkind95df4f2014-04-26 23:44:57 -0400407 case PIPE_CAP_TEXTURE_GATHER_OFFSETS:
Roland Scheideggerade8b262014-12-12 04:13:43 +0100408 case PIPE_CAP_VERTEXID_NOBASE:
Ilia Mirkin3695b252015-11-09 13:27:07 -0500409 case PIPE_CAP_CLEAR_TEXTURE:
Ilia Mirkin87b4e4e2015-12-29 16:49:32 -0500410 case PIPE_CAP_DRAW_PARAMETERS:
Ilia Mirkind67b9ba2015-12-31 13:30:13 -0500411 case PIPE_CAP_MULTI_DRAW_INDIRECT:
412 case PIPE_CAP_MULTI_DRAW_INDIRECT_PARAMS:
Rob Clarkd6408372015-08-10 11:41:29 -0400413 case PIPE_CAP_STRING_MARKER:
Ilia Mirkinf9e6f462016-01-09 23:30:16 -0500414 case PIPE_CAP_QUERY_BUFFER_OBJECT:
Tobias Klausmann2be258e2016-05-08 22:44:07 +0200415 case PIPE_CAP_CULL_DISTANCE:
Kenneth Graunke70048eb2016-05-20 21:05:34 -0700416 case PIPE_CAP_PRIMITIVE_RESTART_FOR_PATCHES:
Ilia Mirkinedfa7a42016-05-29 11:39:52 -0400417 case PIPE_CAP_TGSI_VOTE:
Ilia Mirkin07fcb062016-06-11 15:26:45 -0400418 case PIPE_CAP_MAX_WINDOW_RECTANGLES:
Tom Stellarda75c6162012-01-06 17:38:37 -0500419 return 0;
420
Marek Olšákbac12c82015-02-22 18:46:53 +0100421 case PIPE_CAP_MAX_SHADER_PATCH_VARYINGS:
422 return 30;
423
Marek Olšák164de0d2013-10-30 21:44:07 +0100424 case PIPE_CAP_TEXTURE_BORDER_COLOR_QUIRK:
425 return PIPE_QUIRK_TEXTURE_BORDER_COLOR_SWIZZLE_R600;
426
Tom Stellarda75c6162012-01-06 17:38:37 -0500427 /* Stream output. */
428 case PIPE_CAP_MAX_STREAM_OUTPUT_BUFFERS:
Andreas Hartmetzaa7ae4f2014-01-11 16:01:11 +0100429 return sscreen->b.has_streamout ? 4 : 0;
Tom Stellarda75c6162012-01-06 17:38:37 -0500430 case PIPE_CAP_STREAM_OUTPUT_PAUSE_RESUME:
Andreas Hartmetzaa7ae4f2014-01-11 16:01:11 +0100431 return sscreen->b.has_streamout ? 1 : 0;
Tom Stellarda75c6162012-01-06 17:38:37 -0500432 case PIPE_CAP_MAX_STREAM_OUTPUT_SEPARATE_COMPONENTS:
433 case PIPE_CAP_MAX_STREAM_OUTPUT_INTERLEAVED_COMPONENTS:
Andreas Hartmetzaa7ae4f2014-01-11 16:01:11 +0100434 return sscreen->b.has_streamout ? 32*4 : 0;
Tom Stellarda75c6162012-01-06 17:38:37 -0500435
Grigori Goronzyd34d5fd2014-02-09 22:56:20 +0100436 /* Geometry shader output. */
437 case PIPE_CAP_MAX_GEOMETRY_OUTPUT_VERTICES:
438 return 1024;
439 case PIPE_CAP_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS:
440 return 4095;
Ilia Mirkin746e5262014-06-26 20:01:50 -0400441 case PIPE_CAP_MAX_VERTEX_STREAMS:
Dave Airlie3c73c412015-07-20 02:37:14 +0100442 return 4;
Grigori Goronzyd34d5fd2014-02-09 22:56:20 +0100443
Timothy Arceri89e68062014-08-19 21:09:58 -1000444 case PIPE_CAP_MAX_VERTEX_ATTRIB_STRIDE:
445 return 2048;
446
Tom Stellarda75c6162012-01-06 17:38:37 -0500447 /* Texturing. */
448 case PIPE_CAP_MAX_TEXTURE_2D_LEVELS:
Tom Stellarda75c6162012-01-06 17:38:37 -0500449 case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:
Marek Olšák4f1f3232014-03-09 20:03:57 +0100450 return 15; /* 16384 */
451 case PIPE_CAP_MAX_TEXTURE_3D_LEVELS:
452 /* textures support 8192, but layered rendering supports 2048 */
453 return 12;
Tom Stellarda75c6162012-01-06 17:38:37 -0500454 case PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS:
Marek Olšák4f1f3232014-03-09 20:03:57 +0100455 /* textures support 8192, but layered rendering supports 2048 */
456 return 2048;
Tom Stellarda75c6162012-01-06 17:38:37 -0500457
458 /* Render targets. */
459 case PIPE_CAP_MAX_RENDER_TARGETS:
Tom Stellarda75c6162012-01-06 17:38:37 -0500460 return 8;
461
Marek Olšáka62cd692013-09-21 19:45:08 +0200462 case PIPE_CAP_MAX_VIEWPORTS:
Marek Olšák2ca55662016-04-10 04:26:50 +0200463 return R600_MAX_VIEWPORTS;
Marek Olšáka62cd692013-09-21 19:45:08 +0200464
Tom Stellarda75c6162012-01-06 17:38:37 -0500465 /* Timer queries, present when the clock frequency is non zero. */
Niels Ole Salscheiderdb6f4162013-08-09 11:59:28 +0200466 case PIPE_CAP_QUERY_TIMESTAMP:
José Fonseca99762162012-12-09 09:50:34 +0000467 case PIPE_CAP_QUERY_TIME_ELAPSED:
Marek Olšák1e864d72016-01-30 01:27:46 +0100468 return sscreen->b.info.clock_crystal_freq != 0;
Tom Stellarda75c6162012-01-06 17:38:37 -0500469
Ilia Mirkinc2f9ad52014-04-09 14:58:53 -0400470 case PIPE_CAP_MIN_TEXTURE_GATHER_OFFSET:
Tom Stellarda75c6162012-01-06 17:38:37 -0500471 case PIPE_CAP_MIN_TEXEL_OFFSET:
Marek Olšákc7b5a5c2014-06-06 03:00:18 +0200472 return -32;
Tom Stellarda75c6162012-01-06 17:38:37 -0500473
Ilia Mirkinc2f9ad52014-04-09 14:58:53 -0400474 case PIPE_CAP_MAX_TEXTURE_GATHER_OFFSET:
Tom Stellarda75c6162012-01-06 17:38:37 -0500475 case PIPE_CAP_MAX_TEXEL_OFFSET:
Marek Olšákc7b5a5c2014-06-06 03:00:18 +0200476 return 31;
477
Tom Stellard4e90bc92013-07-09 21:21:39 -0700478 case PIPE_CAP_ENDIANNESS:
479 return PIPE_ENDIAN_LITTLE;
Emil Velikovde014432014-08-14 20:57:29 +0100480
481 case PIPE_CAP_VENDOR_ID:
Marek Olšákec74dee2016-02-25 22:32:26 +0100482 return ATI_VENDOR_ID;
Emil Velikovde014432014-08-14 20:57:29 +0100483 case PIPE_CAP_DEVICE_ID:
484 return sscreen->b.info.pci_id;
485 case PIPE_CAP_ACCELERATED:
486 return 1;
487 case PIPE_CAP_VIDEO_MEMORY:
488 return sscreen->b.info.vram_size >> 20;
489 case PIPE_CAP_UMA:
490 return 0;
Marek Olšákdcb2b772016-02-29 20:22:37 +0100491 case PIPE_CAP_PCI_GROUP:
492 return sscreen->b.info.pci_domain;
493 case PIPE_CAP_PCI_BUS:
494 return sscreen->b.info.pci_bus;
495 case PIPE_CAP_PCI_DEVICE:
496 return sscreen->b.info.pci_dev;
497 case PIPE_CAP_PCI_FUNCTION:
498 return sscreen->b.info.pci_func;
Tom Stellarda75c6162012-01-06 17:38:37 -0500499 }
500 return 0;
501}
502
Andreas Hartmetzeb0ddb62014-01-07 03:07:55 +0100503static int si_get_shader_param(struct pipe_screen* pscreen, unsigned shader, enum pipe_shader_cap param)
Tom Stellarda75c6162012-01-06 17:38:37 -0500504{
Bas Nieuwenhuizen464cef52016-03-19 15:16:50 +0100505 struct si_screen *sscreen = (struct si_screen *)pscreen;
506
Tom Stellarda75c6162012-01-06 17:38:37 -0500507 switch(shader)
508 {
509 case PIPE_SHADER_FRAGMENT:
510 case PIPE_SHADER_VERTEX:
Tom Stellarda75c6162012-01-06 17:38:37 -0500511 case PIPE_SHADER_GEOMETRY:
Michel Dänzerd7c68e22014-01-24 17:51:34 +0900512 break;
Marek Olšákbac12c82015-02-22 18:46:53 +0100513 case PIPE_SHADER_TESS_CTRL:
514 case PIPE_SHADER_TESS_EVAL:
515 /* LLVM 3.6.2 is required for tessellation because of bug fixes there */
Marek Olšák100796c2016-02-10 21:48:59 +0100516 if (HAVE_LLVM == 0x0306 && MESA_LLVM_VERSION_PATCH < 2)
Marek Olšákbac12c82015-02-22 18:46:53 +0100517 return 0;
518 break;
Tom Stellard302f53d2012-10-25 13:50:10 -0400519 case PIPE_SHADER_COMPUTE:
520 switch (param) {
521 case PIPE_SHADER_CAP_PREFERRED_IR:
Tom Stellard1f4e48d2014-09-25 18:11:24 -0700522 return PIPE_SHADER_IR_NATIVE;
Samuel Pitoiset5e09ac72016-02-03 18:57:58 +0100523
Bas Nieuwenhuizen464cef52016-03-19 15:16:50 +0100524 case PIPE_SHADER_CAP_SUPPORTED_IRS: {
525 int ir = 1 << PIPE_SHADER_IR_NATIVE;
Samuel Pitoiset5e09ac72016-02-03 18:57:58 +0100526
Bas Nieuwenhuizen464cef52016-03-19 15:16:50 +0100527 /* Old kernels disallowed some register writes for SI
528 * that are used for indirect dispatches. */
529 if (HAVE_LLVM >= 0x309 && (sscreen->b.chip_class >= CIK ||
530 sscreen->b.info.drm_major == 3 ||
531 (sscreen->b.info.drm_major == 2 &&
532 sscreen->b.info.drm_minor >= 45)))
533 ir |= 1 << PIPE_SHADER_IR_TGSI;
534
535 return ir;
536 }
Tom Stellardfea996c2014-06-17 08:52:34 -0700537 case PIPE_SHADER_CAP_DOUBLES:
Tom Stellardda85ab42015-02-26 23:25:14 +0000538 return HAVE_LLVM >= 0x0307;
539
Tom Stellard72969e02014-08-07 15:31:17 -0400540 case PIPE_SHADER_CAP_MAX_CONST_BUFFER_SIZE: {
541 uint64_t max_const_buffer_size;
Bas Nieuwenhuizen1a5c8c22016-03-25 02:06:50 +0100542 pscreen->get_compute_param(pscreen, PIPE_SHADER_IR_TGSI,
Tom Stellard72969e02014-08-07 15:31:17 -0400543 PIPE_COMPUTE_CAP_MAX_MEM_ALLOC_SIZE,
544 &max_const_buffer_size);
545 return max_const_buffer_size;
546 }
Tom Stellard302f53d2012-10-25 13:50:10 -0400547 default:
Tom Stellard4c53d2a2015-03-21 00:27:16 +0000548 /* If compute shaders don't require a special value
549 * for this cap, we can return the same value we
550 * do for other shader types. */
551 break;
Tom Stellard302f53d2012-10-25 13:50:10 -0400552 }
Tom Stellard4c53d2a2015-03-21 00:27:16 +0000553 break;
Tom Stellarda75c6162012-01-06 17:38:37 -0500554 default:
Tom Stellarda75c6162012-01-06 17:38:37 -0500555 return 0;
556 }
557
Tom Stellarda75c6162012-01-06 17:38:37 -0500558 switch (param) {
559 case PIPE_SHADER_CAP_MAX_INSTRUCTIONS:
560 case PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS:
561 case PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS:
562 case PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS:
563 return 16384;
564 case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH:
Marek Olšák225228a2013-01-31 19:40:24 +0100565 return 32;
Tom Stellarda75c6162012-01-06 17:38:37 -0500566 case PIPE_SHADER_CAP_MAX_INPUTS:
Marek Olšákee2a8182014-07-07 23:27:19 +0200567 return shader == PIPE_SHADER_VERTEX ? SI_NUM_VERTEX_BUFFERS : 32;
Marek Olšák5f5b83c2014-10-01 20:28:17 +0200568 case PIPE_SHADER_CAP_MAX_OUTPUTS:
569 return shader == PIPE_SHADER_FRAGMENT ? 8 : 32;
Tom Stellarda75c6162012-01-06 17:38:37 -0500570 case PIPE_SHADER_CAP_MAX_TEMPS:
571 return 256; /* Max native temporaries. */
Marek Olšák04f2c882014-07-24 20:32:08 +0200572 case PIPE_SHADER_CAP_MAX_CONST_BUFFER_SIZE:
573 return 4096 * sizeof(float[4]); /* actually only memory limits this */
Tom Stellarda75c6162012-01-06 17:38:37 -0500574 case PIPE_SHADER_CAP_MAX_CONST_BUFFERS:
Marek Olšák0954d5e2016-04-19 02:14:53 +0200575 return SI_NUM_CONST_BUFFERS;
Tom Stellarda75c6162012-01-06 17:38:37 -0500576 case PIPE_SHADER_CAP_MAX_PREDS:
577 return 0; /* FIXME */
578 case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
579 return 1;
Brian Paul13f3ae52013-02-01 11:16:54 -0700580 case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED:
Marek Olšákf9fd0c42015-03-02 02:40:57 +0100581 return 1;
Tom Stellarda75c6162012-01-06 17:38:37 -0500582 case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:
Michel Dänzer3b3687a2014-01-22 18:47:21 +0900583 /* Indirection of geometry shader input dimension is not
584 * handled yet
585 */
Marek Olšákbac12c82015-02-22 18:46:53 +0100586 return shader != PIPE_SHADER_GEOMETRY;
Tom Stellarda75c6162012-01-06 17:38:37 -0500587 case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR:
588 case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
589 case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
Christian König90862c852013-03-07 12:00:18 +0100590 return 1;
Tom Stellardae9be352012-07-25 08:22:30 -0400591 case PIPE_SHADER_CAP_INTEGERS:
592 return 1;
Tom Stellarda75c6162012-01-06 17:38:37 -0500593 case PIPE_SHADER_CAP_SUBROUTINES:
594 return 0;
595 case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
Roland Scheidegger2983c032013-11-26 02:30:41 +0100596 case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:
Marek Olšák0954d5e2016-04-19 02:14:53 +0200597 return SI_NUM_SAMPLERS;
Marek Olšák7b01bc12012-10-11 21:35:45 +0200598 case PIPE_SHADER_CAP_PREFERRED_IR:
599 return PIPE_SHADER_IR_TGSI;
Samuel Pitoiset5e09ac72016-02-03 18:57:58 +0100600 case PIPE_SHADER_CAP_SUPPORTED_IRS:
601 return 0;
Tom Stellardfea996c2014-06-17 08:52:34 -0700602 case PIPE_SHADER_CAP_DOUBLES:
Dave Airlie4cbf0a02015-07-01 04:58:24 +0100603 return HAVE_LLVM >= 0x0307;
Ilia Mirkin899d7792014-07-25 17:03:33 -0400604 case PIPE_SHADER_CAP_TGSI_DROUND_SUPPORTED:
Ilia Mirkin924ee3f2014-07-25 17:48:01 -0400605 case PIPE_SHADER_CAP_TGSI_DFRACEXP_DLDEXP_SUPPORTED:
Tom Stellardfea996c2014-06-17 08:52:34 -0700606 return 0;
Marek Olšákd73c1c12015-02-28 00:44:19 +0100607 case PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED:
Marek Olšákb6ebe7e2015-05-25 19:30:44 +0200608 case PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE:
Marek Olšákd73c1c12015-02-28 00:44:19 +0100609 return 1;
Marek Olšák814f3142015-10-20 18:26:02 +0200610 case PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HINT:
611 return 32;
Ilia Mirkin266d0012015-09-26 20:27:42 -0400612 case PIPE_SHADER_CAP_MAX_SHADER_BUFFERS:
Nicolai Hähnlebfd11c52016-03-15 16:25:42 -0500613 return HAVE_LLVM >= 0x0309 ? SI_NUM_SHADER_BUFFERS : 0;
Edward O'Callaghan5219eb12016-01-11 00:50:32 +1100614 case PIPE_SHADER_CAP_MAX_SHADER_IMAGES:
615 return HAVE_LLVM >= 0x0309 ? SI_NUM_IMAGES : 0;
Tom Stellarda75c6162012-01-06 17:38:37 -0500616 }
617 return 0;
618}
619
Andreas Hartmetzeb0ddb62014-01-07 03:07:55 +0100620static void si_destroy_screen(struct pipe_screen* pscreen)
Tom Stellarda75c6162012-01-06 17:38:37 -0500621{
Andreas Hartmetzaa7ae4f2014-01-11 16:01:11 +0100622 struct si_screen *sscreen = (struct si_screen *)pscreen;
Marek Olšák70de4332016-01-27 00:29:53 +0100623 struct si_shader_part *parts[] = {
624 sscreen->vs_prologs,
Marek Olšáke1b21692016-01-27 00:33:07 +0100625 sscreen->vs_epilogs,
Marek Olšákeb109192016-01-27 00:38:03 +0100626 sscreen->tcs_epilogs,
Marek Olšák4636d9b2016-02-15 23:57:54 +0100627 sscreen->ps_prologs,
Marek Olšáke79bb742016-01-27 00:50:29 +0100628 sscreen->ps_epilogs
Marek Olšák70de4332016-01-27 00:29:53 +0100629 };
630 unsigned i;
Tom Stellarda75c6162012-01-06 17:38:37 -0500631
Edward O'Callaghan13eb5f52015-12-04 22:08:22 +1100632 if (!sscreen)
Tom Stellarda75c6162012-01-06 17:38:37 -0500633 return;
634
Marek Olšákac330d42014-04-09 00:26:32 +0200635 if (!sscreen->b.ws->unref(sscreen->b.ws))
Christian König48711282013-09-25 13:59:56 +0200636 return;
637
Marek Olšák70de4332016-01-27 00:29:53 +0100638 /* Free shader parts. */
639 for (i = 0; i < ARRAY_SIZE(parts); i++) {
640 while (parts[i]) {
641 struct si_shader_part *part = parts[i];
642
643 parts[i] = part->next;
644 radeon_shader_binary_clean(&part->binary);
645 FREE(part);
646 }
647 }
648 pipe_mutex_destroy(sscreen->shader_parts_mutex);
Marek Olšákff360a52016-02-11 15:49:34 +0100649 si_destroy_shader_cache(sscreen);
Tom Stellarde28f9d02015-01-07 13:49:12 -0500650 r600_destroy_common_screen(&sscreen->b);
Tom Stellarda75c6162012-01-06 17:38:37 -0500651}
652
Marek Olšák06083042015-10-19 02:45:56 +0200653static bool si_init_gs_info(struct si_screen *sscreen)
654{
655 switch (sscreen->b.family) {
656 case CHIP_OLAND:
657 case CHIP_HAINAN:
658 case CHIP_KAVERI:
659 case CHIP_KABINI:
660 case CHIP_MULLINS:
661 case CHIP_ICELAND:
662 case CHIP_CARRIZO:
Alex Deucher830e57b2015-10-23 18:31:57 -0400663 case CHIP_STONEY:
Marek Olšák06083042015-10-19 02:45:56 +0200664 sscreen->gs_table_depth = 16;
665 return true;
666 case CHIP_TAHITI:
667 case CHIP_PITCAIRN:
668 case CHIP_VERDE:
669 case CHIP_BONAIRE:
670 case CHIP_HAWAII:
671 case CHIP_TONGA:
672 case CHIP_FIJI:
Sonny Jiang42e442d2015-11-04 16:13:07 -0500673 case CHIP_POLARIS10:
674 case CHIP_POLARIS11:
Marek Olšák06083042015-10-19 02:45:56 +0200675 sscreen->gs_table_depth = 32;
676 return true;
677 default:
678 return false;
679 }
680}
681
Tom Stellarda75c6162012-01-06 17:38:37 -0500682struct pipe_screen *radeonsi_screen_create(struct radeon_winsys *ws)
683{
Andreas Hartmetzaa7ae4f2014-01-11 16:01:11 +0100684 struct si_screen *sscreen = CALLOC_STRUCT(si_screen);
Michel Dänzerd64adc32015-03-26 11:32:59 +0900685
Edward O'Callaghan13eb5f52015-12-04 22:08:22 +1100686 if (!sscreen) {
Tom Stellarda75c6162012-01-06 17:38:37 -0500687 return NULL;
688 }
689
Marek Olšák09fc5d62013-09-22 21:47:35 +0200690 /* Set functions first. */
Andreas Hartmetzaa7ae4f2014-01-11 16:01:11 +0100691 sscreen->b.b.context_create = si_create_context;
692 sscreen->b.b.destroy = si_destroy_screen;
Andreas Hartmetzaa7ae4f2014-01-11 16:01:11 +0100693 sscreen->b.b.get_param = si_get_param;
694 sscreen->b.b.get_shader_param = si_get_shader_param;
Andreas Hartmetzaa7ae4f2014-01-11 16:01:11 +0100695 sscreen->b.b.is_format_supported = si_is_format_supported;
Tom Stellard7b4592a2014-01-28 06:51:50 -0800696 sscreen->b.b.resource_create = r600_resource_create_common;
Marek Olšák09fc5d62013-09-22 21:47:35 +0200697
Marek Olšákec74dee2016-02-25 22:32:26 +0100698 si_init_screen_state_functions(sscreen);
699
Marek Olšák955505f2014-08-07 21:14:31 +0200700 if (!r600_common_screen_init(&sscreen->b, ws) ||
Marek Olšákff360a52016-02-11 15:49:34 +0100701 !si_init_gs_info(sscreen) ||
702 !si_init_shader_cache(sscreen)) {
Andreas Hartmetzaa7ae4f2014-01-11 16:01:11 +0100703 FREE(sscreen);
Marek Olšák1bb77f82013-09-22 22:12:18 +0200704 return NULL;
705 }
Tom Stellarda75c6162012-01-06 17:38:37 -0500706
Nicolai Hähnlead220062015-11-25 15:30:03 +0100707 if (!debug_get_bool_option("RADEON_DISABLE_PERFCOUNTERS", FALSE))
708 si_init_perfcounters(sscreen);
709
Andreas Hartmetzaa7ae4f2014-01-11 16:01:11 +0100710 sscreen->b.has_cp_dma = true;
Marek Olšáka66d9342014-07-08 02:50:57 +0200711 sscreen->b.has_streamout = true;
Marek Olšák70de4332016-01-27 00:29:53 +0100712 pipe_mutex_init(sscreen->shader_parts_mutex);
Marek Olšák9aaf28d2016-01-28 01:29:59 +0100713 sscreen->use_monolithic_shaders =
714 HAVE_LLVM < 0x0308 ||
715 (sscreen->b.debug_flags & DBG_MONOLITHIC_SHADERS) != 0;
Marek Olšákbba39d82013-11-28 15:09:35 +0100716
Marek Olšák0cb9de12013-09-22 15:34:12 +0200717 if (debug_get_bool_option("RADEON_DUMP_SHADERS", FALSE))
Andreas Hartmetzaa7ae4f2014-01-11 16:01:11 +0100718 sscreen->b.debug_flags |= DBG_FS | DBG_VS | DBG_GS | DBG_PS | DBG_CS;
Marek Olšák0cb9de12013-09-22 15:34:12 +0200719
Marek Olšákb893bbf2013-10-03 16:39:50 +0200720 /* Create the auxiliary context. This must be done last. */
Marek Olšák0fc21ec2015-07-25 18:40:59 +0200721 sscreen->b.aux_context = sscreen->b.b.context_create(&sscreen->b.b, NULL, 0);
Marek Olšákb893bbf2013-10-03 16:39:50 +0200722
Marek Olšák3af28e52014-09-05 20:15:16 +0200723 if (sscreen->b.debug_flags & DBG_TEST_DMA)
724 r600_test_dma(&sscreen->b);
725
Andreas Hartmetzaa7ae4f2014-01-11 16:01:11 +0100726 return &sscreen->b.b;
Tom Stellarda75c6162012-01-06 17:38:37 -0500727}