blob: 9263659be328d5840ffe3bb387e45f0e928645bd [file] [log] [blame]
Jerome Glisse1235bec2010-09-29 15:05:19 -04001/*
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šák330b6c82012-03-05 15:17:00 +010023#include "r600_pipe.h"
24#include "r600_public.h"
Vadim Girlin022122e2013-02-01 11:45:35 +040025#include "r600_isa.h"
Marek Olšák2ca73bc2013-03-01 15:32:46 +010026#include "evergreen_compute.h"
Marek Olšákc77917d2013-02-27 21:24:02 +010027#include "r600d.h"
Marek Olšák330b6c82012-03-05 15:17:00 +010028
Vadim Girlinad1df472013-04-30 20:53:15 +040029#include "sb/sb_public.h"
30
Jerome Glisse1235bec2010-09-29 15:05:19 -040031#include <errno.h>
Marek Olšák330b6c82012-03-05 15:17:00 +010032#include "pipe/p_shader_tokens.h"
Marek Olšák4bf0ebd2013-03-01 16:31:49 +010033#include "util/u_debug.h"
Marek Olšák9f069662012-12-03 21:31:04 +010034#include "util/u_memory.h"
Marek Olšákf71f5ed2012-02-24 02:08:32 +010035#include "util/u_simple_shaders.h"
Marek Olšák428855e2012-04-11 16:00:09 +020036#include "util/u_upload_mgr.h"
Jerome Glisse325422c2013-01-07 17:45:59 -050037#include "util/u_math.h"
Kai Wasserbäch8fb7f1a2011-08-27 17:51:51 +020038#include "vl/vl_decoder.h"
39#include "vl/vl_video_buffer.h"
Christian König7bcfb0b2013-10-17 06:21:40 -060040#include "radeon/radeon_video.h"
Christian König5b2855b2013-04-03 10:18:35 +020041#include "radeon/radeon_uvd.h"
Fredrik Höglund948e1eb2011-03-29 19:43:59 +020042#include "os/os_time.h"
Jerome Glisse1235bec2010-09-29 15:05:19 -040043
Marek Olšákba650cc2013-09-22 15:18:11 +020044static const struct debug_named_value r600_debug_options[] = {
Marek Olšák4bf0ebd2013-03-01 16:31:49 +010045 /* features */
Marek Olšáke4e655f2013-03-05 01:15:45 +010046 { "nocpdma", DBG_NO_CP_DMA, "Disable CP DMA" },
Marek Olšák4bf0ebd2013-03-01 16:31:49 +010047
Vadim Girlinad1df472013-04-30 20:53:15 +040048 /* shader backend */
Vadim Girlinf7217b92013-08-24 00:54:54 +040049 { "nosb", DBG_NO_SB, "Disable sb backend for graphics shaders" },
50 { "sbcl", DBG_SB_CS, "Enable sb backend for compute shaders" },
Vadim Girlinad1df472013-04-30 20:53:15 +040051 { "sbdry", DBG_SB_DRY_RUN, "Don't use optimized bytecode (just print the dumps)" },
52 { "sbstat", DBG_SB_STAT, "Print optimization statistics for shaders" },
53 { "sbdump", DBG_SB_DUMP, "Print IR dumps after some optimization passes" },
Vadim Girlin188c8932013-04-23 10:34:00 +040054 { "sbnofallback", DBG_SB_NO_FALLBACK, "Abort on errors instead of fallback" },
Vadim Girlin4ca67db2013-05-03 12:01:20 +040055 { "sbdisasm", DBG_SB_DISASM, "Use sb disassembler for shader dumps" },
Vadim Girlin758ac6f2013-06-05 20:55:31 +040056 { "sbsafemath", DBG_SB_SAFEMATH, "Disable unsafe math optimizations" },
Vadim Girlinad1df472013-04-30 20:53:15 +040057
Marek Olšák4bf0ebd2013-03-01 16:31:49 +010058 DEBUG_NAMED_VALUE_END /* must be last */
59};
60
Jerome Glisse1235bec2010-09-29 15:05:19 -040061/*
62 * pipe_context
63 */
Fredrik Höglund948e1eb2011-03-29 19:43:59 +020064
Jerome Glisse1235bec2010-09-29 15:05:19 -040065static void r600_destroy_context(struct pipe_context *context)
66{
Marek Olšáke4340c12012-01-29 23:25:42 +010067 struct r600_context *rctx = (struct r600_context *)context;
Grazvydas Ignotas0153ff82016-01-21 01:52:24 +020068 unsigned sh;
Jerome Glisse1235bec2010-09-29 15:05:19 -040069
Vadim Girlin022122e2013-02-01 11:45:35 +040070 r600_isa_destroy(rctx->isa);
71
Vadim Girlinad1df472013-04-30 20:53:15 +040072 r600_sb_context_destroy(rctx->sb_context);
73
Marek Olšákd5383a72016-06-21 21:13:00 +020074 r600_resource_reference(&rctx->dummy_cmask, NULL);
75 r600_resource_reference(&rctx->dummy_fmask, NULL);
Marek Olšák78354012012-08-26 22:38:35 +020076
Grazvydas Ignotas0153ff82016-01-21 01:52:24 +020077 for (sh = 0; sh < PIPE_SHADER_TYPES; sh++) {
78 rctx->b.b.set_constant_buffer(&rctx->b.b, sh, R600_BUFFER_INFO_CONST_BUFFER, NULL);
79 free(rctx->driver_consts[sh].constants);
80 }
81
Dave Airliee3ecc282015-11-30 15:06:23 +100082 if (rctx->fixed_func_tcs_shader)
83 rctx->b.b.delete_tcs_state(&rctx->b.b, rctx->fixed_func_tcs_shader);
84
Marek Olšákf7b13712017-04-12 17:45:30 +020085 if (rctx->dummy_pixel_shader) {
86 rctx->b.b.delete_fs_state(&rctx->b.b, rctx->dummy_pixel_shader);
87 }
Marek Olšák6a94c9d2012-02-21 18:30:18 +010088 if (rctx->custom_dsa_flush) {
Marek Olšákd5b23df2013-08-13 21:49:59 +020089 rctx->b.b.delete_depth_stencil_alpha_state(&rctx->b.b, rctx->custom_dsa_flush);
Marek Olšák6a94c9d2012-02-21 18:30:18 +010090 }
Marek Olšák0f869152012-08-09 17:21:10 +020091 if (rctx->custom_blend_resolve) {
Marek Olšákd5b23df2013-08-13 21:49:59 +020092 rctx->b.b.delete_blend_state(&rctx->b.b, rctx->custom_blend_resolve);
Marek Olšák0f869152012-08-09 17:21:10 +020093 }
Marek Olšáka3d9d7e2012-08-12 20:06:33 +020094 if (rctx->custom_blend_decompress) {
Marek Olšákd5b23df2013-08-13 21:49:59 +020095 rctx->b.b.delete_blend_state(&rctx->b.b, rctx->custom_blend_decompress);
Marek Olšáka3d9d7e2012-08-12 20:06:33 +020096 }
Grigori Goronzyedbbfac2013-09-11 01:41:40 +020097 if (rctx->custom_blend_fastclear) {
98 rctx->b.b.delete_blend_state(&rctx->b.b, rctx->custom_blend_fastclear);
99 }
Marek Olšákc8b06dc2012-09-18 19:42:29 +0200100 util_unreference_framebuffer_state(&rctx->framebuffer.state);
Tilman Sauerbeckecb1b8b2010-10-31 12:16:03 +0100101
Marek Olšák6a94c9d2012-02-21 18:30:18 +0100102 if (rctx->blitter) {
103 util_blitter_destroy(rctx->blitter);
104 }
Marek Olšákd225d072012-12-09 18:51:31 +0100105 if (rctx->allocator_fetch_shader) {
106 u_suballocator_destroy(rctx->allocator_fetch_shader);
107 }
Jerome Glisse1235bec2010-09-29 15:05:19 -0400108
Marek Olšáke363dd52012-03-05 16:20:05 +0100109 r600_release_command_buffer(&rctx->start_cs_cmd);
Marek Olšák9670e722012-02-21 18:08:32 +0100110
Aaron Watry3ddabe02013-11-15 16:09:41 -0600111 FREE(rctx->start_compute_cs_cmd.buf);
112
Marek Olšákd5b23df2013-08-13 21:49:59 +0200113 r600_common_context_cleanup(&rctx->b);
Dave Airlief42fb002017-05-09 15:47:12 +1000114
115 r600_resource_reference(&rctx->trace_buf, NULL);
116 r600_resource_reference(&rctx->last_trace_buf, NULL);
117 radeon_clear_saved_cs(&rctx->last_gfx);
118
Jerome Glisse1235bec2010-09-29 15:05:19 -0400119 FREE(rctx);
120}
121
Marek Olšák0fc21ec2015-07-25 18:40:59 +0200122static struct pipe_context *r600_create_context(struct pipe_screen *screen,
123 void *priv, unsigned flags)
Jerome Glisse1235bec2010-09-29 15:05:19 -0400124{
Marek Olšáke4340c12012-01-29 23:25:42 +0100125 struct r600_context *rctx = CALLOC_STRUCT(r600_context);
Jerome Glisse1235bec2010-09-29 15:05:19 -0400126 struct r600_screen* rscreen = (struct r600_screen *)screen;
Marek Olšákdd72c322014-04-11 22:14:27 +0200127 struct radeon_winsys *ws = rscreen->b.ws;
Jerome Glisse1235bec2010-09-29 15:05:19 -0400128
Edward O'Callaghan13eb5f52015-12-04 22:08:22 +1100129 if (!rctx)
Jerome Glisse1235bec2010-09-29 15:05:19 -0400130 return NULL;
Marek Olšákf0b202e2011-02-08 17:30:39 +0100131
Marek Olšákd5b23df2013-08-13 21:49:59 +0200132 rctx->b.b.screen = screen;
Marek Olšák9a22c852017-06-07 14:43:28 +0200133 assert(!priv);
134 rctx->b.b.priv = NULL; /* for threaded_context_unwrap_sync */
Marek Olšákd5b23df2013-08-13 21:49:59 +0200135 rctx->b.b.destroy = r600_destroy_context;
Grazvydas Ignotas3206d4e2015-08-10 00:42:32 +0300136 rctx->b.set_atom_dirty = (void *)r600_set_atom_dirty;
Jerome Glisse1235bec2010-09-29 15:05:19 -0400137
Marek Olšák700de072016-07-16 21:52:20 +0200138 if (!r600_common_context_init(&rctx->b, &rscreen->b, flags))
Marek Olšákd5b23df2013-08-13 21:49:59 +0200139 goto fail;
140
Jerome Glisse1235bec2010-09-29 15:05:19 -0400141 rctx->screen = rscreen;
Marek Olšák6c016842016-10-02 16:12:47 +0200142 LIST_INITHEAD(&rctx->texture_buffers);
Jerome Glisse1235bec2010-09-29 15:05:19 -0400143
Dave Airliedbcd6522010-09-30 09:07:07 +1000144 r600_init_blit_functions(rctx);
Marek Olšákf96df322012-09-10 00:28:46 +0200145
Leo Liuc23ffaf2017-04-17 12:14:00 -0400146 if (rscreen->b.info.has_hw_decode) {
Marek Olšákd5b23df2013-08-13 21:49:59 +0200147 rctx->b.b.create_video_codec = r600_uvd_create_decoder;
148 rctx->b.b.create_video_buffer = r600_video_buffer_create;
Christian König5b2855b2013-04-03 10:18:35 +0200149 } else {
Marek Olšákd5b23df2013-08-13 21:49:59 +0200150 rctx->b.b.create_video_codec = vl_create_decoder;
151 rctx->b.b.create_video_buffer = vl_video_buffer_create;
Christian König5b2855b2013-04-03 10:18:35 +0200152 }
Jerome Glisse1235bec2010-09-29 15:05:19 -0400153
Dave Airlief42fb002017-05-09 15:47:12 +1000154 if (getenv("R600_TRACE"))
155 rctx->is_debug = true;
Marek Olšákf96df322012-09-10 00:28:46 +0200156 r600_init_common_state_functions(rctx);
157
Marek Olšákd5b23df2013-08-13 21:49:59 +0200158 switch (rctx->b.chip_class) {
Henri Verbeetb3b946b2011-07-09 17:18:59 +0200159 case R600:
160 case R700:
Dave Airliedbcd6522010-09-30 09:07:07 +1000161 r600_init_state_functions(rctx);
Marek Olšákf1262532012-01-31 10:50:51 +0100162 r600_init_atom_start_cs(rctx);
Henri Verbeetb3b946b2011-07-09 17:18:59 +0200163 rctx->custom_dsa_flush = r600_create_db_flush_dsa(rctx);
Marek Olšákd5b23df2013-08-13 21:49:59 +0200164 rctx->custom_blend_resolve = rctx->b.chip_class == R700 ? r700_create_resolve_blend(rctx)
Marek Olšák78354012012-08-26 22:38:35 +0200165 : r600_create_resolve_blend(rctx);
Marek Olšák8698a3b2012-08-02 22:31:22 +0200166 rctx->custom_blend_decompress = r600_create_decompress_blend(rctx);
Marek Olšákd5b23df2013-08-13 21:49:59 +0200167 rctx->has_vertex_cache = !(rctx->b.family == CHIP_RV610 ||
168 rctx->b.family == CHIP_RV620 ||
169 rctx->b.family == CHIP_RS780 ||
170 rctx->b.family == CHIP_RS880 ||
171 rctx->b.family == CHIP_RV710);
Jerome Glisse1235bec2010-09-29 15:05:19 -0400172 break;
Henri Verbeetb3b946b2011-07-09 17:18:59 +0200173 case EVERGREEN:
174 case CAYMAN:
Dave Airliedbcd6522010-09-30 09:07:07 +1000175 evergreen_init_state_functions(rctx);
Marek Olšákf1262532012-01-31 10:50:51 +0100176 evergreen_init_atom_start_cs(rctx);
Tom Stellard5016fe22012-06-25 17:56:01 +0000177 evergreen_init_atom_start_compute_cs(rctx);
Henri Verbeetb3b946b2011-07-09 17:18:59 +0200178 rctx->custom_dsa_flush = evergreen_create_db_flush_dsa(rctx);
Marek Olšák0f869152012-08-09 17:21:10 +0200179 rctx->custom_blend_resolve = evergreen_create_resolve_blend(rctx);
Marek Olšáka3d9d7e2012-08-12 20:06:33 +0200180 rctx->custom_blend_decompress = evergreen_create_decompress_blend(rctx);
Grigori Goronzyedbbfac2013-09-11 01:41:40 +0200181 rctx->custom_blend_fastclear = evergreen_create_fastclear_blend(rctx);
Marek Olšákd5b23df2013-08-13 21:49:59 +0200182 rctx->has_vertex_cache = !(rctx->b.family == CHIP_CEDAR ||
183 rctx->b.family == CHIP_PALM ||
184 rctx->b.family == CHIP_SUMO ||
185 rctx->b.family == CHIP_SUMO2 ||
186 rctx->b.family == CHIP_CAICOS ||
187 rctx->b.family == CHIP_CAYMAN ||
188 rctx->b.family == CHIP_ARUBA);
Jerome Glisse1235bec2010-09-29 15:05:19 -0400189 break;
190 default:
Marek Olšákd5b23df2013-08-13 21:49:59 +0200191 R600_ERR("Unsupported chip class %d.\n", rctx->b.chip_class);
Marek Olšák04d28282012-02-21 19:03:14 +0100192 goto fail;
Jerome Glisse1235bec2010-09-29 15:05:19 -0400193 }
194
Marek Olšák6cc8f6c2015-11-07 14:00:30 +0100195 rctx->b.gfx.cs = ws->cs_create(rctx->b.ctx, RING_GFX,
Marek Olšák81401542016-03-11 15:24:05 +0100196 r600_context_gfx_flush, rctx);
Marek Olšák6cc8f6c2015-11-07 14:00:30 +0100197 rctx->b.gfx.flush = r600_context_gfx_flush;
Jerome Glissebff07632013-01-07 14:25:11 -0500198
Marek Olšák22c34bb2017-02-15 20:55:15 +0100199 rctx->allocator_fetch_shader =
200 u_suballocator_create(&rctx->b.b, 64 * 1024,
201 0, PIPE_USAGE_DEFAULT, 0, FALSE);
Jerome Glissed499ff92013-01-04 11:46:13 -0500202 if (!rctx->allocator_fetch_shader)
203 goto fail;
Marek Olšákd225d072012-12-09 18:51:31 +0100204
Vadim Girlin022122e2013-02-01 11:45:35 +0400205 rctx->isa = calloc(1, sizeof(struct r600_isa));
206 if (!rctx->isa || r600_isa_init(rctx, rctx->isa))
Jerome Glissed499ff92013-01-04 11:46:13 -0500207 goto fail;
Marek Olšák8df38552012-12-09 17:56:26 +0100208
Marek Olšákd13d2fd2014-09-06 17:07:50 +0200209 if (rscreen->b.debug_flags & DBG_FORCE_DMA)
210 rctx->b.b.resource_copy_region = rctx->b.dma_copy;
211
Marek Olšákd5b23df2013-08-13 21:49:59 +0200212 rctx->blitter = util_blitter_create(&rctx->b.b);
Marek Olšák04d28282012-02-21 19:03:14 +0100213 if (rctx->blitter == NULL)
214 goto fail;
Marek Olšák96ed6c92012-10-12 18:46:32 +0200215 util_blitter_set_texture_multisample(rctx->blitter, rscreen->has_msaa);
Marek Olšák187d7fb2012-08-24 05:57:22 +0200216 rctx->blitter->draw_rectangle = r600_draw_rectangle;
Dave Airlied59498b2010-10-13 15:22:04 +1000217
Marek Olšákc383a3c2012-09-10 05:56:46 +0200218 r600_begin_new_cs(rctx);
Marek Olšákbbad5102011-10-28 22:31:34 +0200219
Marek Olšákf7b13712017-04-12 17:45:30 +0200220 rctx->dummy_pixel_shader =
221 util_make_fragment_cloneinput_shader(&rctx->b.b, 0,
222 TGSI_SEMANTIC_GENERIC,
223 TGSI_INTERPOLATE_CONSTANT);
224 rctx->b.b.bind_fs_state(&rctx->b.b, rctx->dummy_pixel_shader);
225
Marek Olšákd5b23df2013-08-13 21:49:59 +0200226 return &rctx->b.b;
Marek Olšák04d28282012-02-21 19:03:14 +0100227
228fail:
Marek Olšákd5b23df2013-08-13 21:49:59 +0200229 r600_destroy_context(&rctx->b.b);
Marek Olšák04d28282012-02-21 19:03:14 +0100230 return NULL;
Jerome Glisse1235bec2010-09-29 15:05:19 -0400231}
232
233/*
234 * pipe_screen
235 */
Jerome Glisse1235bec2010-09-29 15:05:19 -0400236
237static int r600_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
238{
Alex Deucherfae7cb82010-12-02 16:09:22 -0500239 struct r600_screen *rscreen = (struct r600_screen *)pscreen;
Marek Olšákd5b23df2013-08-13 21:49:59 +0200240 enum radeon_family family = rscreen->b.family;
Alex Deucherfae7cb82010-12-02 16:09:22 -0500241
Jerome Glisse1235bec2010-09-29 15:05:19 -0400242 switch (param) {
243 /* Supported features (boolean caps). */
244 case PIPE_CAP_NPOT_TEXTURES:
Ilia Mirkin12d39b42013-10-04 04:32:15 -0400245 case PIPE_CAP_MIXED_FRAMEBUFFER_SIZES:
Ilia Mirkin9515d652016-08-20 22:40:33 -0400246 case PIPE_CAP_MIXED_COLOR_DEPTH_BITS:
Jerome Glisse1235bec2010-09-29 15:05:19 -0400247 case PIPE_CAP_TWO_SIDED_STENCIL:
Jerome Glisse1235bec2010-09-29 15:05:19 -0400248 case PIPE_CAP_ANISOTROPIC_FILTER:
249 case PIPE_CAP_POINT_SPRITE:
250 case PIPE_CAP_OCCLUSION_QUERY:
251 case PIPE_CAP_TEXTURE_SHADOW_MAP:
252 case PIPE_CAP_TEXTURE_MIRROR_CLAMP:
Jerome Glisse1235bec2010-09-29 15:05:19 -0400253 case PIPE_CAP_BLEND_EQUATION_SEPARATE:
Jerome Glisse1235bec2010-09-29 15:05:19 -0400254 case PIPE_CAP_TEXTURE_SWIZZLE:
Marek Olšákdc4c8212012-01-10 00:19:00 +0100255 case PIPE_CAP_DEPTH_CLIP_DISABLE:
Dave Airlie39d1feb2010-10-06 10:14:33 +1000256 case PIPE_CAP_SHADER_STENCIL_EXPORT:
Marek Olšák95c78812011-03-05 16:06:10 +0100257 case PIPE_CAP_VERTEX_ELEMENT_INSTANCE_DIVISOR:
Marek Olšák4a7f0132011-03-29 18:18:05 +0200258 case PIPE_CAP_MIXED_COLORBUFFER_FORMATS:
Marek Olšák93754d82011-05-03 11:54:40 +0200259 case PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT:
260 case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER:
Dave Airlie13c9a852011-06-15 15:15:41 +1000261 case PIPE_CAP_SM3:
Marek Olšákbadf0332011-06-19 23:41:02 +0200262 case PIPE_CAP_SEAMLESS_CUBE_MAP:
Marek Olšák01680ce2011-08-16 09:47:16 +0200263 case PIPE_CAP_PRIMITIVE_RESTART:
Marek Olšák3d13b082011-09-27 23:08:04 +0200264 case PIPE_CAP_CONDITIONAL_RENDER:
Marek Olšákba890862011-09-27 23:18:17 +0200265 case PIPE_CAP_TEXTURE_BARRIER:
Marek Olšákbc1c8362012-01-23 03:11:17 +0100266 case PIPE_CAP_VERTEX_COLOR_UNCLAMPED:
Marek Olšákb0b81212012-02-16 14:45:35 +0100267 case PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION:
Marek Olšák7f1cbf12012-03-08 12:20:01 +0100268 case PIPE_CAP_TGSI_INSTANCEID:
Marek Olšák7fe36312012-04-10 05:14:26 +0200269 case PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY:
270 case PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY:
271 case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY:
Marek Olšák437ab1d2012-04-24 15:19:31 +0200272 case PIPE_CAP_USER_CONSTANT_BUFFERS:
Fredrik Höglundaf372122012-06-18 22:50:02 +0200273 case PIPE_CAP_START_INSTANCE:
Marek Olšák9d699cd2012-07-15 03:38:42 +0200274 case PIPE_CAP_MAX_DUAL_SOURCE_RENDER_TARGETS:
Dave Airlied23aa652012-12-16 10:31:32 +0000275 case PIPE_CAP_TEXTURE_BUFFER_OBJECTS:
Oded Gabbay72d0d2b2016-03-07 15:27:26 +0200276 case PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER:
Marek Olšákdfe53672013-04-10 20:45:01 +0200277 case PIPE_CAP_QUERY_PIPELINE_STATISTICS:
Marek Olšák5a3fac42013-04-11 15:29:41 +0200278 case PIPE_CAP_TEXTURE_MULTISAMPLE:
Christoph Bumillerb206f592014-05-17 01:20:20 +0200279 case PIPE_CAP_BUFFER_MAP_PERSISTENT_COHERENT:
280 case PIPE_CAP_TGSI_VS_WINDOW_SPACE_POSITION:
Marek Olšák13b93592014-08-20 19:17:39 +0200281 case PIPE_CAP_TGSI_VS_LAYER_VIEWPORT:
Glenn Kennarda327fa32014-09-10 11:54:40 +0200282 case PIPE_CAP_SAMPLE_SHADING:
Mathias Fröhlich56088132014-09-14 15:17:07 +0200283 case PIPE_CAP_CLIP_HALFZ:
Ilia Mirkin7c211a12015-02-01 09:01:50 -0500284 case PIPE_CAP_POLYGON_OFFSET_CLAMP:
Edward O'Callaghan82546722015-07-27 11:01:47 +1000285 case PIPE_CAP_CONDITIONAL_RENDER_INVERTED:
Marek Olšák44dc1d32015-08-10 19:37:01 +0200286 case PIPE_CAP_TEXTURE_FLOAT_LINEAR:
287 case PIPE_CAP_TEXTURE_HALF_FLOAT_LINEAR:
Ilia Mirkinec3fe422015-09-10 22:33:34 -0400288 case PIPE_CAP_TGSI_TXQS:
Edward O'Callaghan1f614472015-12-07 20:35:55 +1100289 case PIPE_CAP_COPY_BETWEEN_COMPRESSED_AND_PLAIN_FORMATS:
Nicolai Hähnle321140d2016-01-14 09:41:04 -0500290 case PIPE_CAP_INVALIDATE_BUFFER:
Nicolai Hähnle7dd31b82016-01-26 10:29:50 -0500291 case PIPE_CAP_SURFACE_REINTERPRET_BLOCKS:
Marek Olšák635555a2016-02-02 02:09:36 +0100292 case PIPE_CAP_QUERY_MEMORY_INFO:
Edward O'Callaghanea310f22016-02-01 12:12:12 +1100293 case PIPE_CAP_FRAMEBUFFER_NO_ATTACHMENT:
Axel Davyf6704f22016-06-14 23:13:26 +0200294 case PIPE_CAP_POLYGON_OFFSET_UNITS_UNSCALED:
Marek Olšák739d5262016-08-04 19:04:02 +0200295 case PIPE_CAP_CLEAR_TEXTURE:
Ilia Mirkinbacbb012017-01-23 21:02:28 -0500296 case PIPE_CAP_TGSI_MUL_ZERO_WINS:
Marek Olšák70dcb732017-04-30 01:18:43 +0200297 case PIPE_CAP_CAN_BIND_CONST_BUFFER_AS_VERTEX:
Marek Olšák50189372017-05-15 16:30:30 +0200298 case PIPE_CAP_ALLOW_MAPPED_BUFFERS_DURING_EXECUTION:
Jerome Glisse1235bec2010-09-29 15:05:19 -0400299 return 1;
Marek Olšák5a3fac42013-04-11 15:29:41 +0200300
Marek Olšák914365c2015-04-29 15:27:50 +0200301 case PIPE_CAP_DEVICE_RESET_STATUS_QUERY:
302 return rscreen->b.info.drm_major == 2 && rscreen->b.info.drm_minor >= 43;
303
Marek Olšák7713d592015-02-10 16:02:54 +0100304 case PIPE_CAP_RESOURCE_FROM_USER_MEMORY:
305 return !R600_BIG_ENDIAN && rscreen->b.info.has_userptr;
306
Tom Stellardf61e3822014-02-24 16:51:05 -0500307 case PIPE_CAP_COMPUTE:
308 return rscreen->b.chip_class > R700;
309
Christoph Bumiller8acaf862013-03-15 22:11:31 +0100310 case PIPE_CAP_TGSI_TEXCOORD:
311 return 0;
Marek Olšák93754d82011-05-03 11:54:40 +0200312
Dave Airlie76ba50a2013-11-27 19:47:51 +1000313 case PIPE_CAP_FAKE_SW_MSAA:
314 return 0;
315
Marek Olšák52cb3952013-05-02 03:24:33 +0200316 case PIPE_CAP_MAX_TEXTURE_BUFFER_SIZE:
Marek Olšák8a4ace42016-07-01 00:17:36 +0200317 return MIN2(rscreen->b.info.max_alloc_size, INT_MAX);
Marek Olšák52cb3952013-05-02 03:24:33 +0200318
Marek Olšákc9f2af32012-10-28 17:52:48 +0100319 case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT:
Marek Olšákd172fa82012-11-22 22:40:06 +0100320 return R600_MAP_BUFFER_ALIGNMENT;
Marek Olšákc9f2af32012-10-28 17:52:48 +0100321
Marek Olšák1b749dc2012-04-24 17:31:17 +0200322 case PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT:
323 return 256;
324
Fredrik Höglundfb69dbb2013-03-22 17:14:43 +0100325 case PIPE_CAP_TEXTURE_BUFFER_OFFSET_ALIGNMENT:
326 return 1;
327
Marek Olšák171be752012-01-24 22:23:01 +0100328 case PIPE_CAP_GLSL_FEATURE_LEVEL:
Dave Airlie79ea0f42014-01-30 04:19:57 +0000329 if (family >= CHIP_CEDAR)
Glenn Kennard24a1a152015-10-07 17:17:34 +0200330 return 410;
Dave Airlie79ea0f42014-01-30 04:19:57 +0000331 /* pre-evergreen geom shaders need newer kernel */
332 if (rscreen->b.info.drm_minor >= 37)
333 return 330;
334 return 140;
Marek Olšák171be752012-01-24 22:23:01 +0100335
Marek Olšák93754d82011-05-03 11:54:40 +0200336 /* Supported except the original R600. */
Alex Deucherd6fea4a2011-03-14 17:47:21 -0400337 case PIPE_CAP_INDEP_BLEND_ENABLE:
Dave Airliede481992011-04-25 06:55:09 +1000338 case PIPE_CAP_INDEP_BLEND_FUNC:
Alex Deucherd6fea4a2011-03-14 17:47:21 -0400339 /* R600 doesn't support per-MRT blends */
Marek Olšák93754d82011-05-03 11:54:40 +0200340 return family == CHIP_R600 ? 0 : 1;
Jerome Glisse1235bec2010-09-29 15:05:19 -0400341
Marek Olšákd931b0d2011-05-02 02:38:20 +0200342 /* Supported on Evergreen. */
Marek Olšákd931b0d2011-05-02 02:38:20 +0200343 case PIPE_CAP_SEAMLESS_CUBE_MAP_PER_TEXTURE:
Dave Airlieeb44c36d2012-11-03 20:53:33 +1000344 case PIPE_CAP_CUBE_MAP_ARRAY:
Glenn Kennard3a9278b2014-07-20 15:59:16 +0200345 case PIPE_CAP_TEXTURE_GATHER_SM5:
Glenn Kennarda48b6152014-07-23 10:48:17 +0200346 case PIPE_CAP_TEXTURE_QUERY_LOD:
Glenn Kennardafa7df92014-08-15 10:30:58 +0200347 case PIPE_CAP_TGSI_FS_FINE_DERIVATIVE:
Glenn Kennardc878d612015-10-16 01:53:47 +0200348 case PIPE_CAP_SAMPLER_VIEW_TARGET:
Glenn Kennard5da24242016-01-03 23:47:18 +0100349 case PIPE_CAP_TGSI_PACK_HALF_FLOAT:
Marek Olšákd931b0d2011-05-02 02:38:20 +0200350 return family >= CHIP_CEDAR ? 1 : 0;
Glenn Kennard3a9278b2014-07-20 15:59:16 +0200351 case PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS:
352 return family >= CHIP_CEDAR ? 4 : 0;
Glenn Kennardd80701d2015-02-24 15:59:16 +0100353 case PIPE_CAP_DRAW_INDIRECT:
354 /* kernel command checker support is also required */
355 return family >= CHIP_CEDAR && rscreen->b.info.drm_minor >= 41;
Marek Olšákfc8e30e2011-04-17 01:57:13 +0200356
Nicolai Hähnle3abb5482016-01-26 10:26:30 -0500357 case PIPE_CAP_BUFFER_SAMPLER_VIEW_RGBA_ONLY:
358 return family >= CHIP_CEDAR ? 0 : 1;
359
Marek Olšák93754d82011-05-03 11:54:40 +0200360 /* Unsupported features. */
Marek Olšák93754d82011-05-03 11:54:40 +0200361 case PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT:
362 case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER:
Marek Olšáka3bfbcc2011-12-17 15:13:23 +0100363 case PIPE_CAP_TGSI_CAN_COMPACT_CONSTANTS:
Marek Olšákbc1c8362012-01-23 03:11:17 +0100364 case PIPE_CAP_FRAGMENT_COLOR_CLAMPED:
365 case PIPE_CAP_VERTEX_COLOR_CLAMPED:
Marek Olšák7fe36312012-04-10 05:14:26 +0200366 case PIPE_CAP_USER_VERTEX_BUFFERS:
Ilia Mirkind95df4f2014-04-26 23:44:57 -0400367 case PIPE_CAP_TEXTURE_GATHER_OFFSETS:
Roland Scheideggerade8b262014-12-12 04:13:43 +0100368 case PIPE_CAP_VERTEXID_NOBASE:
Marek Olšák3b7800e2015-08-10 02:11:48 +0200369 case PIPE_CAP_DEPTH_BOUNDS_TEST:
Marek Olšákf3b37e32015-09-27 19:32:07 +0200370 case PIPE_CAP_FORCE_PERSAMPLE_INTERP:
Marek Olšákd74e7b62015-09-27 21:02:15 +0200371 case PIPE_CAP_SHAREABLE_SHADERS:
Ilia Mirkin87b4e4e2015-12-29 16:49:32 -0500372 case PIPE_CAP_DRAW_PARAMETERS:
Ilia Mirkind67b9ba2015-12-31 13:30:13 -0500373 case PIPE_CAP_MULTI_DRAW_INDIRECT:
374 case PIPE_CAP_MULTI_DRAW_INDIRECT_PARAMS:
Marek Olšák34738a92016-01-02 20:45:00 +0100375 case PIPE_CAP_TGSI_FS_POSITION_IS_SYSVAL:
376 case PIPE_CAP_TGSI_FS_FACE_IS_INTEGER_SYSVAL:
Ilia Mirkinebfb5442016-01-02 21:56:45 -0500377 case PIPE_CAP_SHADER_BUFFER_OFFSET_ALIGNMENT:
Charmaine Lee3038e892016-01-14 10:22:17 -0700378 case PIPE_CAP_GENERATE_MIPMAP:
Rob Clarkd6408372015-08-10 11:41:29 -0400379 case PIPE_CAP_STRING_MARKER:
Ilia Mirkinf9e6f462016-01-09 23:30:16 -0500380 case PIPE_CAP_QUERY_BUFFER_OBJECT:
Bas Nieuwenhuizen70dcd842016-04-12 15:00:31 +0200381 case PIPE_CAP_ROBUST_BUFFER_ACCESS_BEHAVIOR:
Tobias Klausmann2be258e2016-05-08 22:44:07 +0200382 case PIPE_CAP_CULL_DISTANCE:
Kenneth Graunke70048eb2016-05-20 21:05:34 -0700383 case PIPE_CAP_PRIMITIVE_RESTART_FOR_PATCHES:
Ilia Mirkinedfa7a42016-05-29 11:39:52 -0400384 case PIPE_CAP_TGSI_VOTE:
Ilia Mirkin07fcb062016-06-11 15:26:45 -0400385 case PIPE_CAP_MAX_WINDOW_RECTANGLES:
Nicolai Hähnle700a5712016-10-07 09:42:55 +0200386 case PIPE_CAP_TGSI_ARRAY_COMPONENTS:
Nicolai Hähnle611166b2016-11-18 20:49:54 +0100387 case PIPE_CAP_TGSI_CAN_READ_OUTPUTS:
Rob Clark026a7222016-04-01 16:10:42 -0400388 case PIPE_CAP_NATIVE_FENCE_FD:
Ilia Mirkinee3ebe62017-01-01 23:10:00 -0500389 case PIPE_CAP_GLSL_OPTIMIZE_CONSERVATIVELY:
390 case PIPE_CAP_TGSI_FS_FBFETCH:
Dave Airlief8045062016-06-09 10:13:03 +1000391 case PIPE_CAP_INT64:
Ilia Mirkinb0900332017-02-04 22:31:29 -0500392 case PIPE_CAP_INT64_DIVMOD:
Marek Olšákbf3cdf02017-03-07 02:09:03 +0100393 case PIPE_CAP_TGSI_TEX_TXF_LZ:
Nicolai Hähnled0c7f922017-03-29 20:44:57 +0200394 case PIPE_CAP_TGSI_CLOCK:
Lyudeffe2bd62017-03-16 18:00:05 -0400395 case PIPE_CAP_POLYGON_MODE_FILL_RECTANGLE:
Nicolai Hähnled6e6fa02017-02-02 21:10:44 +0100396 case PIPE_CAP_SPARSE_BUFFER_PAGE_SIZE:
Nicolai Hähnled3e6f6d2017-03-30 11:16:09 +0200397 case PIPE_CAP_TGSI_BALLOT:
Nicolai Hähnle17f24a92017-04-13 21:54:54 +0200398 case PIPE_CAP_TGSI_TES_LAYER_VIEWPORT:
Lyude467af442017-05-24 15:42:39 -0400399 case PIPE_CAP_POST_DEPTH_COVERAGE:
Samuel Pitoiset973822b2017-02-16 13:43:16 +0100400 case PIPE_CAP_BINDLESS_TEXTURE:
Nicolai Hähnle01f15982017-06-25 18:31:11 +0200401 case PIPE_CAP_NIR_SAMPLERS_AS_DEREF:
Nicolai Hähnlea6777992017-07-26 19:16:14 +0200402 case PIPE_CAP_QUERY_SO_OVERFLOW:
Timothy Arceri4e4042d2017-08-03 13:54:45 +1000403 case PIPE_CAP_MEMOBJ:
Marek Olšák93754d82011-05-03 11:54:40 +0200404 return 0;
Jerome Glisse1235bec2010-09-29 15:05:19 -0400405
Nicolai Hähnlea020cb32017-01-27 10:35:13 +0100406 case PIPE_CAP_DOUBLES:
407 if (rscreen->b.family == CHIP_ARUBA ||
408 rscreen->b.family == CHIP_CAYMAN ||
409 rscreen->b.family == CHIP_CYPRESS ||
410 rscreen->b.family == CHIP_HEMLOCK)
411 return 1;
412 return 0;
413
Dave Airlie33404f12015-11-30 16:01:31 +1000414 case PIPE_CAP_MAX_SHADER_PATCH_VARYINGS:
415 if (family >= CHIP_CEDAR)
416 return 30;
417 else
418 return 0;
Marek Olšák543b2332011-11-08 21:58:27 +0100419 /* Stream output. */
420 case PIPE_CAP_MAX_STREAM_OUTPUT_BUFFERS:
Marek Olšákbba39d82013-11-28 15:09:35 +0100421 return rscreen->b.has_streamout ? 4 : 0;
Marek Olšák15146fd2012-01-25 03:23:27 +0100422 case PIPE_CAP_STREAM_OUTPUT_PAUSE_RESUME:
Ilia Mirkin3fdeb7c2016-10-14 00:03:12 -0400423 case PIPE_CAP_STREAM_OUTPUT_INTERLEAVE_BUFFERS:
Marek Olšákbba39d82013-11-28 15:09:35 +0100424 return rscreen->b.has_streamout ? 1 : 0;
Marek Olšák543b2332011-11-08 21:58:27 +0100425 case PIPE_CAP_MAX_STREAM_OUTPUT_SEPARATE_COMPONENTS:
426 case PIPE_CAP_MAX_STREAM_OUTPUT_INTERLEAVED_COMPONENTS:
Marek Olšákb78b6242012-10-26 18:41:49 +0200427 return 32*4;
Marek Olšák543b2332011-11-08 21:58:27 +0100428
Grigori Goronzyd34d5fd2014-02-09 22:56:20 +0100429 /* Geometry shader output. */
430 case PIPE_CAP_MAX_GEOMETRY_OUTPUT_VERTICES:
431 return 1024;
432 case PIPE_CAP_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS:
433 return 16384;
Ilia Mirkin746e5262014-06-26 20:01:50 -0400434 case PIPE_CAP_MAX_VERTEX_STREAMS:
Glenn Kennard3bfa3452015-07-09 16:37:28 +1000435 return family >= CHIP_CEDAR ? 4 : 1;
Grigori Goronzyd34d5fd2014-02-09 22:56:20 +0100436
Timothy Arceri89e68062014-08-19 21:09:58 -1000437 case PIPE_CAP_MAX_VERTEX_ATTRIB_STRIDE:
438 return 2047;
439
Jerome Glisse1235bec2010-09-29 15:05:19 -0400440 /* Texturing. */
441 case PIPE_CAP_MAX_TEXTURE_2D_LEVELS:
Jerome Glisse1235bec2010-09-29 15:05:19 -0400442 case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:
Alex Deucherfae7cb82010-12-02 16:09:22 -0500443 if (family >= CHIP_CEDAR)
444 return 15;
445 else
446 return 14;
Marek Olšák4f1f3232014-03-09 20:03:57 +0100447 case PIPE_CAP_MAX_TEXTURE_3D_LEVELS:
448 /* textures support 8192, but layered rendering supports 2048 */
449 return 12;
Marek Olšákb37931f2011-09-04 04:41:52 +0200450 case PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS:
Marek Olšák4f1f3232014-03-09 20:03:57 +0100451 /* textures support 8192, but layered rendering supports 2048 */
Marek Olšákc54f3842016-02-23 23:32:44 +0100452 return 2048;
Jerome Glisse1235bec2010-09-29 15:05:19 -0400453
454 /* Render targets. */
455 case PIPE_CAP_MAX_RENDER_TARGETS:
Marek Olšák370c8b52012-02-24 16:36:05 +0100456 /* XXX some r6xx are buggy and can only do 4 */
Jerome Glisse1235bec2010-09-29 15:05:19 -0400457 return 8;
458
Marek Olšáka62cd692013-09-21 19:45:08 +0200459 case PIPE_CAP_MAX_VIEWPORTS:
Alexandre Demers7a37d5c2015-02-25 01:50:49 -0500460 return R600_MAX_VIEWPORTS;
Józef Kucia98aa8072016-07-19 13:07:25 +0200461 case PIPE_CAP_VIEWPORT_SUBPIXEL_BITS:
462 return 8;
Marek Olšáka62cd692013-09-21 19:45:08 +0200463
Mathias Fröhlich90c2fd82011-01-23 22:35:13 +0100464 /* Timer queries, present when the clock frequency is non zero. */
José Fonseca99762162012-12-09 09:50:34 +0000465 case PIPE_CAP_QUERY_TIME_ELAPSED:
Marek Olšák1e864d72016-01-30 01:27:46 +0100466 return rscreen->b.info.clock_crystal_freq != 0;
Marek Olšák44f14eb2012-07-05 20:06:41 +0200467 case PIPE_CAP_QUERY_TIMESTAMP:
Marek Olšákd5b23df2013-08-13 21:49:59 +0200468 return rscreen->b.info.drm_minor >= 20 &&
Marek Olšák1e864d72016-01-30 01:27:46 +0100469 rscreen->b.info.clock_crystal_freq != 0;
Mathias Fröhlich90c2fd82011-01-23 22:35:13 +0100470
Ilia Mirkinc2f9ad52014-04-09 14:58:53 -0400471 case PIPE_CAP_MIN_TEXTURE_GATHER_OFFSET:
Dave Airlie0b666102011-08-29 14:35:16 +0100472 case PIPE_CAP_MIN_TEXEL_OFFSET:
473 return -8;
474
Ilia Mirkinc2f9ad52014-04-09 14:58:53 -0400475 case PIPE_CAP_MAX_TEXTURE_GATHER_OFFSET:
Dave Airlie0b666102011-08-29 14:35:16 +0100476 case PIPE_CAP_MAX_TEXEL_OFFSET:
477 return 7;
Christoph Bumiller729abfd2013-04-12 13:42:01 +0200478
479 case PIPE_CAP_TEXTURE_BORDER_COLOR_QUIRK:
480 return PIPE_QUIRK_TEXTURE_BORDER_COLOR_SWIZZLE_R600;
Tom Stellard4e90bc92013-07-09 21:21:39 -0700481 case PIPE_CAP_ENDIANNESS:
482 return PIPE_ENDIAN_LITTLE;
Emil Velikovde014432014-08-14 20:57:29 +0100483
484 case PIPE_CAP_VENDOR_ID:
Marek Olšákec74dee2016-02-25 22:32:26 +0100485 return ATI_VENDOR_ID;
Emil Velikovde014432014-08-14 20:57:29 +0100486 case PIPE_CAP_DEVICE_ID:
487 return rscreen->b.info.pci_id;
488 case PIPE_CAP_ACCELERATED:
489 return 1;
490 case PIPE_CAP_VIDEO_MEMORY:
491 return rscreen->b.info.vram_size >> 20;
492 case PIPE_CAP_UMA:
493 return 0;
Axel Davyeb1c12d2015-01-17 14:30:17 +0100494 case PIPE_CAP_MULTISAMPLE_Z_RESOLVE:
495 return rscreen->b.chip_class >= R700;
Marek Olšákdcb2b772016-02-29 20:22:37 +0100496 case PIPE_CAP_PCI_GROUP:
497 return rscreen->b.info.pci_domain;
498 case PIPE_CAP_PCI_BUS:
499 return rscreen->b.info.pci_bus;
500 case PIPE_CAP_PCI_DEVICE:
501 return rscreen->b.info.pci_dev;
502 case PIPE_CAP_PCI_FUNCTION:
503 return rscreen->b.info.pci_func;
Jerome Glisse1235bec2010-09-29 15:05:19 -0400504 }
Marek Olšák4ac250c2011-11-22 20:44:14 +0100505 return 0;
Jerome Glisse1235bec2010-09-29 15:05:19 -0400506}
507
Brian Paul637e5712017-03-05 12:13:02 -0700508static int r600_get_shader_param(struct pipe_screen* pscreen,
509 enum pipe_shader_type shader,
510 enum pipe_shader_cap param)
Jerome Glisse1235bec2010-09-29 15:05:19 -0400511{
Vadim Girlin1371d652013-08-02 06:38:23 +0400512 struct r600_screen *rscreen = (struct r600_screen *)pscreen;
513
Jerome Glisse1235bec2010-09-29 15:05:19 -0400514 switch(shader)
515 {
516 case PIPE_SHADER_FRAGMENT:
517 case PIPE_SHADER_VERTEX:
Vadim Girlin1371d652013-08-02 06:38:23 +0400518 case PIPE_SHADER_COMPUTE:
Jerome Glisse1235bec2010-09-29 15:05:19 -0400519 break;
520 case PIPE_SHADER_GEOMETRY:
Dave Airlie79ea0f42014-01-30 04:19:57 +0000521 if (rscreen->b.family >= CHIP_CEDAR)
522 break;
523 /* pre-evergreen geom shaders need newer kernel */
524 if (rscreen->b.info.drm_minor >= 37)
525 break;
526 return 0;
Dave Airlie33404f12015-11-30 16:01:31 +1000527 case PIPE_SHADER_TESS_CTRL:
528 case PIPE_SHADER_TESS_EVAL:
529 if (rscreen->b.family >= CHIP_CEDAR)
530 break;
Jerome Glisse1235bec2010-09-29 15:05:19 -0400531 default:
Jerome Glisse1235bec2010-09-29 15:05:19 -0400532 return 0;
533 }
534
Jerome Glisse1235bec2010-09-29 15:05:19 -0400535 switch (param) {
536 case PIPE_SHADER_CAP_MAX_INSTRUCTIONS:
537 case PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS:
538 case PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS:
539 case PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS:
540 return 16384;
541 case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH:
Marek Olšákcf37aef2013-01-31 19:39:41 +0100542 return 32;
Jerome Glisse1235bec2010-09-29 15:05:19 -0400543 case PIPE_SHADER_CAP_MAX_INPUTS:
Marek Olšákbb867e22013-05-02 05:24:27 +0200544 return shader == PIPE_SHADER_VERTEX ? 16 : 32;
Marek Olšák5f5b83c2014-10-01 20:28:17 +0200545 case PIPE_SHADER_CAP_MAX_OUTPUTS:
546 return shader == PIPE_SHADER_FRAGMENT ? 8 : 32;
Jerome Glisse1235bec2010-09-29 15:05:19 -0400547 case PIPE_SHADER_CAP_MAX_TEMPS:
Henri Verbeetb2a98c32011-04-25 13:28:55 +0200548 return 256; /* Max native temporaries. */
Marek Olšák04f2c882014-07-24 20:32:08 +0200549 case PIPE_SHADER_CAP_MAX_CONST_BUFFER_SIZE:
Tom Stellard72969e02014-08-07 15:31:17 -0400550 if (shader == PIPE_SHADER_COMPUTE) {
551 uint64_t max_const_buffer_size;
Bas Nieuwenhuizen1a5c8c22016-03-25 02:06:50 +0100552 pscreen->get_compute_param(pscreen, PIPE_SHADER_IR_TGSI,
Tom Stellard72969e02014-08-07 15:31:17 -0400553 PIPE_COMPUTE_CAP_MAX_MEM_ALLOC_SIZE,
554 &max_const_buffer_size);
Marek Olšák8a4ace42016-07-01 00:17:36 +0200555 return MIN2(max_const_buffer_size, INT_MAX);
Tom Stellard72969e02014-08-07 15:31:17 -0400556
557 } else {
558 return R600_MAX_CONST_BUFFER_SIZE;
559 }
Jerome Glisse1235bec2010-09-29 15:05:19 -0400560 case PIPE_SHADER_CAP_MAX_CONST_BUFFERS:
Dave Airlie73565792012-11-06 15:31:41 +1000561 return R600_MAX_USER_CONST_BUFFERS;
Jerome Glisse1235bec2010-09-29 15:05:19 -0400562 case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
563 return 1;
Brian Paul13f3ae52013-02-01 11:16:54 -0700564 case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED:
Glenn Kennard2fa6d652014-07-18 09:54:37 +0200565 return 1;
Marek Olšák5c7127c2010-11-12 03:07:05 +0100566 case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:
567 case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR:
568 case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
569 case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
570 return 1;
Marek Olšák9aa089e2010-11-14 15:34:59 +0100571 case PIPE_SHADER_CAP_SUBROUTINES:
572 return 0;
Bryan Cain17b695e2011-05-05 21:10:28 -0500573 case PIPE_SHADER_CAP_INTEGERS:
Marek Olšák79051082015-06-05 19:09:21 +0200574 case PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE:
Marek Olšák15ca9d12012-07-14 22:28:26 +0200575 return 1;
Marek Olšákf5bfe542011-09-27 22:22:06 +0200576 case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
Roland Scheidegger2983c032013-11-26 02:30:41 +0100577 case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:
Marek Olšákf5bfe542011-09-27 22:22:06 +0200578 return 16;
Adam Rak6a829a12011-11-30 22:20:41 +0100579 case PIPE_SHADER_CAP_PREFERRED_IR:
580 if (shader == PIPE_SHADER_COMPUTE) {
Tom Stellardfa07f4b2014-09-25 18:10:44 -0700581 return PIPE_SHADER_IR_NATIVE;
Adam Rak6a829a12011-11-30 22:20:41 +0100582 } else {
583 return PIPE_SHADER_IR_TGSI;
584 }
Samuel Pitoiset5e09ac72016-02-03 18:57:58 +0100585 case PIPE_SHADER_CAP_SUPPORTED_IRS:
586 return 0;
Jan Vesely54c4d522016-06-15 19:41:22 -0400587 case PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED:
Jan Vesely54c4d522016-06-15 19:41:22 -0400588 if (rscreen->b.family == CHIP_ARUBA ||
589 rscreen->b.family == CHIP_CAYMAN ||
590 rscreen->b.family == CHIP_CYPRESS ||
591 rscreen->b.family == CHIP_HEMLOCK)
Glenn Kennardce340482015-09-11 12:42:23 +0200592 return 1;
Tom Stellardfea996c2014-06-17 08:52:34 -0700593 return 0;
Ilia Mirkin899d7792014-07-25 17:03:33 -0400594 case PIPE_SHADER_CAP_TGSI_DROUND_SUPPORTED:
Ilia Mirkin924ee3f2014-07-25 17:48:01 -0400595 case PIPE_SHADER_CAP_TGSI_DFRACEXP_DLDEXP_SUPPORTED:
Ilia Mirkin266d0012015-09-26 20:27:42 -0400596 case PIPE_SHADER_CAP_MAX_SHADER_BUFFERS:
Ilia Mirkin9fbfa1a2016-01-08 22:56:23 -0500597 case PIPE_SHADER_CAP_MAX_SHADER_IMAGES:
Marek Olšák72217d42016-10-28 22:34:20 +0200598 case PIPE_SHADER_CAP_LOWER_IF_THRESHOLD:
Samuel Pitoiset3a927e02017-04-25 00:31:46 +0200599 case PIPE_SHADER_CAP_TGSI_SKIP_MERGE_REGISTERS:
Ilia Mirkin899d7792014-07-25 17:03:33 -0400600 return 0;
Marek Olšák814f3142015-10-20 18:26:02 +0200601 case PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HINT:
602 /* due to a bug in the shader compiler, some loops hang
603 * if they are not unrolled, see:
604 * https://bugs.freedesktop.org/show_bug.cgi?id=86720
605 */
606 return 255;
Jerome Glisse1235bec2010-09-29 15:05:19 -0400607 }
Marek Olšák4ac250c2011-11-22 20:44:14 +0100608 return 0;
Jerome Glisse1235bec2010-09-29 15:05:19 -0400609}
610
Jerome Glisse1235bec2010-09-29 15:05:19 -0400611static void r600_destroy_screen(struct pipe_screen* pscreen)
612{
613 struct r600_screen *rscreen = (struct r600_screen *)pscreen;
614
Edward O'Callaghan13eb5f52015-12-04 22:08:22 +1100615 if (!rscreen)
Jerome Glisse1235bec2010-09-29 15:05:19 -0400616 return;
Tilman Sauerbeck52ba68d2010-10-31 15:51:55 +0100617
Marek Olšákac330d42014-04-09 00:26:32 +0200618 if (!rscreen->b.ws->unref(rscreen->b.ws))
Christian König48711282013-09-25 13:59:56 +0200619 return;
620
Adam Rak6a829a12011-11-30 22:20:41 +0100621 if (rscreen->global_pool) {
622 compute_memory_pool_delete(rscreen->global_pool);
623 }
624
Marek Olšáked42e952014-01-22 02:49:53 +0100625 r600_destroy_common_screen(&rscreen->b);
Jerome Glisse1235bec2010-09-29 15:05:19 -0400626}
627
Marek Olšáka9ae7632014-01-22 00:58:12 +0100628static struct pipe_resource *r600_resource_create(struct pipe_screen *screen,
629 const struct pipe_resource *templ)
630{
631 if (templ->target == PIPE_BUFFER &&
632 (templ->bind & PIPE_BIND_GLOBAL))
633 return r600_compute_global_buffer_create(screen, templ);
634
635 return r600_resource_create_common(screen, templ);
636}
637
Nicolai Hähnlebc7f41e2017-06-28 14:47:32 +0200638struct pipe_screen *r600_screen_create(struct radeon_winsys *ws,
639 const struct pipe_screen_config *config)
Jerome Glisse1235bec2010-09-29 15:05:19 -0400640{
Marek Olšák90ce3cd2011-09-17 14:10:20 +0200641 struct r600_screen *rscreen = CALLOC_STRUCT(r600_screen);
Dave Airliee6aad9b2012-04-22 08:09:05 +0100642
Edward O'Callaghan13eb5f52015-12-04 22:08:22 +1100643 if (!rscreen) {
Jerome Glisse1235bec2010-09-29 15:05:19 -0400644 return NULL;
645 }
646
Marek Olšák68f6dec2013-09-22 21:45:23 +0200647 /* Set functions first. */
648 rscreen->b.b.context_create = r600_create_context;
649 rscreen->b.b.destroy = r600_destroy_screen;
Marek Olšák68f6dec2013-09-22 21:45:23 +0200650 rscreen->b.b.get_param = r600_get_param;
651 rscreen->b.b.get_shader_param = r600_get_shader_param;
Marek Olšáka9ae7632014-01-22 00:58:12 +0100652 rscreen->b.b.resource_create = r600_resource_create;
Marek Olšák68f6dec2013-09-22 21:45:23 +0200653
Nicolai Hähnlebc7f41e2017-06-28 14:47:32 +0200654 if (!r600_common_screen_init(&rscreen->b, ws, config->flags)) {
Marek Olšák1bb77f82013-09-22 22:12:18 +0200655 FREE(rscreen);
656 return NULL;
657 }
Marek Olšák3603d152011-09-11 14:53:07 +0200658
Marek Olšáked42e952014-01-22 02:49:53 +0100659 if (rscreen->b.info.chip_class >= EVERGREEN) {
660 rscreen->b.b.is_format_supported = evergreen_is_format_supported;
661 } else {
662 rscreen->b.b.is_format_supported = r600_is_format_supported;
663 }
664
Marek Olšákba650cc2013-09-22 15:18:11 +0200665 rscreen->b.debug_flags |= debug_get_flags_option("R600_DEBUG", r600_debug_options, 0);
Michel Dänzer31009b42013-03-21 17:56:52 +0100666 if (debug_get_bool_option("R600_DEBUG_COMPUTE", FALSE))
Marek Olšákba650cc2013-09-22 15:18:11 +0200667 rscreen->b.debug_flags |= DBG_COMPUTE;
Michel Dänzer31009b42013-03-21 17:56:52 +0100668 if (debug_get_bool_option("R600_DUMP_SHADERS", FALSE))
Dave Airlie958d6172015-11-30 16:01:43 +1000669 rscreen->b.debug_flags |= DBG_FS | DBG_VS | DBG_GS | DBG_PS | DBG_CS | DBG_TCS | DBG_TES;
Andreas Boll14bdcc62014-10-23 14:52:55 +0200670 if (!debug_get_bool_option("R600_HYPERZ", TRUE))
671 rscreen->b.debug_flags |= DBG_NO_HYPERZ;
Marek Olšák4bf0ebd2013-03-01 16:31:49 +0100672
Marek Olšákd5b23df2013-08-13 21:49:59 +0200673 if (rscreen->b.family == CHIP_UNKNOWN) {
674 fprintf(stderr, "r600: Unknown chipset 0x%04X\n", rscreen->b.info.pci_id);
Marek Olšák518557d2011-09-17 13:56:09 +0200675 FREE(rscreen);
676 return NULL;
677 }
678
Marek Olšák6e7756d2012-06-17 17:54:38 +0200679 /* Figure out streamout kernel support. */
Marek Olšákd5b23df2013-08-13 21:49:59 +0200680 switch (rscreen->b.chip_class) {
Marek Olšák6e7756d2012-06-17 17:54:38 +0200681 case R600:
Marek Olšákd5b23df2013-08-13 21:49:59 +0200682 if (rscreen->b.family < CHIP_RS780) {
Marek Olšákbba39d82013-11-28 15:09:35 +0100683 rscreen->b.has_streamout = rscreen->b.info.drm_minor >= 14;
Marek Olšákd063c7b2012-09-25 01:43:49 +0200684 } else {
Marek Olšákbba39d82013-11-28 15:09:35 +0100685 rscreen->b.has_streamout = rscreen->b.info.drm_minor >= 23;
Marek Olšákd063c7b2012-09-25 01:43:49 +0200686 }
Marek Olšák6e7756d2012-06-17 17:54:38 +0200687 break;
688 case R700:
Marek Olšákbba39d82013-11-28 15:09:35 +0100689 rscreen->b.has_streamout = rscreen->b.info.drm_minor >= 17;
Marek Olšák6e7756d2012-06-17 17:54:38 +0200690 break;
Marek Olšákd063c7b2012-09-25 01:43:49 +0200691 case EVERGREEN:
692 case CAYMAN:
Marek Olšákbba39d82013-11-28 15:09:35 +0100693 rscreen->b.has_streamout = rscreen->b.info.drm_minor >= 14;
Marek Olšákd063c7b2012-09-25 01:43:49 +0200694 break;
Jerome Glisseca474f92013-01-04 16:34:52 -0500695 default:
Marek Olšákbba39d82013-11-28 15:09:35 +0100696 rscreen->b.has_streamout = FALSE;
Jerome Glisseca474f92013-01-04 16:34:52 -0500697 break;
Marek Olšák393d7412012-03-27 21:00:49 +0200698 }
699
Marek Olšák96ed6c92012-10-12 18:46:32 +0200700 /* MSAA support. */
Marek Olšákd5b23df2013-08-13 21:49:59 +0200701 switch (rscreen->b.chip_class) {
Marek Olšák96ed6c92012-10-12 18:46:32 +0200702 case R600:
703 case R700:
Marek Olšákd5b23df2013-08-13 21:49:59 +0200704 rscreen->has_msaa = rscreen->b.info.drm_minor >= 22;
Marek Olšák5a3fac42013-04-11 15:29:41 +0200705 rscreen->has_compressed_msaa_texturing = false;
Marek Olšák96ed6c92012-10-12 18:46:32 +0200706 break;
707 case EVERGREEN:
Marek Olšákd5b23df2013-08-13 21:49:59 +0200708 rscreen->has_msaa = rscreen->b.info.drm_minor >= 19;
709 rscreen->has_compressed_msaa_texturing = rscreen->b.info.drm_minor >= 24;
Marek Olšák96ed6c92012-10-12 18:46:32 +0200710 break;
711 case CAYMAN:
Marek Olšákd5b23df2013-08-13 21:49:59 +0200712 rscreen->has_msaa = rscreen->b.info.drm_minor >= 19;
Marek Olšák5a3fac42013-04-11 15:29:41 +0200713 rscreen->has_compressed_msaa_texturing = true;
Marek Olšák96ed6c92012-10-12 18:46:32 +0200714 break;
Jerome Glisseca474f92013-01-04 16:34:52 -0500715 default:
716 rscreen->has_msaa = FALSE;
Marek Olšák5a3fac42013-04-11 15:29:41 +0200717 rscreen->has_compressed_msaa_texturing = false;
Marek Olšák96ed6c92012-10-12 18:46:32 +0200718 }
719
Marek Olšákbba39d82013-11-28 15:09:35 +0100720 rscreen->b.has_cp_dma = rscreen->b.info.drm_minor >= 27 &&
Marek Olšákba650cc2013-09-22 15:18:11 +0200721 !(rscreen->b.debug_flags & DBG_NO_CP_DMA);
Marek Olšák58bd9262013-02-21 17:06:26 +0100722
Nicolai Hähnle8e4de002016-09-15 16:24:17 +0200723 rscreen->b.barrier_flags.cp_to_L2 =
724 R600_CONTEXT_INV_VERTEX_CACHE |
725 R600_CONTEXT_INV_TEX_CACHE |
726 R600_CONTEXT_INV_CONST_CACHE;
727 rscreen->b.barrier_flags.compute_to_L2 = R600_CONTEXT_PS_PARTIAL_FLUSH;
728
Tom Stellardc0f7fe72012-07-11 16:18:22 +0000729 rscreen->global_pool = compute_memory_pool_new(rscreen);
Adam Rak6a829a12011-11-30 22:20:41 +0100730
Marek Olšákb893bbf2013-10-03 16:39:50 +0200731 /* Create the auxiliary context. This must be done last. */
Marek Olšák0fc21ec2015-07-25 18:40:59 +0200732 rscreen->b.aux_context = rscreen->b.b.context_create(&rscreen->b.b, NULL, 0);
Marek Olšákb893bbf2013-10-03 16:39:50 +0200733
Marek Olšákb6920762013-04-21 23:26:52 +0200734#if 0 /* This is for testing whether aux_context and buffer clearing work correctly. */
735 struct pipe_resource templ = {};
736
737 templ.width0 = 4;
738 templ.height0 = 2048;
739 templ.depth0 = 1;
740 templ.array_size = 1;
741 templ.target = PIPE_TEXTURE_2D;
742 templ.format = PIPE_FORMAT_R8G8B8A8_UNORM;
Marek Olšákc3211442014-02-03 03:42:17 +0100743 templ.usage = PIPE_USAGE_DEFAULT;
Marek Olšákb6920762013-04-21 23:26:52 +0200744
745 struct r600_resource *res = r600_resource(rscreen->screen.resource_create(&rscreen->screen, &templ));
Marek Olšákcf811fa2015-12-07 00:00:59 +0100746 unsigned char *map = ws->buffer_map(res->buf, NULL, PIPE_TRANSFER_WRITE);
Marek Olšákb6920762013-04-21 23:26:52 +0200747
748 memset(map, 0, 256);
749
750 r600_screen_clear_buffer(rscreen, &res->b.b, 4, 4, 0xCC);
751 r600_screen_clear_buffer(rscreen, &res->b.b, 8, 4, 0xDD);
752 r600_screen_clear_buffer(rscreen, &res->b.b, 12, 4, 0xEE);
753 r600_screen_clear_buffer(rscreen, &res->b.b, 20, 4, 0xFF);
754 r600_screen_clear_buffer(rscreen, &res->b.b, 32, 20, 0x87);
755
756 ws->buffer_wait(res->buf, RADEON_USAGE_WRITE);
757
758 int i;
759 for (i = 0; i < 256; i++) {
760 printf("%02X", map[i]);
761 if (i % 16 == 15)
762 printf("\n");
763 }
764#endif
765
Marek Olšák3af28e52014-09-05 20:15:16 +0200766 if (rscreen->b.debug_flags & DBG_TEST_DMA)
767 r600_test_dma(&rscreen->b);
768
Samuel Pitoisetaf7fef12017-01-30 13:55:53 +0100769 r600_query_fix_enabled_rb_mask(&rscreen->b);
Marek Olšákd5b23df2013-08-13 21:49:59 +0200770 return &rscreen->b.b;
Jerome Glisse1235bec2010-09-29 15:05:19 -0400771}