GPU


This chapter describes common information and instructions of GPU on IoT Yocto, such as command to query GPU hardware information, command to find EGL, GLES support details and so on.

But GPU on different platforms may have some platform-specific instructions or test results. For example, you will get different benchmark results on different platforms. Please find section: Device-Dependent to find more details about difference of GPU on each platform.

Note

After IoT Yocto v23.0, you have to flash image with gpu device tree overlay (gpu-mali.dtbo) to enable GPU support on every platform.

genio-flash --load-dtbo gpu-mali.dtbo

Note

Starting from IoT Yocto v23.1, we no longer specifically reserve memory of Contiguous Memory Allocator (CMA) heap for GPU usage. The size of reserved memory is very difficult to estimate. Therefore, we allow the GPU to directly use the system memory instead of the reserved CMA.


GPU Hardware Specification

Please refer to the SoC Platforms to find GPU specifications.


GPU Identification

GPU Hardware Information

You can use following cmd: cat /sys/class/misc/mali0/device/gpuinfo to determine the GPU hardware you are using.

Take Genio 1200-EVK as an example:

cat /sys/class/misc/mali0/device/gpuinfo
Mali-G57 5 cores r0p1 0x9091

Note

All cmd operations presented in this chapter are based on the IoT Yocto v23.1, Genio 1200-EVK. You might get different operation result depends on what platform you currently use.

EGL/OpenGL ES Information

To determine OpenGL ES support details, you can query it by launch weston --backend=drm-backend.so then you could get following information:

  • EGL version and extensions

  • OpenGL ES version and extensions

  • GLSL version

weston --backend=drm-backend.so
Date: 2010-01-01 UTC
weston 10.0.2
    https://wayland.freedesktop.org
    Bug reports to: https://gitlab.freedesktop.org/wayland/weston/issues/
    Build: 10.0.2
Command line: weston --backend=drm-backend.so
OS: Linux, 5.15.37-mtk+g94da79813879, #1 SMP PREEMPT Mon Feb 20 06:42:54 UTC 2023, aarch64
Flight recorder: enabled
Using config file '/etc/xdg/weston/weston.ini'
Output repaint window is 7 ms maximum.
Loading module '/usr/lib/libweston-10/drm-backend.so'
initializing drm backend
Trying libseat launcher...
libseat: session control granted
using /dev/dri/card0
DRM: supports atomic modesetting
DRM: does not support GBM modifiers
DRM: supports picture aspect ratio
Loading module '/usr/lib/libweston-10/gl-renderer.so'
EGL client extensions: EGL_EXT_client_extensions
EGL_EXT_platform_base EGL_KHR_client_get_all_proc_addresses
EGL_KHR_platform_gbm EGL_KHR_platform_wayland
EGL_EXT_platform_wayland
EGL version: 1.4 Valhall-"r41p0-01eac0"
EGL vendor: ARM
EGL client APIs: OpenGL_ES
EGL extensions: EGL_WL_bind_wayland_display
EGL_NV_context_priority_realtime
EGL_KHR_partial_updateEGL_EXT_buffer_age EGL_KHR_config_attribs
EGL_KHR_image EGL_KHR_image_base EGL_KHR_fence_sync
EGL_KHR_wait_sync EGL_KHR_gl_colorspace
EGL_KHR_get_all_proc_addresses EGL_IMG_context_priority
EGL_KHR_no_config_context EGL_EXT_image_dma_buf_import
EGL_EXT_image_dma_buf_import_modifiers EGL_EXT_yuv_surface
EGL_EXT_pixel_format_float EGL_ARM_pixmap_multisample_discard
EGL_ARM_implicit_external_sync EGL_ANDROID_native_fence_sync
EGL_KHR_gl_texture_2D_image EGL_KHR_gl_renderbuffer_image
EGL_KHR_create_context EGL_KHR_surfaceless_context
EGL_KHR_gl_texture_cubemap_image EGL_EXT_image_gl_colorspace
EGL_EXT_create_context_robustness
EGL_KHR_surfaceless_context available
GL version: OpenGL ES 3.2 v1.r41p0-01eac0.c36381f2278bad73183210f9208267f3
GLSL version: OpenGL ES GLSL ES 3.20
GL vendor: ARM
GL renderer: Mali-G57
GL extensions: GL_ARM_rgba8 GL_ARM_mali_shader_binary
GL_OES_depth24 GL_OES_depth_texture
GL_OES_depth_texture_cube_map GL_OES_packed_depth_stencil
GL_OES_rgb8_rgba8 GL_EXT_read_format_bgra
GL_OES_compressed_paletted_texture
GL_OES_compressed_ETC1_RGB8_texture GL_OES_standard_derivatives
GL_OES_EGL_image GL_OES_EGL_image_external
GL_OES_EGL_image_external_essl3 GL_OES_EGL_sync
GL_OES_texture_npot GL_OES_vertex_half_float
GL_OES_required_internalformat GL_OES_vertex_array_object
GL_OES_mapbuffer GL_EXT_texture_format_BGRA8888
GL_EXT_texture_rg GL_EXT_texture_type_2_10_10_10_REV
GL_OES_fbo_render_mipmap GL_OES_element_index_uint
GL_EXT_shadow_samplers GL_OES_texture_compression_astc
GL_KHR_texture_compression_astc_ldr
GL_KHR_texture_compression_astc_hdr
GL_KHR_texture_compression_astc_sliced_3d
GL_EXT_texture_compression_astc_decode_mode
GL_EXT_texture_compression_astc_decode_mode_rgb9e5 GL_KHR_debug
GL_EXT_occlusion_query_boolean GL_EXT_disjoint_timer_query
GL_EXT_blend_minmax GL_EXT_discard_framebuffer
GL_OES_get_program_binary GL_OES_texture_3D
GL_EXT_texture_storage GL_EXT_multisampled_render_to_texture
GL_EXT_multisampled_render_to_texture2
GL_OES_surfaceless_context GL_OES_texture_stencil8
GL_EXT_shader_pixel_local_storage
GL_ARM_shader_framebuffer_fetch
GL_ARM_shader_framebuffer_fetch_depth_stencil
GL_ARM_mali_program_binary GL_EXT_sRGB
GL_EXT_sRGB_write_control GL_EXT_texture_sRGB_decode
GL_EXT_texture_sRGB_R8 GL_EXT_texture_sRGB_RG8
GL_KHR_blend_equation_advanced
GL_KHR_blend_equation_advanced_coherent
GL_OES_texture_storage_multisample_2d_array
GL_OES_shader_image_atomic GL_EXT_robustness
GL_EXT_draw_buffers_indexed GL_OES_draw_buffers_indexed
GL_EXT_texture_border_clamp GL_OES_texture_border_clamp
GL_EXT_texture_cube_map_array GL_OES_texture_cube_map_array
GL_OES_sample_variables GL_OES_sample_shading
GL_OES_shader_multisample_interpolation GL_EXT_shader_io_blocks
GL_OES_shader_io_blocks GL_EXT_tessellation_shader
GL_OES_tessellation_shader GL_EXT_primitive_bounding_box
GL_OES_primitive_bounding_box GL_EXT_geometry_shader
GL_OES_geometry_shader GL_ANDROID_extension_pack_es31a
GL_EXT_gpu_shader5 GL_OES_gpu_shader5 GL_EXT_texture_buffer
GL_OES_texture_buffer GL_EXT_copy_image GL_OES_copy_image
GL_EXT_shader_non_constant_global_initializers
GL_EXT_color_buffer_half_float GL_EXT_unpack_subimage
GL_EXT_color_buffer_float GL_EXT_float_blend GL_EXT_YUV_target
GL_OVR_multiview GL_OVR_multiview2
GL_OVR_multiview_multisampled_render_to_texture
GL_KHR_robustness GL_KHR_robust_buffer_access_behavior
GL_EXT_draw_elements_base_vertex
GL_OES_draw_elements_base_vertex GL_EXT_buffer_storage
GL_EXT_texture_filter_anisotropic GL_OES_texture_float_linear
GL_ARM_texture_unnormalized_coordinates
GL_EXT_shader_framebuffer_fetch GL_EXT_clip_control
GL ES 3.2 - renderer features:
read-back format: BGRA
EGL Wayland extension: yes
...

OpenCL Information

To determine OpenCL support details, you can query it by launch clinfo

clinfo
    Number of platforms                               1
    Platform Name                                   ARM Platform
    Platform Vendor                                 ARM
    Platform Version                                OpenCL 3.0 v1.r41p0-01eac0.c36381f2278bad73183210f9208267f3
    Platform Profile                                FULL_PROFILE
    Platform Extensions                             cl_khr_global_int32_base_atomics cl_khr_global_int32_extended_atomics cl_khr_local_int32_base_atomics cl_khr_local_int32_extended_atomics cl_khr_byte_addressable_store cl_khr_3d_image_writes cl_khr_int64_base_atomics cl_khr_int64_extended_atomics cl_khr_fp16 cl_khr_icd cl_khr_egl_image cl_khr_image2d_from_buffer cl_khr_depth_images cl_khr_subgroups cl_khr_subgroup_extended_types cl_khr_subgroup_non_uniform_vote cl_khr_subgroup_ballot cl_khr_subgroup_non_uniform_arithmetic cl_khr_subgroup_shuffle cl_khr_subgroup_shuffle_relative cl_khr_subgroup_clustered_reduce cl_khr_subgroup_rotate cl_khr_il_program cl_khr_priority_hints cl_khr_create_command_queue cl_khr_spirv_no_integer_wrap_decoration cl_khr_extended_versioning cl_khr_device_uuid cl_khr_suggested_local_work_size cl_khr_extended_bit_ops cl_khr_integer_dot_product cl_khr_semaphore cl_khr_external_semaphore cl_khr_external_semaphore_sync_fd cl_khr_command_buffer cl_arm_core_id cl_arm_printf cl_arm_non_uniform_work_group_size cl_arm_import_memory cl_arm_import_memory_dma_buf cl_arm_import_memory_host cl_arm_integer_dot_product_int8 cl_arm_integer_dot_product_accumulate_int8 cl_arm_integer_dot_product_accumulate_saturate_int8 cl_arm_job_slot_selection cl_arm_scheduling_controls cl_arm_controlled_kernel_termination cl_ext_cxx_for_opencl cl_ext_image_tiling_control cl_ext_image_requirements_info cl_ext_image_from_buffer cl_ext_yuv_images
    Platform Extensions with Version                cl_khr_global_int32_base_atomics                                 0x400000 (1.0.0)
                                                    cl_khr_global_int32_extended_atomics                             0x400000 (1.0.0)
                                                    cl_khr_local_int32_base_atomics                                  0x400000 (1.0.0)
                                                    cl_khr_local_int32_extended_atomics                              0x400000 (1.0.0)
                                                    cl_khr_byte_addressable_store                                    0x400000 (1.0.0)
                                                    cl_khr_3d_image_writes                                           0x400000 (1.0.0)
                                                    cl_khr_int64_base_atomics                                        0x400000 (1.0.0)
                                                    cl_khr_int64_extended_atomics                                    0x400000 (1.0.0)
                                                    cl_khr_fp16                                                      0x400000 (1.0.0)
                                                    cl_khr_icd                                                       0x400000 (1.0.0)
                                                    cl_khr_egl_image                                                 0x400000 (1.0.0)
                                                    cl_khr_image2d_from_buffer                                       0x400000 (1.0.0)
                                                    cl_khr_depth_images                                              0x400000 (1.0.0)
                                                    cl_khr_subgroups                                                 0x400000 (1.0.0)
                                                    cl_khr_subgroup_extended_types                                   0x400000 (1.0.0)
                                                    cl_khr_subgroup_non_uniform_vote                                 0x400000 (1.0.0)
                                                    cl_khr_subgroup_ballot                                           0x400000 (1.0.0)
                                                    cl_khr_subgroup_non_uniform_arithmetic                           0x400000 (1.0.0)
                                                    cl_khr_subgroup_shuffle                                          0x400000 (1.0.0)
                                                    cl_khr_subgroup_shuffle_relative                                 0x400000 (1.0.0)
                                                    cl_khr_subgroup_clustered_reduce                                 0x400000 (1.0.0)
                                                    cl_khr_subgroup_rotate                                           0x400000 (1.0.0)
                                                    cl_khr_il_program                                                0x400000 (1.0.0)
                                                    cl_khr_priority_hints                                            0x400000 (1.0.0)
                                                    cl_khr_create_command_queue                                      0x400000 (1.0.0)
                                                    cl_khr_spirv_no_integer_wrap_decoration                          0x400000 (1.0.0)
                                                    cl_khr_extended_versioning                                       0x400000 (1.0.0)
                                                    cl_khr_device_uuid                                               0x400000 (1.0.0)
                                                    cl_khr_suggested_local_work_size                                 0x400000 (1.0.0)
                                                    cl_khr_extended_bit_ops                                          0x400000 (1.0.0)
                                                    cl_khr_integer_dot_product                                       0x800000 (2.0.0)
                                                    cl_khr_semaphore                                                   0x9000 (0.9.0)
                                                    cl_khr_external_semaphore                                          0x9000 (0.9.0)
                                                    cl_khr_external_semaphore_sync_fd                                  0x9000 (0.9.0)
                                                    cl_khr_command_buffer                                              0x9000 (0.9.0)
                                                    cl_arm_core_id                                                   0x400000 (1.0.0)
                                                    cl_arm_printf                                                    0x800000 (2.0.0)
                                                    cl_arm_non_uniform_work_group_size                               0x400000 (1.0.0)
                                                    cl_arm_import_memory                                             0x401000 (1.1.0)
                                                    cl_arm_import_memory_dma_buf                                     0x400000 (1.0.0)
                                                    cl_arm_import_memory_host                                        0x400000 (1.0.0)
                                                    cl_arm_integer_dot_product_int8                                  0x400000 (1.0.0)
                                                    cl_arm_integer_dot_product_accumulate_int8                       0x400000 (1.0.0)
                                                    cl_arm_integer_dot_product_accumulate_saturate_int8              0x400000 (1.0.0)
                                                    cl_arm_job_slot_selection                                        0x400000 (1.0.0)
                                                    cl_arm_scheduling_controls                                         0x4000 (0.4.0)
                                                    cl_arm_controlled_kernel_termination                             0x400000 (1.0.0)
                                                    cl_ext_cxx_for_opencl                                            0x400000 (1.0.0)
                                                    cl_ext_image_tiling_control                                        0x1000 (0.1.0)
                                                    cl_ext_image_requirements_info                                     0x5000 (0.5.0)
                                                    cl_ext_image_from_buffer                                         0x400000 (1.0.0)
                                                    cl_ext_yuv_images                                                  0x1000 (0.1.0)
    Platform Numeric Version                        0xc00000 (3.0.0)
    Platform Extensions function suffix             ARM
    Platform Host timer resolution                  1ns

    Platform Name                                   ARM Platform
    Number of devices                                 1
    Device Name                                     Mali-G57 r0p1
    Device Vendor                                   ARM
    Device Vendor ID                                0x90910010
    Device Version                                  OpenCL 3.0 v1.r41p0-01eac0.c36381f2278bad73183210f9208267f3
    Device UUID                                     10009190-0100-0000-0000-000000000000
    Driver UUID                                     61ca9692-464f-ae09-e956-8da4e1069754
    Valid Device LUID                               No
    Device LUID                                     0000-000000000000
    Device Node Mask                                0
    Device Numeric Version                          0xc00000 (3.0.0)
    Driver Version                                  3.0
    Device OpenCL C Version                         OpenCL C 3.0 v1.r41p0-01eac0.c36381f2278bad73183210f9208267f3
    Device OpenCL C all versions                    OpenCL C                                                         0x400000 (1.0.0)
                                                    OpenCL C                                                         0x401000 (1.1.0)
                                                    OpenCL C                                                         0x402000 (1.2.0)
                                                    OpenCL C                                                         0x800000 (2.0.0)
                                                    OpenCL C                                                         0xc00000 (3.0.0)
    Device OpenCL C features                        __opencl_c_images                                                0x400000 (1.0.0)
                                                    __opencl_c_int64                                                 0x400000 (1.0.0)
                                                    __opencl_c_3d_image_writes                                       0x402000 (1.2.0)
                                                    __opencl_c_atomic_order_acq_rel                                  0x800000 (2.0.0)
                                                    __opencl_c_atomic_order_seq_cst                                  0x800000 (2.0.0)
                                                    __opencl_c_atomic_scope_device                                   0x800000 (2.0.0)
                                                    __opencl_c_atomic_scope_all_devices                              0x800000 (2.0.0)
                                                    __opencl_c_device_enqueue                                        0x800000 (2.0.0)
                                                    __opencl_c_generic_address_space                                 0x800000 (2.0.0)
                                                    __opencl_c_pipes                                                 0x800000 (2.0.0)
                                                    __opencl_c_program_scope_global_variables                        0x800000 (2.0.0)
                                                    __opencl_c_read_write_images                                     0x800000 (2.0.0)
                                                    __opencl_c_subgroups                                             0x800000 (2.0.0)
                                                    __opencl_c_work_group_collective_functions                       0x800000 (2.0.0)
    Device C++ for OpenCL Numeric Version           0x400000 (1.0.0)
    Latest comfornace test passed                   v2021-03-05-00
    Device Type                                     GPU
    Device Profile                                  FULL_PROFILE
    Device Available                                Yes
    Compiler Available                              Yes
    Linker Available                                Yes
    Max compute units                               5
    Available core IDs                              0, 2, 6, 16, 18
    Available job slots (ARM)                       1-2
    Max clock frequency                             880MHz
    Device Partition                                (core)
    Max number of sub-devices                     0
    Supported partition types                     None
    Supported affinity domains                    (n/a)
    Max work item dimensions                        3
    Max work item sizes                             512x512x512
    Max work group size                             512
    Preferred work group size multiple (device)     16
    Preferred work group size multiple (kernel)     16
    Max sub-groups per work group                   32
    Preferred / native vector sizes
    char                                                16 / 4
    short                                                8 / 2
    int                                                  4 / 1
    long                                                 2 / 1
    half                                                 8 / 2        (cl_khr_fp16)
    float                                                4 / 1
    double                                               0 / 0        (n/a)
    Half-precision Floating-point support           (cl_khr_fp16)
    Denormals                                     Yes
    Infinity and NANs                             Yes
    Round to nearest                              Yes
    Round to zero                                 Yes
    Round to infinity                             Yes
    IEEE754-2008 fused multiply-add               Yes
    Support is emulated in software               No
    Single-precision Floating-point support         (core)
    Denormals                                     Yes
    Infinity and NANs                             Yes
    Round to nearest                              Yes
    Round to zero                                 Yes
    Round to infinity                             Yes
    IEEE754-2008 fused multiply-add               Yes
    Support is emulated in software               No
    Correctly-rounded divide and sqrt operations  No
    Double-precision Floating-point support         (n/a)
    Address bits                                    64, Little-Endian
    Global memory size                              8202838016 (7.639GiB)
    Error Correction support                        No
    Max memory allocation                           8202838016 (7.639GiB)
    Unified memory for Host and Device              Yes
    Shared Virtual Memory (SVM) capabilities        (core)
    Coarse-grained buffer sharing                 Yes
    Fine-grained buffer sharing                   No
    Fine-grained system sharing                   No
    Atomics                                       No
    Minimum alignment for any data type             128 bytes
    Alignment of base address                       1024 bits (128 bytes)
    Preferred alignment for atomics
    SVM                                           0 bytes
    Global                                        0 bytes
    Local                                         0 bytes
    Atomic memory capabilities                      relaxed, acquire/release, sequentially-consistent, work-item scope, work-group scope, device scope, all-devices scope
    Atomic fence capabilities                       relaxed, acquire/release, sequentially-consistent, work-item scope, work-group scope, device scope, all-devices scope
    Max size for global variable                    65536 (64KiB)
    Preferred total size of global vars             0
    Global Memory cache type                        Read/Write
    Global Memory cache size                        1048576 (1024KiB)
    Global Memory cache line size                   64 bytes
    Image support                                   Yes
    Max number of samplers per kernel             16
    Max size for 1D images from buffer            65536 pixels
    Max 1D or 2D image array size                 2048 images
    Base address alignment for 2D image buffers   32 bytes
    Pitch alignment for 2D image buffers          64 pixels
    Max 2D image size                             65536x65536 pixels
    Max 3D image size                             65536x65536x65536 pixels
    Max number of read image args                 128
    Max number of write image args                64
    Max number of read/write image args           64
    Pipe support                                    Yes
    Max number of pipe args                         16
    Max active pipe reservations                    1
    Max pipe packet size                            1024
    Local memory type                               Global
    Local memory size                               32768 (32KiB)
    Max number of constant args                     128
    Max constant buffer size                        8202838016 (7.639GiB)
    Generic address space support                   Yes
    Max size of kernel argument                     1024
    Queue properties (on host)
    Out-of-order execution                        Yes
    Profiling                                     Yes
    Device enqueue capabilities                     supported, replaceable default queue
    Queue properties (on device)
    Out-of-order execution                        Yes
    Profiling                                     Yes
    Preferred size                                2097152 (2MiB)
    Max size                                      16777216 (16MiB)
    Max queues on device                            1
    Max events on device                            1024
    Prefer user sync for interop                    No
    Profiling timer resolution                      1000ns
    Execution capabilities
    Run OpenCL kernels                            Yes
    Run native kernels                            No
    Non-uniform work-groups                       Yes
    Work-group collective functions               Yes
    Sub-group independent forward progress        Yes
    IL version                                    SPIR-V_1.0
    ILs with version                              SPIR-V                                                           0x400000 (1.0.0)
    printf() buffer size                            1048576 (1024KiB)
    Built-in kernels                                (n/a)
    Built-in kernels with version                   (n/a)
    Device Extensions                               cl_khr_global_int32_base_atomics cl_khr_global_int32_extended_atomics cl_khr_local_int32_base_atomics cl_khr_local_int32_extended_atomics cl_khr_byte_addressable_store cl_khr_3d_image_writes cl_khr_int64_base_atomics cl_khr_int64_extended_atomics cl_khr_fp16 cl_khr_icd cl_khr_egl_image cl_khr_image2d_from_buffer cl_khr_depth_images cl_khr_subgroups cl_khr_subgroup_extended_types cl_khr_subgroup_non_uniform_vote cl_khr_subgroup_ballot cl_khr_subgroup_non_uniform_arithmetic cl_khr_subgroup_shuffle cl_khr_subgroup_shuffle_relative cl_khr_subgroup_clustered_reduce cl_khr_subgroup_rotate cl_khr_il_program cl_khr_priority_hints cl_khr_create_command_queue cl_khr_spirv_no_integer_wrap_decoration cl_khr_extended_versioning cl_khr_device_uuid cl_khr_suggested_local_work_size cl_khr_extended_bit_ops cl_khr_integer_dot_product cl_khr_semaphore cl_khr_external_semaphore cl_khr_external_semaphore_sync_fd cl_khr_command_buffer cl_arm_core_id cl_arm_printf cl_arm_non_uniform_work_group_size cl_arm_import_memory cl_arm_import_memory_dma_buf cl_arm_import_memory_host cl_arm_integer_dot_product_int8 cl_arm_integer_dot_product_accumulate_int8 cl_arm_integer_dot_product_accumulate_saturate_int8 cl_arm_job_slot_selection cl_arm_scheduling_controls cl_arm_controlled_kernel_termination cl_ext_cxx_for_opencl cl_ext_image_tiling_control cl_ext_image_requirements_info cl_ext_image_from_buffer cl_ext_yuv_images
    Device Extensions with Version                  cl_khr_global_int32_base_atomics                                 0x400000 (1.0.0)
                                                    cl_khr_global_int32_extended_atomics                             0x400000 (1.0.0)
                                                    cl_khr_local_int32_base_atomics                                  0x400000 (1.0.0)
                                                    cl_khr_local_int32_extended_atomics                              0x400000 (1.0.0)
                                                    cl_khr_byte_addressable_store                                    0x400000 (1.0.0)
                                                    cl_khr_3d_image_writes                                           0x400000 (1.0.0)
                                                    cl_khr_int64_base_atomics                                        0x400000 (1.0.0)
                                                    cl_khr_int64_extended_atomics                                    0x400000 (1.0.0)
                                                    cl_khr_fp16                                                      0x400000 (1.0.0)
                                                    cl_khr_icd                                                       0x400000 (1.0.0)
                                                    cl_khr_egl_image                                                 0x400000 (1.0.0)
                                                    cl_khr_image2d_from_buffer                                       0x400000 (1.0.0)
                                                    cl_khr_depth_images                                              0x400000 (1.0.0)
                                                    cl_khr_subgroups                                                 0x400000 (1.0.0)
                                                    cl_khr_subgroup_extended_types                                   0x400000 (1.0.0)
                                                    cl_khr_subgroup_non_uniform_vote                                 0x400000 (1.0.0)
                                                    cl_khr_subgroup_ballot                                           0x400000 (1.0.0)
                                                    cl_khr_subgroup_non_uniform_arithmetic                           0x400000 (1.0.0)
                                                    cl_khr_subgroup_shuffle                                          0x400000 (1.0.0)
                                                    cl_khr_subgroup_shuffle_relative                                 0x400000 (1.0.0)
                                                    cl_khr_subgroup_clustered_reduce                                 0x400000 (1.0.0)
                                                    cl_khr_subgroup_rotate                                           0x400000 (1.0.0)
                                                    cl_khr_il_program                                                0x400000 (1.0.0)
                                                    cl_khr_priority_hints                                            0x400000 (1.0.0)
                                                    cl_khr_create_command_queue                                      0x400000 (1.0.0)
                                                    cl_khr_spirv_no_integer_wrap_decoration                          0x400000 (1.0.0)
                                                    cl_khr_extended_versioning                                       0x400000 (1.0.0)
                                                    cl_khr_device_uuid                                               0x400000 (1.0.0)
                                                    cl_khr_suggested_local_work_size                                 0x400000 (1.0.0)
                                                    cl_khr_extended_bit_ops                                          0x400000 (1.0.0)
                                                    cl_khr_integer_dot_product                                       0x800000 (2.0.0)
                                                    cl_khr_semaphore                                                   0x9000 (0.9.0)
                                                    cl_khr_external_semaphore                                          0x9000 (0.9.0)
                                                    cl_khr_external_semaphore_sync_fd                                  0x9000 (0.9.0)
                                                    cl_khr_command_buffer                                              0x9000 (0.9.0)
                                                    cl_arm_core_id                                                   0x400000 (1.0.0)
                                                    cl_arm_printf                                                    0x800000 (2.0.0)
                                                    cl_arm_non_uniform_work_group_size                               0x400000 (1.0.0)
                                                    cl_arm_import_memory                                             0x401000 (1.1.0)
                                                    cl_arm_import_memory_dma_buf                                     0x400000 (1.0.0)
                                                    cl_arm_import_memory_host                                        0x400000 (1.0.0)
                                                    cl_arm_integer_dot_product_int8                                  0x400000 (1.0.0)
                                                    cl_arm_integer_dot_product_accumulate_int8                       0x400000 (1.0.0)
                                                    cl_arm_integer_dot_product_accumulate_saturate_int8              0x400000 (1.0.0)
                                                    cl_arm_job_slot_selection                                        0x400000 (1.0.0)
                                                    cl_arm_scheduling_controls                                         0x4000 (0.4.0)
                                                    cl_arm_controlled_kernel_termination                             0x400000 (1.0.0)
                                                    cl_ext_cxx_for_opencl                                            0x400000 (1.0.0)
                                                    cl_ext_image_tiling_control                                        0x1000 (0.1.0)
                                                    cl_ext_image_requirements_info                                     0x5000 (0.5.0)
                                                    cl_ext_image_from_buffer                                         0x400000 (1.0.0)
                                                    cl_ext_yuv_images                                                  0x1000 (0.1.0)

    NULL platform behavior
    clGetPlatformInfo(NULL, CL_PLATFORM_NAME, ...)  No platform
    clGetDeviceIDs(NULL, CL_DEVICE_TYPE_ALL, ...)   No platform
    clCreateContext(NULL, ...) [default]            No platform
    clCreateContext(NULL, ...) [other]              Success [ARM]
    clCreateContextFromType(NULL, CL_DEVICE_TYPE_DEFAULT)  Success (1)
    Platform Name                                 ARM Platform
    Device Name                                   Mali-G57 r0p1
    clCreateContextFromType(NULL, CL_DEVICE_TYPE_CPU)  No devices found in platform
    clCreateContextFromType(NULL, CL_DEVICE_TYPE_GPU)  Success (1)
    Platform Name                                 ARM Platform
    Device Name                                   Mali-G57 r0p1
    clCreateContextFromType(NULL, CL_DEVICE_TYPE_ACCELERATOR)  No devices found in platform
    clCreateContextFromType(NULL, CL_DEVICE_TYPE_CUSTOM)  No devices found in platform
    clCreateContextFromType(NULL, CL_DEVICE_TYPE_ALL)  Success (1)
    Platform Name                                 ARM Platform
    Device Name                                   Mali-G57 r0p1

Vulkan Information

To determine Vulkan support details, you can query it by launch vulkaninfo

vulkaninfo
==========
VULKANINFO
==========

Vulkan Instance Version: 1.3.204


Instance Extensions: count = 12
===============================
            VK_EXT_debug_report                    : extension revision 10
            VK_EXT_debug_utils                     : extension revision 2
            VK_EXT_headless_surface                : extension revision 1
            VK_KHR_device_group_creation           : extension revision 1
            VK_KHR_display                         : extension revision 23
            VK_KHR_external_fence_capabilities     : extension revision 1
            VK_KHR_external_memory_capabilities    : extension revision 1
            VK_KHR_external_semaphore_capabilities : extension revision 1
            VK_KHR_get_physical_device_properties2 : extension revision 2
            VK_KHR_get_surface_capabilities2       : extension revision 1
            VK_KHR_surface                         : extension revision 25
            VK_KHR_wayland_surface                 : extension revision 6

Layers: count = 1
=================
    VK_LAYER_window_system_integration (Window system integration layer) Vulkan version 1.3.216, layer version 1:
            Layer Extensions: count = 3
                    VK_KHR_get_surface_capabilities2 : extension revision 1
                    VK_KHR_surface                   : extension revision 25
                    VK_KHR_wayland_surface           : extension revision 6
            Devices: count = 1
                    GPU id = 0 (Mali-G57)
                    Layer-Device Extensions: count = 2
                            VK_EXT_image_compression_control_swapchain : extension revision 1
                            VK_KHR_swapchain                           : extension revision 70

Presentable Surfaces:
=====================
    GPU id : 0 (Mali-G57):
            Surface type = VK_KHR_wayland_surface
            Formats: count = 13
                    SurfaceFormat[0]:
                            format = FORMAT_R8G8B8_UNORM
                            colorSpace = COLOR_SPACE_SRGB_NONLINEAR_KHR
                    SurfaceFormat[1]:
                            format = FORMAT_R8G8B8A8_UNORM
                            colorSpace = COLOR_SPACE_SRGB_NONLINEAR_KHR
                    SurfaceFormat[2]:
                            format = FORMAT_B8G8R8A8_SRGB
                            colorSpace = COLOR_SPACE_SRGB_NONLINEAR_KHR
                    SurfaceFormat[3]:
                            format = FORMAT_B4G4R4A4_UNORM_PACK16
                            colorSpace = COLOR_SPACE_SRGB_NONLINEAR_KHR
                    SurfaceFormat[4]:
                            format = FORMAT_R4G4B4A4_UNORM_PACK16
                            colorSpace = COLOR_SPACE_SRGB_NONLINEAR_KHR
                    SurfaceFormat[5]:
                            format = FORMAT_B5G5R5A1_UNORM_PACK16
                            colorSpace = COLOR_SPACE_SRGB_NONLINEAR_KHR
                    SurfaceFormat[6]:
                            format = FORMAT_R5G5B5A1_UNORM_PACK16
                            colorSpace = COLOR_SPACE_SRGB_NONLINEAR_KHR
                    SurfaceFormat[7]:
                            format = FORMAT_A1R5G5B5_UNORM_PACK16
                            colorSpace = COLOR_SPACE_SRGB_NONLINEAR_KHR
                    SurfaceFormat[8]:
                            format = FORMAT_B8G8R8A8_UNORM
                            colorSpace = COLOR_SPACE_SRGB_NONLINEAR_KHR
                    SurfaceFormat[9]:
                            format = FORMAT_B5G6R5_UNORM_PACK16
                            colorSpace = COLOR_SPACE_SRGB_NONLINEAR_KHR
                    SurfaceFormat[10]:
                            format = FORMAT_B8G8R8_UNORM
                            colorSpace = COLOR_SPACE_SRGB_NONLINEAR_KHR
                    SurfaceFormat[11]:
                            format = FORMAT_R8G8B8A8_SRGB
                            colorSpace = COLOR_SPACE_SRGB_NONLINEAR_KHR
                    SurfaceFormat[12]:
                            format = FORMAT_R5G6B5_UNORM_PACK16
                            colorSpace = COLOR_SPACE_SRGB_NONLINEAR_KHR
            Present Modes: count = 2
                    PRESENT_MODE_FIFO_KHR
                    PRESENT_MODE_MAILBOX_KHR
            VkSurfaceCapabilitiesKHR:
            -------------------------
                    minImageCount = 2
                    maxImageCount = 6
                    currentExtent:
                            width  = 4294967295
                            height = 4294967295
                    minImageExtent:
                            width  = 1
                            height = 1
                    maxImageExtent:
                            width  = 16384
                            height = 16384
                    maxImageArrayLayers = 1
                    supportedTransforms: count = 1
                            SURFACE_TRANSFORM_IDENTITY_BIT_KHR
                    currentTransform = SURFACE_TRANSFORM_IDENTITY_BIT_KHR
                    supportedCompositeAlpha: count = 2
                            COMPOSITE_ALPHA_PRE_MULTIPLIED_BIT_KHR
                            COMPOSITE_ALPHA_INHERIT_BIT_KHR
                    supportedUsageFlags: count = 6
                            IMAGE_USAGE_TRANSFER_SRC_BIT
                            IMAGE_USAGE_TRANSFER_DST_BIT
                            IMAGE_USAGE_SAMPLED_BIT
                            IMAGE_USAGE_STORAGE_BIT
                            IMAGE_USAGE_COLOR_ATTACHMENT_BIT
                            IMAGE_USAGE_INPUT_ATTACHMENT_BIT


Device Groups:
==============
    Group 0:
            Properties:
                    physicalDevices: count = 1
                            Mali-G57 (ID: 0)
                    subsetAllocation = 0

            Present Capabilities:
                    Mali-G57 (ID: 0):
                            Can present images from the following devices: count = 1
                                    Mali-G57 (ID: 0)
                    Present modes: count = 1
                            DEVICE_GROUP_PRESENT_MODE_LOCAL_BIT_KHR


Device Properties and Extensions:
=================================
    GPU0:
    VkPhysicalDeviceProperties:
    ---------------------------
            apiVersion        = 4206817 (1.3.225)
            driverVersion     = 171966464 (0xa400000)
            vendorID          = 0x13b5
            deviceID          = 0x90910010
            deviceType        = PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU
            deviceName        = Mali-G57
            pipelineCacheUUID = 9b1db9df-56b8-5d7c-01b6-67037a496c68

    VkPhysicalDeviceLimits:
    -----------------------
            maxImageDimension1D                             = 16384
            maxImageDimension2D                             = 16384
            maxImageDimension3D                             = 16384
            maxImageDimensionCube                           = 16384
            maxImageArrayLayers                             = 4096
            maxTexelBufferElements                          = 268435456
            maxUniformBufferRange                           = 65536
            maxStorageBufferRange                           = 268435456
            maxPushConstantsSize                            = 256
            maxMemoryAllocationCount                        = 16384
            maxSamplerAllocationCount                       = 4294967295
            bufferImageGranularity                          = 0x00000001
            sparseAddressSpaceSize                          = 0x00000000
            maxBoundDescriptorSets                          = 7
            maxPerStageDescriptorSamplers                   = 500000
            maxPerStageDescriptorUniformBuffers             = 36
            maxPerStageDescriptorStorageBuffers             = 500000
            maxPerStageDescriptorSampledImages              = 500000
            maxPerStageDescriptorStorageImages              = 500000
            maxPerStageDescriptorInputAttachments           = 9
            maxPerStageResources                            = 500000
            maxDescriptorSetSamplers                        = 500000
            maxDescriptorSetUniformBuffers                  = 216
            maxDescriptorSetUniformBuffersDynamic           = 32
            maxDescriptorSetStorageBuffers                  = 500000
            maxDescriptorSetStorageBuffersDynamic           = 32
            maxDescriptorSetSampledImages                   = 500000
            maxDescriptorSetStorageImages                   = 500000
            maxDescriptorSetInputAttachments                = 9
            maxVertexInputAttributes                        = 32
            maxVertexInputBindings                          = 32
            maxVertexInputAttributeOffset                   = 2047
            maxVertexInputBindingStride                     = 2048
            maxVertexOutputComponents                       = 128
            maxTessellationGenerationLevel                  = 64
            maxTessellationPatchSize                        = 32
            maxTessellationControlPerVertexInputComponents  = 128
            maxTessellationControlPerVertexOutputComponents = 128
            maxTessellationControlPerPatchOutputComponents  = 120
            maxTessellationControlTotalOutputComponents     = 4096
            maxTessellationEvaluationInputComponents        = 128
            maxTessellationEvaluationOutputComponents       = 128
            maxGeometryShaderInvocations                    = 32
            maxGeometryInputComponents                      = 128
            maxGeometryOutputComponents                     = 128
            maxGeometryOutputVertices                       = 256
            maxGeometryTotalOutputComponents                = 2048
            maxFragmentInputComponents                      = 128
            maxFragmentOutputAttachments                    = 8
            maxFragmentDualSrcAttachments                   = 0
            maxFragmentCombinedOutputResources              = 1000008
            maxComputeSharedMemorySize                      = 32768
            maxComputeWorkGroupCount: count = 3
                    4294967295
                    4294967295
                    4294967295
            maxComputeWorkGroupInvocations                  = 512
            maxComputeWorkGroupSize: count = 3
                    512
                    512
                    512
            subPixelPrecisionBits                           = 8
            subTexelPrecisionBits                           = 8
            mipmapPrecisionBits                             = 8
            maxDrawIndexedIndexValue                        = 4294967295
            maxDrawIndirectCount                            = 1
            maxSamplerLodBias                               = 255
            maxSamplerAnisotropy                            = 16
            maxViewports                                    = 1
            maxViewportDimensions: count = 2
                    16384
                    16384
            viewportBoundsRange: count = 2
                    -32768
                    32767
            viewportSubPixelBits                            = 0
            minMemoryMapAlignment                           = 64
            minTexelBufferOffsetAlignment                   = 0x00000040
            minUniformBufferOffsetAlignment                 = 0x00000010
            minStorageBufferOffsetAlignment                 = 0x00000040
            minTexelOffset                                  = -8
            maxTexelOffset                                  = 7
            minTexelGatherOffset                            = -8
            maxTexelGatherOffset                            = 7
            minInterpolationOffset                          = -0.5
            maxInterpolationOffset                          = 0.5
            subPixelInterpolationOffsetBits                 = 4
            maxFramebufferWidth                             = 16384
            maxFramebufferHeight                            = 16384
            maxFramebufferLayers                            = 256
            framebufferColorSampleCounts: count = 3
                    SAMPLE_COUNT_1_BIT
                    SAMPLE_COUNT_4_BIT
                    SAMPLE_COUNT_8_BIT
            framebufferDepthSampleCounts: count = 3
                    SAMPLE_COUNT_1_BIT
                    SAMPLE_COUNT_4_BIT
                    SAMPLE_COUNT_8_BIT
            framebufferStencilSampleCounts: count = 3
                    SAMPLE_COUNT_1_BIT
                    SAMPLE_COUNT_4_BIT
                    SAMPLE_COUNT_8_BIT
            framebufferNoAttachmentsSampleCounts: count = 4
                    SAMPLE_COUNT_1_BIT
                    SAMPLE_COUNT_4_BIT
                    SAMPLE_COUNT_8_BIT
                    SAMPLE_COUNT_16_BIT
            maxColorAttachments                             = 8
            sampledImageColorSampleCounts: count = 3
                    SAMPLE_COUNT_1_BIT
                    SAMPLE_COUNT_4_BIT
                    SAMPLE_COUNT_8_BIT
            sampledImageIntegerSampleCounts: count = 3
                    SAMPLE_COUNT_1_BIT
                    SAMPLE_COUNT_4_BIT
                    SAMPLE_COUNT_8_BIT
            sampledImageDepthSampleCounts: count = 3
                    SAMPLE_COUNT_1_BIT
                    SAMPLE_COUNT_4_BIT
                    SAMPLE_COUNT_8_BIT
            sampledImageStencilSampleCounts: count = 3
                    SAMPLE_COUNT_1_BIT
                    SAMPLE_COUNT_4_BIT
                    SAMPLE_COUNT_8_BIT
            storageImageSampleCounts: count = 1
                    SAMPLE_COUNT_1_BIT
            maxSampleMaskWords                              = 1
            timestampComputeAndGraphics                     = true
            timestampPeriod                                 = 76.9231
            maxClipDistances                                = 0
            maxCullDistances                                = 0
            maxCombinedClipAndCullDistances                 = 0
            discreteQueuePriorities                         = 2
            pointSizeRange: count = 2
                    1
                    1024
            lineWidthRange: count = 2
                    1
                    1
            pointSizeGranularity                            = 0.0625
            lineWidthGranularity                            = 0
            strictLines                                     = true
            standardSampleLocations                         = true
            optimalBufferCopyOffsetAlignment                = 0x00000040
            optimalBufferCopyRowPitchAlignment              = 0x00000040
            nonCoherentAtomSize                             = 0x00000040

    VkPhysicalDeviceSparseProperties:
    ---------------------------------
            residencyStandard2DBlockShape            = false
            residencyStandard2DMultisampleBlockShape = false
            residencyStandard3DBlockShape            = false
            residencyAlignedMipSize                  = false
            residencyNonResidentStrict               = false

    VkPhysicalDeviceCustomBorderColorPropertiesEXT:
    -----------------------------------------------
            maxCustomBorderColorSamplers = 4294967295

    VkPhysicalDeviceDepthStencilResolveProperties:
    ----------------------------------------------
            supportedDepthResolveModes: count = 1
                    RESOLVE_MODE_SAMPLE_ZERO_BIT
            supportedStencilResolveModes: count = 1
                    RESOLVE_MODE_SAMPLE_ZERO_BIT
            independentResolveNone = false
            independentResolve     = false

    VkPhysicalDeviceDescriptorIndexingProperties:
    ---------------------------------------------
            maxUpdateAfterBindDescriptorsInAllPools              = 4294967295
            shaderUniformBufferArrayNonUniformIndexingNative     = false
            shaderSampledImageArrayNonUniformIndexingNative      = false
            shaderStorageBufferArrayNonUniformIndexingNative     = true
            shaderStorageImageArrayNonUniformIndexingNative      = false
            shaderInputAttachmentArrayNonUniformIndexingNative   = false
            robustBufferAccessUpdateAfterBind                    = true
            quadDivergentImplicitLod                             = false
            maxPerStageDescriptorUpdateAfterBindSamplers         = 500000
            maxPerStageDescriptorUpdateAfterBindUniformBuffers   = 36
            maxPerStageDescriptorUpdateAfterBindStorageBuffers   = 500000
            maxPerStageDescriptorUpdateAfterBindSampledImages    = 500000
            maxPerStageDescriptorUpdateAfterBindStorageImages    = 500000
            maxPerStageDescriptorUpdateAfterBindInputAttachments = 9
            maxPerStageUpdateAfterBindResources                  = 500000
            maxDescriptorSetUpdateAfterBindSamplers              = 500000
            maxDescriptorSetUpdateAfterBindUniformBuffers        = 216
            maxDescriptorSetUpdateAfterBindUniformBuffersDynamic = 32
            maxDescriptorSetUpdateAfterBindStorageBuffers        = 500000
            maxDescriptorSetUpdateAfterBindStorageBuffersDynamic = 32
            maxDescriptorSetUpdateAfterBindSampledImages         = 500000
            maxDescriptorSetUpdateAfterBindStorageImages         = 500000
            maxDescriptorSetUpdateAfterBindInputAttachments      = 9

    VkPhysicalDeviceDriverProperties:
    ---------------------------------
            driverID           = DRIVER_ID_ARM_PROPRIETARY
            driverName         = Mali-G57
            driverInfo         = v1.r41p0-01eac0.c36381f2278bad73183210f9208267f3
            conformanceVersion = 1.3.3.1

    VkPhysicalDeviceFloatControlsProperties:
    ----------------------------------------
            denormBehaviorIndependence            = SHADER_FLOAT_CONTROLS_INDEPENDENCE_ALL
            roundingModeIndependence              = SHADER_FLOAT_CONTROLS_INDEPENDENCE_ALL
            shaderSignedZeroInfNanPreserveFloat16 = true
            shaderSignedZeroInfNanPreserveFloat32 = true
            shaderSignedZeroInfNanPreserveFloat64 = false
            shaderDenormPreserveFloat16           = true
            shaderDenormPreserveFloat32           = true
            shaderDenormPreserveFloat64           = false
            shaderDenormFlushToZeroFloat16        = true
            shaderDenormFlushToZeroFloat32        = true
            shaderDenormFlushToZeroFloat64        = false
            shaderRoundingModeRTEFloat16          = true
            shaderRoundingModeRTEFloat32          = true
            shaderRoundingModeRTEFloat64          = false
            shaderRoundingModeRTZFloat16          = true
            shaderRoundingModeRTZFloat32          = true
            shaderRoundingModeRTZFloat64          = false

    VkPhysicalDeviceFragmentDensityMap2PropertiesEXT:
    -------------------------------------------------
            subsampledLoads                           = false
            subsampledCoarseReconstructionEarlyAccess = true
            maxSubsampledArrayLayers                  = 4096
            maxDescriptorSetSubsampledSamplers        = 8

    VkPhysicalDeviceFragmentDensityMapPropertiesEXT:
    ------------------------------------------------
            minFragmentDensityTexelSize:
                    width  = 32
                    height = 32
            maxFragmentDensityTexelSize:
                    width  = 32
                    height = 32
            fragmentDensityInvocations = true

    VkPhysicalDeviceIDProperties:
    -----------------------------
            deviceUUID      = 10009190-0100-0000-0000-000000000000
            driverUUID      = 61ca9692-464f-ae09-e956-8da4e1069754
            deviceNodeMask  = 0
            deviceLUIDValid = false

    VkPhysicalDeviceInlineUniformBlockProperties:
    ---------------------------------------------
            maxInlineUniformBlockSize                               = 65536
            maxPerStageDescriptorInlineUniformBlocks                = 32
            maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks = 32
            maxDescriptorSetInlineUniformBlocks                     = 192
            maxDescriptorSetUpdateAfterBindInlineUniformBlocks      = 192

    VkPhysicalDeviceLineRasterizationPropertiesEXT:
    -----------------------------------------------
            lineSubPixelPrecisionBits = 8

    VkPhysicalDeviceMaintenance3Properties:
    ---------------------------------------
            maxPerSetDescriptors    = 500000
            maxMemoryAllocationSize = 0x1e8ed6000

    VkPhysicalDeviceMaintenance4Properties:
    ---------------------------------------
            maxBufferSize = 0xffffffff

    VkPhysicalDeviceMultiviewProperties:
    ------------------------------------
            maxMultiviewViewCount     = 8
            maxMultiviewInstanceIndex = 4294967295

    VkPhysicalDevicePointClippingProperties:
    ----------------------------------------
            pointClippingBehavior = POINT_CLIPPING_BEHAVIOR_USER_CLIP_PLANES_ONLY

    VkPhysicalDeviceProtectedMemoryProperties:
    ------------------------------------------
            protectedNoFault = false

    VkPhysicalDeviceProvokingVertexPropertiesEXT:
    ---------------------------------------------
            provokingVertexModePerPipeline                       = false
            transformFeedbackPreservesTriangleFanProvokingVertex = false

    VkPhysicalDeviceSamplerFilterMinmaxProperties:
    ----------------------------------------------
            filterMinmaxSingleComponentFormats = false
            filterMinmaxImageComponentMapping  = false

    VkPhysicalDeviceShaderIntegerDotProductProperties:
    --------------------------------------------------
            integerDotProduct8BitUnsignedAccelerated                                      = true
            integerDotProduct8BitSignedAccelerated                                        = true
            integerDotProduct8BitMixedSignednessAccelerated                               = false
            integerDotProduct4x8BitPackedUnsignedAccelerated                              = true
            integerDotProduct4x8BitPackedSignedAccelerated                                = true
            integerDotProduct4x8BitPackedMixedSignednessAccelerated                       = false
            integerDotProduct16BitUnsignedAccelerated                                     = false
            integerDotProduct16BitSignedAccelerated                                       = false
            integerDotProduct16BitMixedSignednessAccelerated                              = false
            integerDotProduct32BitUnsignedAccelerated                                     = false
            integerDotProduct32BitSignedAccelerated                                       = false
            integerDotProduct32BitMixedSignednessAccelerated                              = false
            integerDotProduct64BitUnsignedAccelerated                                     = false
            integerDotProduct64BitSignedAccelerated                                       = false
            integerDotProduct64BitMixedSignednessAccelerated                              = false
            integerDotProductAccumulatingSaturating8BitUnsignedAccelerated                = true
            integerDotProductAccumulatingSaturating8BitSignedAccelerated                  = true
            integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated         = false
            integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated        = true
            integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated          = true
            integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated = false
            integerDotProductAccumulatingSaturating16BitUnsignedAccelerated               = false
            integerDotProductAccumulatingSaturating16BitSignedAccelerated                 = false
            integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated        = false
            integerDotProductAccumulatingSaturating32BitUnsignedAccelerated               = false
            integerDotProductAccumulatingSaturating32BitSignedAccelerated                 = false
            integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated        = false
            integerDotProductAccumulatingSaturating64BitUnsignedAccelerated               = false
            integerDotProductAccumulatingSaturating64BitSignedAccelerated                 = false
            integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated        = false

    VkPhysicalDeviceSubgroupProperties:
    -----------------------------------
            subgroupSize              = 16
            supportedStages: count = 10
                    SHADER_STAGE_FRAGMENT_BIT
                    SHADER_STAGE_COMPUTE_BIT
                    SHADER_STAGE_ALL_GRAPHICS
                    SHADER_STAGE_ALL
                    SHADER_STAGE_RAYGEN_BIT_KHR
                    SHADER_STAGE_ANY_HIT_BIT_KHR
                    SHADER_STAGE_CLOSEST_HIT_BIT_KHR
                    SHADER_STAGE_MISS_BIT_KHR
                    SHADER_STAGE_INTERSECTION_BIT_KHR
                    SHADER_STAGE_CALLABLE_BIT_KHR
            supportedOperations: count = 8
                    SUBGROUP_FEATURE_BASIC_BIT
                    SUBGROUP_FEATURE_VOTE_BIT
                    SUBGROUP_FEATURE_ARITHMETIC_BIT
                    SUBGROUP_FEATURE_BALLOT_BIT
                    SUBGROUP_FEATURE_SHUFFLE_BIT
                    SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT
                    SUBGROUP_FEATURE_CLUSTERED_BIT
                    SUBGROUP_FEATURE_QUAD_BIT
            quadOperationsInAllStages = false

    VkPhysicalDeviceSubgroupSizeControlProperties:
    ----------------------------------------------
            minSubgroupSize              = 16
            maxSubgroupSize              = 16
            maxComputeWorkgroupSubgroups = 32
            requiredSubgroupSizeStages: count = 10
                    SHADER_STAGE_FRAGMENT_BIT
                    SHADER_STAGE_COMPUTE_BIT
                    SHADER_STAGE_ALL_GRAPHICS
                    SHADER_STAGE_ALL
                    SHADER_STAGE_RAYGEN_BIT_KHR
                    SHADER_STAGE_ANY_HIT_BIT_KHR
                    SHADER_STAGE_CLOSEST_HIT_BIT_KHR
                    SHADER_STAGE_MISS_BIT_KHR
                    SHADER_STAGE_INTERSECTION_BIT_KHR
                    SHADER_STAGE_CALLABLE_BIT_KHR

    VkPhysicalDeviceTexelBufferAlignmentProperties:
    -----------------------------------------------
            storageTexelBufferOffsetAlignmentBytes       = 0x00000040
            storageTexelBufferOffsetSingleTexelAlignment = false
            uniformTexelBufferOffsetAlignmentBytes       = 0x00000004
            uniformTexelBufferOffsetSingleTexelAlignment = true

    VkPhysicalDeviceTimelineSemaphoreProperties:
    --------------------------------------------
            maxTimelineSemaphoreValueDifference = 18446744073709551615

    VkPhysicalDeviceTransformFeedbackPropertiesEXT:
    -----------------------------------------------
            maxTransformFeedbackStreams                = 1
            maxTransformFeedbackBuffers                = 4
            maxTransformFeedbackBufferSize             = 0x10000000
            maxTransformFeedbackStreamDataSize         = 512
            maxTransformFeedbackBufferDataSize         = 512
            maxTransformFeedbackBufferDataStride       = 512
            transformFeedbackQueries                   = true
            transformFeedbackStreamsLinesTriangles     = false
            transformFeedbackRasterizationStreamSelect = false
            transformFeedbackDraw                      = false

    VkPhysicalDeviceVulkan11Properties:
    -----------------------------------
            deviceUUID                        = 10009190-0100-0000-0000-000000000000
            driverUUID                        = 61ca9692-464f-ae09-e956-8da4e1069754
            deviceNodeMask                    = 0
            deviceLUIDValid                   = false
            subgroupSize                      = 16
            subgroupSupportedStages: count = 10
                    SHADER_STAGE_FRAGMENT_BIT
                    SHADER_STAGE_COMPUTE_BIT
                    SHADER_STAGE_ALL_GRAPHICS
                    SHADER_STAGE_ALL
                    SHADER_STAGE_RAYGEN_BIT_KHR
                    SHADER_STAGE_ANY_HIT_BIT_KHR
                    SHADER_STAGE_CLOSEST_HIT_BIT_KHR
                    SHADER_STAGE_MISS_BIT_KHR
                    SHADER_STAGE_INTERSECTION_BIT_KHR
                    SHADER_STAGE_CALLABLE_BIT_KHR
            subgroupSupportedOperations: count = 8
                    SUBGROUP_FEATURE_BASIC_BIT
                    SUBGROUP_FEATURE_VOTE_BIT
                    SUBGROUP_FEATURE_ARITHMETIC_BIT
                    SUBGROUP_FEATURE_BALLOT_BIT
                    SUBGROUP_FEATURE_SHUFFLE_BIT
                    SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT
                    SUBGROUP_FEATURE_CLUSTERED_BIT
                    SUBGROUP_FEATURE_QUAD_BIT
            subgroupQuadOperationsInAllStages = false
            pointClippingBehavior             = POINT_CLIPPING_BEHAVIOR_USER_CLIP_PLANES_ONLY
            maxMultiviewViewCount             = 8
            maxMultiviewInstanceIndex         = 4294967295
            protectedNoFault                  = false
            maxPerSetDescriptors              = 500000
            maxMemoryAllocationSize           = 0x1e8ed6000

    VkPhysicalDeviceVulkan12Properties:
    -----------------------------------
            driverID                                             = DRIVER_ID_ARM_PROPRIETARY
            driverName                                           = Mali-G57
            driverInfo                                           = v1.r41p0-01eac0.c36381f2278bad73183210f9208267f3
            conformanceVersion                                   = 1.3.3.1
            denormBehaviorIndependence                           = SHADER_FLOAT_CONTROLS_INDEPENDENCE_ALL
            roundingModeIndependence                             = SHADER_FLOAT_CONTROLS_INDEPENDENCE_ALL
            shaderSignedZeroInfNanPreserveFloat16                = true
            shaderSignedZeroInfNanPreserveFloat32                = true
            shaderSignedZeroInfNanPreserveFloat64                = false
            shaderDenormPreserveFloat16                          = true
            shaderDenormPreserveFloat32                          = true
            shaderDenormPreserveFloat64                          = false
            shaderDenormFlushToZeroFloat16                       = true
            shaderDenormFlushToZeroFloat32                       = true
            shaderDenormFlushToZeroFloat64                       = false
            shaderRoundingModeRTEFloat16                         = true
            shaderRoundingModeRTEFloat32                         = true
            shaderRoundingModeRTEFloat64                         = false
            shaderRoundingModeRTZFloat16                         = true
            shaderRoundingModeRTZFloat32                         = true
            shaderRoundingModeRTZFloat64                         = false
            maxUpdateAfterBindDescriptorsInAllPools              = 4294967295
            shaderUniformBufferArrayNonUniformIndexingNative     = false
            shaderSampledImageArrayNonUniformIndexingNative      = false
            shaderStorageBufferArrayNonUniformIndexingNative     = true
            shaderStorageImageArrayNonUniformIndexingNative      = false
            shaderInputAttachmentArrayNonUniformIndexingNative   = false
            robustBufferAccessUpdateAfterBind                    = true
            quadDivergentImplicitLod                             = false
            maxPerStageDescriptorUpdateAfterBindSamplers         = 500000
            maxPerStageDescriptorUpdateAfterBindUniformBuffers   = 36
            maxPerStageDescriptorUpdateAfterBindStorageBuffers   = 500000
            maxPerStageDescriptorUpdateAfterBindSampledImages    = 500000
            maxPerStageDescriptorUpdateAfterBindStorageImages    = 500000
            maxPerStageDescriptorUpdateAfterBindInputAttachments = 9
            maxPerStageUpdateAfterBindResources                  = 500000
            maxDescriptorSetUpdateAfterBindSamplers              = 500000
            maxDescriptorSetUpdateAfterBindUniformBuffers        = 216
            maxDescriptorSetUpdateAfterBindUniformBuffersDynamic = 32
            maxDescriptorSetUpdateAfterBindStorageBuffers        = 500000
            maxDescriptorSetUpdateAfterBindStorageBuffersDynamic = 32
            maxDescriptorSetUpdateAfterBindSampledImages         = 500000
            maxDescriptorSetUpdateAfterBindStorageImages         = 500000
            maxDescriptorSetUpdateAfterBindInputAttachments      = 9
            supportedDepthResolveModes: count = 1
                    RESOLVE_MODE_SAMPLE_ZERO_BIT
            supportedStencilResolveModes: count = 1
                    RESOLVE_MODE_SAMPLE_ZERO_BIT
            independentResolveNone                               = false
            independentResolve                                   = false
            filterMinmaxSingleComponentFormats                   = false
            filterMinmaxImageComponentMapping                    = false
            maxTimelineSemaphoreValueDifference                  = 18446744073709551615
            framebufferIntegerColorSampleCounts: count = 3
                    SAMPLE_COUNT_1_BIT
                    SAMPLE_COUNT_4_BIT
                    SAMPLE_COUNT_8_BIT

    VkPhysicalDeviceVulkan13Properties:
    -----------------------------------
            minSubgroupSize                                                               = 16
            maxSubgroupSize                                                               = 16
            maxComputeWorkgroupSubgroups                                                  = 32
            requiredSubgroupSizeStages: count = 10
                    SHADER_STAGE_FRAGMENT_BIT
                    SHADER_STAGE_COMPUTE_BIT
                    SHADER_STAGE_ALL_GRAPHICS
                    SHADER_STAGE_ALL
                    SHADER_STAGE_RAYGEN_BIT_KHR
                    SHADER_STAGE_ANY_HIT_BIT_KHR
                    SHADER_STAGE_CLOSEST_HIT_BIT_KHR
                    SHADER_STAGE_MISS_BIT_KHR
                    SHADER_STAGE_INTERSECTION_BIT_KHR
                    SHADER_STAGE_CALLABLE_BIT_KHR
            maxInlineUniformBlockSize                                                     = 65536
            maxPerStageDescriptorInlineUniformBlocks                                      = 32
            maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks                       = 32
            maxDescriptorSetInlineUniformBlocks                                           = 192
            maxDescriptorSetUpdateAfterBindInlineUniformBlocks                            = 192
            maxInlineUniformTotalSize                                                     = 12582912
            integerDotProduct8BitUnsignedAccelerated                                      = true
            integerDotProduct8BitSignedAccelerated                                        = true
            integerDotProduct8BitMixedSignednessAccelerated                               = false
            integerDotProduct4x8BitPackedUnsignedAccelerated                              = true
            integerDotProduct4x8BitPackedSignedAccelerated                                = true
            integerDotProduct4x8BitPackedMixedSignednessAccelerated                       = false
            integerDotProduct16BitUnsignedAccelerated                                     = false
            integerDotProduct16BitSignedAccelerated                                       = false
            integerDotProduct16BitMixedSignednessAccelerated                              = false
            integerDotProduct32BitUnsignedAccelerated                                     = false
            integerDotProduct32BitSignedAccelerated                                       = false
            integerDotProduct32BitMixedSignednessAccelerated                              = false
            integerDotProduct64BitUnsignedAccelerated                                     = false
            integerDotProduct64BitSignedAccelerated                                       = false
            integerDotProduct64BitMixedSignednessAccelerated                              = false
            integerDotProductAccumulatingSaturating8BitUnsignedAccelerated                = true
            integerDotProductAccumulatingSaturating8BitSignedAccelerated                  = true
            integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated         = false
            integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated        = true
            integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated          = true
            integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated = false
            integerDotProductAccumulatingSaturating16BitUnsignedAccelerated               = false
            integerDotProductAccumulatingSaturating16BitSignedAccelerated                 = false
            integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated        = false
            integerDotProductAccumulatingSaturating32BitUnsignedAccelerated               = false
            integerDotProductAccumulatingSaturating32BitSignedAccelerated                 = false
            integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated        = false
            integerDotProductAccumulatingSaturating64BitUnsignedAccelerated               = false
            integerDotProductAccumulatingSaturating64BitSignedAccelerated                 = false
            integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated        = false
            storageTexelBufferOffsetAlignmentBytes                                        = 0x00000040
            storageTexelBufferOffsetSingleTexelAlignment                                  = false
            uniformTexelBufferOffsetAlignmentBytes                                        = 0x00000004
            uniformTexelBufferOffsetSingleTexelAlignment                                  = true
            maxBufferSize                                                                 = 0xffffffff


    Device Extensions: count = 95
            VK_ARM_rasterization_order_attachment_access : extension revision 1
            VK_EXT_4444_formats                          : extension revision 1
            VK_EXT_astc_decode_mode                      : extension revision 1
            VK_EXT_border_color_swizzle                  : extension revision 1
            VK_EXT_calibrated_timestamps                 : extension revision 2
            VK_EXT_custom_border_color                   : extension revision 12
            VK_EXT_descriptor_indexing                   : extension revision 2
            VK_EXT_device_memory_report                  : extension revision 2
            VK_EXT_extended_dynamic_state                : extension revision 1
            VK_EXT_extended_dynamic_state2               : extension revision 1
            VK_EXT_external_memory_dma_buf               : extension revision 1
            VK_EXT_fragment_density_map                  : extension revision 2
            VK_EXT_fragment_density_map2                 : extension revision 1
            VK_EXT_global_priority                       : extension revision 2
            VK_EXT_global_priority_query                 : extension revision 1
            VK_EXT_host_query_reset                      : extension revision 1
            VK_EXT_image_compression_control             : extension revision 1
            VK_EXT_image_compression_control_swapchain   : extension revision 1
            VK_EXT_image_drm_format_modifier             : extension revision 2
            VK_EXT_image_robustness                      : extension revision 1
            VK_EXT_index_type_uint8                      : extension revision 1
            VK_EXT_inline_uniform_block                  : extension revision 1
            VK_EXT_line_rasterization                    : extension revision 1
            VK_EXT_load_store_op_none                    : extension revision 1
            VK_EXT_multisampled_render_to_single_sampled : extension revision 1
            VK_EXT_pipeline_creation_cache_control       : extension revision 3
            VK_EXT_pipeline_creation_feedback            : extension revision 1
            VK_EXT_primitive_topology_list_restart       : extension revision 1
            VK_EXT_primitives_generated_query            : extension revision 1
            VK_EXT_private_data                          : extension revision 1
            VK_EXT_provoking_vertex                      : extension revision 1
            VK_EXT_queue_family_foreign                  : extension revision 1
            VK_EXT_rasterization_order_attachment_access : extension revision 1
            VK_EXT_rgba10x6_formats                      : extension revision 1
            VK_EXT_scalar_block_layout                   : extension revision 1
            VK_EXT_separate_stencil_usage                : extension revision 1
            VK_EXT_shader_demote_to_helper_invocation    : extension revision 1
            VK_EXT_shader_image_atomic_int64             : extension revision 1
            VK_EXT_shader_subgroup_ballot                : extension revision 1
            VK_EXT_shader_subgroup_vote                  : extension revision 1
            VK_EXT_subgroup_size_control                 : extension revision 2
            VK_EXT_subpass_merge_feedback                : extension revision 2
            VK_EXT_texel_buffer_alignment                : extension revision 1
            VK_EXT_texture_compression_astc_hdr          : extension revision 1
            VK_EXT_tooling_info                          : extension revision 1
            VK_EXT_transform_feedback                    : extension revision 1
            VK_KHR_16bit_storage                         : extension revision 1
            VK_KHR_8bit_storage                          : extension revision 1
            VK_KHR_bind_memory2                          : extension revision 1
            VK_KHR_buffer_device_address                 : extension revision 1
            VK_KHR_copy_commands2                        : extension revision 1
            VK_KHR_create_renderpass2                    : extension revision 1
            VK_KHR_dedicated_allocation                  : extension revision 3
            VK_KHR_depth_stencil_resolve                 : extension revision 1
            VK_KHR_descriptor_update_template            : extension revision 1
            VK_KHR_device_group                          : extension revision 4
            VK_KHR_driver_properties                     : extension revision 1
            VK_KHR_dynamic_rendering                     : extension revision 1
            VK_KHR_external_fence                        : extension revision 1
            VK_KHR_external_fence_fd                     : extension revision 1
            VK_KHR_external_memory                       : extension revision 1
            VK_KHR_external_memory_fd                    : extension revision 1
            VK_KHR_external_semaphore                    : extension revision 1
            VK_KHR_external_semaphore_fd                 : extension revision 1
            VK_KHR_format_feature_flags2                 : extension revision 2
            VK_KHR_get_memory_requirements2              : extension revision 1
            VK_KHR_global_priority                       : extension revision 1
            VK_KHR_image_format_list                     : extension revision 1
            VK_KHR_imageless_framebuffer                 : extension revision 1
            VK_KHR_maintenance1                          : extension revision 2
            VK_KHR_maintenance2                          : extension revision 1
            VK_KHR_maintenance3                          : extension revision 1
            VK_KHR_maintenance4                          : extension revision 2
            VK_KHR_multiview                             : extension revision 1
            VK_KHR_relaxed_block_layout                  : extension revision 1
            VK_KHR_sampler_mirror_clamp_to_edge          : extension revision 3
            VK_KHR_sampler_ycbcr_conversion              : extension revision 14
            VK_KHR_separate_depth_stencil_layouts        : extension revision 1
            VK_KHR_shader_atomic_int64                   : extension revision 1
            VK_KHR_shader_draw_parameters                : extension revision 1
            VK_KHR_shader_float16_int8                   : extension revision 1
            VK_KHR_shader_float_controls                 : extension revision 4
            VK_KHR_shader_integer_dot_product            : extension revision 1
            VK_KHR_shader_non_semantic_info              : extension revision 1
            VK_KHR_shader_subgroup_extended_types        : extension revision 1
            VK_KHR_shader_terminate_invocation           : extension revision 1
            VK_KHR_spirv_1_4                             : extension revision 1
            VK_KHR_storage_buffer_storage_class          : extension revision 1
            VK_KHR_swapchain                             : extension revision 70
            VK_KHR_synchronization2                      : extension revision 1
            VK_KHR_timeline_semaphore                    : extension revision 2
            VK_KHR_uniform_buffer_standard_layout        : extension revision 1
            VK_KHR_variable_pointers                     : extension revision 1
            VK_KHR_vulkan_memory_model                   : extension revision 3
            VK_KHR_zero_initialize_workgroup_memory      : extension revision 1

VkQueueFamilyProperties:
========================
            queueProperties[0]:
            -------------------
                    minImageTransferGranularity = (1,1,1)
                    queueCount                  = 2
                    queueFlags                  = QUEUE_GRAPHICS | QUEUE_COMPUTE | QUEUE_TRANSFER
                    timestampValidBits          = 64
                    present support             = true
                    VkQueueFamilyGlobalPriorityPropertiesKHR:
                    -----------------------------------------
                            priorityCount  = 4
                            priorities: count = 16
                                    128
                                    256
                                    512
                                    1024
                                    0
                                    0
                                    0
                                    0
                                    0
                                    0
                                    0
                                    0
                                    0
                                    0
                                    0
                                    0


VkPhysicalDeviceMemoryProperties:
=================================
    memoryHeaps: count = 1
            memoryHeaps[0]:
                    size   = 8202838016 (0x1e8ed6000) (7.64 GiB)
                    flags: count = 1
                            MEMORY_HEAP_DEVICE_LOCAL_BIT
    memoryTypes: count = 3
            memoryTypes[0]:
                    heapIndex     = 0
                    propertyFlags = 0x0007: count = 3
                            MEMORY_PROPERTY_DEVICE_LOCAL_BIT
                            MEMORY_PROPERTY_HOST_VISIBLE_BIT
                            MEMORY_PROPERTY_HOST_COHERENT_BIT
                    usable for:
                            IMAGE_TILING_OPTIMAL:
                                    color images
                                    FORMAT_D16_UNORM
                                    FORMAT_X8_D24_UNORM_PACK32
                                    FORMAT_D32_SFLOAT
                                    FORMAT_S8_UINT
                                    FORMAT_D24_UNORM_S8_UINT
                                    FORMAT_D32_SFLOAT_S8_UINT
                                    (non-sparse, non-transient)
                            IMAGE_TILING_LINEAR:
                                    color images
                                    (non-sparse, non-transient)
            memoryTypes[1]:
                    heapIndex     = 0
                    propertyFlags = 0x000b: count = 3
                            MEMORY_PROPERTY_DEVICE_LOCAL_BIT
                            MEMORY_PROPERTY_HOST_VISIBLE_BIT
                            MEMORY_PROPERTY_HOST_CACHED_BIT
                    usable for:
                            IMAGE_TILING_OPTIMAL:
                                    color images
                                    FORMAT_D16_UNORM
                                    FORMAT_X8_D24_UNORM_PACK32
                                    FORMAT_D32_SFLOAT
                                    FORMAT_S8_UINT
                                    FORMAT_D24_UNORM_S8_UINT
                                    FORMAT_D32_SFLOAT_S8_UINT
                                    (non-sparse, non-transient)
                            IMAGE_TILING_LINEAR:
                                    color images
                                    (non-sparse, non-transient)
            memoryTypes[2]:
                    heapIndex     = 0
                    propertyFlags = 0x0011: count = 2
                            MEMORY_PROPERTY_DEVICE_LOCAL_BIT
                            MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT
                    usable for:
                            IMAGE_TILING_OPTIMAL:
                                    color images
                                    (transient only)
                            IMAGE_TILING_LINEAR:
                                    None

VkPhysicalDeviceFeatures:
=========================
            robustBufferAccess                      = true
            fullDrawIndexUint32                     = true
            imageCubeArray                          = true
            independentBlend                        = true
            geometryShader                          = true
            tessellationShader                      = true
            sampleRateShading                       = true
            dualSrcBlend                            = false
            logicOp                                 = false
            multiDrawIndirect                       = false
            drawIndirectFirstInstance               = true
            depthClamp                              = true
            depthBiasClamp                          = true
            fillModeNonSolid                        = false
            depthBounds                             = false
            wideLines                               = false
            largePoints                             = true
            alphaToOne                              = false
            multiViewport                           = false
            samplerAnisotropy                       = true
            textureCompressionETC2                  = true
            textureCompressionASTC_LDR              = true
            textureCompressionBC                    = false
            occlusionQueryPrecise                   = true
            pipelineStatisticsQuery                 = false
            vertexPipelineStoresAndAtomics          = false
            fragmentStoresAndAtomics                = true
            shaderTessellationAndGeometryPointSize  = false
            shaderImageGatherExtended               = true
            shaderStorageImageExtendedFormats       = true
            shaderStorageImageMultisample           = false
            shaderStorageImageReadWithoutFormat     = true
            shaderStorageImageWriteWithoutFormat    = true
            shaderUniformBufferArrayDynamicIndexing = true
            shaderSampledImageArrayDynamicIndexing  = true
            shaderStorageBufferArrayDynamicIndexing = true
            shaderStorageImageArrayDynamicIndexing  = true
            shaderClipDistance                      = false
            shaderCullDistance                      = false
            shaderFloat64                           = false
            shaderInt64                             = true
            shaderInt16                             = true
            shaderResourceResidency                 = false
            shaderResourceMinLod                    = false
            sparseBinding                           = false
            sparseResidencyBuffer                   = false
            sparseResidencyImage2D                  = false
            sparseResidencyImage3D                  = false
            sparseResidency2Samples                 = false
            sparseResidency4Samples                 = false
            sparseResidency8Samples                 = false
            sparseResidency16Samples                = false
            sparseResidencyAliased                  = false
            variableMultisampleRate                 = false
            inheritedQueries                        = false

    VkPhysicalDevice16BitStorageFeatures:
    -------------------------------------
            storageBuffer16BitAccess           = true
            uniformAndStorageBuffer16BitAccess = true
            storagePushConstant16              = true
            storageInputOutput16               = true

    VkPhysicalDevice4444FormatsFeaturesEXT:
    ---------------------------------------
            formatA4R4G4B4 = true
            formatA4B4G4R4 = true

    VkPhysicalDevice8BitStorageFeatures:
    ------------------------------------
            storageBuffer8BitAccess           = true
            uniformAndStorageBuffer8BitAccess = true
            storagePushConstant8              = true

    VkPhysicalDeviceASTCDecodeFeaturesEXT:
    --------------------------------------
            decodeModeSharedExponent = true

    VkPhysicalDeviceBorderColorSwizzleFeaturesEXT:
    ----------------------------------------------
            borderColorSwizzle          = true
            borderColorSwizzleFromImage = true

    VkPhysicalDeviceBufferDeviceAddressFeatures:
    --------------------------------------------
            bufferDeviceAddress              = true
            bufferDeviceAddressCaptureReplay = false
            bufferDeviceAddressMultiDevice   = false

    VkPhysicalDeviceCustomBorderColorFeaturesEXT:
    ---------------------------------------------
            customBorderColors             = true
            customBorderColorWithoutFormat = true

    VkPhysicalDeviceDescriptorIndexingFeatures:
    -------------------------------------------
            shaderInputAttachmentArrayDynamicIndexing          = true
            shaderUniformTexelBufferArrayDynamicIndexing       = true
            shaderStorageTexelBufferArrayDynamicIndexing       = true
            shaderUniformBufferArrayNonUniformIndexing         = true
            shaderSampledImageArrayNonUniformIndexing          = true
            shaderStorageBufferArrayNonUniformIndexing         = true
            shaderStorageImageArrayNonUniformIndexing          = true
            shaderInputAttachmentArrayNonUniformIndexing       = true
            shaderUniformTexelBufferArrayNonUniformIndexing    = true
            shaderStorageTexelBufferArrayNonUniformIndexing    = true
            descriptorBindingUniformBufferUpdateAfterBind      = true
            descriptorBindingSampledImageUpdateAfterBind       = true
            descriptorBindingStorageImageUpdateAfterBind       = true
            descriptorBindingStorageBufferUpdateAfterBind      = true
            descriptorBindingUniformTexelBufferUpdateAfterBind = true
            descriptorBindingStorageTexelBufferUpdateAfterBind = true
            descriptorBindingUpdateUnusedWhilePending          = true
            descriptorBindingPartiallyBound                    = true
            descriptorBindingVariableDescriptorCount           = true
            runtimeDescriptorArray                             = true

    VkPhysicalDeviceDeviceMemoryReportFeaturesEXT:
    ----------------------------------------------
            deviceMemoryReport = true

    VkPhysicalDeviceDynamicRenderingFeatures:
    -----------------------------------------
            dynamicRendering = true

    VkPhysicalDeviceExtendedDynamicState2FeaturesEXT:
    -------------------------------------------------
            extendedDynamicState2                   = true
            extendedDynamicState2LogicOp            = false
            extendedDynamicState2PatchControlPoints = true

    VkPhysicalDeviceExtendedDynamicStateFeaturesEXT:
    ------------------------------------------------
            extendedDynamicState = true

    VkPhysicalDeviceFragmentDensityMap2FeaturesEXT:
    -----------------------------------------------
            fragmentDensityMapDeferred = true

    VkPhysicalDeviceFragmentDensityMapFeaturesEXT:
    ----------------------------------------------
            fragmentDensityMap                    = true
            fragmentDensityMapDynamic             = true
            fragmentDensityMapNonSubsampledImages = false

    VkPhysicalDeviceGlobalPriorityQueryFeaturesKHR:
    -----------------------------------------------
            globalPriorityQuery = true

    VkPhysicalDeviceHostQueryResetFeatures:
    ---------------------------------------
            hostQueryReset = true

    VkPhysicalDeviceImageRobustnessFeatures:
    ----------------------------------------
            robustImageAccess = true

    VkPhysicalDeviceImagelessFramebufferFeatures:
    ---------------------------------------------
            imagelessFramebuffer = true

    VkPhysicalDeviceIndexTypeUint8FeaturesEXT:
    ------------------------------------------
            indexTypeUint8 = true

    VkPhysicalDeviceInlineUniformBlockFeatures:
    -------------------------------------------
            inlineUniformBlock                                 = true
            descriptorBindingInlineUniformBlockUpdateAfterBind = true

    VkPhysicalDeviceLineRasterizationFeaturesEXT:
    ---------------------------------------------
            rectangularLines         = true
            bresenhamLines           = true
            smoothLines              = false
            stippledRectangularLines = false
            stippledBresenhamLines   = false
            stippledSmoothLines      = false

    VkPhysicalDeviceMaintenance4Features:
    -------------------------------------
            maintenance4 = true

    VkPhysicalDeviceMultiviewFeatures:
    ----------------------------------
            multiview                   = true
            multiviewGeometryShader     = false
            multiviewTessellationShader = false

    VkPhysicalDevicePipelineCreationCacheControlFeatures:
    -----------------------------------------------------
            pipelineCreationCacheControl = true

    VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT:
    --------------------------------------------------------
            primitiveTopologyListRestart      = true
            primitiveTopologyPatchListRestart = false

    VkPhysicalDevicePrivateDataFeatures:
    ------------------------------------
            privateData = true

    VkPhysicalDeviceProtectedMemoryFeatures:
    ----------------------------------------
            protectedMemory = false

    VkPhysicalDeviceProvokingVertexFeaturesEXT:
    -------------------------------------------
            provokingVertexLast                       = true
            transformFeedbackPreservesProvokingVertex = false

    VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT:
    -------------------------------------------
            formatRgba10x6WithoutYCbCrSampler = false

    VkPhysicalDeviceSamplerYcbcrConversionFeatures:
    -----------------------------------------------
            samplerYcbcrConversion = true

    VkPhysicalDeviceScalarBlockLayoutFeatures:
    ------------------------------------------
            scalarBlockLayout = true

    VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures:
    ----------------------------------------------------
            separateDepthStencilLayouts = true

    VkPhysicalDeviceShaderAtomicInt64Features:
    ------------------------------------------
            shaderBufferInt64Atomics = true
            shaderSharedInt64Atomics = true

    VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures:
    -------------------------------------------------------
            shaderDemoteToHelperInvocation = true

    VkPhysicalDeviceShaderDrawParametersFeatures:
    ---------------------------------------------
            shaderDrawParameters = true

    VkPhysicalDeviceShaderFloat16Int8Features:
    ------------------------------------------
            shaderFloat16 = true
            shaderInt8    = true

    VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT:
    --------------------------------------------------
            shaderImageInt64Atomics = true
            sparseImageInt64Atomics = false

    VkPhysicalDeviceShaderIntegerDotProductFeatures:
    ------------------------------------------------
            shaderIntegerDotProduct = true

    VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures:
    ----------------------------------------------------
            shaderSubgroupExtendedTypes = true

    VkPhysicalDeviceShaderTerminateInvocationFeatures:
    --------------------------------------------------
            shaderTerminateInvocation = true

    VkPhysicalDeviceSubgroupSizeControlFeatures:
    --------------------------------------------
            subgroupSizeControl  = true
            computeFullSubgroups = true

    VkPhysicalDeviceSynchronization2Features:
    -----------------------------------------
            synchronization2 = true

    VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT:
    ------------------------------------------------
            texelBufferAlignment = true

    VkPhysicalDeviceTextureCompressionASTCHDRFeatures:
    --------------------------------------------------
            textureCompressionASTC_HDR = true

    VkPhysicalDeviceTimelineSemaphoreFeatures:
    ------------------------------------------
            timelineSemaphore = true

    VkPhysicalDeviceTransformFeedbackFeaturesEXT:
    ---------------------------------------------
            transformFeedback = true
            geometryStreams   = false

    VkPhysicalDeviceUniformBufferStandardLayoutFeatures:
    ----------------------------------------------------
            uniformBufferStandardLayout = true

    VkPhysicalDeviceVariablePointersFeatures:
    -----------------------------------------
            variablePointersStorageBuffer = true
            variablePointers              = true

    VkPhysicalDeviceVulkan11Features:
    ---------------------------------
            storageBuffer16BitAccess           = true
            uniformAndStorageBuffer16BitAccess = true
            storagePushConstant16              = true
            storageInputOutput16               = true
            multiview                          = true
            multiviewGeometryShader            = false
            multiviewTessellationShader        = false
            variablePointersStorageBuffer      = true
            variablePointers                   = true
            protectedMemory                    = false
            samplerYcbcrConversion             = true
            shaderDrawParameters               = true

    VkPhysicalDeviceVulkan12Features:
    ---------------------------------
            samplerMirrorClampToEdge                           = true
            drawIndirectCount                                  = false
            storageBuffer8BitAccess                            = true
            uniformAndStorageBuffer8BitAccess                  = true
            storagePushConstant8                               = true
            shaderBufferInt64Atomics                           = true
            shaderSharedInt64Atomics                           = true
            shaderFloat16                                      = true
            shaderInt8                                         = true
            descriptorIndexing                                 = true
            shaderInputAttachmentArrayDynamicIndexing          = true
            shaderUniformTexelBufferArrayDynamicIndexing       = true
            shaderStorageTexelBufferArrayDynamicIndexing       = true
            shaderUniformBufferArrayNonUniformIndexing         = true
            shaderSampledImageArrayNonUniformIndexing          = true
            shaderStorageBufferArrayNonUniformIndexing         = true
            shaderStorageImageArrayNonUniformIndexing          = true
            shaderInputAttachmentArrayNonUniformIndexing       = true
            shaderUniformTexelBufferArrayNonUniformIndexing    = true
            shaderStorageTexelBufferArrayNonUniformIndexing    = true
            descriptorBindingUniformBufferUpdateAfterBind      = true
            descriptorBindingSampledImageUpdateAfterBind       = true
            descriptorBindingStorageImageUpdateAfterBind       = true
            descriptorBindingStorageBufferUpdateAfterBind      = true
            descriptorBindingUniformTexelBufferUpdateAfterBind = true
            descriptorBindingStorageTexelBufferUpdateAfterBind = true
            descriptorBindingUpdateUnusedWhilePending          = true
            descriptorBindingPartiallyBound                    = true
            descriptorBindingVariableDescriptorCount           = true
            runtimeDescriptorArray                             = true
            samplerFilterMinmax                                = false
            scalarBlockLayout                                  = true
            imagelessFramebuffer                               = true
            uniformBufferStandardLayout                        = true
            shaderSubgroupExtendedTypes                        = true
            separateDepthStencilLayouts                        = true
            hostQueryReset                                     = true
            timelineSemaphore                                  = true
            bufferDeviceAddress                                = true
            bufferDeviceAddressCaptureReplay                   = false
            bufferDeviceAddressMultiDevice                     = false
            vulkanMemoryModel                                  = true
            vulkanMemoryModelDeviceScope                       = true
            vulkanMemoryModelAvailabilityVisibilityChains      = true
            shaderOutputViewportIndex                          = true
            shaderOutputLayer                                  = false
            subgroupBroadcastDynamicId                         = true

    VkPhysicalDeviceVulkan13Features:
    ---------------------------------
            robustImageAccess                                  = true
            inlineUniformBlock                                 = true
            descriptorBindingInlineUniformBlockUpdateAfterBind = true
            pipelineCreationCacheControl                       = true
            privateData                                        = true
            shaderDemoteToHelperInvocation                     = true
            shaderTerminateInvocation                          = true
            subgroupSizeControl                                = true
            computeFullSubgroups                               = true
            synchronization2                                   = true
            textureCompressionASTC_HDR                         = true
            shaderZeroInitializeWorkgroupMemory                = true
            dynamicRendering                                   = true
            shaderIntegerDotProduct                            = true
            maintenance4                                       = true

    VkPhysicalDeviceVulkanMemoryModelFeatures:
    ------------------------------------------
            vulkanMemoryModel                             = true
            vulkanMemoryModelDeviceScope                  = true
            vulkanMemoryModelAvailabilityVisibilityChains = true

    VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeatures:
    ------------------------------------------------------
            shaderZeroInitializeWorkgroupMemory = true

Adjust GPU Frequency

The Mali GPU kernel driver supports devfreq-based Dynamic Voltage and Frequency Scaling (DVFS) support using the in-kernel devfreq framework.

Take Genio 1200-EVK as example, the Mali GPU is already integrated into the generic clock framework and the common regulator API and Operating Performance Points (OPPs) have been registered on the Mali device-tree node. You can find Mali GPU node and available frequencies and supplied voltages are defined in OPPs table (gpu_opp_table) in device tree overlay. DVFS can help to reduce the power consumption by dynamically adjusting voltage and frequency of the GPU.

GPU node, ID and device tree overlay

Genio 350

Genio 1200

Genio 700

Mali GPU node

mali@13040000

mali@13000000

mali@13000000

Mali GPU ID

13040000

13000000

13000000

Device tree

src/meta-mediatek-bsp/recipes-kernel/dtbo/mt8365/gpu-mali.dts

src/meta-mediatek-bsp/recipes-kernel/dtbo/mt8395/gpu-mali.dts

src/meta-mediatek-bsp/recipes-kernel/dtbo/mt8390/gpu-mali.dts

Taking Genio 1200-EVK as an example, the device tree overlay is as follows

/ {
    compatible = "mediatek,mt8195";

    fragment@0 {
            target-path = "/soc";
            __overlay__ {
                    gpu: mali@13000000 {
                            compatible = "mediatek,mt8195-mali", "arm,mali-midgard";
                            reg = <0 0x13000000 0 0x4000>;
                            interrupts =
                                    <GIC_SPI 395 IRQ_TYPE_LEVEL_HIGH 0>,
                                    <GIC_SPI 396 IRQ_TYPE_LEVEL_HIGH 0>,
                                    <GIC_SPI 397 IRQ_TYPE_LEVEL_HIGH 0>;
                            interrupt-names =
                                    "GPU",
                                    "MMU",
                                    "JOB";

                            /*
                             * Note: the properties below are not part of the
                             * upstream binding.
                             */
                            clocks =
                                    <&topckgen CLK_TOP_MFG_CK_FAST_REF>,
                                    <&apmixedsys CLK_APMIXED_MFGPLL>,
                                    <&apmixedsys CLK_APMIXED_MFGPLL>,
                                    <&topckgen CLK_TOP_MFG_CORE_TMP>,
                                    <&mfgcfg CLK_MFG_BG3D>;

                            clock-names =
                                    "clk_mux",
                                    "clk_pll_src",
                                    "clk_main_parent",
                                    "clk_sub_parent",
                                    "subsys_bg3d";

                            operating-points-v2 = <&gpu_opp_table>;

                            power-domains =
                                    <&spm MT8195_POWER_DOMAIN_MFG2>,
                                    <&spm MT8195_POWER_DOMAIN_MFG3>,
                                    <&spm MT8195_POWER_DOMAIN_MFG4>,
                                    <&spm MT8195_POWER_DOMAIN_MFG5>,
                                    <&spm MT8195_POWER_DOMAIN_MFG6>;
                            power-domain-names = "core0",
                                    "core1",
                                    "core2",
                                    "core3",
                                    "core4";

                            supply-names = "mali","mali_sram";
                            mali-supply = <&mt6315_7_vbuck1>;
                            mali_sram-supply = <&mt6359_vsram_others_ldo_reg>;

                    };

                    gpu_opp_table: opp_table0 {
                            compatible = "operating-points-v2", "operating-points-v2-mali";
                            opp-shared;

                            opp-390000000 {
                                    opp-hz = /bits/ 64 <390000000>;
                                    opp-hz-real = /bits/ 64 <390000000>,
                                                      /bits/ 64 <390000000>;
                                    opp-microvolt = <625000>,
                                                    <750000>;
                            };

                            opp-410000000 {
                                    opp-hz = /bits/ 64 <410000000>;
                                    opp-hz-real = /bits/ 64 <410000000>,
                                                      /bits/ 64 <410000000>;
                                    opp-microvolt = <631250>,
                                                    <750000>;
                            };

                            opp-431000000 {
                                    opp-hz = /bits/ 64 <431000000>;
                                    opp-hz-real = /bits/ 64 <431000000>,
                                                      /bits/ 64 <431000000>;
                                    opp-microvolt = <631250>,
                                                    <750000>;
                            };

                            opp-473000000 {
                                    opp-hz = /bits/ 64 <473000000>;
                                    opp-hz-real = /bits/ 64 <473000000>,
                                                      /bits/ 64 <473000000>;
                                    opp-microvolt = <637500>,
                                                    <750000>;
                            };

                            opp-515000000 {
                                    opp-hz = /bits/ 64 <515000000>;
                                    opp-hz-real = /bits/ 64 <515000000>,
                                                      /bits/ 64 <515000000>;
                                    opp-microvolt = <637500>,
                                                    <750000>;
                            };

                            opp-556000000 {
                                    opp-hz = /bits/ 64 <556000000>;
                                    opp-hz-real = /bits/ 64 <556000000>,
                                                      /bits/ 64 <556000000>;
                                    opp-microvolt = <643750>,
                                                    <750000>;
                            };

                            opp-598000000 {
                                    opp-hz = /bits/ 64 <598000000>;
                                    opp-hz-real = /bits/ 64 <598000000>,
                                                      /bits/ 64 <598000000>;
                                    opp-microvolt = <650000>,
                                                    <750000>;
                            };

                            opp-640000000 {
                                    opp-hz = /bits/ 64 <640000000>;
                                    opp-hz-real = /bits/ 64 <640000000>,
                                                      /bits/ 64 <640000000>;
                                    opp-microvolt = <650000>,
                                                    <750000>;
                            };

                            opp-670000000 {
                                    opp-hz = /bits/ 64 <670000000>;
                                    opp-hz-real = /bits/ 64 <670000000>,
                                                      /bits/ 64 <670000000>;
                                    opp-microvolt = <662500>,
                                                    <750000>;
                            };

                            opp-700000000 {
                                    opp-hz = /bits/ 64 <700000000>;
                                    opp-hz-real = /bits/ 64 <700000000>,
                                                      /bits/ 64 <700000000>;
                                    opp-microvolt = <675000>,
                                                    <750000>;
                            };

                            opp-730000000 {
                                    opp-hz = /bits/ 64 <730000000>;
                                    opp-hz-real = /bits/ 64 <730000000>,
                                                      /bits/ 64 <730000000>;
                                    opp-microvolt = <687500>,
                                                    <750000>;
                            };

                            opp-760000000 {
                                    opp-hz = /bits/ 64 <760000000>;
                                    opp-hz-real = /bits/ 64 <760000000>,
                                                      /bits/ 64 <760000000>;
                                    opp-microvolt = <700000>,
                                                    <750000>;
                            };

                            opp-790000000 {
                                    opp-hz = /bits/ 64 <790000000>;
                                    opp-hz-real = /bits/ 64 <790000000>,
                                                      /bits/ 64 <790000000>;
                                    opp-microvolt = <712500>,
                                                    <750000>;
                            };

                            opp-820000000 {
                                    opp-hz = /bits/ 64 <820000000>;
                                    opp-hz-real = /bits/ 64 <820000000>,
                                                      /bits/ 64 <820000000>;
                                    opp-microvolt = <725000>,
                                                    <750000>;
                            };

                            opp-850000000 {
                                    opp-hz = /bits/ 64 <850000000>;
                                    opp-hz-real = /bits/ 64 <850000000>,
                                                      /bits/ 64 <850000000>;
                                    opp-microvolt = <737500>,
                                                    <750000>;
                            };

                            opp-880000000 {
                                    opp-hz = /bits/ 64 <880000000>;
                                    opp-hz-real = /bits/ 64 <880000000>,
                                                      /bits/ 64 <880000000>;
                                    opp-microvolt = <750000>,
                                                    <750000>;
                            };

                    };
            };
    };

According to the ID of Mali GPU node, you can find corresponding device in /sys/devices/platform/soc/${Mali GPU node}.mali/devfreq/${Mali GPU node}.mali. You can also find all DVFS related attributes here.

Here are the attributes of DVFS:

ls -l /sys/devices/platform/soc/13000000.mali/devfreq/13000000.mali/
total 0
-r--r--r-- 1 root root 4096 Jan  1 00:31 available_frequencies
-r--r--r-- 1 root root 4096 Jan  1 00:31 available_governors
-r--r--r-- 1 root root 4096 Jan  1 00:31 cur_freq
lrwxrwxrwx 1 root root    0 Jan  1 00:31 device -> ../../../13000000.mali
-rw-r--r-- 1 root root 4096 Jan  1 00:00 governor
rw-r--r-- 1 root root 4096 Jan  1 00:31 max_freq
-rw-r--r-- 1 root root 4096 Jan  1 00:31 min_freq
-r--r--r-- 1 root root 4096 Jan  1 00:31 name
drwxr-xr-x 2 root root    0 Jan  1 00:31 power
lrwxrwxrwx 1 root root    0 Jan  1 00:00 subsystem -> ../../../../../../class/devfreq
-r--r--r-- 1 root root 4096 Jan  1 00:31 target_freq
-rw-r--r-- 1 root root 4096 Jan  1 00:31 trans_stat
-rw-r--r-- 1 root root 4096 Jan  1 00:00 uevent

Query Available Frequencies

Concatenate available_frequencies.

cat /sys/devices/platform/soc/13000000.mali/devfreq/13000000.mali/available_frequencies
880000000 850000000 820000000 790000000 760000000 730000000 700000000 670000000 640000000 598000000 556000000 515000000 473000000 431000000 410000000 390000000

Query Current Frequency

Concatenate cur_freq.

cat /sys/devices/platform/soc/13000000.mali/devfreq/13000000.mali/cur_freq
390000000

Query Max and Min Frequencies

Concatenate max_freq and min_freq.

# query max frequency
cat /sys/devices/platform/soc/13000000.mali/devfreq/13000000.mali/max_freq
880000000
# query min frequency
cat /sys/devices/platform/soc/13000000.mali/devfreq/13000000.mali/min_freq
390000000

Set Max and Min Frequencies

Echo value of max_freq and min_freq.

# set max frequency to 560000000
echo 790000000 > /sys/devices/platform/soc/13000000.mali/devfreq/13000000.mali/max_freq
# set min frequency to 560000000
echo 640000000 > /sys/devices/platform/soc/13000000.mali/devfreq/13000000.mali/min_freq

Set Current Frequency

By default the simple_ondemand governor is selected as the default governor, frequency changes automatically based on the system load. For user specific GPU frequency, it can be done only for userspace governor. So you have to change governor to userspace, then set frequency to GPU.

Note

More in depth documentation about each governor can be found in the linux kernel documentation here: https://www.kernel.org/doc/Documentation/cpu-freq/governors.txt

# query current frequency before operation
cat /sys/devices/platform/soc/13000000.mali/devfreq/13000000.mali/cur_freq
880000000
# change governor to userspace to allow the user to set the gpu to a specific frequency
echo userspace > /sys/devices/platform/soc/13000000.mali/devfreq/13000000.mali/governor
# set frequency
echo 700000000 > /sys/devices/platform/soc/13000000.mali/devfreq/13000000.mali/userspace/set_freq
# check current frequency after operationn
cat /sys/devices/platform/soc/13000000.mali/devfreq/13000000.mali/cur_freq
700000000

Performance Mode

Performance mode means forcing the CPU and GPU to run at maximum frequency. For GPU, regardless of the platform, the cmd: echo performance > /sys/devices/platform/soc/${Mali GPU node}.mali/devfreq/${Mali GPU node}.mali/governor can be used to make the GPU statically to the highest frequency.

echo performance > /sys/devices/platform/soc/13040000.mali/devfreq/13040000.mali/governor

But for the CPU, different platforms have different instructions to make the CPU statically to the highest frequency. Please refer to the corresponding section according to the platform:


Query GPU Utilization

Get GPU utilization by query gpu_utilization attribute in GPU device node. The result will be Mali GPU utilization:${utilization}@${current_frequency}

cat /sys/devices/platform/soc/13000000.mali/gpu_utilization
Mali GPU utilization:60@390000000Hz

OpenGL ES Application

On IoT Yocto, there are several OpenGL ES applications can used to check that GPU is running and well integrated within the Wayland/Weston system.

weston-simple-egl

It’s a simple demonstration GLES program that draws a rotating colorized triangle on a transparent Wayland window.

You can find it in weston package (aiot-yocto/src/poky/meta/recipes-graphics/wayland/weston_${version}.bb). And you can also find source code from weston github

Launch weston-simple-egl

  1. Start weston service if it is not started yet.

  1. Launch weston-simple-egl

weston-simple-egl
300 frames in 5 seconds: 60.000000 fps
301 frames in 5 seconds: 60.200001 fps
...
../../../../_images/sw_yocto_gpu-weston-simple-egl-screenshot.png

Screenshot of weston-simple-egl

kmscube

It is a simple demonstration GLES program for how to drive bare metal graphics without a compositor (wayland), using DRM/KMS (kernel mode setting), GBM (graphics buffer manager) and EGL for rendering content using OpenGL ES.

You can find it in kmscube package (aiot-yocto/src/poky/meta/recipes-graphics/kmscube/kmscube_git.bb). And you can also find source code from mesa gitlab.

Launch kmscube

  1. Stop weston service if it already started.

  1. Launch kmscube

kmscube
Using display 0xaaaadcbd5180 with EGL version 1.4
===================================
EGL information:
version: "1.4 Valhall-"r41p0-01eac0""
vendor: "ARM"
client extensions: "EGL_EXT_client_extensions EGL_EXT_platform_base EGL_KHR_client_get_all_proc_addresses EGL_KHR_platform_gbm EGL_KHR_platform_wayland EGL_EXT_platform_wayland"
display extensions: "EGL_WL_bind_wayland_display EGL_NV_context_priority_realtime EGL_KHR_partial_updateEGL_EXT_buffer_age EGL_KHR_config_attribs EGL_KHR_image EGL_KHR_image_base EGL_KHR_fence_sync EGL_KHR_wait_sync EGL_KHR_gl_colorspace EGL_KHR_get_all_proc_addresses EGL_IMG_context_priority EGL_KHR_no_config_context EGL_EXT_image_dma_buf_import EGL_EXT_image_dma_buf_import_modifiers EGL_EXT_yuv_surface EGL_EXT_pixel_format_float EGL_ARM_pixmap_multisample_discard EGL_ARM_implicit_external_sync EGL_ANDROID_native_fence_sync EGL_KHR_gl_texture_2D_image EGL_KHR_gl_renderbuffer_image EGL_KHR_create_context EGL_KHR_surfaceless_context EGL_KHR_gl_texture_cubemap_image EGL_EXT_image_gl_colorspace EGL_EXT_create_context_robustness"
===================================
OpenGL ES 2.x information:
version: "OpenGL ES 3.2 v1.r41p0-01eac0.c36381f2278bad73183210f9208267f3"
shading language version: "OpenGL ES GLSL ES 3.20"
vendor: "ARM"
renderer: "Mali-G57"
...
../../../../_images/sw_yocto_gpu-kmscube-screenshot.png

Screenshot of kmscube


GPU Benchmark

glmark2

IoT Yocto provides glmark2 which is an OpenGL 2.0 and ES 2.0 benchmark. It offers a suite of scenes that can be used to measure many aspects of OpenGL (ES) 2.0 performance. By default, glmark2 is already prebuilt into the rity-demo-image, or you can also modify the $BUILD_DIR/conf/local.conf and add the following change to build and install glmark2 into the image.

IMAGE_INSTALL_append = " glmark2 "

If glmark2 is enabled, you can use cmd: whereis to find glmark2-es2-wayland and glmark2-es2-drm on board.

  • glmark2-es2-wayland: run benchmark as a wayland client.

  • glmark2-es2-drm: run benchmark as a native DRM/GBM openGLES application.

whereis glmark2-es2-wayland
glmark2-es2-wayland: /usr/bin/glmark2-es2-wayland
whereis glmark2-es2-drm
glmark2-es2-drm: /usr/bin/glmark2-es2-drm

Launch glmark2-es2-wayland

  1. Start weston service if it is not started yet.

systemctl start weston
  1. Before running glmark2-es2-wayland, we set both the CPU and GPU to performance mode..

  2. Launch glmark2-es2-wayland. By default, it renders various scenes in a output window with the resolution of 800x600, but the complexity of these scenes does not make the GPU to achieve a 100% usage rate. Therefore, we let glmark2 render to a window with higher resolution: 1920x1080, performing benchmarks when the GPU usage rate is close to 100%. You can find benchmark score when it finishes.

glmark2-es2-wayland -s 1920x1080
=======================================================
...
=======================================================
glmark2 Score: 2192
=======================================================

Launch glmark2-es2-drm

  1. Stop weston service if it already started.

systemctl stop weston
  1. Before running glmark2-es2-drm, we set both the CPU and GPU to performance mode.

  2. Launch glmark2-es2-drm with specified visual config. Default it renders scene at fullscreen resolution and fps is locked to the display refresh rate. You can find benchmark score when it finishes.

glmark2-es2-drm --visual-config 'red=8:green=8:blue=8:alpha=0:buffer=24:depth=24:stencil=8'
=======================================================
...
=======================================================
glmark2 Score: 60

Benchmark result of each SoC platform:

Reference Boards

GPU on different platforms may have some platform-specific instructions or test results. For example, you will get different benchmark results on different platforms. Please find more details about difference of GPU on each platform: