GPU


This chapter describes common information and instructions of GPU on AIoT 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 paltform.


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 MT8395 P1V6 (Genio 1200) demo board 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 AIoT Yocto v22.1, MT8395 P1V6 (Genio 1200) demo board. 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: 2022-04-29 UTC
weston 10.0.0
https://wayland.freedesktop.org
Bug reports to: https://gitlab.freedesktop.org/wayland/weston/issues/
Build: 10.0.0
Command line: weston --backend=drm-backend.so
OS: Linux, 5.15.37-mtk, #1 SMP PREEMPT Tue Jun 28 10:08:56 UTC 2022, aarch64
Flight recorder: enabled
Using config file '/etc/xdg/weston/weston.ini'
Output repaint window is 7 ms maximum.
Loading module '/usr/lib64/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/lib64/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-"r32p0-01eac1"
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_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
warning: Disabling render GPU timeline and explicit synchronization due to missing EGL_ANDROID_native_fence_sync extension
EGL_KHR_surfaceless_context available
GL version: OpenGL ES 3.2 v1.r32p0-01eac1.a614746065a3dea01b0881dde5799119
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 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.r32p0-01eac1.a614746065a3dea01b0881dde5799119
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_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_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
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_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_arm_core_id                                                   0x400000 (1.0.0)
                                                cl_arm_printf                                                    0x400000 (1.0.0)
                                                cl_arm_non_uniform_work_group_size                               0x400000 (1.0.0)
                                                cl_arm_import_memory                                             0x400000 (1.0.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                                         0x3000 (0.3.0)
                                                cl_arm_controlled_kernel_termination                             0x400000 (1.0.0)
                                                cl_ext_cxx_for_opencl                                            0x400000 (1.0.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.r32p0-01eac1.a614746065a3dea01b0881dde5799119
Device UUID                                     10009190-0100-0000-0000-000000000000
Driver UUID                                     065ef112-6803-bee4-36df-7aa1cc6c9d10
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.r32p0-01eac1.a614746065a3dea01b0881dde5799119
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                                                               __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                   N/A
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                              1904369664 (1.774GiB)
Error Correction support                        No
Max memory allocation                           1904369664 (1.774GiB)
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                        1904369664 (1.774GiB)
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_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_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
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_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_arm_core_id                                                   0x400000 (1.0.0)
                                                cl_arm_printf                                                    0x400000 (1.0.0)
                                                cl_arm_non_uniform_work_group_size                               0x400000 (1.0.0)
                                                cl_arm_import_memory                                             0x400000 (1.0.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                                         0x3000 (0.3.0)
                                                cl_arm_controlled_kernel_termination                             0x400000 (1.0.0)
                                                cl_ext_cxx_for_opencl                                            0x400000 (1.0.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 -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 = 10
===============================
        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_surface                         : extension revision 25

Layers:
=======
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        = 4202673 (1.2.177)
        driverVersion     = 134217728 (0x8000000)
        vendorID          = 0x13b5
        deviceID          = 0x90910010
        deviceType        = PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU
        deviceName        = Mali-G57
        pipelineCacheUUID = 942a1b40-7b7e-ab66-aa79-7f4166fa5d15

VkPhysicalDeviceLimits:
-----------------------
        maxImageDimension1D                             = 16384
        maxImageDimension2D                             = 16384
        maxImageDimension3D                             = 16384
        maxImageDimensionCube                           = 16384
        maxImageArrayLayers                             = 4096
        maxTexelBufferElements                          = 268435456
        maxUniformBufferRange                           = 65536
        maxStorageBufferRange                           = 268435456
        maxPushConstantsSize                            = 256
        maxMemoryAllocationCount                        = 4294967295
        maxSamplerAllocationCount                       = 4294967295
        bufferImageGranularity                          = 0x00001000
        sparseAddressSpaceSize                          = 0x00000000
        maxBoundDescriptorSets                          = 4
        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                      = 64
        maxGeometryOutputComponents                     = 128
        maxGeometryOutputVertices                       = 256
        maxGeometryTotalOutputComponents                = 1024
        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                                 = 38.4615
        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.r32p0-01eac1.a614746065a3dea01b0881dde5799119
        conformanceVersion = 1.2.6.0

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      = 065ef112-6803-bee4-36df-7aa1cc6c9d10
        deviceNodeMask  = 0
        deviceLUIDValid = false

VkPhysicalDeviceInlineUniformBlockPropertiesEXT:
------------------------------------------------
        maxInlineUniformBlockSize                               = 65536
        maxPerStageDescriptorInlineUniformBlocks                = 4
        maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks = 4
        maxDescriptorSetInlineUniformBlocks                     = 4
        maxDescriptorSetUpdateAfterBindInlineUniformBlocks      = 4

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

VkPhysicalDeviceMaintenance3Properties:
---------------------------------------
        maxPerSetDescriptors    = 500000
        maRE_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

VkPhysicalDeviceSubgroupSizeControlPropertiesEXT:
-------------------------------------------------
        minSubgroupSize              = 16
        maxSubgroupSize              = 16
        maxComputeWorkgroupSubgroups = 32
        requiredSubgroupSizeStages: count = 4
                SHADER_STAGE_FRAGMENT_BIT
                SHADER_STAGE_COMPUTE_BIT
                SHADER_STAGE_ALL_GRAPHICS
                SHADER_STAGE_ALL

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                        = 065ef112-6803-bee4-36df-7aa1cc6c9d10
        deviceNodeMask                    = 0
        deviceLUIDValid                   = false
        subgroupSize                      = 16
        subgroupSupportedStages: count = 4
                SHADER_STAGE_FRAGMENT_BIT
                SHADER_STAGE_COMPUTE_BIT
                SHADER_STAGE_ALL_GRAPHICS
                SHADER_STAGE_ALL
        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           = 0x71826000

VkPhysicalDeviceVulkan12Properties:
-----------------------------------
        driverID                                             = DRIVER_ID_ARM_PROPRIETARY
        driverName                                           = Mali-G57
        driverInfo                                           = v1.r32p0-01eac1.a614746065a3dea01b0881dde5799119
        conformanceVersion                                   = 1.2.6.0
        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              = 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


Device Extensions: count = 63
-----------------------------
        VK_EXT_4444_formats                   : extension revision 1
        VK_EXT_astc_decode_mode               : 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_external_memory_dma_buf        : extension revision 1
        VK_EXT_fragment_density_map           : extension revision 1
        VK_EXT_fragment_density_map2          : extension revision 1
        VK_EXT_global_priority                : extension revision 2
        VK_EXT_host_query_reset               : extension revision 1
        VK_EXT_image_drm_format_modifier      : extension revision 1
        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_provoking_vertex               : extension revision 1
        VK_EXT_queue_family_foreign           : extension revision 1
        VK_EXT_scalar_block_layout            : extension revision 1
        VK_EXT_separate_stencil_usage         : 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_texture_compression_astc_hdr   : 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_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_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_get_memory_requirements2       : 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_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_draw_parameters         : extension revision 1
        VK_KHR_shader_float16_int8            : extension revision 1
        VK_KHR_shader_float_controls          : extension revision 4
        VK_KHR_shader_non_semantic_info       : extension revision 1
        VK_KHR_shader_subgroup_extended_types : 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_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

VkQueueFamilyProperties:
========================
        queueProperties[0]:
        -------------------
                minImageTransferGranularity = (1,1,1)
                queueCount                  = 2
                queueFlags                  = QUEUE_GRAPHICS | QUEUE_COMPUTE | QUEUE_TRANSFER
                timestampValidBits          = 64
                present support             = false

VkPhysicalDeviceMemoryProperties:
=================================
memoryHeaps: count = 1
        memoryHeaps[0]:
                size   = 1904369664 (0x71826000) (1.77 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:
==================        = 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                             = false
        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

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

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

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

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

VkPhysicalDeviceImageRobustnessFeaturesEXT:
-------------------------------------------
        robustImageAccess = true

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

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

VkPhysicalDeviceInlineUniformBlockFeaturesEXT:
----------------------------------------------
        inlineUniformBlock                                 = true
        descriptorBindingInlineUniformBlockUpdateAfterBind = true

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

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

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

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

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

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

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

VkPhysicalDeviceShaderAtomicInt64Features:
------------------------------------------
        shaderBufferInt64Atomics = false
        shaderSharedInt64Atomics = false

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

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

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

VkPhysicalDeviceSubgroupSizeControlFeaturesEXT:
-----------------------------------------------
        subgroupSizeControl  = true
        computeFullSubgroups = true

VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT:
-----------------------------------------------------
        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                           = false
        shaderSharedInt64Atomics                           = false
        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

VkPhysicalDeviceVulkanMemoryModelFeatures:
------------------------------------------
        vulkanMemoryModel                             = true
        vulkanMemoryModelDeviceScope                  = true
        vulkanMemoryModelAvailabilityVisibilityChains = 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 MT8395 P1V6 (Genio 1200) demo board 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. DVFS can help to reduce the power consumption by dynamically adjusting voltage and frequency of the GPU.

GPU node, ID and device tree

Genio 350

Genio 1200

Mali GPU node

mali@13040000

mali@13000000

Mali GPU ID

13040000

13000000

Device tree

kernel src/arch/arm64/boot/dts/mediatek/mt8365.dtsi

kernel src/arch/arm64/boot/dts/mediatek/mt8195.dtsi

Taking MT8395 P1V6 (Genio 1200) demo board as an example, the device tree is as follows

gpu: mali@13000000 {
                    compatible = "mediatek,mt8195-mali", "arm,mali-valhall",
                                 "arm,mali-bifrost", "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";
            };

            gpu_opp_table: opp_table0 {
                    /*
                     * Note: "operating-points-v2-mali" compatible and the
                     * opp-core-mask properties are not part of upstream
                     * binding.
                     */

                    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 = <575000>;
                    };

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

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

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

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

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

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

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

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

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

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

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

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

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

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

                    opp-880000000 {
                            opp-hz = /bits/ 64 <880000000>;
                            opp-hz-real = /bits/ 64 <880000000>,
                                          /bits/ 64 <880000000>;
                            opp-microvolt = <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 Apr 29 17:48 available_frequencies
-r--r--r-- 1 root root 4096 Apr 29 17:48 available_governors
-r--r--r-- 1 root root 4096 Apr 29 17:48 cur_freq
lrwxrwxrwx 1 root root    0 Apr 29 17:48 device -> ../../../13000000.mali
-rw-r--r-- 1 root root 4096 Apr 29 17:48 governor
-rw-r--r-- 1 root root 4096 Apr 29 17:48 max_freq
-rw-r--r-- 1 root root 4096 Apr 29 17:48 min_freq
-r--r--r-- 1 root root 4096 Apr 29 17:48 name
-rw-r--r-- 1 root root 4096 Apr 29 17:48 polling_interval
drwxr-xr-x 2 root root    0 Apr 29 17:48 power
lrwxrwxrwx 1 root root    0 Apr 28 17:42 subsystem -> ../../../../../../class/devfreq
-r--r--r-- 1 root root 4096 Apr 29 17:48 target_freq
-rw-r--r-- 1 root root 4096 Apr 29 17:48 timer
-rw-r--r-- 1 root root 4096 Apr 29 17:48 trans_stat
-rw-r--r-- 1 root root 4096 Apr 28 17:42 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 vaule 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:


OpenGL ES Application

On AIoT 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 0xaaaabd1e5570 with EGL version 1.4
===================================
EGL information:
version: "1.4 Valhall-"r32p0-01eac1""
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_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.r32p0-01eac1.a614746065a3dea01b0881dde5799119"
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

AIoT 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. Default it is not enabled, please add following change in $BUILD_DIR/conf/local.conf to build and install glmark2 into 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.

  1. Launch glmark2-es2-wayland. Default it renders scene on window surface at 800x600 resolution. You can find benchmark score when it finishes.

glmark2-es2-wayland
=======================================================
glmark2 2021.12
=======================================================
OpenGL Information
GL_VENDOR:     ARM
GL_RENDERER:   Mali-G57
GL_VERSION:    OpenGL ES 3.2 v1.r32p0-01eac1.a614746065a3dea01b0881dde5799119
=======================================================
...
=======================================================
glmark2 Score: 1895
=======================================================

Launch glmark2-es2-drm

  1. Stop weston service if it already started.

  1. 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 2017.07
=======================================================
    OpenGL Information
    GL_VENDOR:     ARM
    GL_RENDERER:   Mali-G52
    GL_VERSION:    OpenGL ES 3.2 v1.r32p1-00bet4.ec22f9a2accdf7f16bc2903e5454567b
=======================================================
...
=======================================================
glmark2 Score: 58

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 paltform: