• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2012-2015 Etnaviv Project
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  * the rights to use, copy, modify, merge, publish, distribute, sub license,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice (including the
12  * next paragraph) shall be included in all copies or substantial portions
13  * of the 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21  * DEALINGS IN THE SOFTWARE.
22  *
23  * Authors:
24  *    Wladimir J. van der Laan <laanwj@gmail.com>
25  *    Christian Gmeiner <christian.gmeiner@gmail.com>
26  */
27 
28 #include "etnaviv_screen.h"
29 
30 #include "hw/common.xml.h"
31 
32 #include "etnaviv_compiler.h"
33 #include "etnaviv_context.h"
34 #include "etnaviv_debug.h"
35 #include "etnaviv_fence.h"
36 #include "etnaviv_format.h"
37 #include "etnaviv_query.h"
38 #include "etnaviv_resource.h"
39 #include "etnaviv_translate.h"
40 
41 #include "util/hash_table.h"
42 #include "util/os_time.h"
43 #include "util/u_math.h"
44 #include "util/u_memory.h"
45 #include "util/u_screen.h"
46 #include "util/u_string.h"
47 
48 #include "frontend/drm_driver.h"
49 
50 #include "drm-uapi/drm_fourcc.h"
51 
52 #define ETNA_DRM_VERSION_FENCE_FD      ETNA_DRM_VERSION(1, 1)
53 #define ETNA_DRM_VERSION_PERFMON       ETNA_DRM_VERSION(1, 2)
54 
55 static const struct debug_named_value etna_debug_options[] = {
56    {"dbg_msgs",       ETNA_DBG_MSGS, "Print debug messages"},
57    {"drm_msgs",       ETNA_DRM_MSGS, "Print drm messages"},
58    {"frame_msgs",     ETNA_DBG_FRAME_MSGS, "Print frame messages"},
59    {"resource_msgs",  ETNA_DBG_RESOURCE_MSGS, "Print resource messages"},
60    {"compiler_msgs",  ETNA_DBG_COMPILER_MSGS, "Print compiler messages"},
61    {"linker_msgs",    ETNA_DBG_LINKER_MSGS, "Print linker messages"},
62    {"ml_msgs",        ETNA_DBG_ML_MSGS, "Print ML messages"},
63    {"dump_shaders",   ETNA_DBG_DUMP_SHADERS, "Dump shaders"},
64    {"no_ts",          ETNA_DBG_NO_TS, "Disable TS"},
65    {"no_autodisable", ETNA_DBG_NO_AUTODISABLE, "Disable autodisable"},
66    {"no_supertile",   ETNA_DBG_NO_SUPERTILE, "Disable supertiles"},
67    {"no_early_z",     ETNA_DBG_NO_EARLY_Z, "Disable early z"},
68    {"cflush_all",     ETNA_DBG_CFLUSH_ALL, "Flush every cache before state update"},
69    {"flush_all",      ETNA_DBG_FLUSH_ALL, "Flush after every rendered primitive"},
70    {"zero",           ETNA_DBG_ZERO, "Zero all resources after allocation"},
71    {"draw_stall",     ETNA_DBG_DRAW_STALL, "Stall FE/PE after each rendered primitive"},
72    {"shaderdb",       ETNA_DBG_SHADERDB, "Enable shaderdb output"},
73    {"no_singlebuffer",ETNA_DBG_NO_SINGLEBUF, "Disable single buffer feature"},
74    {"deqp",           ETNA_DBG_DEQP, "Hacks to run dEQP GLES3 tests"}, /* needs MESA_GLES_VERSION_OVERRIDE=3.0 */
75    {"nocache",        ETNA_DBG_NOCACHE,    "Disable shader cache"},
76    {"linear_pe",      ETNA_DBG_LINEAR_PE, "Enable linear PE"},
77    {"msaa",           ETNA_DBG_MSAA, "Enable MSAA support"},
78    {"shared_ts",      ETNA_DBG_SHARED_TS, "Enable TS sharing"},
79    {"perf",           ETNA_DBG_PERF, "Enable performance warnings"},
80    {"npu_no_parallel",ETNA_DBG_NPU_NO_PARALLEL, "Disable parallelism inside NPU batches"},
81    {"npu_no_batching",ETNA_DBG_NPU_NO_BATCHING, "Disable batching NPU jobs"},
82    DEBUG_NAMED_VALUE_END
83 };
84 
85 DEBUG_GET_ONCE_FLAGS_OPTION(etna_mesa_debug, "ETNA_MESA_DEBUG", etna_debug_options, 0)
86 int etna_mesa_debug = 0;
87 
88 static void
etna_screen_destroy(struct pipe_screen * pscreen)89 etna_screen_destroy(struct pipe_screen *pscreen)
90 {
91    struct etna_screen *screen = etna_screen(pscreen);
92 
93    if (screen->dummy_desc_reloc.bo)
94       etna_bo_del(screen->dummy_desc_reloc.bo);
95 
96    if (screen->dummy_rt_reloc.bo)
97       etna_bo_del(screen->dummy_rt_reloc.bo);
98 
99    if (screen->perfmon)
100       etna_perfmon_del(screen->perfmon);
101 
102    util_dynarray_fini(&screen->supported_pm_queries);
103 
104    etna_shader_screen_fini(pscreen);
105 
106    if (screen->pipe)
107       etna_pipe_del(screen->pipe);
108 
109    if (screen->gpu)
110       etna_gpu_del(screen->gpu);
111 
112    if (screen->ro)
113       screen->ro->destroy(screen->ro);
114 
115    if (screen->dev)
116       etna_device_del(screen->dev);
117 
118    FREE(screen);
119 }
120 
121 static const char *
etna_screen_get_name(struct pipe_screen * pscreen)122 etna_screen_get_name(struct pipe_screen *pscreen)
123 {
124    struct etna_screen *priv = etna_screen(pscreen);
125    static char buffer[128];
126 
127    snprintf(buffer, sizeof(buffer), "Vivante GC%x rev %04x", priv->model,
128             priv->revision);
129 
130    return buffer;
131 }
132 
133 static const char *
etna_screen_get_vendor(struct pipe_screen * pscreen)134 etna_screen_get_vendor(struct pipe_screen *pscreen)
135 {
136    return "Mesa";
137 }
138 
139 static const char *
etna_screen_get_device_vendor(struct pipe_screen * pscreen)140 etna_screen_get_device_vendor(struct pipe_screen *pscreen)
141 {
142    return "Vivante";
143 }
144 
145 static int
etna_screen_get_param(struct pipe_screen * pscreen,enum pipe_cap param)146 etna_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
147 {
148    struct etna_screen *screen = etna_screen(pscreen);
149 
150    switch (param) {
151    /* Supported features (boolean caps). */
152    case PIPE_CAP_BLEND_EQUATION_SEPARATE:
153    case PIPE_CAP_FS_COORD_ORIGIN_UPPER_LEFT:
154    case PIPE_CAP_FS_COORD_PIXEL_CENTER_HALF_INTEGER:
155    case PIPE_CAP_FRAGMENT_SHADER_TEXTURE_LOD:
156    case PIPE_CAP_FRAGMENT_SHADER_DERIVATIVES:
157    case PIPE_CAP_TEXTURE_BARRIER:
158    case PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION:
159    case PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY:
160    case PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY:
161    case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY:
162    case PIPE_CAP_TGSI_TEXCOORD:
163    case PIPE_CAP_VERTEX_COLOR_UNCLAMPED:
164    case PIPE_CAP_MIXED_COLOR_DEPTH_BITS:
165    case PIPE_CAP_MIXED_FRAMEBUFFER_SIZES:
166    case PIPE_CAP_STRING_MARKER:
167    case PIPE_CAP_FRONTEND_NOOP:
168       return 1;
169    case PIPE_CAP_NATIVE_FENCE_FD:
170       return screen->drm_version >= ETNA_DRM_VERSION_FENCE_FD;
171    case PIPE_CAP_FS_POSITION_IS_SYSVAL:
172    case PIPE_CAP_FS_FACE_IS_INTEGER_SYSVAL: /* note: not integer */
173       return 1;
174    case PIPE_CAP_FS_POINT_IS_SYSVAL:
175       return 0;
176 
177    /* Memory */
178    case PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT:
179       return 256;
180    case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT:
181       return 4096;
182 
183    case PIPE_CAP_NPOT_TEXTURES:
184       return true; /* VIV_FEATURE(priv->dev, chipMinorFeatures1,
185                       NON_POWER_OF_TWO); */
186 
187    case PIPE_CAP_ANISOTROPIC_FILTER:
188    case PIPE_CAP_TEXTURE_SWIZZLE:
189    case PIPE_CAP_PRIMITIVE_RESTART:
190    case PIPE_CAP_PRIMITIVE_RESTART_FIXED_INDEX:
191       return VIV_FEATURE(screen, chipMinorFeatures1, HALTI0);
192 
193    case PIPE_CAP_ALPHA_TEST:
194       return !VIV_FEATURE(screen, chipMinorFeatures7, PE_NO_ALPHA_TEST);
195 
196    /* Unsupported features. */
197    case PIPE_CAP_TEXTURE_BUFFER_OFFSET_ALIGNMENT:
198    case PIPE_CAP_TEXRECT:
199       return 0;
200 
201    /* Stream output. */
202    case PIPE_CAP_MAX_STREAM_OUTPUT_BUFFERS:
203       return DBG_ENABLED(ETNA_DBG_DEQP) ? 4 : 0;
204    case PIPE_CAP_MAX_STREAM_OUTPUT_SEPARATE_COMPONENTS:
205    case PIPE_CAP_MAX_STREAM_OUTPUT_INTERLEAVED_COMPONENTS:
206       return 0;
207 
208    case PIPE_CAP_MAX_VERTEX_ATTRIB_STRIDE:
209       return 128;
210    case PIPE_CAP_MAX_VERTEX_ELEMENT_SRC_OFFSET:
211       return 255;
212    case PIPE_CAP_MAX_VERTEX_BUFFERS:
213       return screen->specs.stream_count;
214    case PIPE_CAP_VS_INSTANCEID:
215    case PIPE_CAP_VERTEX_ELEMENT_INSTANCE_DIVISOR:
216       return VIV_FEATURE(screen, chipMinorFeatures4, HALTI2);
217 
218 
219    /* Texturing. */
220    case PIPE_CAP_TEXTURE_HALF_FLOAT_LINEAR:
221       return VIV_FEATURE(screen, chipMinorFeatures1, HALF_FLOAT);
222    case PIPE_CAP_TEXTURE_SHADOW_MAP:
223       return 1;
224    case PIPE_CAP_MAX_TEXTURE_2D_SIZE:
225       return screen->specs.max_texture_size;
226    case PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS: /* TODO: verify */
227       return screen->specs.halti >= 0 ? screen->specs.max_texture_size : 0;
228    case PIPE_CAP_MAX_TEXTURE_3D_LEVELS:
229       if (screen->specs.halti < 0)
230          return 0;
231       FALLTHROUGH;
232    case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:
233    {
234       int log2_max_tex_size = util_last_bit(screen->specs.max_texture_size);
235       assert(log2_max_tex_size > 0);
236       return log2_max_tex_size;
237    }
238 
239    case PIPE_CAP_MIN_TEXTURE_GATHER_OFFSET:
240    case PIPE_CAP_MIN_TEXEL_OFFSET:
241       return -8;
242    case PIPE_CAP_MAX_TEXTURE_GATHER_OFFSET:
243    case PIPE_CAP_MAX_TEXEL_OFFSET:
244       return 7;
245    case PIPE_CAP_SEAMLESS_CUBE_MAP_PER_TEXTURE:
246       return screen->specs.seamless_cube_map;
247 
248    /* Queries. */
249    case PIPE_CAP_OCCLUSION_QUERY:
250    case PIPE_CAP_CONDITIONAL_RENDER:
251    case PIPE_CAP_CONDITIONAL_RENDER_INVERTED:
252       return VIV_FEATURE(screen, chipMinorFeatures1, HALTI0);
253 
254    /* Preferences */
255    case PIPE_CAP_TEXTURE_TRANSFER_MODES:
256       return 0;
257    case PIPE_CAP_MAX_TEXTURE_UPLOAD_MEMORY_BUDGET: {
258       /* etnaviv is being run on systems as small as 256MB total RAM so
259        * we need to provide a sane value for such a device. Limit the
260        * memory budget to min(~3% of pyhiscal memory, 64MB).
261        *
262        * a simple divison by 32 provides the numbers we want.
263        *    256MB / 32 =  8MB
264        *   2048MB / 32 = 64MB
265        */
266       uint64_t system_memory;
267 
268       if (!os_get_total_physical_memory(&system_memory))
269          system_memory = (uint64_t)4096 << 20;
270 
271       return MIN2(system_memory / 32, 64 * 1024 * 1024);
272    }
273 
274    case PIPE_CAP_MAX_VARYINGS:
275       return screen->specs.max_varyings;
276 
277    case PIPE_CAP_SUPPORTED_PRIM_MODES:
278    case PIPE_CAP_SUPPORTED_PRIM_MODES_WITH_RESTART: {
279       /* Generate the bitmask of supported draw primitives. */
280       uint32_t modes = 1 << MESA_PRIM_POINTS |
281                        1 << MESA_PRIM_LINES |
282                        1 << MESA_PRIM_LINE_STRIP |
283                        1 << MESA_PRIM_TRIANGLES |
284                        1 << MESA_PRIM_TRIANGLE_FAN;
285 
286       /* TODO: The bug relates only to indexed draws, but here we signal
287        * that there is no support for triangle strips at all. This should
288        * be refined.
289        */
290       if (VIV_FEATURE(screen, chipMinorFeatures2, BUG_FIXES8))
291          modes |= 1 << MESA_PRIM_TRIANGLE_STRIP;
292 
293       if (VIV_FEATURE(screen, chipMinorFeatures2, LINE_LOOP))
294          modes |= 1 << MESA_PRIM_LINE_LOOP;
295 
296       return modes;
297    }
298 
299    case PIPE_CAP_PCI_GROUP:
300    case PIPE_CAP_PCI_BUS:
301    case PIPE_CAP_PCI_DEVICE:
302    case PIPE_CAP_PCI_FUNCTION:
303       return 0;
304    case PIPE_CAP_ACCELERATED:
305       return 1;
306    case PIPE_CAP_VIDEO_MEMORY:
307       return 0;
308    case PIPE_CAP_UMA:
309       return 1;
310    default:
311       return u_pipe_screen_get_param_defaults(pscreen, param);
312    }
313 }
314 
315 static float
etna_screen_get_paramf(struct pipe_screen * pscreen,enum pipe_capf param)316 etna_screen_get_paramf(struct pipe_screen *pscreen, enum pipe_capf param)
317 {
318    struct etna_screen *screen = etna_screen(pscreen);
319 
320    switch (param) {
321    case PIPE_CAPF_MIN_LINE_WIDTH:
322    case PIPE_CAPF_MIN_LINE_WIDTH_AA:
323    case PIPE_CAPF_MIN_POINT_SIZE:
324    case PIPE_CAPF_MIN_POINT_SIZE_AA:
325       return 1;
326    case PIPE_CAPF_POINT_SIZE_GRANULARITY:
327    case PIPE_CAPF_LINE_WIDTH_GRANULARITY:
328       return 0.1;
329    case PIPE_CAPF_MAX_LINE_WIDTH:
330    case PIPE_CAPF_MAX_LINE_WIDTH_AA:
331    case PIPE_CAPF_MAX_POINT_SIZE:
332    case PIPE_CAPF_MAX_POINT_SIZE_AA:
333       return 8192.0f;
334    case PIPE_CAPF_MAX_TEXTURE_ANISOTROPY:
335       return 16.0f;
336    case PIPE_CAPF_MAX_TEXTURE_LOD_BIAS:
337       return util_last_bit(screen->specs.max_texture_size);
338    case PIPE_CAPF_MIN_CONSERVATIVE_RASTER_DILATE:
339    case PIPE_CAPF_MAX_CONSERVATIVE_RASTER_DILATE:
340    case PIPE_CAPF_CONSERVATIVE_RASTER_DILATE_GRANULARITY:
341       return 0.0f;
342    }
343 
344    debug_printf("unknown paramf %d", param);
345    return 0;
346 }
347 
348 static int
etna_screen_get_shader_param(struct pipe_screen * pscreen,enum pipe_shader_type shader,enum pipe_shader_cap param)349 etna_screen_get_shader_param(struct pipe_screen *pscreen,
350                              enum pipe_shader_type shader,
351                              enum pipe_shader_cap param)
352 {
353    struct etna_screen *screen = etna_screen(pscreen);
354    bool ubo_enable = screen->specs.halti >= 2;
355 
356    if (DBG_ENABLED(ETNA_DBG_DEQP))
357       ubo_enable = true;
358 
359    switch (shader) {
360    case PIPE_SHADER_FRAGMENT:
361    case PIPE_SHADER_VERTEX:
362       break;
363    case PIPE_SHADER_COMPUTE:
364    case PIPE_SHADER_GEOMETRY:
365    case PIPE_SHADER_TESS_CTRL:
366    case PIPE_SHADER_TESS_EVAL:
367       return 0;
368    default:
369       DBG("unknown shader type %d", shader);
370       return 0;
371    }
372 
373    switch (param) {
374    case PIPE_SHADER_CAP_MAX_INSTRUCTIONS:
375    case PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS:
376    case PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS:
377    case PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS:
378       return ETNA_MAX_TOKENS;
379    case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH:
380       return ETNA_MAX_DEPTH; /* XXX */
381    case PIPE_SHADER_CAP_MAX_INPUTS:
382       /* Maximum number of inputs for the vertex shader is the number
383        * of vertex elements - each element defines one vertex shader
384        * input register.  For the fragment shader, this is the number
385        * of varyings. */
386       return shader == PIPE_SHADER_FRAGMENT ? screen->specs.max_varyings
387                                             : screen->specs.vertex_max_elements;
388    case PIPE_SHADER_CAP_MAX_OUTPUTS:
389       return 16; /* see VIVS_VS_OUTPUT */
390    case PIPE_SHADER_CAP_MAX_TEMPS:
391       return 64; /* Max native temporaries. */
392    case PIPE_SHADER_CAP_MAX_CONST_BUFFERS:
393       return ubo_enable ? ETNA_MAX_CONST_BUF : 1;
394    case PIPE_SHADER_CAP_CONT_SUPPORTED:
395       return 1;
396    case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:
397    case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR:
398    case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
399    case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
400       return 1;
401    case PIPE_SHADER_CAP_SUBROUTINES:
402       return 0;
403    case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED:
404       return VIV_FEATURE(screen, chipMinorFeatures0, HAS_SQRT_TRIG);
405    case PIPE_SHADER_CAP_INT64_ATOMICS:
406    case PIPE_SHADER_CAP_FP16:
407    case PIPE_SHADER_CAP_FP16_DERIVATIVES:
408    case PIPE_SHADER_CAP_FP16_CONST_BUFFERS:
409    case PIPE_SHADER_CAP_INT16:
410    case PIPE_SHADER_CAP_GLSL_16BIT_CONSTS:
411       return 0;
412    case PIPE_SHADER_CAP_INTEGERS:
413       return screen->specs.halti >= 2;
414    case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
415    case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:
416       return shader == PIPE_SHADER_FRAGMENT
417                 ? screen->specs.fragment_sampler_count
418                 : screen->specs.vertex_sampler_count;
419    case PIPE_SHADER_CAP_MAX_CONST_BUFFER0_SIZE:
420       if (ubo_enable)
421          return 16384; /* 16384 so state tracker enables UBOs */
422       return shader == PIPE_SHADER_FRAGMENT
423                 ? screen->specs.max_ps_uniforms * sizeof(float[4])
424                 : screen->specs.max_vs_uniforms * sizeof(float[4]);
425    case PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE:
426       return false;
427    case PIPE_SHADER_CAP_SUPPORTED_IRS:
428       return (1 << PIPE_SHADER_IR_TGSI) |
429              (1 << PIPE_SHADER_IR_NIR);
430    case PIPE_SHADER_CAP_MAX_SHADER_BUFFERS:
431    case PIPE_SHADER_CAP_MAX_SHADER_IMAGES:
432    case PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTERS:
433    case PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTER_BUFFERS:
434       return 0;
435    }
436 
437    debug_printf("unknown shader param %d", param);
438    return 0;
439 }
440 
441 static bool
gpu_supports_texture_target(struct etna_screen * screen,enum pipe_texture_target target)442 gpu_supports_texture_target(struct etna_screen *screen,
443                             enum pipe_texture_target target)
444 {
445    if (target == PIPE_TEXTURE_CUBE_ARRAY)
446       return false;
447 
448    /* pre-halti has no array/3D */
449    if (screen->specs.halti < 0 &&
450        (target == PIPE_TEXTURE_1D_ARRAY ||
451         target == PIPE_TEXTURE_2D_ARRAY ||
452         target == PIPE_TEXTURE_3D))
453       return false;
454 
455    return true;
456 }
457 
458 static bool
gpu_supports_texture_format(struct etna_screen * screen,uint32_t fmt,enum pipe_format format)459 gpu_supports_texture_format(struct etna_screen *screen, uint32_t fmt,
460                             enum pipe_format format)
461 {
462    bool supported = true;
463 
464    /* Requires split sampler support, which the driver doesn't support, yet. */
465    if (!util_format_is_compressed(format) &&
466        util_format_get_blocksizebits(format) > 32)
467       return false;
468 
469    if (fmt == TEXTURE_FORMAT_ETC1)
470       supported = VIV_FEATURE(screen, chipFeatures, ETC1_TEXTURE_COMPRESSION);
471 
472    if (fmt >= TEXTURE_FORMAT_DXT1 && fmt <= TEXTURE_FORMAT_DXT4_DXT5)
473       supported = VIV_FEATURE(screen, chipFeatures, DXT_TEXTURE_COMPRESSION);
474 
475    if (util_format_is_srgb(format))
476       supported = VIV_FEATURE(screen, chipMinorFeatures1, HALTI0);
477 
478    if (fmt & EXT_FORMAT)
479       supported = VIV_FEATURE(screen, chipMinorFeatures1, HALTI0);
480 
481    if (fmt & ASTC_FORMAT) {
482       supported = screen->specs.tex_astc;
483    }
484 
485    if (util_format_is_snorm(format))
486       supported = VIV_FEATURE(screen, chipMinorFeatures2, HALTI1);
487 
488    if (format != PIPE_FORMAT_S8_UINT_Z24_UNORM &&
489        (util_format_is_pure_integer(format) || util_format_is_float(format)))
490       supported = VIV_FEATURE(screen, chipMinorFeatures4, HALTI2);
491 
492 
493    if (!supported)
494       return false;
495 
496    if (texture_format_needs_swiz(format))
497       return VIV_FEATURE(screen, chipMinorFeatures1, HALTI0);
498 
499    return true;
500 }
501 
502 static bool
gpu_supports_render_format(struct etna_screen * screen,enum pipe_format format,unsigned sample_count)503 gpu_supports_render_format(struct etna_screen *screen, enum pipe_format format,
504                            unsigned sample_count)
505 {
506    const uint32_t fmt = translate_pe_format(format);
507 
508    if (fmt == ETNA_NO_MATCH)
509       return false;
510 
511    /* Requires split target support, which the driver doesn't support, yet. */
512    if (util_format_get_blocksizebits(format) > 32)
513       return false;
514 
515    if (sample_count > 1) {
516       /* Explicitly enabled. */
517       if (!DBG_ENABLED(ETNA_DBG_MSAA))
518          return false;
519 
520       /* The hardware supports it. */
521       if (!VIV_FEATURE(screen, chipFeatures, MSAA))
522          return false;
523 
524       /* Number of samples must be allowed. */
525       if (!translate_samples_to_xyscale(sample_count, NULL, NULL))
526          return false;
527 
528       /* On SMALL_MSAA hardware 2x MSAA does not work. */
529       if (sample_count == 2 && VIV_FEATURE(screen, chipMinorFeatures4, SMALL_MSAA))
530          return false;
531 
532       /* BLT/RS supports the format. */
533       if (screen->specs.use_blt) {
534          if (translate_blt_format(format) == ETNA_NO_MATCH)
535             return false;
536       } else {
537          if (translate_rs_format(format) == ETNA_NO_MATCH)
538             return false;
539       }
540    }
541 
542    if (format == PIPE_FORMAT_R8_UNORM)
543       return VIV_FEATURE(screen, chipMinorFeatures5, HALTI5);
544 
545    /* figure out 8bpp RS clear to enable these formats */
546    if (format == PIPE_FORMAT_R8_SINT || format == PIPE_FORMAT_R8_UINT)
547       return VIV_FEATURE(screen, chipMinorFeatures5, HALTI5);
548 
549    if (util_format_is_srgb(format))
550       return VIV_FEATURE(screen, chipMinorFeatures5, HALTI3);
551 
552    if (util_format_is_pure_integer(format) || util_format_is_float(format))
553       return VIV_FEATURE(screen, chipMinorFeatures4, HALTI2);
554 
555    if (format == PIPE_FORMAT_R8G8_UNORM)
556       return VIV_FEATURE(screen, chipMinorFeatures4, HALTI2);
557 
558    /* any other extended format is HALTI0 (only R10G10B10A2?) */
559    if (fmt >= PE_FORMAT_R16F)
560       return VIV_FEATURE(screen, chipMinorFeatures1, HALTI0);
561 
562    return true;
563 }
564 
565 static bool
gpu_supports_vertex_format(struct etna_screen * screen,enum pipe_format format)566 gpu_supports_vertex_format(struct etna_screen *screen, enum pipe_format format)
567 {
568    if (translate_vertex_format_type(format) == ETNA_NO_MATCH)
569       return false;
570 
571    if (util_format_is_pure_integer(format))
572       return VIV_FEATURE(screen, chipMinorFeatures4, HALTI2);
573 
574    return true;
575 }
576 
577 static bool
etna_screen_is_format_supported(struct pipe_screen * pscreen,enum pipe_format format,enum pipe_texture_target target,unsigned sample_count,unsigned storage_sample_count,unsigned usage)578 etna_screen_is_format_supported(struct pipe_screen *pscreen,
579                                 enum pipe_format format,
580                                 enum pipe_texture_target target,
581                                 unsigned sample_count,
582                                 unsigned storage_sample_count,
583                                 unsigned usage)
584 {
585    struct etna_screen *screen = etna_screen(pscreen);
586    unsigned allowed = 0;
587 
588    if (!gpu_supports_texture_target(screen, target))
589       return false;
590 
591    if (MAX2(1, sample_count) != MAX2(1, storage_sample_count))
592       return false;
593 
594    if (usage & PIPE_BIND_RENDER_TARGET) {
595       if (gpu_supports_render_format(screen, format, sample_count))
596          allowed |= PIPE_BIND_RENDER_TARGET;
597    }
598 
599    if (usage & PIPE_BIND_DEPTH_STENCIL) {
600       if (translate_depth_format(format) != ETNA_NO_MATCH)
601          allowed |= PIPE_BIND_DEPTH_STENCIL;
602    }
603 
604    if (usage & PIPE_BIND_SAMPLER_VIEW) {
605       uint32_t fmt = translate_texture_format(format);
606 
607       if (!gpu_supports_texture_format(screen, fmt, format))
608          fmt = ETNA_NO_MATCH;
609 
610       if (sample_count < 2 && fmt != ETNA_NO_MATCH)
611          allowed |= PIPE_BIND_SAMPLER_VIEW;
612    }
613 
614    if (usage & PIPE_BIND_VERTEX_BUFFER) {
615       if (gpu_supports_vertex_format(screen, format))
616          allowed |= PIPE_BIND_VERTEX_BUFFER;
617    }
618 
619    if (usage & PIPE_BIND_INDEX_BUFFER) {
620       /* must be supported index format */
621       if (format == PIPE_FORMAT_R8_UINT || format == PIPE_FORMAT_R16_UINT ||
622           (format == PIPE_FORMAT_R32_UINT &&
623            VIV_FEATURE(screen, chipFeatures, 32_BIT_INDICES))) {
624          allowed |= PIPE_BIND_INDEX_BUFFER;
625       }
626    }
627 
628    /* Always allowed */
629    allowed |=
630       usage & (PIPE_BIND_DISPLAY_TARGET | PIPE_BIND_SCANOUT | PIPE_BIND_SHARED);
631 
632    if (usage != allowed) {
633       DBG("not supported: format=%s, target=%d, sample_count=%d, "
634           "usage=%x, allowed=%x",
635           util_format_name(format), target, sample_count, usage, allowed);
636    }
637 
638    return usage == allowed;
639 }
640 
641 const uint64_t supported_modifiers[] = {
642    DRM_FORMAT_MOD_LINEAR,
643    DRM_FORMAT_MOD_VIVANTE_TILED,
644    DRM_FORMAT_MOD_VIVANTE_SUPER_TILED,
645    DRM_FORMAT_MOD_VIVANTE_SPLIT_TILED,
646    DRM_FORMAT_MOD_VIVANTE_SPLIT_SUPER_TILED,
647 };
648 
etna_get_num_modifiers(struct etna_screen * screen)649 static int etna_get_num_modifiers(struct etna_screen *screen)
650 {
651    int num = ARRAY_SIZE(supported_modifiers);
652 
653    /* don't advertise split tiled formats on single pipe/buffer GPUs */
654    if (screen->specs.pixel_pipes == 1 || screen->specs.single_buffer)
655       num = 3;
656 
657    return num;
658 }
659 
660 static void
etna_screen_query_dmabuf_modifiers(struct pipe_screen * pscreen,enum pipe_format format,int max,uint64_t * modifiers,unsigned int * external_only,int * count)661 etna_screen_query_dmabuf_modifiers(struct pipe_screen *pscreen,
662                                    enum pipe_format format, int max,
663                                    uint64_t *modifiers,
664                                    unsigned int *external_only, int *count)
665 {
666    struct etna_screen *screen = etna_screen(pscreen);
667    int num_base_mods = etna_get_num_modifiers(screen);
668    int mods_multiplier = 1;
669    int i, j;
670 
671    if (DBG_ENABLED(ETNA_DBG_SHARED_TS) &&
672        VIV_FEATURE(screen, chipFeatures, FAST_CLEAR)) {
673       /* If TS is supported expose the TS modifiers. GPUs with feature
674        * CACHE128B256BPERLINE have both 128B and 256B color tile TS modes,
675        * older cores support exactly one TS layout.
676        */
677       if (VIV_FEATURE(screen, chipMinorFeatures6, CACHE128B256BPERLINE))
678          if (screen->specs.v4_compression &&
679              translate_ts_format(format) != ETNA_NO_MATCH)
680             mods_multiplier += 4;
681          else
682             mods_multiplier += 2;
683       else
684          mods_multiplier += 1;
685    }
686 
687    if (max > num_base_mods * mods_multiplier)
688       max = num_base_mods * mods_multiplier;
689 
690    if (!max) {
691       modifiers = NULL;
692       max = num_base_mods * mods_multiplier;
693    }
694 
695    for (i = 0, *count = 0; *count < max && i < num_base_mods; i++) {
696       for (j = 0; *count < max && j < mods_multiplier; j++, (*count)++) {
697          uint64_t ts_mod;
698 
699          if (j == 0) {
700             ts_mod = 0;
701          } else if (VIV_FEATURE(screen, chipMinorFeatures6,
702                                 CACHE128B256BPERLINE)) {
703             switch (j) {
704             case 1:
705                ts_mod = VIVANTE_MOD_TS_128_4;
706                break;
707             case 2:
708                ts_mod = VIVANTE_MOD_TS_256_4;
709                break;
710             case 3:
711                ts_mod = VIVANTE_MOD_TS_128_4 | VIVANTE_MOD_COMP_DEC400;
712                break;
713             case 4:
714                ts_mod = VIVANTE_MOD_TS_256_4 | VIVANTE_MOD_COMP_DEC400;
715             }
716          } else {
717             if (screen->specs.bits_per_tile == 2)
718                ts_mod = VIVANTE_MOD_TS_64_2;
719             else
720                ts_mod = VIVANTE_MOD_TS_64_4;
721          }
722 
723          if (modifiers)
724             modifiers[*count] = supported_modifiers[i] | ts_mod;
725          if (external_only)
726             external_only[*count] = util_format_is_yuv(format) ? 1 : 0;
727       }
728    }
729 }
730 
731 static bool
etna_screen_is_dmabuf_modifier_supported(struct pipe_screen * pscreen,uint64_t modifier,enum pipe_format format,bool * external_only)732 etna_screen_is_dmabuf_modifier_supported(struct pipe_screen *pscreen,
733                                          uint64_t modifier,
734                                          enum pipe_format format,
735                                          bool *external_only)
736 {
737    struct etna_screen *screen = etna_screen(pscreen);
738    int num_base_mods = etna_get_num_modifiers(screen);
739    uint64_t base_mod = modifier & ~VIVANTE_MOD_EXT_MASK;
740    uint64_t ts_mod = modifier & VIVANTE_MOD_TS_MASK;
741    int i;
742 
743    for (i = 0; i < num_base_mods; i++) {
744       if (base_mod != supported_modifiers[i])
745          continue;
746 
747       if ((modifier & VIVANTE_MOD_COMP_DEC400) &&
748           (!screen->specs.v4_compression || translate_ts_format(format) == ETNA_NO_MATCH))
749          return false;
750 
751       if (ts_mod) {
752          if (!VIV_FEATURE(screen, chipFeatures, FAST_CLEAR))
753             return false;
754 
755          if (VIV_FEATURE(screen, chipMinorFeatures6, CACHE128B256BPERLINE)) {
756             if (ts_mod != VIVANTE_MOD_TS_128_4 &&
757                 ts_mod != VIVANTE_MOD_TS_256_4)
758                return false;
759          } else {
760             if ((screen->specs.bits_per_tile == 2 &&
761                  ts_mod != VIVANTE_MOD_TS_64_2) ||
762                 (screen->specs.bits_per_tile == 4 &&
763                  ts_mod != VIVANTE_MOD_TS_64_4))
764                return false;
765          }
766       }
767 
768       if (external_only)
769          *external_only = util_format_is_yuv(format) ? 1 : 0;
770 
771       return true;
772    }
773 
774    return false;
775 }
776 
777 static unsigned int
etna_screen_get_dmabuf_modifier_planes(struct pipe_screen * pscreen,uint64_t modifier,enum pipe_format format)778 etna_screen_get_dmabuf_modifier_planes(struct pipe_screen *pscreen,
779                                        uint64_t modifier,
780                                        enum pipe_format format)
781 {
782    unsigned planes = util_format_get_num_planes(format);
783 
784    if (modifier & VIVANTE_MOD_TS_MASK)
785       return planes * 2;
786 
787    return planes;
788 }
789 
790 static void
etna_determine_uniform_limits(struct etna_screen * screen)791 etna_determine_uniform_limits(struct etna_screen *screen)
792 {
793    /* values for the non unified case are taken from
794     * gcmCONFIGUREUNIFORMS in the Vivante kernel driver file
795     * drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_base.h.
796     */
797    if (screen->model == chipModel_GC2000 &&
798        (screen->revision == 0x5118 || screen->revision == 0x5140)) {
799       screen->specs.max_vs_uniforms = 256;
800       screen->specs.max_ps_uniforms = 64;
801    } else if (screen->specs.num_constants == 320) {
802       screen->specs.max_vs_uniforms = 256;
803       screen->specs.max_ps_uniforms = 64;
804    } else if (screen->specs.num_constants > 256 &&
805               screen->model == chipModel_GC1000) {
806       /* All GC1000 series chips can only support 64 uniforms for ps on non-unified const mode. */
807       screen->specs.max_vs_uniforms = 256;
808       screen->specs.max_ps_uniforms = 64;
809    } else if (screen->specs.num_constants > 256) {
810       screen->specs.max_vs_uniforms = 256;
811       screen->specs.max_ps_uniforms = 256;
812    } else if (screen->specs.num_constants == 256) {
813       screen->specs.max_vs_uniforms = 256;
814       screen->specs.max_ps_uniforms = 256;
815    } else {
816       screen->specs.max_vs_uniforms = 168;
817       screen->specs.max_ps_uniforms = 64;
818    }
819 }
820 
821 static void
etna_determine_sampler_limits(struct etna_screen * screen)822 etna_determine_sampler_limits(struct etna_screen *screen)
823 {
824    /* vertex and fragment samplers live in one address space */
825    if (screen->specs.halti >= 1) {
826       screen->specs.vertex_sampler_offset = 16;
827       screen->specs.fragment_sampler_count = 16;
828       screen->specs.vertex_sampler_count = 16;
829    } else {
830       screen->specs.vertex_sampler_offset = 8;
831       screen->specs.fragment_sampler_count = 8;
832       screen->specs.vertex_sampler_count = 4;
833    }
834 
835    if (screen->model == 0x400)
836       screen->specs.vertex_sampler_count = 0;
837 }
838 
839 static bool
etna_get_specs(struct etna_screen * screen)840 etna_get_specs(struct etna_screen *screen)
841 {
842    uint64_t val;
843    uint32_t instruction_count;
844 
845    if (etna_gpu_get_param(screen->gpu, ETNA_GPU_INSTRUCTION_COUNT, &val)) {
846       DBG("could not get ETNA_GPU_INSTRUCTION_COUNT");
847       goto fail;
848    }
849    instruction_count = val;
850 
851    if (etna_gpu_get_param(screen->gpu, ETNA_GPU_VERTEX_OUTPUT_BUFFER_SIZE,
852                           &val)) {
853       DBG("could not get ETNA_GPU_VERTEX_OUTPUT_BUFFER_SIZE");
854       goto fail;
855    }
856    screen->specs.vertex_output_buffer_size = val;
857 
858    if (etna_gpu_get_param(screen->gpu, ETNA_GPU_VERTEX_CACHE_SIZE, &val)) {
859       DBG("could not get ETNA_GPU_VERTEX_CACHE_SIZE");
860       goto fail;
861    }
862    screen->specs.vertex_cache_size = val;
863 
864    if (etna_gpu_get_param(screen->gpu, ETNA_GPU_SHADER_CORE_COUNT, &val)) {
865       DBG("could not get ETNA_GPU_SHADER_CORE_COUNT");
866       goto fail;
867    }
868    screen->specs.shader_core_count = val;
869 
870    if (etna_gpu_get_param(screen->gpu, ETNA_GPU_STREAM_COUNT, &val)) {
871       DBG("could not get ETNA_GPU_STREAM_COUNT");
872       goto fail;
873    }
874    screen->specs.stream_count = val;
875 
876    if (etna_gpu_get_param(screen->gpu, ETNA_GPU_REGISTER_MAX, &val)) {
877       DBG("could not get ETNA_GPU_REGISTER_MAX");
878       goto fail;
879    }
880    screen->specs.max_registers = val;
881 
882    if (etna_gpu_get_param(screen->gpu, ETNA_GPU_PIXEL_PIPES, &val)) {
883       DBG("could not get ETNA_GPU_PIXEL_PIPES");
884       goto fail;
885    }
886    screen->specs.pixel_pipes = val;
887 
888    if (etna_gpu_get_param(screen->gpu, ETNA_GPU_NUM_CONSTANTS, &val)) {
889       DBG("could not get %s", "ETNA_GPU_NUM_CONSTANTS");
890       goto fail;
891    }
892    if (val == 0) {
893       fprintf(stderr, "Warning: zero num constants (update kernel?)\n");
894       val = 168;
895    }
896    screen->specs.num_constants = val;
897 
898    if (etna_gpu_get_param(screen->gpu, ETNA_GPU_NUM_VARYINGS, &val)) {
899       DBG("could not get ETNA_GPU_NUM_VARYINGS");
900       goto fail;
901    }
902    screen->specs.max_varyings = MAX2(val, ETNA_NUM_VARYINGS);
903 
904    if (etna_gpu_get_param(screen->gpu, ETNA_GPU_NN_CORE_COUNT, &val)) {
905       DBG("could not get ETNA_GPU_NN_CORE_COUNT");
906       goto fail;
907    }
908    screen->specs.nn_core_count = val;
909 
910    if (etna_gpu_get_param(screen->gpu, ETNA_GPU_NN_MAD_PER_CORE, &val)) {
911       DBG("could not get ETNA_GPU_NN_MAD_PER_CORE");
912       goto fail;
913    }
914    screen->specs.nn_mad_per_core = val;
915 
916    if (etna_gpu_get_param(screen->gpu, ETNA_GPU_TP_CORE_COUNT, &val)) {
917       DBG("could not get ETNA_GPU_TP_CORE_COUNT");
918       goto fail;
919    }
920    screen->specs.tp_core_count = val;
921 
922    if (etna_gpu_get_param(screen->gpu, ETNA_GPU_ON_CHIP_SRAM_SIZE, &val)) {
923       DBG("could not get ETNA_GPU_ON_CHIP_SRAM_SIZE");
924       goto fail;
925    }
926    screen->specs.on_chip_sram_size = val;
927 
928    if (etna_gpu_get_param(screen->gpu, ETNA_GPU_AXI_SRAM_SIZE, &val)) {
929       DBG("could not get ETNA_GPU_AXI_SRAM_SIZE");
930       goto fail;
931    }
932    screen->specs.axi_sram_size = val;
933 
934    /* Figure out gross GPU architecture. See rnndb/common.xml for a specific
935     * description of the differences. */
936    if (VIV_FEATURE(screen, chipMinorFeatures5, HALTI5))
937       screen->specs.halti = 5; /* New GC7000/GC8x00  */
938    else if (VIV_FEATURE(screen, chipMinorFeatures5, HALTI4))
939       screen->specs.halti = 4; /* Old GC7000/GC7400 */
940    else if (VIV_FEATURE(screen, chipMinorFeatures5, HALTI3))
941       screen->specs.halti = 3; /* None? */
942    else if (VIV_FEATURE(screen, chipMinorFeatures4, HALTI2))
943       screen->specs.halti = 2; /* GC2500/GC3000/GC5000/GC6400 */
944    else if (VIV_FEATURE(screen, chipMinorFeatures2, HALTI1))
945       screen->specs.halti = 1; /* GC900/GC4000/GC7000UL */
946    else if (VIV_FEATURE(screen, chipMinorFeatures1, HALTI0))
947       screen->specs.halti = 0; /* GC880/GC2000/GC7000TM */
948    else
949       screen->specs.halti = -1; /* GC7000nanolite / pre-GC2000 except GC880 */
950    if (screen->specs.halti >= 0)
951       DBG("etnaviv: GPU arch: HALTI%d", screen->specs.halti);
952    else
953       DBG("etnaviv: GPU arch: pre-HALTI");
954 
955    screen->specs.can_supertile =
956       VIV_FEATURE(screen, chipMinorFeatures0, SUPER_TILED);
957    screen->specs.bits_per_tile =
958       !VIV_FEATURE(screen, chipMinorFeatures0, 2BITPERTILE) ||
959       VIV_FEATURE(screen, chipMinorFeatures6, CACHE128B256BPERLINE) ? 4 : 2;
960 
961    screen->specs.ts_clear_value =
962       VIV_FEATURE(screen, chipMinorFeatures10, DEC400) ? 0xffffffff :
963       screen->specs.bits_per_tile == 4 ? 0x11111111 : 0x55555555;
964 
965    screen->specs.vs_need_z_div =
966       screen->model < 0x1000 && screen->model != 0x880;
967    screen->specs.has_sin_cos_sqrt =
968       VIV_FEATURE(screen, chipMinorFeatures0, HAS_SQRT_TRIG);
969    screen->specs.has_sign_floor_ceil =
970       VIV_FEATURE(screen, chipMinorFeatures0, HAS_SIGN_FLOOR_CEIL);
971    screen->specs.has_shader_range_registers =
972       screen->model >= 0x1000 || screen->model == 0x880;
973    screen->specs.npot_tex_any_wrap =
974       VIV_FEATURE(screen, chipMinorFeatures1, NON_POWER_OF_TWO);
975    screen->specs.has_new_transcendentals =
976       VIV_FEATURE(screen, chipMinorFeatures3, HAS_FAST_TRANSCENDENTALS);
977    screen->specs.has_halti2_instructions =
978       VIV_FEATURE(screen, chipMinorFeatures4, HALTI2);
979    screen->specs.has_no_oneconst_limit =
980       VIV_FEATURE(screen, chipMinorFeatures8, SH_NO_ONECONST_LIMIT);
981    screen->specs.v4_compression =
982       VIV_FEATURE(screen, chipMinorFeatures6, V4_COMPRESSION);
983    screen->specs.seamless_cube_map =
984       (screen->model != 0x880) && /* Seamless cubemap is broken on GC880? */
985       VIV_FEATURE(screen, chipMinorFeatures2, SEAMLESS_CUBE_MAP);
986 
987    if (screen->specs.halti >= 5) {
988       /* GC7000 - this core must load shaders from memory. */
989       screen->specs.vs_offset = 0;
990       screen->specs.ps_offset = 0;
991       screen->specs.max_instructions = 0; /* Do not program shaders manually */
992       screen->specs.has_icache = true;
993    } else if (VIV_FEATURE(screen, chipMinorFeatures3, INSTRUCTION_CACHE)) {
994       /* GC3000 - this core is capable of loading shaders from
995        * memory. It can also run shaders from registers, as a fallback, but
996        * "max_instructions" does not have the correct value. It has place for
997        * 2*256 instructions just like GC2000, but the offsets are slightly
998        * different.
999        */
1000       screen->specs.vs_offset = 0xC000;
1001       /* State 08000-0C000 mirrors 0C000-0E000, and the Vivante driver uses
1002        * this mirror for writing PS instructions, probably safest to do the
1003        * same.
1004        */
1005       screen->specs.ps_offset = 0x8000 + 0x1000;
1006       screen->specs.max_instructions = 256; /* maximum number instructions for non-icache use */
1007       screen->specs.has_icache = true;
1008    } else {
1009       if (instruction_count > 256) { /* unified instruction memory? */
1010          screen->specs.vs_offset = 0xC000;
1011          screen->specs.ps_offset = 0xD000; /* like vivante driver */
1012          screen->specs.max_instructions = 256;
1013       } else {
1014          screen->specs.vs_offset = 0x4000;
1015          screen->specs.ps_offset = 0x6000;
1016          screen->specs.max_instructions = instruction_count;
1017       }
1018       screen->specs.has_icache = false;
1019    }
1020 
1021    if (VIV_FEATURE(screen, chipMinorFeatures1, HALTI0)) {
1022       screen->specs.vertex_max_elements = 16;
1023    } else {
1024       /* Etna_viv documentation seems confused over the correct value
1025        * here so choose the lower to be safe: HALTI0 says 16 i.s.o.
1026        * 10, but VERTEX_ELEMENT_CONFIG register says 16 i.s.o. 12. */
1027       screen->specs.vertex_max_elements = 10;
1028    }
1029 
1030    etna_determine_uniform_limits(screen);
1031    etna_determine_sampler_limits(screen);
1032 
1033    if (screen->specs.halti >= 5) {
1034       screen->specs.has_unified_uniforms = true;
1035       screen->specs.vs_uniforms_offset = VIVS_SH_HALTI5_UNIFORMS_MIRROR(0);
1036       screen->specs.ps_uniforms_offset = VIVS_SH_HALTI5_UNIFORMS(screen->specs.max_vs_uniforms*4);
1037    } else if (screen->specs.halti >= 1) {
1038       /* unified uniform memory on GC3000 - HALTI1 feature bit is just a guess
1039       */
1040       screen->specs.has_unified_uniforms = true;
1041       screen->specs.vs_uniforms_offset = VIVS_SH_UNIFORMS(0);
1042       /* hardcode PS uniforms to start after end of VS uniforms -
1043        * for more flexibility this offset could be variable based on the
1044        * shader.
1045        */
1046       screen->specs.ps_uniforms_offset = VIVS_SH_UNIFORMS(screen->specs.max_vs_uniforms*4);
1047    } else {
1048       screen->specs.has_unified_uniforms = false;
1049       screen->specs.vs_uniforms_offset = VIVS_VS_UNIFORMS(0);
1050       screen->specs.ps_uniforms_offset = VIVS_PS_UNIFORMS(0);
1051    }
1052 
1053    screen->specs.max_texture_size =
1054       VIV_FEATURE(screen, chipMinorFeatures0, TEXTURE_8K) ? 8192 : 2048;
1055    screen->specs.max_rendertarget_size =
1056       VIV_FEATURE(screen, chipMinorFeatures0, RENDERTARGET_8K) ? 8192 : 2048;
1057 
1058    screen->specs.single_buffer = VIV_FEATURE(screen, chipMinorFeatures4, SINGLE_BUFFER);
1059    if (screen->specs.single_buffer)
1060       DBG("etnaviv: Single buffer mode enabled with %d pixel pipes", screen->specs.pixel_pipes);
1061 
1062    screen->specs.tex_astc = VIV_FEATURE(screen, chipMinorFeatures4, TEXTURE_ASTC) &&
1063                             !VIV_FEATURE(screen, chipMinorFeatures6, NO_ASTC);
1064 
1065    screen->specs.use_blt = VIV_FEATURE(screen, chipMinorFeatures5, BLT_ENGINE);
1066 
1067    /* Only allow fast clear with MC2.0 or MMUv2, as the TS unit bypasses the
1068     * memory offset for the MMUv1 linear window on MC1.0 and we have no way to
1069     * fixup the address.
1070     */
1071    if (!VIV_FEATURE(screen, chipMinorFeatures0, MC20) &&
1072        !VIV_FEATURE(screen, chipMinorFeatures1, MMU_VERSION))
1073       screen->features[viv_chipFeatures] &= ~chipFeatures_FAST_CLEAR;
1074 
1075    return true;
1076 
1077 fail:
1078    return false;
1079 }
1080 
1081 struct etna_bo *
etna_screen_bo_from_handle(struct pipe_screen * pscreen,struct winsys_handle * whandle)1082 etna_screen_bo_from_handle(struct pipe_screen *pscreen,
1083                            struct winsys_handle *whandle)
1084 {
1085    struct etna_screen *screen = etna_screen(pscreen);
1086    struct etna_bo *bo;
1087 
1088    if (whandle->type == WINSYS_HANDLE_TYPE_SHARED) {
1089       bo = etna_bo_from_name(screen->dev, whandle->handle);
1090    } else if (whandle->type == WINSYS_HANDLE_TYPE_FD) {
1091       bo = etna_bo_from_dmabuf(screen->dev, whandle->handle);
1092    } else {
1093       DBG("Attempt to import unsupported handle type %d", whandle->type);
1094       return NULL;
1095    }
1096 
1097    if (!bo) {
1098       DBG("ref name 0x%08x failed", whandle->handle);
1099       return NULL;
1100    }
1101 
1102    return bo;
1103 }
1104 
1105 static const void *
etna_get_compiler_options(struct pipe_screen * pscreen,enum pipe_shader_ir ir,enum pipe_shader_type shader)1106 etna_get_compiler_options(struct pipe_screen *pscreen,
1107                           enum pipe_shader_ir ir, enum pipe_shader_type shader)
1108 {
1109    return etna_compiler_get_options(etna_screen(pscreen)->compiler);
1110 }
1111 
1112 static struct disk_cache *
etna_get_disk_shader_cache(struct pipe_screen * pscreen)1113 etna_get_disk_shader_cache(struct pipe_screen *pscreen)
1114 {
1115    struct etna_screen *screen = etna_screen(pscreen);
1116    struct etna_compiler *compiler = screen->compiler;
1117 
1118    return compiler->disk_cache;
1119 }
1120 
1121 static int
etna_screen_get_fd(struct pipe_screen * pscreen)1122 etna_screen_get_fd(struct pipe_screen *pscreen)
1123 {
1124    struct etna_screen *screen = etna_screen(pscreen);
1125    return etna_device_fd(screen->dev);
1126 }
1127 
1128 struct pipe_screen *
etna_screen_create(struct etna_device * dev,struct etna_gpu * gpu,struct renderonly * ro)1129 etna_screen_create(struct etna_device *dev, struct etna_gpu *gpu,
1130                    struct renderonly *ro)
1131 {
1132    struct etna_screen *screen = CALLOC_STRUCT(etna_screen);
1133    struct pipe_screen *pscreen;
1134    uint64_t val;
1135 
1136    if (!screen)
1137       return NULL;
1138 
1139    pscreen = &screen->base;
1140    screen->dev = dev;
1141    screen->gpu = gpu;
1142    screen->ro = ro;
1143 
1144    screen->drm_version = etnaviv_device_version(screen->dev);
1145    etna_mesa_debug = debug_get_option_etna_mesa_debug();
1146 
1147    /* Disable autodisable for correct rendering with TS */
1148    etna_mesa_debug |= ETNA_DBG_NO_AUTODISABLE;
1149 
1150    screen->pipe = etna_pipe_new(gpu, ETNA_PIPE_3D);
1151    if (!screen->pipe) {
1152       DBG("could not create 3d pipe");
1153       goto fail;
1154    }
1155 
1156    if (etna_gpu_get_param(screen->gpu, ETNA_GPU_MODEL, &val)) {
1157       DBG("could not get ETNA_GPU_MODEL");
1158       goto fail;
1159    }
1160    screen->model = val;
1161 
1162    if (etna_gpu_get_param(screen->gpu, ETNA_GPU_REVISION, &val)) {
1163       DBG("could not get ETNA_GPU_REVISION");
1164       goto fail;
1165    }
1166    screen->revision = val;
1167 
1168    if (etna_gpu_get_param(screen->gpu, ETNA_GPU_FEATURES_0, &val)) {
1169       DBG("could not get ETNA_GPU_FEATURES_0");
1170       goto fail;
1171    }
1172    screen->features[0] = val;
1173 
1174    if (etna_gpu_get_param(screen->gpu, ETNA_GPU_FEATURES_1, &val)) {
1175       DBG("could not get ETNA_GPU_FEATURES_1");
1176       goto fail;
1177    }
1178    screen->features[1] = val;
1179 
1180    if (etna_gpu_get_param(screen->gpu, ETNA_GPU_FEATURES_2, &val)) {
1181       DBG("could not get ETNA_GPU_FEATURES_2");
1182       goto fail;
1183    }
1184    screen->features[2] = val;
1185 
1186    if (etna_gpu_get_param(screen->gpu, ETNA_GPU_FEATURES_3, &val)) {
1187       DBG("could not get ETNA_GPU_FEATURES_3");
1188       goto fail;
1189    }
1190    screen->features[3] = val;
1191 
1192    if (etna_gpu_get_param(screen->gpu, ETNA_GPU_FEATURES_4, &val)) {
1193       DBG("could not get ETNA_GPU_FEATURES_4");
1194       goto fail;
1195    }
1196    screen->features[4] = val;
1197 
1198    if (etna_gpu_get_param(screen->gpu, ETNA_GPU_FEATURES_5, &val)) {
1199       DBG("could not get ETNA_GPU_FEATURES_5");
1200       goto fail;
1201    }
1202    screen->features[5] = val;
1203 
1204    if (etna_gpu_get_param(screen->gpu, ETNA_GPU_FEATURES_6, &val)) {
1205       DBG("could not get ETNA_GPU_FEATURES_6");
1206       goto fail;
1207    }
1208    screen->features[6] = val;
1209 
1210    if (etna_gpu_get_param(screen->gpu, ETNA_GPU_FEATURES_7, &val)) {
1211       DBG("could not get ETNA_GPU_FEATURES_7");
1212       goto fail;
1213    }
1214    screen->features[7] = val;
1215 
1216    if (etna_gpu_get_param(screen->gpu, ETNA_GPU_FEATURES_8, &val)) {
1217       DBG("could not get ETNA_GPU_FEATURES_8");
1218       goto fail;
1219    }
1220    screen->features[8] = val;
1221 
1222    if (etna_gpu_get_param(screen->gpu, ETNA_GPU_FEATURES_9, &val)) {
1223       DBG("could not get ETNA_GPU_FEATURES_9");
1224       goto fail;
1225    }
1226    screen->features[9] = val;
1227 
1228    if (etna_gpu_get_param(screen->gpu, ETNA_GPU_FEATURES_10, &val)) {
1229       DBG("could not get ETNA_GPU_FEATURES_10");
1230       goto fail;
1231    }
1232    screen->features[10] = val;
1233 
1234    if (etna_gpu_get_param(screen->gpu, ETNA_GPU_FEATURES_11, &val)) {
1235       DBG("could not get ETNA_GPU_FEATURES_11");
1236       goto fail;
1237    }
1238    screen->features[11] = val;
1239 
1240    if (etna_gpu_get_param(screen->gpu, ETNA_GPU_FEATURES_12, &val)) {
1241       DBG("could not get ETNA_GPU_FEATURES_12");
1242       goto fail;
1243    }
1244    screen->features[12] = val;
1245 
1246    if (!etna_get_specs(screen))
1247       goto fail;
1248 
1249    if (screen->specs.halti >= 5 && !etnaviv_device_softpin_capable(dev)) {
1250       DBG("halti5 requires softpin");
1251       goto fail;
1252    }
1253 
1254    /* apply debug options that disable individual features */
1255    if (DBG_ENABLED(ETNA_DBG_NO_EARLY_Z))
1256       screen->features[viv_chipFeatures] |= chipFeatures_NO_EARLY_Z;
1257    if (DBG_ENABLED(ETNA_DBG_NO_TS))
1258          screen->features[viv_chipFeatures] &= ~chipFeatures_FAST_CLEAR;
1259    if (DBG_ENABLED(ETNA_DBG_NO_AUTODISABLE))
1260       screen->features[viv_chipMinorFeatures1] &= ~chipMinorFeatures1_AUTO_DISABLE;
1261    if (DBG_ENABLED(ETNA_DBG_NO_SUPERTILE))
1262       screen->specs.can_supertile = 0;
1263    if (DBG_ENABLED(ETNA_DBG_NO_SINGLEBUF))
1264       screen->specs.single_buffer = 0;
1265    if (!DBG_ENABLED(ETNA_DBG_LINEAR_PE))
1266       screen->features[viv_chipMinorFeatures2] &= ~chipMinorFeatures2_LINEAR_PE;
1267 
1268    pscreen->destroy = etna_screen_destroy;
1269    pscreen->get_screen_fd = etna_screen_get_fd;
1270    pscreen->get_param = etna_screen_get_param;
1271    pscreen->get_paramf = etna_screen_get_paramf;
1272    pscreen->get_shader_param = etna_screen_get_shader_param;
1273    pscreen->get_compiler_options = etna_get_compiler_options;
1274    pscreen->get_disk_shader_cache = etna_get_disk_shader_cache;
1275 
1276    pscreen->get_name = etna_screen_get_name;
1277    pscreen->get_vendor = etna_screen_get_vendor;
1278    pscreen->get_device_vendor = etna_screen_get_device_vendor;
1279 
1280    pscreen->get_timestamp = u_default_get_timestamp;
1281    pscreen->context_create = etna_context_create;
1282    pscreen->is_format_supported = etna_screen_is_format_supported;
1283    pscreen->query_dmabuf_modifiers = etna_screen_query_dmabuf_modifiers;
1284    pscreen->is_dmabuf_modifier_supported = etna_screen_is_dmabuf_modifier_supported;
1285    pscreen->get_dmabuf_modifier_planes = etna_screen_get_dmabuf_modifier_planes;
1286 
1287    if (!etna_shader_screen_init(pscreen))
1288       goto fail;
1289 
1290    etna_fence_screen_init(pscreen);
1291    etna_query_screen_init(pscreen);
1292    etna_resource_screen_init(pscreen);
1293 
1294    util_dynarray_init(&screen->supported_pm_queries, NULL);
1295    slab_create_parent(&screen->transfer_pool, sizeof(struct etna_transfer), 16);
1296 
1297    if (screen->drm_version >= ETNA_DRM_VERSION_PERFMON)
1298       etna_pm_query_setup(screen);
1299 
1300 
1301    /* create dummy RT buffer, used when rendering with no color buffer */
1302    screen->dummy_rt_reloc.bo = etna_bo_new(screen->dev, 64 * 64 * 4,
1303                                            DRM_ETNA_GEM_CACHE_WC);
1304    if (!screen->dummy_rt_reloc.bo)
1305       goto fail;
1306 
1307    screen->dummy_rt_reloc.offset = 0;
1308    screen->dummy_rt_reloc.flags = ETNA_RELOC_READ | ETNA_RELOC_WRITE;
1309 
1310    if (screen->specs.halti >= 5) {
1311       void *buf;
1312 
1313       /* create an empty dummy texture descriptor */
1314       screen->dummy_desc_reloc.bo = etna_bo_new(screen->dev, 0x100,
1315                                                 DRM_ETNA_GEM_CACHE_WC);
1316       if (!screen->dummy_desc_reloc.bo)
1317          goto fail;
1318 
1319       buf = etna_bo_map(screen->dummy_desc_reloc.bo);
1320       etna_bo_cpu_prep(screen->dummy_desc_reloc.bo, DRM_ETNA_PREP_WRITE);
1321       memset(buf, 0, 0x100);
1322       etna_bo_cpu_fini(screen->dummy_desc_reloc.bo);
1323       screen->dummy_desc_reloc.offset = 0;
1324       screen->dummy_desc_reloc.flags = ETNA_RELOC_READ;
1325    }
1326 
1327    return pscreen;
1328 
1329 fail:
1330    etna_screen_destroy(pscreen);
1331    return NULL;
1332 }
1333