blob: 704d129c81c8934d01ab989c8bfd3f0a80e8f66d [file] [log] [blame]
Alyssa Rosenzweig629c5162019-07-08 09:25:08 -07001/*
2 * Copyright (C) 2008 VMware, Inc.
3 * Copyright (C) 2014 Broadcom
4 * Copyright (C) 2018 Alyssa Rosenzweig
5 * Copyright (C) 2019 Collabora, Ltd.
Alyssa Rosenzweig16977602019-07-23 10:41:25 -07006 * Copyright (C) 2012 Rob Clark <robclark@freedesktop.org>
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +00007 *
8 * Permission is hereby granted, free of charge, to any person obtaining a
Alyssa Rosenzweig629c5162019-07-08 09:25:08 -07009 * copy of this software and associated documentation files (the "Software"),
10 * to deal in the Software without restriction, including without limitation
11 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12 * and/or sell copies of the Software, and to permit persons to whom the
13 * Software is furnished to do so, subject to the following conditions:
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +000014 *
Alyssa Rosenzweig629c5162019-07-08 09:25:08 -070015 * The above copyright notice and this permission notice (including the next
16 * paragraph) shall be included in all copies or substantial portions of the
17 * Software.
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +000018 *
Alyssa Rosenzweig629c5162019-07-08 09:25:08 -070019 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
25 * SOFTWARE.
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +000026 *
Alyssa Rosenzweig629c5162019-07-08 09:25:08 -070027 */
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +000028
Tomeu Vizoso97f2d042019-03-08 15:24:57 +010029#include "util/u_debug.h"
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +000030#include "util/u_memory.h"
Eric Anholt882ca6d2019-06-27 15:05:31 -070031#include "util/format/u_format.h"
32#include "util/format/u_format_s3tc.h"
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +000033#include "util/u_video.h"
Alyssa Rosenzweig8f4485e2019-02-05 02:19:38 +000034#include "util/u_screen.h"
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +000035#include "util/os_time.h"
Alyssa Rosenzweig1f8b6532019-08-05 08:20:24 -070036#include "util/u_process.h"
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +000037#include "pipe/p_defines.h"
38#include "pipe/p_screen.h"
39#include "draw/draw_context.h"
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +000040
41#include <fcntl.h>
42
Eric Engestromf1374802019-02-12 18:18:03 +000043#include "drm-uapi/drm_fourcc.h"
Boris Brezillon0500c9e2019-09-14 08:00:27 +020044#include "drm-uapi/panfrost_drm.h"
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +000045
Boris Brezillon154cb722019-09-14 09:58:55 +020046#include "pan_bo.h"
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +000047#include "pan_screen.h"
48#include "pan_resource.h"
49#include "pan_public.h"
Tomeu Vizoso97f2d042019-03-08 15:24:57 +010050#include "pan_util.h"
Alyssa Rosenzweig1c62b552020-08-05 16:16:00 -040051#include "decode.h"
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +000052
53#include "pan_context.h"
Alyssa Rosenzweig7da251f2019-02-05 04:32:27 +000054#include "midgard/midgard_compile.h"
Alyssa Rosenzweig23620d12020-04-08 19:05:57 -040055#include "bifrost/bifrost_compile.h"
Tomeu Vizoso6887ff42019-11-28 10:21:06 +010056#include "panfrost-quirks.h"
Alyssa Rosenzweig7da251f2019-02-05 04:32:27 +000057
Tomeu Vizoso97f2d042019-03-08 15:24:57 +010058static const struct debug_named_value debug_options[] = {
Alyssa Rosenzweiga2d0ea92019-07-10 10:10:31 -070059 {"msgs", PAN_DBG_MSGS, "Print debug messages"},
60 {"trace", PAN_DBG_TRACE, "Trace the command stream"},
61 {"deqp", PAN_DBG_DEQP, "Hacks for dEQP"},
Alyssa Rosenzweig2a121752020-07-22 12:11:39 -040062 {"afbc", PAN_DBG_AFBC, "Enable AFBC buffer sharing"},
Tomeu Vizoso63ae9e62019-12-09 08:39:59 +010063 {"sync", PAN_DBG_SYNC, "Wait for each job's completion and check for any GPU fault"},
Alyssa Rosenzweig271726e2019-12-13 15:13:02 -050064 {"precompile", PAN_DBG_PRECOMPILE, "Precompile shaders for shader-db"},
Alyssa Rosenzweig610af7e2020-07-17 17:04:41 -040065 {"nofp16", PAN_DBG_NOFP16, "Disable 16-bit support"},
Alyssa Rosenzweigbccb3de2020-05-29 19:24:45 -040066 {"bifrost", PAN_DBG_BIFROST, "Enable experimental Mali G31 and G52 support"},
Icecream956b886fbc2020-06-21 18:22:21 +120067 {"gl3", PAN_DBG_GL3, "Enable experimental GL 3.x implementation, up to 3.3"},
Icecream95210db652020-10-09 22:39:40 +130068 {"noafbc", PAN_DBG_NO_AFBC, "Disable AFBC support"},
Alyssa Rosenzweiga2d0ea92019-07-10 10:10:31 -070069 DEBUG_NAMED_VALUE_END
Tomeu Vizoso97f2d042019-03-08 15:24:57 +010070};
71
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +000072static const char *
73panfrost_get_name(struct pipe_screen *screen)
74{
Alyssa Rosenzweigca8c6252020-03-23 18:44:21 -040075 return panfrost_model_name(pan_device(screen)->gpu_id);
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +000076}
77
78static const char *
79panfrost_get_vendor(struct pipe_screen *screen)
80{
Alyssa Rosenzweig7c972eb2019-12-09 16:02:17 -050081 return "Panfrost";
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +000082}
83
84static const char *
85panfrost_get_device_vendor(struct pipe_screen *screen)
86{
87 return "Arm";
88}
89
90static int
91panfrost_get_param(struct pipe_screen *screen, enum pipe_cap param)
92{
Alyssa Rosenzweigb5de4232019-07-08 08:44:49 -070093 /* We expose in-dev stuff for dEQP that we don't want apps to use yet */
Alyssa Rosenzweig30f07e02020-05-01 12:05:01 -040094 struct panfrost_device *dev = pan_device(screen);
Alyssa Rosenzweiged1910d2020-07-07 16:15:45 -040095 bool is_deqp = dev->debug & PAN_DBG_DEQP;
Alyssa Rosenzweigb5de4232019-07-08 08:44:49 -070096
Icecream956b886fbc2020-06-21 18:22:21 +120097 /* Our GL 3.x implementation is WIP */
Alyssa Rosenzweiged1910d2020-07-07 16:15:45 -040098 bool is_gl3 = dev->debug & PAN_DBG_GL3;
Icecream956b886fbc2020-06-21 18:22:21 +120099 is_gl3 |= is_deqp;
100
Alyssa Rosenzweig96fa8d72020-07-15 18:38:02 -0400101 /* Don't expose MRT related CAPs on GPUs that don't implement them */
102 bool has_mrt = !(dev->quirks & MIDGARD_SFBD);
103
104 /* Bifrost is WIP. No MRT support yet. */
105 bool is_bifrost = (dev->quirks & IS_BIFROST);
106 has_mrt &= !is_bifrost;
Alyssa Rosenzweig5491a132020-02-20 09:30:42 -0500107
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +0000108 switch (param) {
109 case PIPE_CAP_NPOT_TEXTURES:
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +0000110 case PIPE_CAP_MIXED_COLOR_DEPTH_BITS:
Erik Faye-Lund39e7fbf2019-07-05 16:36:41 +0200111 case PIPE_CAP_FRAGMENT_SHADER_TEXTURE_LOD:
Erik Faye-Lund39e7fbf2019-07-05 16:36:41 +0200112 case PIPE_CAP_VERTEX_SHADER_SATURATE:
Icecream95faf28b82020-05-17 16:26:00 +1200113 case PIPE_CAP_VERTEX_COLOR_UNCLAMPED:
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +0000114 case PIPE_CAP_POINT_SPRITE:
Icecream95ec628ab2020-05-14 15:58:04 +1200115 case PIPE_CAP_DEPTH_CLIP_DISABLE:
Icecream955857a012020-09-05 12:02:10 +1200116 case PIPE_CAP_DEPTH_CLIP_DISABLE_SEPARATE:
Alyssa Rosenzweig96fa8d72020-07-15 18:38:02 -0400117 case PIPE_CAP_MIXED_COLORBUFFER_FORMATS:
118 case PIPE_CAP_MIXED_FRAMEBUFFER_SIZES:
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +0000119 return 1;
120
121 case PIPE_CAP_MAX_RENDER_TARGETS:
Icecream95c4171722020-07-06 12:03:46 +1200122 case PIPE_CAP_FBFETCH:
123 case PIPE_CAP_FBFETCH_COHERENT:
Icecream953ec252a2020-07-14 12:05:47 +1200124 return has_mrt ? 8 : 1;
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +0000125
Icecream956b886fbc2020-06-21 18:22:21 +1200126 case PIPE_CAP_MAX_DUAL_SOURCE_RENDER_TARGETS:
Icecream95787c1ed2020-06-25 22:56:14 +1200127 return 1;
Icecream956b886fbc2020-06-21 18:22:21 +1200128
Alyssa Rosenzweig82256042020-07-15 11:38:39 -0400129 case PIPE_CAP_SAMPLE_SHADING:
130 /* WIP */
131 return is_gl3 ? 1 : 0;
132
Alyssa Rosenzweig2f93ecd2019-07-22 20:11:04 -0700133
Alyssa Rosenzweig96fa8d72020-07-15 18:38:02 -0400134 /* ES3 features unsupported on Bifrost */
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +0000135 case PIPE_CAP_OCCLUSION_QUERY:
Alyssa Rosenzweigf277bd32019-03-25 04:57:27 +0000136 case PIPE_CAP_TGSI_INSTANCEID:
Alyssa Rosenzweig96fa8d72020-07-15 18:38:02 -0400137 case PIPE_CAP_TEXTURE_MULTISAMPLE:
Alyssa Rosenzweigb75427c2020-07-21 18:54:18 -0400138 case PIPE_CAP_SURFACE_SAMPLE_COUNT:
Alyssa Rosenzweigf5b6dfc2020-02-20 09:43:34 -0500139 case PIPE_CAP_PRIMITIVE_RESTART:
Neil Robertsbb5fc902020-06-18 15:18:54 +0200140 case PIPE_CAP_PRIMITIVE_RESTART_FIXED_INDEX:
Alyssa Rosenzweig96fa8d72020-07-15 18:38:02 -0400141 return !is_bifrost;
142
143 case PIPE_CAP_SAMPLER_VIEW_TARGET:
144 case PIPE_CAP_TEXTURE_SWIZZLE:
145 case PIPE_CAP_TEXTURE_MIRROR_CLAMP:
146 case PIPE_CAP_TEXTURE_MIRROR_CLAMP_TO_EDGE:
147 case PIPE_CAP_VERTEX_ELEMENT_INSTANCE_DIVISOR:
148 case PIPE_CAP_BLEND_EQUATION_SEPARATE:
149 case PIPE_CAP_INDEP_BLEND_ENABLE:
150 case PIPE_CAP_INDEP_BLEND_FUNC:
151 case PIPE_CAP_GENERATE_MIPMAP:
152 case PIPE_CAP_ACCELERATED:
153 case PIPE_CAP_UMA:
154 case PIPE_CAP_TEXTURE_FLOAT_LINEAR:
155 case PIPE_CAP_TEXTURE_HALF_FLOAT_LINEAR:
156 case PIPE_CAP_COPY_BETWEEN_COMPRESSED_AND_PLAIN_FORMATS:
157 case PIPE_CAP_TGSI_ARRAY_COMPONENTS:
Alyssa Rosenzweigbef716b2020-01-18 09:44:19 -0500158 return 1;
Alyssa Rosenzweigb5de4232019-07-08 08:44:49 -0700159
160 case PIPE_CAP_MAX_STREAM_OUTPUT_BUFFERS:
Alyssa Rosenzweig96fa8d72020-07-15 18:38:02 -0400161 return is_bifrost ? 0 : 4;
Alyssa Rosenzweigb5de4232019-07-08 08:44:49 -0700162 case PIPE_CAP_MAX_STREAM_OUTPUT_SEPARATE_COMPONENTS:
163 case PIPE_CAP_MAX_STREAM_OUTPUT_INTERLEAVED_COMPONENTS:
Alyssa Rosenzweig96fa8d72020-07-15 18:38:02 -0400164 return is_bifrost ? 0 : 64;
Ilia Mirkin4c050f22020-08-09 00:13:14 -0400165 case PIPE_CAP_STREAM_OUTPUT_PAUSE_RESUME:
Alyssa Rosenzweig4dba4932019-08-08 09:21:27 -0700166 case PIPE_CAP_STREAM_OUTPUT_INTERLEAVE_BUFFERS:
Alyssa Rosenzweig96fa8d72020-07-15 18:38:02 -0400167 return is_bifrost ? 0 : 1;
Alyssa Rosenzweigb5de4232019-07-08 08:44:49 -0700168
169 case PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS:
Alyssa Rosenzweig96fa8d72020-07-15 18:38:02 -0400170 return is_bifrost ? 0 : 256;
Alyssa Rosenzweigb5de4232019-07-08 08:44:49 -0700171
172 case PIPE_CAP_GLSL_FEATURE_LEVEL:
173 case PIPE_CAP_GLSL_FEATURE_LEVEL_COMPATIBILITY:
Alyssa Rosenzweig96fa8d72020-07-15 18:38:02 -0400174 return is_gl3 ? 330 : (is_bifrost ? 120 : 140);
Alyssa Rosenzweigb5de4232019-07-08 08:44:49 -0700175 case PIPE_CAP_ESSL_FEATURE_LEVEL:
Alyssa Rosenzweig96fa8d72020-07-15 18:38:02 -0400176 return is_bifrost ? 120 : 300;
Alyssa Rosenzweigb5de4232019-07-08 08:44:49 -0700177
178 case PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT:
Alyssa Rosenzweigbef716b2020-01-18 09:44:19 -0500179 return 16;
Alyssa Rosenzweigb5de4232019-07-08 08:44:49 -0700180
Alyssa Rosenzweig5491a132020-02-20 09:30:42 -0500181 /* For faking GLES 3.1 for dEQP-GLES31 */
Alyssa Rosenzweig2f93ecd2019-07-22 20:11:04 -0700182 case PIPE_CAP_IMAGE_LOAD_FORMATTED:
Alyssa Rosenzweig5491a132020-02-20 09:30:42 -0500183 case PIPE_CAP_CUBE_MAP_ARRAY:
Alyssa Rosenzweigc8bc6642019-07-23 09:05:40 -0700184 case PIPE_CAP_COMPUTE:
185 return is_deqp;
Alyssa Rosenzweig96fa8d72020-07-15 18:38:02 -0400186 case PIPE_CAP_MAX_TEXTURE_BUFFER_SIZE:
187 return is_deqp ? 65536 : 0;
Alyssa Rosenzweigc8bc6642019-07-23 09:05:40 -0700188
Icecream9501147482020-07-17 22:15:42 +1200189 case PIPE_CAP_TEXTURE_BUFFER_OBJECTS:
Icecream956b886fbc2020-06-21 18:22:21 +1200190 case PIPE_CAP_QUERY_TIMESTAMP:
191 case PIPE_CAP_CONDITIONAL_RENDER:
192 return is_gl3;
193
Alyssa Rosenzweige03622e2020-08-13 15:19:07 -0400194 /* TODO: Where does this req come from in practice? */
195 case PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY:
196 return 1;
197
Eric Anholt0c31fe92019-04-29 15:38:24 -0700198 case PIPE_CAP_MAX_TEXTURE_2D_SIZE:
199 return 4096;
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +0000200 case PIPE_CAP_MAX_TEXTURE_3D_LEVELS:
Alyssa Rosenzweig96fa8d72020-07-15 18:38:02 -0400201 return is_bifrost ? 0 : 13;
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +0000202 case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:
203 return 13;
204
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +0000205 case PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT:
Alyssa Rosenzweig2adf35e2019-05-23 03:01:32 +0000206 /* Hardware is natively upper left */
207 return 0;
208
209 case PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT:
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +0000210 case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER:
211 case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER:
Alyssa Rosenzweig96fa8d72020-07-15 18:38:02 -0400212 case PIPE_CAP_TGSI_TEXCOORD:
Alyssa Rosenzweigffcc4d12019-06-21 13:57:42 -0700213 return 1;
214
Alyssa Rosenzweig30f07e02020-05-01 12:05:01 -0400215 /* We would prefer varyings on Midgard, but proper sysvals on Bifrost */
Alyssa Rosenzweige9139862019-07-31 12:24:32 -0700216 case PIPE_CAP_TGSI_FS_FACE_IS_INTEGER_SYSVAL:
217 case PIPE_CAP_TGSI_FS_POSITION_IS_SYSVAL:
Alyssa Rosenzweig3f8abd82020-06-01 18:26:03 -0400218 case PIPE_CAP_TGSI_FS_POINT_IS_SYSVAL:
Alyssa Rosenzweig96fa8d72020-07-15 18:38:02 -0400219 return is_bifrost;
Alyssa Rosenzweig4b0001c2019-08-07 12:00:14 -0700220
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +0000221 case PIPE_CAP_SEAMLESS_CUBE_MAP:
222 case PIPE_CAP_SEAMLESS_CUBE_MAP_PER_TEXTURE:
Alyssa Rosenzweig96fa8d72020-07-15 18:38:02 -0400223 return !is_bifrost;
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +0000224
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +0000225 case PIPE_CAP_MAX_VERTEX_ELEMENT_SRC_OFFSET:
226 return 0xffff;
227
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +0000228 case PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER:
229 return 0;
230
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +0000231 case PIPE_CAP_ENDIANNESS:
232 return PIPE_ENDIAN_NATIVE;
233
Alyssa Rosenzweig8ff6e7c2020-08-28 09:53:30 -0400234 case PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS:
235 return is_deqp ? 4 : 0;
236
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +0000237 case PIPE_CAP_MIN_TEXTURE_GATHER_OFFSET:
Alyssa Rosenzweigb5de4232019-07-08 08:44:49 -0700238 return -8;
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +0000239
240 case PIPE_CAP_MAX_TEXTURE_GATHER_OFFSET:
Alyssa Rosenzweigb5de4232019-07-08 08:44:49 -0700241 return 7;
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +0000242
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +0000243 case PIPE_CAP_VIDEO_MEMORY: {
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +0000244 uint64_t system_memory;
245
246 if (!os_get_total_physical_memory(&system_memory))
247 return 0;
248
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +0000249 return (int)(system_memory >> 20);
250 }
251
Boris Brezillon38c20692020-01-31 10:55:49 +0100252 case PIPE_CAP_SHADER_STENCIL_EXPORT:
Alyssa Rosenzweig96fa8d72020-07-15 18:38:02 -0400253 return !is_bifrost;
Boris Brezillon38c20692020-01-31 10:55:49 +0100254
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +0000255 case PIPE_CAP_SHADER_BUFFER_OFFSET_ALIGNMENT:
256 return 4;
257
Karol Herbst6010d7b2017-08-25 19:22:03 +0200258 case PIPE_CAP_MAX_VARYINGS:
259 return 16;
260
Erik Faye-Lund2da792d2019-10-07 12:07:20 +0200261 case PIPE_CAP_ALPHA_TEST:
Alyssa Rosenzweig62d056d2019-12-27 15:33:33 -0500262 case PIPE_CAP_FLATSHADE:
263 case PIPE_CAP_TWO_SIDED_COLOR:
264 case PIPE_CAP_CLIP_PLANES:
Erik Faye-Lund2da792d2019-10-07 12:07:20 +0200265 return 0;
266
Louis-Francis Ratté-Boulianne2d322482019-10-12 03:04:22 -0400267 case PIPE_CAP_PACKED_STREAM_OUTPUT:
268 return 0;
269
270 case PIPE_CAP_VIEWPORT_TRANSFORM_LOWERED:
271 case PIPE_CAP_PSIZ_CLAMPED:
272 return 1;
273
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +0000274 default:
Alyssa Rosenzweig8f4485e2019-02-05 02:19:38 +0000275 return u_pipe_screen_get_param_defaults(screen, param);
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +0000276 }
277}
278
279static int
280panfrost_get_shader_param(struct pipe_screen *screen,
281 enum pipe_shader_type shader,
282 enum pipe_shader_cap param)
283{
Alyssa Rosenzweigc2a8ef92020-03-27 14:39:39 -0400284 struct panfrost_device *dev = pan_device(screen);
Alyssa Rosenzweiged1910d2020-07-07 16:15:45 -0400285 bool is_deqp = dev->debug & PAN_DBG_DEQP;
Alyssa Rosenzweig610af7e2020-07-17 17:04:41 -0400286 bool is_nofp16 = dev->debug & PAN_DBG_NOFP16;
Alyssa Rosenzweig96fa8d72020-07-15 18:38:02 -0400287 bool is_bifrost = dev->quirks & IS_BIFROST;
Alyssa Rosenzweig2f93ecd2019-07-22 20:11:04 -0700288
Alyssa Rosenzweigc8bc6642019-07-23 09:05:40 -0700289 if (shader != PIPE_SHADER_VERTEX &&
290 shader != PIPE_SHADER_FRAGMENT &&
291 !(shader == PIPE_SHADER_COMPUTE && is_deqp))
292 return 0;
293
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +0000294 /* this is probably not totally correct.. but it's a start: */
295 switch (param) {
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +0000296 case PIPE_SHADER_CAP_MAX_INSTRUCTIONS:
297 case PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS:
298 case PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS:
299 case PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS:
300 return 16384;
301
302 case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH:
303 return 1024;
304
305 case PIPE_SHADER_CAP_MAX_INPUTS:
306 return 16;
307
308 case PIPE_SHADER_CAP_MAX_OUTPUTS:
Icecream953ec252a2020-07-14 12:05:47 +1200309 return shader == PIPE_SHADER_FRAGMENT ? 8 : 16;
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +0000310
311 case PIPE_SHADER_CAP_MAX_TEMPS:
312 return 256; /* GL_MAX_PROGRAM_TEMPORARIES_ARB */
313
314 case PIPE_SHADER_CAP_MAX_CONST_BUFFER_SIZE:
315 return 16 * 1024 * sizeof(float);
316
317 case PIPE_SHADER_CAP_MAX_CONST_BUFFERS:
Alyssa Rosenzweigfae790e2019-07-15 11:30:35 -0700318 return PAN_MAX_CONST_BUFFERS;
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +0000319
320 case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
321 return 0;
322
323 case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:
Alyssa Rosenzweig96fa8d72020-07-15 18:38:02 -0400324 return is_bifrost ? 0 : 1;
Alyssa Rosenzweig12cd89d2019-04-21 05:11:02 +0000325 case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR:
326 return 0;
Alyssa Rosenzweig6a466c02019-04-20 23:52:42 +0000327
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +0000328 case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
329 return 0;
330
331 case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
Alyssa Rosenzweig96fa8d72020-07-15 18:38:02 -0400332 return is_bifrost ? 0 : 1;
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +0000333
334 case PIPE_SHADER_CAP_SUBROUTINES:
335 return 0;
336
337 case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED:
338 return 0;
339
340 case PIPE_SHADER_CAP_INTEGERS:
341 return 1;
342
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +0000343 case PIPE_SHADER_CAP_FP16:
Rob Clarkc4e0cae2020-08-05 10:21:46 -0700344 case PIPE_SHADER_CAP_GLSL_16BIT_CONSTS:
Alyssa Rosenzweig610af7e2020-07-17 17:04:41 -0400345 return !is_nofp16;
Alyssa Rosenzweigc2a8ef92020-03-27 14:39:39 -0400346
Marek Olšák1af8fe42020-05-10 17:05:00 -0400347 case PIPE_SHADER_CAP_FP16_DERIVATIVES:
348 case PIPE_SHADER_CAP_INT16:
Alyssa Rosenzweigc2a8ef92020-03-27 14:39:39 -0400349 case PIPE_SHADER_CAP_INT64_ATOMICS:
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +0000350 case PIPE_SHADER_CAP_TGSI_DROUND_SUPPORTED:
351 case PIPE_SHADER_CAP_TGSI_DFRACEXP_DLDEXP_SUPPORTED:
352 case PIPE_SHADER_CAP_TGSI_LDEXP_SUPPORTED:
353 case PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED:
354 case PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE:
355 return 0;
356
357 case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
358 case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:
359 return 16; /* XXX: How many? */
360
361 case PIPE_SHADER_CAP_PREFERRED_IR:
362 return PIPE_SHADER_IR_NIR;
363
364 case PIPE_SHADER_CAP_SUPPORTED_IRS:
Alyssa Rosenzweig728a9752019-10-19 17:14:44 -0400365 return (1 << PIPE_SHADER_IR_NIR) | (1 << PIPE_SHADER_IR_NIR_SERIALIZED);
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +0000366
367 case PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HINT:
368 return 32;
369
370 case PIPE_SHADER_CAP_MAX_SHADER_BUFFERS:
371 case PIPE_SHADER_CAP_MAX_SHADER_IMAGES:
Alyssa Rosenzweig995e4372020-02-26 13:37:10 -0500372 return is_deqp ? 8 : 0;
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +0000373 case PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTERS:
374 case PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTER_BUFFERS:
Alyssa Rosenzweig31c9fcb2019-07-23 19:18:44 -0700375 return 0;
Alyssa Rosenzweig2f93ecd2019-07-22 20:11:04 -0700376
377 case PIPE_SHADER_CAP_TGSI_SKIP_MERGE_REGISTERS:
378 case PIPE_SHADER_CAP_LOWER_IF_THRESHOLD:
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +0000379 return 0;
380
381 default:
Alyssa Rosenzweiged1910d2020-07-07 16:15:45 -0400382 /* Other params are unknown */
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +0000383 return 0;
384 }
385
386 return 0;
387}
388
389static float
390panfrost_get_paramf(struct pipe_screen *screen, enum pipe_capf param)
391{
392 switch (param) {
393 case PIPE_CAPF_MAX_LINE_WIDTH:
394
395 /* fall-through */
396 case PIPE_CAPF_MAX_LINE_WIDTH_AA:
397 return 255.0; /* arbitrary */
398
399 case PIPE_CAPF_MAX_POINT_WIDTH:
400
401 /* fall-through */
402 case PIPE_CAPF_MAX_POINT_WIDTH_AA:
Alyssa Rosenzweigbb483a92019-07-10 11:30:00 -0700403 return 1024.0;
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +0000404
405 case PIPE_CAPF_MAX_TEXTURE_ANISOTROPY:
406 return 16.0;
407
408 case PIPE_CAPF_MAX_TEXTURE_LOD_BIAS:
409 return 16.0; /* arbitrary */
410
Tomeu Vizoso1b97d9c2019-05-09 14:07:45 +0200411 case PIPE_CAPF_MIN_CONSERVATIVE_RASTER_DILATE:
412 case PIPE_CAPF_MAX_CONSERVATIVE_RASTER_DILATE:
413 case PIPE_CAPF_CONSERVATIVE_RASTER_DILATE_GRANULARITY:
414 return 0.0f;
415
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +0000416 default:
417 debug_printf("Unexpected PIPE_CAPF %d query\n", param);
418 return 0.0;
419 }
420}
421
422/**
423 * Query format support for creating a texture, drawing surface, etc.
424 * \param format the format to test
425 * \param type one of PIPE_TEXTURE, PIPE_SURFACE
426 */
Ilia Mirkin0e30c6b2019-07-04 11:41:41 -0400427static bool
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +0000428panfrost_is_format_supported( struct pipe_screen *screen,
429 enum pipe_format format,
430 enum pipe_texture_target target,
431 unsigned sample_count,
432 unsigned storage_sample_count,
433 unsigned bind)
434{
Alyssa Rosenzweiged1910d2020-07-07 16:15:45 -0400435 struct panfrost_device *dev = pan_device(screen);
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +0000436 const struct util_format_description *format_desc;
437
438 assert(target == PIPE_BUFFER ||
439 target == PIPE_TEXTURE_1D ||
440 target == PIPE_TEXTURE_1D_ARRAY ||
441 target == PIPE_TEXTURE_2D ||
442 target == PIPE_TEXTURE_2D_ARRAY ||
443 target == PIPE_TEXTURE_RECT ||
444 target == PIPE_TEXTURE_3D ||
445 target == PIPE_TEXTURE_CUBE ||
446 target == PIPE_TEXTURE_CUBE_ARRAY);
447
448 format_desc = util_format_description(format);
449
450 if (!format_desc)
Ilia Mirkin0e30c6b2019-07-04 11:41:41 -0400451 return false;
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +0000452
Alyssa Rosenzweig5c715472020-01-04 13:23:18 -0500453 /* MSAA 4x supported, but no more. Technically some revisions of the
Alyssa Rosenzweig546a6002020-06-30 16:53:38 -0400454 * hardware can go up to 16x but we don't support higher modes yet.
455 * MSAA 2x is notably not supported and gets rounded up to MSAA 4x. */
Alyssa Rosenzweig5c715472020-01-04 13:23:18 -0500456
Alyssa Rosenzweig546a6002020-06-30 16:53:38 -0400457 if (!(sample_count == 0 || sample_count == 1 || sample_count == 4))
Alyssa Rosenzweig5c715472020-01-04 13:23:18 -0500458 return false;
459
460 if (MAX2(sample_count, 1) != MAX2(storage_sample_count, 1))
Ilia Mirkin0e30c6b2019-07-04 11:41:41 -0400461 return false;
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +0000462
Alyssa Rosenzweig53d64752019-07-01 11:53:38 -0700463 /* Don't confuse poorly written apps (workaround dEQP bug) that expect
464 * more alpha than they ask for */
Alyssa Rosenzweig0b830052019-07-15 07:12:47 -0700465
Alyssa Rosenzweig53d64752019-07-01 11:53:38 -0700466 bool scanout = bind & (PIPE_BIND_SCANOUT | PIPE_BIND_SHARED | PIPE_BIND_DISPLAY_TARGET);
Alyssa Rosenzweig0b830052019-07-15 07:12:47 -0700467 bool renderable = bind & PIPE_BIND_RENDER_TARGET;
468
469 if (scanout && renderable && !util_format_is_rgba8_variant(format_desc))
Ilia Mirkin0e30c6b2019-07-04 11:41:41 -0400470 return false;
Alyssa Rosenzweigf8fca4f2019-06-28 18:47:10 -0700471
Alyssa Rosenzweig861e7dc2020-05-15 18:43:41 -0400472 /* Check we support the format with the given bind */
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +0000473
Alyssa Rosenzweig861e7dc2020-05-15 18:43:41 -0400474 unsigned relevant_bind = bind &
475 ( PIPE_BIND_DEPTH_STENCIL | PIPE_BIND_RENDER_TARGET
476 | PIPE_BIND_VERTEX_BUFFER | PIPE_BIND_SAMPLER_VIEW);
Icecream95bad6fc42020-03-24 12:42:42 +1300477
Alyssa Rosenzweig861e7dc2020-05-15 18:43:41 -0400478 struct panfrost_format fmt = panfrost_pipe_format_table[format];
Alyssa Rosenzweig6da405c2020-07-10 17:18:00 -0400479
480 /* Also check that compressed texture formats are supported on this
481 * particular chip. They may not be depending on system integration
Icecream95c1d3d392020-07-13 22:45:51 +1200482 * differences. RGTC can be emulated so is always supported. */
Alyssa Rosenzweig6da405c2020-07-10 17:18:00 -0400483
Icecream95c1d3d392020-07-13 22:45:51 +1200484 bool is_rgtc = format_desc->layout == UTIL_FORMAT_LAYOUT_RGTC;
485 bool supported = panfrost_supports_compressed_format(dev, fmt.hw);
486
487 if (!is_rgtc && !supported)
Alyssa Rosenzweig6da405c2020-07-10 17:18:00 -0400488 return false;
489
Alyssa Rosenzweig861e7dc2020-05-15 18:43:41 -0400490 return fmt.hw && ((relevant_bind & ~fmt.bind) == 0);
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +0000491}
492
Alyssa Rosenzweig2a121752020-07-22 12:11:39 -0400493/* We always support linear and tiled operations, both external and internal.
494 * We support AFBC for a subset of formats, and colourspace transform for a
495 * subset of those. */
496
497static void
498panfrost_query_dmabuf_modifiers(struct pipe_screen *screen,
499 enum pipe_format format, int max, uint64_t *modifiers, unsigned
500 int *external_only, int *out_count)
501{
502 /* Query AFBC status */
503 bool afbc = panfrost_format_supports_afbc(format);
504 bool ytr = panfrost_afbc_can_ytr(format);
505
506 /* Don't advertise AFBC before T760 */
507 struct panfrost_device *dev = pan_device(screen);
508 afbc &= !(dev->quirks & MIDGARD_NO_AFBC);
509
510 /* XXX: AFBC scanout is broken on mainline RK3399 with older kernels */
511 afbc &= (dev->debug & PAN_DBG_AFBC);
512
513 unsigned count = 0;
514
515 for (unsigned i = 0; i < PAN_MODIFIER_COUNT; ++i) {
516 if (drm_is_afbc(pan_best_modifiers[i]) && !afbc)
517 continue;
518
519 if ((pan_best_modifiers[i] & AFBC_FORMAT_MOD_YTR) && !ytr)
520 continue;
521
522 count++;
523
524 if (max > (int) count) {
525 modifiers[count] = pan_best_modifiers[i];
526
527 if (external_only)
528 external_only[count] = false;
529 }
530 }
531
532 *out_count = count;
533}
534
Alyssa Rosenzweig16977602019-07-23 10:41:25 -0700535static int
536panfrost_get_compute_param(struct pipe_screen *pscreen, enum pipe_shader_ir ir_type,
537 enum pipe_compute_cap param, void *ret)
538{
Alyssa Rosenzweiged1910d2020-07-07 16:15:45 -0400539 struct panfrost_device *dev = pan_device(pscreen);
Alyssa Rosenzweig16977602019-07-23 10:41:25 -0700540 const char * const ir = "panfrost";
541
Alyssa Rosenzweiged1910d2020-07-07 16:15:45 -0400542 if (!(dev->debug & PAN_DBG_DEQP))
Alyssa Rosenzweig16977602019-07-23 10:41:25 -0700543 return 0;
544
545#define RET(x) do { \
546 if (ret) \
547 memcpy(ret, x, sizeof(x)); \
548 return sizeof(x); \
549} while (0)
550
551 switch (param) {
552 case PIPE_COMPUTE_CAP_ADDRESS_BITS:
Alyssa Rosenzweig8b1548a2019-11-06 14:55:41 -0500553 RET((uint32_t []){ 64 });
Alyssa Rosenzweig16977602019-07-23 10:41:25 -0700554
555 case PIPE_COMPUTE_CAP_IR_TARGET:
556 if (ret)
557 sprintf(ret, "%s", ir);
558 return strlen(ir) * sizeof(char);
559
560 case PIPE_COMPUTE_CAP_GRID_DIMENSION:
561 RET((uint64_t []) { 3 });
562
563 case PIPE_COMPUTE_CAP_MAX_GRID_SIZE:
564 RET(((uint64_t []) { 65535, 65535, 65535 }));
565
566 case PIPE_COMPUTE_CAP_MAX_BLOCK_SIZE:
567 RET(((uint64_t []) { 1024, 1024, 64 }));
568
569 case PIPE_COMPUTE_CAP_MAX_THREADS_PER_BLOCK:
570 RET((uint64_t []) { 1024 });
571
572 case PIPE_COMPUTE_CAP_MAX_GLOBAL_SIZE:
573 RET((uint64_t []) { 1024*1024*512 /* Maybe get memory */ });
574
575 case PIPE_COMPUTE_CAP_MAX_LOCAL_SIZE:
576 RET((uint64_t []) { 32768 });
577
578 case PIPE_COMPUTE_CAP_MAX_PRIVATE_SIZE:
579 case PIPE_COMPUTE_CAP_MAX_INPUT_SIZE:
580 RET((uint64_t []) { 4096 });
581
582 case PIPE_COMPUTE_CAP_MAX_MEM_ALLOC_SIZE:
583 RET((uint64_t []) { 1024*1024*512 /* Maybe get memory */ });
584
585 case PIPE_COMPUTE_CAP_MAX_CLOCK_FREQUENCY:
586 RET((uint32_t []) { 800 /* MHz -- TODO */ });
587
588 case PIPE_COMPUTE_CAP_MAX_COMPUTE_UNITS:
589 RET((uint32_t []) { 9999 }); // TODO
590
591 case PIPE_COMPUTE_CAP_IMAGES_SUPPORTED:
592 RET((uint32_t []) { 1 }); // TODO
593
594 case PIPE_COMPUTE_CAP_SUBGROUP_SIZE:
595 RET((uint32_t []) { 32 }); // TODO
596
597 case PIPE_COMPUTE_CAP_MAX_VARIABLE_THREADS_PER_BLOCK:
598 RET((uint64_t []) { 1024 }); // TODO
599 }
600
601 return 0;
602}
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +0000603
604static void
Tomeu Vizoso0fcf73b2019-06-18 14:24:57 +0200605panfrost_destroy_screen(struct pipe_screen *pscreen)
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +0000606{
Alyssa Rosenzweig39378ee2020-03-24 13:40:12 -0400607 panfrost_close_device(pan_device(pscreen));
Alyssa Rosenzweigca8c6252020-03-23 18:44:21 -0400608 ralloc_free(pscreen);
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +0000609}
610
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +0000611static uint64_t
612panfrost_get_timestamp(struct pipe_screen *_screen)
613{
614 return os_time_get_nano();
615}
616
617static void
Tomeu Vizoso756f7b92019-03-08 10:27:07 +0100618panfrost_fence_reference(struct pipe_screen *pscreen,
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +0000619 struct pipe_fence_handle **ptr,
620 struct pipe_fence_handle *fence)
621{
Alyssa Rosenzweig64d6f562020-07-20 13:34:42 -0400622 struct panfrost_device *dev = pan_device(pscreen);
Boris Brezillon0500c9e2019-09-14 08:00:27 +0200623 struct panfrost_fence **p = (struct panfrost_fence **)ptr;
624 struct panfrost_fence *f = (struct panfrost_fence *)fence;
625 struct panfrost_fence *old = *p;
626
627 if (pipe_reference(&(*p)->reference, &f->reference)) {
Alyssa Rosenzweig64d6f562020-07-20 13:34:42 -0400628 drmSyncobjDestroy(dev->fd, old->syncobj);
Boris Brezillon0500c9e2019-09-14 08:00:27 +0200629 free(old);
630 }
631 *p = f;
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +0000632}
633
Ilia Mirkin0e30c6b2019-07-04 11:41:41 -0400634static bool
Tomeu Vizoso756f7b92019-03-08 10:27:07 +0100635panfrost_fence_finish(struct pipe_screen *pscreen,
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +0000636 struct pipe_context *ctx,
637 struct pipe_fence_handle *fence,
638 uint64_t timeout)
639{
Alyssa Rosenzweigca8c6252020-03-23 18:44:21 -0400640 struct panfrost_device *dev = pan_device(pscreen);
Boris Brezillon0500c9e2019-09-14 08:00:27 +0200641 struct panfrost_fence *f = (struct panfrost_fence *)fence;
642 int ret;
Boris Brezillon819738e2019-09-15 10:57:26 +0200643
Alyssa Rosenzweig64d6f562020-07-20 13:34:42 -0400644 if (f->signaled)
Boris Brezillon819738e2019-09-15 10:57:26 +0200645 return true;
646
Boris Brezillon0500c9e2019-09-14 08:00:27 +0200647 uint64_t abs_timeout = os_time_get_absolute_timeout(timeout);
648 if (abs_timeout == OS_TIMEOUT_INFINITE)
649 abs_timeout = INT64_MAX;
650
Alyssa Rosenzweig64d6f562020-07-20 13:34:42 -0400651 ret = drmSyncobjWait(dev->fd, &f->syncobj,
652 1,
Boris Brezillonb5d8f9b2019-09-15 18:23:10 +0200653 abs_timeout, DRM_SYNCOBJ_WAIT_FLAGS_WAIT_ALL,
654 NULL);
Boris Brezillon0500c9e2019-09-14 08:00:27 +0200655
Alyssa Rosenzweig64d6f562020-07-20 13:34:42 -0400656 f->signaled = (ret >= 0);
657 return f->signaled;
Boris Brezillon0500c9e2019-09-14 08:00:27 +0200658}
659
660struct panfrost_fence *
Boris Brezillonb5d8f9b2019-09-15 18:23:10 +0200661panfrost_fence_create(struct panfrost_context *ctx,
Alyssa Rosenzweig64d6f562020-07-20 13:34:42 -0400662 uint32_t syncobj)
Boris Brezillon0500c9e2019-09-14 08:00:27 +0200663{
Boris Brezillon0500c9e2019-09-14 08:00:27 +0200664 struct panfrost_fence *f = calloc(1, sizeof(*f));
665 if (!f)
666 return NULL;
667
Boris Brezillon0500c9e2019-09-14 08:00:27 +0200668 pipe_reference_init(&f->reference, 1);
Alyssa Rosenzweig64d6f562020-07-20 13:34:42 -0400669 f->syncobj = syncobj;
Boris Brezillon0500c9e2019-09-14 08:00:27 +0200670
671 return f;
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +0000672}
673
674static const void *
675panfrost_screen_get_compiler_options(struct pipe_screen *pscreen,
676 enum pipe_shader_ir ir,
677 enum pipe_shader_type shader)
678{
Alyssa Rosenzweig23620d12020-04-08 19:05:57 -0400679 if (pan_device(pscreen)->quirks & IS_BIFROST)
680 return &bifrost_nir_options;
681 else
682 return &midgard_nir_options;
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +0000683}
684
685struct pipe_screen *
Alyssa Rosenzweig138865e2019-03-31 19:06:05 +0000686panfrost_create_screen(int fd, struct renderonly *ro)
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +0000687{
Alyssa Rosenzweig1f8b6532019-08-05 08:20:24 -0700688 /* Create the screen */
689 struct panfrost_screen *screen = rzalloc(NULL, struct panfrost_screen);
690
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +0000691 if (!screen)
692 return NULL;
693
Alyssa Rosenzweigca8c6252020-03-23 18:44:21 -0400694 struct panfrost_device *dev = pan_device(&screen->base);
Alyssa Rosenzweig39378ee2020-03-24 13:40:12 -0400695 panfrost_open_device(screen, fd, dev);
Alyssa Rosenzweigca8c6252020-03-23 18:44:21 -0400696
Alyssa Rosenzweiged1910d2020-07-07 16:15:45 -0400697 dev->debug = debug_get_flags_option("PAN_MESA_DEBUG", debug_options, 0);
698
Icecream95210db652020-10-09 22:39:40 +1300699 if (dev->debug & PAN_DBG_NO_AFBC)
700 dev->quirks |= MIDGARD_NO_AFBC;
701
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +0000702 if (ro) {
Alyssa Rosenzweigca8c6252020-03-23 18:44:21 -0400703 dev->ro = renderonly_dup(ro);
704 if (!dev->ro) {
Alyssa Rosenzweiged1910d2020-07-07 16:15:45 -0400705 if (dev->debug & PAN_DBG_MSGS)
706 fprintf(stderr, "Failed to dup renderonly object\n");
707
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +0000708 free(screen);
709 return NULL;
710 }
711 }
712
Tomeu Vizoso5a7688f2019-07-11 08:06:41 +0200713 /* Check if we're loading against a supported GPU model. */
Alyssa Rosenzweig2f7145a2019-07-08 09:14:59 -0700714
Alyssa Rosenzweigca8c6252020-03-23 18:44:21 -0400715 switch (dev->gpu_id) {
Tomeu Vizosob655be72019-10-28 09:59:30 +0100716 case 0x720: /* T720 */
Tomeu Vizoso5a7688f2019-07-11 08:06:41 +0200717 case 0x750: /* T760 */
Alyssa Rosenzweiga2d0ea92019-07-10 10:10:31 -0700718 case 0x820: /* T820 */
719 case 0x860: /* T860 */
720 break;
Boris Brezillonfefb3e92020-09-23 11:08:02 +0200721 case 0x6221: /* G72 */
Alyssa Rosenzweigbccb3de2020-05-29 19:24:45 -0400722 case 0x7093: /* G31 */
723 case 0x7212: /* G52 */
Alyssa Rosenzweiged1910d2020-07-07 16:15:45 -0400724 if (dev->debug & PAN_DBG_BIFROST)
Alyssa Rosenzweigbccb3de2020-05-29 19:24:45 -0400725 break;
726
727 /* fallthrough */
Alyssa Rosenzweiga2d0ea92019-07-10 10:10:31 -0700728 default:
729 /* Fail to load against untested models */
Alyssa Rosenzweigca8c6252020-03-23 18:44:21 -0400730 debug_printf("panfrost: Unsupported model %X", dev->gpu_id);
Alyssa Rosenzweig39378ee2020-03-24 13:40:12 -0400731 panfrost_destroy_screen(&(screen->base));
Alyssa Rosenzweiga2d0ea92019-07-10 10:10:31 -0700732 return NULL;
Alyssa Rosenzweig2f7145a2019-07-08 09:14:59 -0700733 }
734
Alyssa Rosenzweiged1910d2020-07-07 16:15:45 -0400735 if (dev->debug & (PAN_DBG_TRACE | PAN_DBG_SYNC))
736 pandecode_initialize(!(dev->debug & PAN_DBG_TRACE));
Alyssa Rosenzweigfc7bcee2019-06-11 12:25:35 -0700737
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +0000738 screen->base.destroy = panfrost_destroy_screen;
739
740 screen->base.get_name = panfrost_get_name;
741 screen->base.get_vendor = panfrost_get_vendor;
742 screen->base.get_device_vendor = panfrost_get_device_vendor;
743 screen->base.get_param = panfrost_get_param;
744 screen->base.get_shader_param = panfrost_get_shader_param;
Alyssa Rosenzweig16977602019-07-23 10:41:25 -0700745 screen->base.get_compute_param = panfrost_get_compute_param;
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +0000746 screen->base.get_paramf = panfrost_get_paramf;
747 screen->base.get_timestamp = panfrost_get_timestamp;
748 screen->base.is_format_supported = panfrost_is_format_supported;
Alyssa Rosenzweig2a121752020-07-22 12:11:39 -0400749 screen->base.query_dmabuf_modifiers = panfrost_query_dmabuf_modifiers;
Alyssa Rosenzweig7da251f2019-02-05 04:32:27 +0000750 screen->base.context_create = panfrost_create_context;
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +0000751 screen->base.get_compiler_options = panfrost_screen_get_compiler_options;
752 screen->base.fence_reference = panfrost_fence_reference;
753 screen->base.fence_finish = panfrost_fence_finish;
Boris Brezillon8d0830d2019-10-07 12:24:51 +0200754 screen->base.set_damage_region = panfrost_resource_set_damage_region;
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +0000755
Alyssa Rosenzweigca8c6252020-03-23 18:44:21 -0400756 panfrost_resource_screen_init(&screen->base);
Alyssa Rosenzweig7da251f2019-02-05 04:32:27 +0000757
Alyssa Rosenzweig293f2512020-07-09 13:42:25 -0400758 if (!(dev->quirks & IS_BIFROST))
759 panfrost_init_blit_shaders(dev);
760
Alyssa Rosenzweig7da251f2019-02-05 04:32:27 +0000761 return &screen->base;
Alyssa Rosenzweig61d3ae62019-01-29 05:46:07 +0000762}