blob: 827e9fe5e0d224c0b1cb1d94bcb45519ea023f0f [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"
26
Christian König5b2855b2013-04-03 10:18:35 +020027#include "radeon/radeon_uvd.h"
Marek Olšák72097032014-01-22 18:50:36 +010028#include "util/u_blitter.h"
29#include "util/u_memory.h"
30#include "util/u_simple_shaders.h"
31#include "vl/vl_decoder.h"
Tom Stellarda75c6162012-01-06 17:38:37 -050032
33/*
34 * pipe_context
35 */
Andreas Hartmetz45578de2014-01-07 02:40:22 +010036void si_flush(struct pipe_context *ctx, struct pipe_fence_handle **fence,
37 unsigned flags)
Tom Stellarda75c6162012-01-06 17:38:37 -050038{
Andreas Hartmetz8662e662014-01-11 16:00:50 +010039 struct si_context *sctx = (struct si_context *)ctx;
Tom Stellarda75c6162012-01-06 17:38:37 -050040 struct pipe_query *render_cond = NULL;
Roland Scheidegger793e8e32013-06-14 19:48:57 +020041 boolean render_cond_cond = FALSE;
Tom Stellarda75c6162012-01-06 17:38:37 -050042 unsigned render_cond_mode = 0;
43
Marek Olšák98075562013-10-08 21:50:43 +020044 if (fence) {
Andreas Hartmetz8662e662014-01-11 16:00:50 +010045 *fence = sctx->b.ws->cs_create_fence(sctx->b.rings.gfx.cs);
Marek Olšák98075562013-10-08 21:50:43 +020046 }
Tom Stellarda75c6162012-01-06 17:38:37 -050047
48 /* Disable render condition. */
Marek Olšák62d55c02014-01-22 00:06:32 +010049 if (sctx->b.current_render_cond) {
50 render_cond = sctx->b.current_render_cond;
51 render_cond_cond = sctx->b.current_render_cond_cond;
52 render_cond_mode = sctx->b.current_render_cond_mode;
Roland Scheidegger793e8e32013-06-14 19:48:57 +020053 ctx->render_condition(ctx, NULL, FALSE, 0);
Tom Stellarda75c6162012-01-06 17:38:37 -050054 }
55
Andreas Hartmetz8662e662014-01-11 16:00:50 +010056 si_context_flush(sctx, flags);
Tom Stellarda75c6162012-01-06 17:38:37 -050057
58 /* Re-enable render condition. */
59 if (render_cond) {
Roland Scheidegger793e8e32013-06-14 19:48:57 +020060 ctx->render_condition(ctx, render_cond, render_cond_cond, render_cond_mode);
Tom Stellarda75c6162012-01-06 17:38:37 -050061 }
62}
63
Andreas Hartmetzeb0ddb62014-01-07 03:07:55 +010064static void si_flush_from_st(struct pipe_context *ctx,
65 struct pipe_fence_handle **fence,
66 unsigned flags)
Tom Stellarda75c6162012-01-06 17:38:37 -050067{
Andreas Hartmetz45578de2014-01-07 02:40:22 +010068 si_flush(ctx, fence,
69 flags & PIPE_FLUSH_END_OF_FRAME ? RADEON_FLUSH_END_OF_FRAME : 0);
Tom Stellarda75c6162012-01-06 17:38:37 -050070}
71
Andreas Hartmetzeb0ddb62014-01-07 03:07:55 +010072static void si_flush_from_winsys(void *ctx, unsigned flags)
Tom Stellarda75c6162012-01-06 17:38:37 -050073{
Andreas Hartmetz45578de2014-01-07 02:40:22 +010074 si_flush((struct pipe_context*)ctx, NULL, flags);
Tom Stellarda75c6162012-01-06 17:38:37 -050075}
76
Andreas Hartmetzeb0ddb62014-01-07 03:07:55 +010077static void si_destroy_context(struct pipe_context *context)
Tom Stellarda75c6162012-01-06 17:38:37 -050078{
Andreas Hartmetz8662e662014-01-11 16:00:50 +010079 struct si_context *sctx = (struct si_context *)context;
Tom Stellarda75c6162012-01-06 17:38:37 -050080
Andreas Hartmetz8662e662014-01-11 16:00:50 +010081 si_release_all_descriptors(sctx);
Marek Olšákc8e70e62013-08-06 06:42:22 +020082
Andreas Hartmetz8662e662014-01-11 16:00:50 +010083 pipe_resource_reference(&sctx->null_const_buf.buffer, NULL);
84 r600_resource_reference(&sctx->border_color_table, NULL);
Michel Dänzer9ccaa242012-09-07 16:09:08 +020085
Christian König1fa2acb2014-03-08 14:18:30 +010086 si_pm4_delete_state(sctx, gs_rings, sctx->gs_rings);
87 si_pm4_delete_state(sctx, gs_onoff, sctx->gs_on);
88 si_pm4_delete_state(sctx, gs_onoff, sctx->gs_off);
Michel Dänzer404b29d2013-11-21 16:45:28 +090089
Andreas Hartmetz8662e662014-01-11 16:00:50 +010090 if (sctx->dummy_pixel_shader) {
91 sctx->b.b.delete_fs_state(&sctx->b.b, sctx->dummy_pixel_shader);
Michel Dänzer82cd9c02012-08-08 15:35:42 +020092 }
Marek Olšák356c0412013-08-06 21:30:59 +020093 for (int i = 0; i < 8; i++) {
Andreas Hartmetz8662e662014-01-11 16:00:50 +010094 sctx->b.b.delete_depth_stencil_alpha_state(&sctx->b.b, sctx->custom_dsa_flush_depth_stencil[i]);
95 sctx->b.b.delete_depth_stencil_alpha_state(&sctx->b.b, sctx->custom_dsa_flush_depth[i]);
96 sctx->b.b.delete_depth_stencil_alpha_state(&sctx->b.b, sctx->custom_dsa_flush_stencil[i]);
Marek Olšák356c0412013-08-06 21:30:59 +020097 }
Andreas Hartmetz8662e662014-01-11 16:00:50 +010098 sctx->b.b.delete_depth_stencil_alpha_state(&sctx->b.b, sctx->custom_dsa_flush_inplace);
99 sctx->b.b.delete_blend_state(&sctx->b.b, sctx->custom_blend_resolve);
100 sctx->b.b.delete_blend_state(&sctx->b.b, sctx->custom_blend_decompress);
Marek Olšáka38e1fd2014-03-06 02:44:07 +0100101 sctx->b.b.delete_blend_state(&sctx->b.b, sctx->custom_blend_fastclear);
Marek Olšák6a5499b2014-03-04 17:49:39 +0100102 util_unreference_framebuffer_state(&sctx->framebuffer.state);
Tom Stellarda75c6162012-01-06 17:38:37 -0500103
Andreas Hartmetz8662e662014-01-11 16:00:50 +0100104 util_blitter_destroy(sctx->blitter);
Tom Stellarda75c6162012-01-06 17:38:37 -0500105
Christian König58d2afa2014-03-07 21:52:51 +0100106 si_pm4_cleanup(sctx);
107
Andreas Hartmetz8662e662014-01-11 16:00:50 +0100108 r600_common_context_cleanup(&sctx->b);
109 FREE(sctx);
Tom Stellarda75c6162012-01-06 17:38:37 -0500110}
111
Andreas Hartmetzeb0ddb62014-01-07 03:07:55 +0100112static struct pipe_context *si_create_context(struct pipe_screen *screen, void *priv)
Tom Stellarda75c6162012-01-06 17:38:37 -0500113{
Andreas Hartmetz8662e662014-01-11 16:00:50 +0100114 struct si_context *sctx = CALLOC_STRUCT(si_context);
Andreas Hartmetzaa7ae4f2014-01-11 16:01:11 +0100115 struct si_screen* sscreen = (struct si_screen *)screen;
Marek Olšák4569bf92013-10-30 20:44:23 +0100116 int shader, i;
Tom Stellarda75c6162012-01-06 17:38:37 -0500117
Andreas Hartmetz8662e662014-01-11 16:00:50 +0100118 if (sctx == NULL)
Tom Stellarda75c6162012-01-06 17:38:37 -0500119 return NULL;
120
Marek Olšák4e5c70e2014-01-21 18:01:01 +0100121 sctx->b.b.screen = screen; /* this must be set first */
Andreas Hartmetz8662e662014-01-11 16:00:50 +0100122 sctx->b.b.priv = priv;
123 sctx->b.b.destroy = si_destroy_context;
124 sctx->b.b.flush = si_flush_from_st;
Marek Olšák4e5c70e2014-01-21 18:01:01 +0100125 sctx->screen = sscreen; /* Easy accessing of screen/winsys. */
Tom Stellarda75c6162012-01-06 17:38:37 -0500126
Marek Olšák4e5c70e2014-01-21 18:01:01 +0100127 if (!r600_common_context_init(&sctx->b, &sscreen->b))
128 goto fail;
Tom Stellarda75c6162012-01-06 17:38:37 -0500129
Andreas Hartmetz8662e662014-01-11 16:00:50 +0100130 si_init_blit_functions(sctx);
Andreas Hartmetz8662e662014-01-11 16:00:50 +0100131 si_init_compute_functions(sctx);
Tom Stellarda75c6162012-01-06 17:38:37 -0500132
Andreas Hartmetzaa7ae4f2014-01-11 16:01:11 +0100133 if (sscreen->b.info.has_uvd) {
Andreas Hartmetz8662e662014-01-11 16:00:50 +0100134 sctx->b.b.create_video_codec = si_uvd_create_decoder;
135 sctx->b.b.create_video_buffer = si_video_buffer_create;
Christian König5b2855b2013-04-03 10:18:35 +0200136 } else {
Andreas Hartmetz8662e662014-01-11 16:00:50 +0100137 sctx->b.b.create_video_codec = vl_create_decoder;
138 sctx->b.b.create_video_buffer = vl_video_buffer_create;
Christian König5b2855b2013-04-03 10:18:35 +0200139 }
Tom Stellarda75c6162012-01-06 17:38:37 -0500140
Andreas Hartmetz8662e662014-01-11 16:00:50 +0100141 sctx->b.rings.gfx.cs = sctx->b.ws->cs_create(sctx->b.ws, RING_GFX, NULL);
142 sctx->b.rings.gfx.flush = si_flush_from_winsys;
Marek Olšákc8e70e62013-08-06 06:42:22 +0200143
Andreas Hartmetz8662e662014-01-11 16:00:50 +0100144 si_init_all_descriptors(sctx);
Marek Olšákc8e70e62013-08-06 06:42:22 +0200145
Marek Olšáka77ee8b2013-08-26 17:19:39 +0200146 /* Initialize cache_flush. */
Andreas Hartmetz8662e662014-01-11 16:00:50 +0100147 sctx->cache_flush = si_atom_cache_flush;
148 sctx->atoms.cache_flush = &sctx->cache_flush;
Marek Olšáka77ee8b2013-08-26 17:19:39 +0200149
Andreas Hartmetz8662e662014-01-11 16:00:50 +0100150 sctx->atoms.streamout_begin = &sctx->b.streamout.begin_atom;
Marek Olšákf5491292014-03-09 22:12:26 +0100151 sctx->atoms.streamout_enable = &sctx->b.streamout.enable_atom;
Marek Olšák2b0a54d2013-08-14 01:52:38 +0200152
Andreas Hartmetz8662e662014-01-11 16:00:50 +0100153 switch (sctx->b.chip_class) {
Alex Deucher5b3f1ea2013-06-07 13:58:34 -0400154 case SI:
Alex Deucherf29f2062013-06-07 14:00:11 -0400155 case CIK:
Andreas Hartmetz8662e662014-01-11 16:00:50 +0100156 si_init_state_functions(sctx);
Andreas Hartmetz8662e662014-01-11 16:00:50 +0100157 si_init_config(sctx);
Alex Deucherf29f2062013-06-07 14:00:11 -0400158 break;
Tom Stellarda75c6162012-01-06 17:38:37 -0500159 default:
Andreas Hartmetz8662e662014-01-11 16:00:50 +0100160 R600_ERR("Unsupported chip class %d.\n", sctx->b.chip_class);
Marek Olšáka81c3e02013-08-14 01:04:39 +0200161 goto fail;
Tom Stellarda75c6162012-01-06 17:38:37 -0500162 }
163
Andreas Hartmetz8662e662014-01-11 16:00:50 +0100164 sctx->b.ws->cs_set_flush_callback(sctx->b.rings.gfx.cs, si_flush_from_winsys, sctx);
Tom Stellarda75c6162012-01-06 17:38:37 -0500165
Andreas Hartmetz8662e662014-01-11 16:00:50 +0100166 sctx->blitter = util_blitter_create(&sctx->b.b);
167 if (sctx->blitter == NULL)
Marek Olšáka81c3e02013-08-14 01:04:39 +0200168 goto fail;
Tom Stellarda75c6162012-01-06 17:38:37 -0500169
Andreas Hartmetz8662e662014-01-11 16:00:50 +0100170 sctx->dummy_pixel_shader =
171 util_make_fragment_cloneinput_shader(&sctx->b.b, 0,
Michel Dänzer82cd9c02012-08-08 15:35:42 +0200172 TGSI_SEMANTIC_GENERIC,
173 TGSI_INTERPOLATE_CONSTANT);
Andreas Hartmetz8662e662014-01-11 16:00:50 +0100174 sctx->b.b.bind_fs_state(&sctx->b.b, sctx->dummy_pixel_shader);
Michel Dänzer82cd9c02012-08-08 15:35:42 +0200175
Marek Olšák9eb3b9d2013-08-31 00:13:43 +0200176 /* these must be last */
Andreas Hartmetz8662e662014-01-11 16:00:50 +0100177 si_begin_new_cs(sctx);
Marek Olšák62d55c02014-01-22 00:06:32 +0100178 r600_query_init_backend_mask(&sctx->b); /* this emits commands and must be last */
Marek Olšák4569bf92013-10-30 20:44:23 +0100179
180 /* CIK cannot unbind a constant buffer (S_BUFFER_LOAD is buggy
181 * with a NULL buffer). We need to use a dummy buffer instead. */
Andreas Hartmetz8662e662014-01-11 16:00:50 +0100182 if (sctx->b.chip_class == CIK) {
183 sctx->null_const_buf.buffer = pipe_buffer_create(screen, PIPE_BIND_CONSTANT_BUFFER,
Marek Olšákc3211442014-02-03 03:42:17 +0100184 PIPE_USAGE_DEFAULT, 16);
Andreas Hartmetz8662e662014-01-11 16:00:50 +0100185 sctx->null_const_buf.buffer_size = sctx->null_const_buf.buffer->width0;
Marek Olšák4569bf92013-10-30 20:44:23 +0100186
187 for (shader = 0; shader < SI_NUM_SHADERS; shader++) {
188 for (i = 0; i < NUM_CONST_BUFFERS; i++) {
Andreas Hartmetz8662e662014-01-11 16:00:50 +0100189 sctx->b.b.set_constant_buffer(&sctx->b.b, shader, i,
190 &sctx->null_const_buf);
Marek Olšák4569bf92013-10-30 20:44:23 +0100191 }
192 }
193
194 /* Clear the NULL constant buffer, because loads should return zeros. */
Andreas Hartmetz8662e662014-01-11 16:00:50 +0100195 sctx->b.clear_buffer(&sctx->b.b, sctx->null_const_buf.buffer, 0,
196 sctx->null_const_buf.buffer->width0, 0);
Marek Olšák4569bf92013-10-30 20:44:23 +0100197 }
198
Andreas Hartmetz8662e662014-01-11 16:00:50 +0100199 return &sctx->b.b;
Marek Olšáka81c3e02013-08-14 01:04:39 +0200200fail:
Andreas Hartmetz8662e662014-01-11 16:00:50 +0100201 si_destroy_context(&sctx->b.b);
Marek Olšáka81c3e02013-08-14 01:04:39 +0200202 return NULL;
Tom Stellarda75c6162012-01-06 17:38:37 -0500203}
204
205/*
206 * pipe_screen
207 */
Tom Stellarda75c6162012-01-06 17:38:37 -0500208
Andreas Hartmetzeb0ddb62014-01-07 03:07:55 +0100209static int si_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
Tom Stellarda75c6162012-01-06 17:38:37 -0500210{
Andreas Hartmetzaa7ae4f2014-01-11 16:01:11 +0100211 struct si_screen *sscreen = (struct si_screen *)pscreen;
Tom Stellarda75c6162012-01-06 17:38:37 -0500212
213 switch (param) {
214 /* Supported features (boolean caps). */
Tom Stellarda75c6162012-01-06 17:38:37 -0500215 case PIPE_CAP_TWO_SIDED_STENCIL:
Tom Stellard69a92182012-04-14 17:37:37 -0400216 case PIPE_CAP_MAX_DUAL_SOURCE_RENDER_TARGETS:
Tom Stellarda75c6162012-01-06 17:38:37 -0500217 case PIPE_CAP_ANISOTROPIC_FILTER:
218 case PIPE_CAP_POINT_SPRITE:
219 case PIPE_CAP_OCCLUSION_QUERY:
220 case PIPE_CAP_TEXTURE_SHADOW_MAP:
221 case PIPE_CAP_TEXTURE_MIRROR_CLAMP:
222 case PIPE_CAP_BLEND_EQUATION_SEPARATE:
223 case PIPE_CAP_TEXTURE_SWIZZLE:
Tom Stellarda75c6162012-01-06 17:38:37 -0500224 case PIPE_CAP_DEPTH_CLIP_DISABLE:
225 case PIPE_CAP_SHADER_STENCIL_EXPORT:
226 case PIPE_CAP_VERTEX_ELEMENT_INSTANCE_DIVISOR:
227 case PIPE_CAP_MIXED_COLORBUFFER_FORMATS:
228 case PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT:
229 case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER:
230 case PIPE_CAP_SM3:
231 case PIPE_CAP_SEAMLESS_CUBE_MAP:
232 case PIPE_CAP_PRIMITIVE_RESTART:
233 case PIPE_CAP_CONDITIONAL_RENDER:
234 case PIPE_CAP_TEXTURE_BARRIER:
235 case PIPE_CAP_INDEP_BLEND_ENABLE:
236 case PIPE_CAP_INDEP_BLEND_FUNC:
237 case PIPE_CAP_SEAMLESS_CUBE_MAP_PER_TEXTURE:
238 case PIPE_CAP_VERTEX_COLOR_UNCLAMPED:
Marek Olšák2a311b12012-04-24 01:23:33 +0200239 case PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY:
240 case PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY:
241 case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY:
Marek Olšák437ab1d2012-04-24 15:19:31 +0200242 case PIPE_CAP_USER_INDEX_BUFFERS:
243 case PIPE_CAP_USER_CONSTANT_BUFFERS:
Fredrik Höglundaf372122012-06-18 22:50:02 +0200244 case PIPE_CAP_START_INSTANCE:
Michel Dänzerd0f51fe2012-09-05 18:27:02 +0200245 case PIPE_CAP_NPOT_TEXTURES:
Ilia Mirkin12d39b42013-10-04 04:32:15 -0400246 case PIPE_CAP_MIXED_FRAMEBUFFER_SIZES:
Marek Olšák3e10ab62013-03-14 17:18:43 +0100247 case PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER:
Christian Könige4ed5872013-03-21 18:02:52 +0100248 case PIPE_CAP_TGSI_INSTANCEID:
Tom Stellard302f53d2012-10-25 13:50:10 -0400249 case PIPE_CAP_COMPUTE:
Marek Olšákdbeedbb2013-10-31 15:08:49 +0100250 case PIPE_CAP_TEXTURE_BUFFER_OBJECTS:
Marek Olšák1a02bb72013-11-21 15:25:55 +0100251 case PIPE_CAP_TGSI_VS_LAYER:
Marek Olšák8739c602014-01-22 00:08:11 +0100252 case PIPE_CAP_QUERY_PIPELINE_STATISTICS:
Marek Olšák6381dd72014-01-27 21:46:21 +0100253 case PIPE_CAP_BUFFER_MAP_PERSISTENT_COHERENT:
Marek Olšákaafb0f92013-08-17 02:47:21 +0200254 return 1;
Marek Olšák21d9a1b2013-08-16 15:21:45 +0200255
Marek Olšák2f1c4492013-07-30 22:29:30 +0200256 case PIPE_CAP_TEXTURE_MULTISAMPLE:
Marek Olšák751e8692013-11-20 13:48:19 +0100257 /* 2D tiling on CIK is supported since DRM 2.35.0 */
Andreas Hartmetzaa7ae4f2014-01-11 16:01:11 +0100258 return HAVE_LLVM >= 0x0304 && (sscreen->b.chip_class < CIK ||
259 sscreen->b.info.drm_minor >= 35);
Marek Olšák2f1c4492013-07-30 22:29:30 +0200260
Marek Olšákc9f2af32012-10-28 17:52:48 +0100261 case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT:
Marek Olšákde5094d2014-03-09 22:29:20 +0100262 return R600_MAP_BUFFER_ALIGNMENT;
Marek Olšákc9f2af32012-10-28 17:52:48 +0100263
Marek Olšák1b749dc2012-04-24 17:31:17 +0200264 case PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT:
Marek Olšáke2198422014-03-09 20:05:54 +0100265 case PIPE_CAP_TEXTURE_BUFFER_OFFSET_ALIGNMENT:
266 return 4;
Marek Olšák1b749dc2012-04-24 17:31:17 +0200267
Tom Stellarda75c6162012-01-06 17:38:37 -0500268 case PIPE_CAP_GLSL_FEATURE_LEVEL:
Michel Dänzerd7c68e22014-01-24 17:51:34 +0900269 return HAVE_LLVM >= 0x0305 ? 330 : 140;
Marek Olšákdbeedbb2013-10-31 15:08:49 +0100270
Marek Olšákdbeedbb2013-10-31 15:08:49 +0100271 case PIPE_CAP_MAX_TEXTURE_BUFFER_SIZE:
Andreas Hartmetzaa7ae4f2014-01-11 16:01:11 +0100272 return MIN2(sscreen->b.info.vram_size, 0xFFFFFFFF);
Tom Stellarda75c6162012-01-06 17:38:37 -0500273
274 /* Unsupported features. */
Tom Stellarda75c6162012-01-06 17:38:37 -0500275 case PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT:
276 case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER:
Tom Stellarda75c6162012-01-06 17:38:37 -0500277 case PIPE_CAP_TGSI_CAN_COMPACT_CONSTANTS:
278 case PIPE_CAP_FRAGMENT_COLOR_CLAMPED:
279 case PIPE_CAP_VERTEX_COLOR_CLAMPED:
280 case PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION:
Marek Olšák2a311b12012-04-24 01:23:33 +0200281 case PIPE_CAP_USER_VERTEX_BUFFERS:
Maxence Le Dore6d7d8212012-12-13 05:17:35 +0100282 case PIPE_CAP_CUBE_MAP_ARRAY:
Dave Airlie2fcbec42013-09-21 18:45:43 +1000283 case PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS:
284 case PIPE_CAP_TEXTURE_GATHER_SM5:
Marek Olšákde5094d2014-03-09 22:29:20 +0100285 case PIPE_CAP_TGSI_TEXCOORD:
Tom Stellarda75c6162012-01-06 17:38:37 -0500286 return 0;
287
Marek Olšák164de0d2013-10-30 21:44:07 +0100288 case PIPE_CAP_TEXTURE_BORDER_COLOR_QUIRK:
289 return PIPE_QUIRK_TEXTURE_BORDER_COLOR_SWIZZLE_R600;
290
Tom Stellarda75c6162012-01-06 17:38:37 -0500291 /* Stream output. */
292 case PIPE_CAP_MAX_STREAM_OUTPUT_BUFFERS:
Andreas Hartmetzaa7ae4f2014-01-11 16:01:11 +0100293 return sscreen->b.has_streamout ? 4 : 0;
Tom Stellarda75c6162012-01-06 17:38:37 -0500294 case PIPE_CAP_STREAM_OUTPUT_PAUSE_RESUME:
Andreas Hartmetzaa7ae4f2014-01-11 16:01:11 +0100295 return sscreen->b.has_streamout ? 1 : 0;
Tom Stellarda75c6162012-01-06 17:38:37 -0500296 case PIPE_CAP_MAX_STREAM_OUTPUT_SEPARATE_COMPONENTS:
297 case PIPE_CAP_MAX_STREAM_OUTPUT_INTERLEAVED_COMPONENTS:
Andreas Hartmetzaa7ae4f2014-01-11 16:01:11 +0100298 return sscreen->b.has_streamout ? 32*4 : 0;
Tom Stellarda75c6162012-01-06 17:38:37 -0500299
Grigori Goronzyd34d5fd2014-02-09 22:56:20 +0100300 /* Geometry shader output. */
301 case PIPE_CAP_MAX_GEOMETRY_OUTPUT_VERTICES:
302 return 1024;
303 case PIPE_CAP_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS:
304 return 4095;
305
Tom Stellarda75c6162012-01-06 17:38:37 -0500306 /* Texturing. */
307 case PIPE_CAP_MAX_TEXTURE_2D_LEVELS:
Tom Stellarda75c6162012-01-06 17:38:37 -0500308 case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:
Marek Olšák4f1f3232014-03-09 20:03:57 +0100309 return 15; /* 16384 */
310 case PIPE_CAP_MAX_TEXTURE_3D_LEVELS:
311 /* textures support 8192, but layered rendering supports 2048 */
312 return 12;
Tom Stellarda75c6162012-01-06 17:38:37 -0500313 case PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS:
Marek Olšák4f1f3232014-03-09 20:03:57 +0100314 /* textures support 8192, but layered rendering supports 2048 */
315 return 2048;
Tom Stellarda75c6162012-01-06 17:38:37 -0500316
317 /* Render targets. */
318 case PIPE_CAP_MAX_RENDER_TARGETS:
Tom Stellarda75c6162012-01-06 17:38:37 -0500319 return 8;
320
Marek Olšáka62cd692013-09-21 19:45:08 +0200321 case PIPE_CAP_MAX_VIEWPORTS:
322 return 1;
323
Tom Stellarda75c6162012-01-06 17:38:37 -0500324 /* Timer queries, present when the clock frequency is non zero. */
Niels Ole Salscheiderdb6f4162013-08-09 11:59:28 +0200325 case PIPE_CAP_QUERY_TIMESTAMP:
José Fonseca99762162012-12-09 09:50:34 +0000326 case PIPE_CAP_QUERY_TIME_ELAPSED:
Andreas Hartmetzaa7ae4f2014-01-11 16:01:11 +0100327 return sscreen->b.info.r600_clock_crystal_freq != 0;
Tom Stellarda75c6162012-01-06 17:38:37 -0500328
329 case PIPE_CAP_MIN_TEXEL_OFFSET:
330 return -8;
331
332 case PIPE_CAP_MAX_TEXEL_OFFSET:
333 return 7;
Tom Stellard4e90bc92013-07-09 21:21:39 -0700334 case PIPE_CAP_ENDIANNESS:
335 return PIPE_ENDIAN_LITTLE;
Tom Stellarda75c6162012-01-06 17:38:37 -0500336 }
337 return 0;
338}
339
Andreas Hartmetzeb0ddb62014-01-07 03:07:55 +0100340static int si_get_shader_param(struct pipe_screen* pscreen, unsigned shader, enum pipe_shader_cap param)
Tom Stellarda75c6162012-01-06 17:38:37 -0500341{
Tom Stellarda75c6162012-01-06 17:38:37 -0500342 switch(shader)
343 {
344 case PIPE_SHADER_FRAGMENT:
345 case PIPE_SHADER_VERTEX:
346 break;
347 case PIPE_SHADER_GEOMETRY:
Michel Dänzerd7c68e22014-01-24 17:51:34 +0900348#if HAVE_LLVM < 0x0305
Tom Stellarda75c6162012-01-06 17:38:37 -0500349 return 0;
Michel Dänzerd7c68e22014-01-24 17:51:34 +0900350#endif
351 break;
Tom Stellard302f53d2012-10-25 13:50:10 -0400352 case PIPE_SHADER_COMPUTE:
353 switch (param) {
354 case PIPE_SHADER_CAP_PREFERRED_IR:
355 return PIPE_SHADER_IR_LLVM;
356 default:
357 return 0;
358 }
Tom Stellarda75c6162012-01-06 17:38:37 -0500359 default:
360 /* TODO: support tessellation */
361 return 0;
362 }
363
Tom Stellarda75c6162012-01-06 17:38:37 -0500364 switch (param) {
365 case PIPE_SHADER_CAP_MAX_INSTRUCTIONS:
366 case PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS:
367 case PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS:
368 case PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS:
369 return 16384;
370 case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH:
Marek Olšák225228a2013-01-31 19:40:24 +0100371 return 32;
Tom Stellarda75c6162012-01-06 17:38:37 -0500372 case PIPE_SHADER_CAP_MAX_INPUTS:
Marek Olšák225228a2013-01-31 19:40:24 +0100373 return 32;
Tom Stellarda75c6162012-01-06 17:38:37 -0500374 case PIPE_SHADER_CAP_MAX_TEMPS:
375 return 256; /* Max native temporaries. */
376 case PIPE_SHADER_CAP_MAX_ADDRS:
377 /* FIXME Isn't this equal to TEMPS? */
378 return 1; /* Max native address registers */
379 case PIPE_SHADER_CAP_MAX_CONSTS:
Christian König8c808942013-02-04 17:55:32 +0100380 return 4096; /* actually only memory limits this */
Tom Stellarda75c6162012-01-06 17:38:37 -0500381 case PIPE_SHADER_CAP_MAX_CONST_BUFFERS:
Marek Olšák2fd42002013-10-25 11:45:47 +0200382 return NUM_PIPE_CONST_BUFFERS;
Tom Stellarda75c6162012-01-06 17:38:37 -0500383 case PIPE_SHADER_CAP_MAX_PREDS:
384 return 0; /* FIXME */
385 case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
386 return 1;
Brian Paul13f3ae52013-02-01 11:16:54 -0700387 case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED:
388 return 0;
Tom Stellarda75c6162012-01-06 17:38:37 -0500389 case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:
Michel Dänzer3b3687a2014-01-22 18:47:21 +0900390 /* Indirection of geometry shader input dimension is not
391 * handled yet
392 */
393 return shader < PIPE_SHADER_GEOMETRY;
Tom Stellarda75c6162012-01-06 17:38:37 -0500394 case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR:
395 case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
396 case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
Christian König90862c852013-03-07 12:00:18 +0100397 return 1;
Tom Stellardae9be352012-07-25 08:22:30 -0400398 case PIPE_SHADER_CAP_INTEGERS:
399 return 1;
Tom Stellarda75c6162012-01-06 17:38:37 -0500400 case PIPE_SHADER_CAP_SUBROUTINES:
401 return 0;
402 case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
Roland Scheidegger2983c032013-11-26 02:30:41 +0100403 case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:
Tom Stellarda75c6162012-01-06 17:38:37 -0500404 return 16;
Marek Olšák7b01bc12012-10-11 21:35:45 +0200405 case PIPE_SHADER_CAP_PREFERRED_IR:
406 return PIPE_SHADER_IR_TGSI;
Tom Stellarda75c6162012-01-06 17:38:37 -0500407 }
408 return 0;
409}
410
Andreas Hartmetzeb0ddb62014-01-07 03:07:55 +0100411static void si_destroy_screen(struct pipe_screen* pscreen)
Tom Stellarda75c6162012-01-06 17:38:37 -0500412{
Andreas Hartmetzaa7ae4f2014-01-11 16:01:11 +0100413 struct si_screen *sscreen = (struct si_screen *)pscreen;
Tom Stellarda75c6162012-01-06 17:38:37 -0500414
Andreas Hartmetzaa7ae4f2014-01-11 16:01:11 +0100415 if (sscreen == NULL)
Tom Stellarda75c6162012-01-06 17:38:37 -0500416 return;
417
Andreas Hartmetzaa7ae4f2014-01-11 16:01:11 +0100418 if (!radeon_winsys_unref(sscreen->b.ws))
Christian König48711282013-09-25 13:59:56 +0200419 return;
420
Marek Olšáked42e952014-01-22 02:49:53 +0100421 r600_destroy_common_screen(&sscreen->b);
Tom Stellarda75c6162012-01-06 17:38:37 -0500422}
423
Tom Stellarda75c6162012-01-06 17:38:37 -0500424struct pipe_screen *radeonsi_screen_create(struct radeon_winsys *ws)
425{
Andreas Hartmetzaa7ae4f2014-01-11 16:01:11 +0100426 struct si_screen *sscreen = CALLOC_STRUCT(si_screen);
427 if (sscreen == NULL) {
Tom Stellarda75c6162012-01-06 17:38:37 -0500428 return NULL;
429 }
430
Marek Olšák09fc5d62013-09-22 21:47:35 +0200431 /* Set functions first. */
Andreas Hartmetzaa7ae4f2014-01-11 16:01:11 +0100432 sscreen->b.b.context_create = si_create_context;
433 sscreen->b.b.destroy = si_destroy_screen;
Andreas Hartmetzaa7ae4f2014-01-11 16:01:11 +0100434 sscreen->b.b.get_param = si_get_param;
435 sscreen->b.b.get_shader_param = si_get_shader_param;
Andreas Hartmetzaa7ae4f2014-01-11 16:01:11 +0100436 sscreen->b.b.is_format_supported = si_is_format_supported;
Tom Stellard7b4592a2014-01-28 06:51:50 -0800437 sscreen->b.b.resource_create = r600_resource_create_common;
Marek Olšák09fc5d62013-09-22 21:47:35 +0200438
Andreas Hartmetzaa7ae4f2014-01-11 16:01:11 +0100439 if (!r600_common_screen_init(&sscreen->b, ws)) {
440 FREE(sscreen);
Marek Olšák1bb77f82013-09-22 22:12:18 +0200441 return NULL;
442 }
Tom Stellarda75c6162012-01-06 17:38:37 -0500443
Andreas Hartmetzaa7ae4f2014-01-11 16:01:11 +0100444 sscreen->b.has_cp_dma = true;
445 sscreen->b.has_streamout = HAVE_LLVM >= 0x0304;
Marek Olšákbba39d82013-11-28 15:09:35 +0100446
Marek Olšák0cb9de12013-09-22 15:34:12 +0200447 if (debug_get_bool_option("RADEON_DUMP_SHADERS", FALSE))
Andreas Hartmetzaa7ae4f2014-01-11 16:01:11 +0100448 sscreen->b.debug_flags |= DBG_FS | DBG_VS | DBG_GS | DBG_PS | DBG_CS;
Marek Olšák0cb9de12013-09-22 15:34:12 +0200449
Marek Olšákb893bbf2013-10-03 16:39:50 +0200450 /* Create the auxiliary context. This must be done last. */
Andreas Hartmetzaa7ae4f2014-01-11 16:01:11 +0100451 sscreen->b.aux_context = sscreen->b.b.context_create(&sscreen->b.b, NULL);
Marek Olšákb893bbf2013-10-03 16:39:50 +0200452
Andreas Hartmetzaa7ae4f2014-01-11 16:01:11 +0100453 return &sscreen->b.b;
Tom Stellarda75c6162012-01-06 17:38:37 -0500454}