~mmach/netext73/mesa-haswell

« back to all changes in this revision

Viewing changes to src/gallium/drivers/panfrost/pan_screen.c

  • Committer: mmach
  • Date: 2022-09-22 20:02:48 UTC
  • Revision ID: netbit73@gmail.com-20220922200248-7y4wybmdgipuwdiw
2022-09-22 21:17:09

Show diffs side-by-side

added added

removed removed

Lines of Context:
69
69
        {"linear",    PAN_DBG_LINEAR,   "Force linear textures"},
70
70
        {"nocache",   PAN_DBG_NO_CACHE, "Disable BO cache"},
71
71
        {"dump",      PAN_DBG_DUMP,     "Dump all graphics memory"},
 
72
#ifdef PAN_DBG_OVERFLOW
 
73
        {"overflow",  PAN_DBG_OVERFLOW, "Check for buffer overflows in pool uploads"},
 
74
#endif
72
75
        DEBUG_NAMED_VALUE_END
73
76
};
74
77
 
105
108
        bool has_heap = dev->kernel_version->version_major > 1 ||
106
109
                        dev->kernel_version->version_minor >= 1;
107
110
 
108
 
        /* Bifrost is WIP */
109
111
        switch (param) {
110
112
        case PIPE_CAP_NPOT_TEXTURES:
111
113
        case PIPE_CAP_MIXED_COLOR_DEPTH_BITS:
112
114
        case PIPE_CAP_FRAGMENT_SHADER_TEXTURE_LOD:
113
 
        case PIPE_CAP_VERTEX_SHADER_SATURATE:
114
115
        case PIPE_CAP_VERTEX_COLOR_UNCLAMPED:
115
116
        case PIPE_CAP_POINT_SPRITE:
116
117
        case PIPE_CAP_DEPTH_CLIP_DISABLE:
122
123
        case PIPE_CAP_FRAGMENT_SHADER_DERIVATIVES:
123
124
        case PIPE_CAP_FRAMEBUFFER_NO_ATTACHMENT:
124
125
        case PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION:
 
126
        case PIPE_CAP_SHADER_PACK_HALF_FLOAT:
125
127
                return 1;
126
128
 
127
129
        case PIPE_CAP_MAX_RENDER_TARGETS:
196
198
        case PIPE_CAP_GLSL_FEATURE_LEVEL_COMPATIBILITY:
197
199
                return is_gl3 ? 330 : 140;
198
200
        case PIPE_CAP_ESSL_FEATURE_LEVEL:
199
 
                return pan_is_bifrost(dev) ? 320 : 310;
 
201
                return dev->arch >= 6 ? 320 : 310;
200
202
 
201
203
        case PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT:
202
204
                return 16;
203
205
 
204
 
        case PIPE_CAP_MAX_TEXTURE_BUFFER_SIZE:
 
206
        case PIPE_CAP_MAX_TEXEL_BUFFER_ELEMENTS_UINT:
205
207
                return 65536;
206
208
 
207
209
        /* Must be at least 64 for correct behaviour */
318
320
 
319
321
        case PIPE_CAP_SUPPORTED_PRIM_MODES:
320
322
        case PIPE_CAP_SUPPORTED_PRIM_MODES_WITH_RESTART: {
321
 
                /* Mali supports GLES and QUADS. Midgard supports more */
 
323
                /* Mali supports GLES and QUADS. Midgard and v6 Bifrost
 
324
                 * support more */
322
325
                uint32_t modes = BITFIELD_MASK(PIPE_PRIM_QUADS + 1);
323
326
 
324
 
                if (dev->arch <= 5) {
 
327
                if (dev->arch <= 6) {
325
328
                        modes |= BITFIELD_BIT(PIPE_PRIM_QUAD_STRIP);
326
329
                        modes |= BITFIELD_BIT(PIPE_PRIM_POLYGON);
327
330
                }
328
331
 
 
332
                if (dev->arch >= 9) {
 
333
                        /* Although Valhall is supposed to support quads, they
 
334
                         * don't seem to work correctly. Disable to fix
 
335
                         * arb-provoking-vertex-render.
 
336
                         */
 
337
                        modes &= ~BITFIELD_BIT(PIPE_PRIM_QUADS);
 
338
                }
 
339
 
329
340
                return modes;
330
341
        }
331
342
 
355
366
                return 0;
356
367
        }
357
368
 
 
369
        /* We only allow observable side effects (memory writes) in compute and
 
370
         * fragment shaders. Side effects in the geometry pipeline cause
 
371
         * trouble with IDVS.
 
372
         *
 
373
         * This restriction doesn't apply to Midgard, which does not implement
 
374
         * IDVS and therefore executes vertex shaders exactly once.
 
375
         */
 
376
        bool allow_side_effects = (shader != PIPE_SHADER_VERTEX) ||
 
377
                                  (dev->arch <= 5);
 
378
 
358
379
        switch (param) {
359
380
        case PIPE_SHADER_CAP_MAX_INSTRUCTIONS:
360
381
        case PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS:
375
396
        case PIPE_SHADER_CAP_MAX_TEMPS:
376
397
                return 256; /* arbitrary */
377
398
 
378
 
        case PIPE_SHADER_CAP_MAX_CONST_BUFFER_SIZE:
 
399
        case PIPE_SHADER_CAP_MAX_CONST_BUFFER0_SIZE:
379
400
                return 16 * 1024 * sizeof(float);
380
401
 
381
402
        case PIPE_SHADER_CAP_MAX_CONST_BUFFERS:
382
403
                STATIC_ASSERT(PAN_MAX_CONST_BUFFERS < 0x100);
383
404
                return PAN_MAX_CONST_BUFFERS;
384
405
 
385
 
        case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
 
406
        case PIPE_SHADER_CAP_CONT_SUPPORTED:
386
407
                return 0;
387
408
 
388
409
        case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:
391
412
                return 0;
392
413
 
393
414
        case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
394
 
                return pan_is_bifrost(dev);
 
415
                return dev->arch >= 6;
395
416
 
396
417
        case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
397
418
                return 1;
414
435
                return !is_nofp16;
415
436
        case PIPE_SHADER_CAP_FP16_DERIVATIVES:
416
437
        case PIPE_SHADER_CAP_FP16_CONST_BUFFERS:
417
 
                return pan_is_bifrost(dev) && !is_nofp16;
 
438
                return dev->arch >= 6 && !is_nofp16;
418
439
        case PIPE_SHADER_CAP_INT16:
419
440
                /* XXX: Advertise this CAP when a proper fix to lower_precision
420
441
                 * lands. GLSL IR validation failure in glmark2 -bterrain */
421
 
                return pan_is_bifrost(dev) && !is_nofp16 && is_deqp;
 
442
                return dev->arch >= 6 && !is_nofp16 && is_deqp;
422
443
 
423
444
        case PIPE_SHADER_CAP_INT64_ATOMICS:
424
 
        case PIPE_SHADER_CAP_TGSI_DROUND_SUPPORTED:
425
 
        case PIPE_SHADER_CAP_TGSI_DFRACEXP_DLDEXP_SUPPORTED:
426
 
        case PIPE_SHADER_CAP_TGSI_LDEXP_SUPPORTED:
427
 
        case PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED:
 
445
        case PIPE_SHADER_CAP_DROUND_SUPPORTED:
 
446
        case PIPE_SHADER_CAP_DFRACEXP_DLDEXP_SUPPORTED:
 
447
        case PIPE_SHADER_CAP_LDEXP_SUPPORTED:
428
448
        case PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE:
429
449
                return 0;
430
450
 
443
463
                return (1 << PIPE_SHADER_IR_NIR) | (1 << PIPE_SHADER_IR_NIR_SERIALIZED);
444
464
 
445
465
        case PIPE_SHADER_CAP_MAX_SHADER_BUFFERS:
446
 
                return 16;
 
466
                return allow_side_effects ? 16 : 0;
447
467
 
448
468
        case PIPE_SHADER_CAP_MAX_SHADER_IMAGES:
449
 
                return PIPE_MAX_SHADER_IMAGES;
 
469
                return allow_side_effects ? PIPE_MAX_SHADER_IMAGES : 0;
450
470
 
451
 
        case PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HINT:
452
471
        case PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTERS:
453
472
        case PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTER_BUFFERS:
454
 
        case PIPE_SHADER_CAP_TGSI_SKIP_MERGE_REGISTERS:
455
 
        case PIPE_SHADER_CAP_LOWER_IF_THRESHOLD:
456
473
                return 0;
457
474
 
458
475
        default:
527
544
 
528
545
        format_desc = util_format_description(format);
529
546
 
530
 
        if (!format_desc)
531
 
                return false;
532
 
 
533
547
        /* MSAA 2x gets rounded up to 4x. MSAA 8x/16x only supported on v5+.
534
548
         * TODO: debug MSAA 8x/16x */
535
549
 
590
604
        struct panfrost_device *dev = pan_device(screen);
591
605
        bool afbc = dev->has_afbc && panfrost_format_supports_afbc(dev, format);
592
606
        bool ytr = panfrost_afbc_can_ytr(format);
 
607
        bool tiled_afbc = panfrost_afbc_can_tile(dev);
593
608
 
594
609
        unsigned count = 0;
595
610
 
600
615
                if ((pan_best_modifiers[i] & AFBC_FORMAT_MOD_YTR) && !ytr)
601
616
                        continue;
602
617
 
 
618
                if ((pan_best_modifiers[i] & AFBC_FORMAT_MOD_TILED) && !tiled_afbc)
 
619
                        continue;
 
620
 
603
621
                if (test_modifier != DRM_FORMAT_MOD_INVALID &&
604
622
                    test_modifier != pan_best_modifiers[i])
605
623
                        continue;
698
716
                RET((uint32_t []) { 800 /* MHz -- TODO */ });
699
717
 
700
718
        case PIPE_COMPUTE_CAP_MAX_COMPUTE_UNITS:
701
 
                RET((uint32_t []) { 9999 });  // TODO
 
719
                RET((uint32_t []) { dev->core_count });
702
720
 
703
721
        case PIPE_COMPUTE_CAP_IMAGES_SUPPORTED:
704
722
                RET((uint32_t []) { 1 });
705
723
 
706
724
        case PIPE_COMPUTE_CAP_SUBGROUP_SIZE:
707
 
                RET((uint32_t []) { dev->arch >= 7 ? 8 : 4 });
 
725
                RET((uint32_t []) { pan_subgroup_size(dev->arch) });
708
726
 
709
727
        case PIPE_COMPUTE_CAP_MAX_VARIABLE_THREADS_PER_BLOCK:
710
728
                RET((uint64_t []) { 1024 }); // TODO
855
873
        if (dev->debug & PAN_DBG_NO_AFBC)
856
874
                dev->has_afbc = false;
857
875
 
858
 
        /* It's early days for Valhall support... disable AFBC for now to keep
859
 
         * hardware bring-up simple
860
 
         */
861
 
        if (dev->arch >= 9)
862
 
                dev->has_afbc = false;
863
 
 
864
876
        /* Bail early on unsupported hardware */
865
877
        if (dev->model == NULL) {
866
878
                debug_printf("panfrost: Unsupported model %X", dev->gpu_id);
907
919
                panfrost_cmdstream_screen_init_v6(screen);
908
920
        else if (dev->arch == 7)
909
921
                panfrost_cmdstream_screen_init_v7(screen);
 
922
        else if (dev->arch == 9)
 
923
                panfrost_cmdstream_screen_init_v9(screen);
910
924
        else
911
925
                unreachable("Unhandled architecture major");
912
926