GPU
Sections
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 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 IoT 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.
Genio 350 |
Genio 1200 |
|
Mali GPU node |
||
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:
For Genio 350-EVK, run at performance mode.
For MT8395 P1V6 (Genio 1200) demo board, run at performance mode.
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
Start
weston
service if it is not started yet.
For Genio 350-EVK, cmd to start weston.
For MT8395 P1V6 (Genio 1200) demo board, cmd to start weston.
Launch
weston-simple-egl
weston-simple-egl
300 frames in 5 seconds: 60.000000 fps
301 frames in 5 seconds: 60.200001 fps
...

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
Stop
weston
service if it already started.
For Genio 350-EVK, cmd to stop weston.
For MT8395 P1V6 (Genio 1200) demo board, cmd to stop weston.
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"

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.
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
Start
weston
service if it is not started yet.
For Genio 350-EVK, cmd to start weston.
For MT8395 P1V6 (Genio 1200) demo board, cmd to start weston.
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
Stop
weston
service if it already started.
For Genio 350-EVK, cmd to stop weston.
For MT8395 P1V6 (Genio 1200) demo board, cmd to stop weston.
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:
For Genio 350-EVK, here is glmark2 benchmark result.
For MT8395 P1V6 (Genio 1200) demo board, here is glmark2 benchmark result.
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: