Skip to content

iGPU not working properly in Vulkan and poor performance #32

@dann2333

Description

@dann2333

Summary

On Radxa Orion O6 (CIX P1 / Sky1), GravityMark 1.89 under Vulkan initializes fine and the HUD renders, but the 3D scene is entirely black with Visible: 0 — no geometry is drawn. vkcube renders correctly on the same machine, so basic Vulkan + WSI work; the failure is specific to the GPU-driven rendering path on the panvk + vendor-layer stack.

Environment

Board Radxa Orion O6
SoC CIX P1 (CD8180) / Sky1
GPU Mali-G720 MC10 — vendor 0x13b5, deviceID 0xc8700008
OS Debian GNU/Linux 13 (trixie)
App GravityMark 1.89, Vulkan API, Default render, windowed (1280×720)
Kernel Linux debian 7.0.9.4-generic #1 SMP PREEMPT Thu May 21 22:39:13 CST 2026 aarch64 GNU/Linux

(I modified the kernel a little, it's related to kvm and I haven't touch anything about GPU part.)

Vulkan info:

==========
VULKANINFO
==========

Vulkan Instance Version: 1.4.309


Instance Extensions: count = 22
-------------------------------
VK_EXT_acquire_xlib_display            : extension revision 1
VK_EXT_debug_report                    : extension revision 10
VK_EXT_debug_utils                     : extension revision 2
VK_EXT_direct_mode_display             : extension revision 1
VK_EXT_display_surface_counter         : extension revision 1
VK_EXT_headless_surface                : extension revision 1
VK_EXT_surface_maintenance1            : extension revision 1
VK_EXT_swapchain_colorspace            : extension revision 5
VK_KHR_device_group_creation           : extension revision 1
VK_KHR_display                         : extension revision 23
VK_KHR_external_fence_capabilities     : extension revision 1
VK_KHR_external_memory_capabilities    : extension revision 1
VK_KHR_external_semaphore_capabilities : extension revision 1
VK_KHR_get_physical_device_properties2 : extension revision 2
VK_KHR_get_surface_capabilities2       : extension revision 1
VK_KHR_portability_enumeration         : extension revision 1
VK_KHR_surface                         : extension revision 25
VK_KHR_surface_protected_capabilities  : extension revision 1
VK_KHR_wayland_surface                 : extension revision 6
VK_KHR_xcb_surface                     : extension revision 6
VK_KHR_xlib_surface                    : extension revision 6
VK_LUNARG_direct_driver_loading        : extension revision 1

Instance Layers: count = 1
--------------------------
VK_LAYER_uma_memory Augments memory types on UMA GPUs (Mali, etc.) so HOST_VISIBLE+HOST_COHERENT entries also claim HOST_CACHED — enables gfxstream HOST CompositorVk to find a usable memory type on Mali UMA 1.3.0  version 1

Devices:
========
GPU0:
        apiVersion         = 1.4.335
        driverVersion      = 26.0.0
        vendorID           = 0x13b5
        deviceID           = 0xc8700008
        deviceType         = PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU
        deviceName         = Mali-G720 MC10
        driverID           = DRIVER_ID_MESA_PANVK
        driverName         = panvk
        driverInfo         = Mesa 26.0.0-1sky1.2 (git-9d1aa7c27d)
        conformanceVersion = 0.0.0.0
        deviceUUID         = b5130000-0800-70c8-0000-000000000000
        driverUUID         = 48c80aad-6531-e573-43d3-ed7fefb2ff62
GPU1:
        apiVersion         = 1.4.318
        driverVersion      = 25.2.6
        vendorID           = 0x10005
        deviceID           = 0x0000
        deviceType         = PHYSICAL_DEVICE_TYPE_CPU
        deviceName         = llvmpipe (LLVM 19.1.7, 128 bits)
        driverID           = DRIVER_ID_MESA_LLVMPIPE
        driverName         = llvmpipe
        driverInfo         = Mesa 25.2.6-1~bpo13+1 (LLVM 19.1.7)
        conformanceVersion = 1.3.1.1
        deviceUUID         = 6d657361-3235-2e32-2e36-2d317e627000
        driverUUID         = 6c6c766d-7069-7065-5555-494400000000

Steps to reproduce

  1. Boot with Debian 13, install open-source driver stack.
  2. Run GravityMark 1.89 (Linux ARM64) → Vulkan / Default.
  3. Observed: HUD + FPS update (~9.5 fps), scene is black, Visible: 0. Resolution-independent.
  4. Sanity check — vkcube renders a spinning cube correctly (basic Vulkan + present OK).
  5. Re-run with validation:
    VK_LOADER_LAYERS_ENABLE=VK_LAYER_KHRONOS_validation ./GravityMark... 2>&1 | tee gm-vvl.log
    
Image

ps. I believe this is not a problem of GravityMark. It runs smoothly on other devices.

Validation errors

(1) Pipeline creation — asteroid render pipeline:

VUID-RuntimeSpirv-NonWritable-06341
vkCreateGraphicsPipelines(): pStages[0] SPIR-V (VERTEX) uses descriptor
[Set 0, Binding 1, "_v13"] (STORAGE_BUFFER) not marked NonWritable,
while vertexPipelineStoresAndAtomics was not enabled.

(2) During the run — texture mip copy:

VUID-vkCmdCopyImage-dstOffset-00150 / -00151
pRegions[4,5,8,9].dstOffset + extent (4) exceeds miplevel width/height (2 / 1)

Logs:

Verifying archive integrity...  100%   All good.
Uncompressing GravityMark GPU Benchmark  100%  
M:      0 us: ./Browser.arm64: server is running on 62828 port
[vk_uma_layer] loaded into pid=86347 (build Jun  6 2026 19:10:32)
WARNING: panvk is not a conformant Vulkan implementation, testing use only.
M:      0 us: ../data.zip: 313 files
M:    828 us: Temporal antialiasing
M:    857 us: Render Statistics
M:  11.12 ms: Build Date: Jun 20 2025
M:  11.16 ms: Build Info: version=20250429; linux; arm64; release; vk=1; gl=45; gles=32; cu=1; fusion
M:  11.17 ms: Build Version: 1.89
M:  17.30 ms: Name: Radxa Computer (Shenzhen) Co., Ltd. Radxa Orion O6 Radxa Orion O6
M:  17.34 ms: System: Debian GNU/Linux 13 (trixie)
M:  17.34 ms: Kernel: Linux 7.0.9.4-generic aarch64
M:  17.36 ms: Memory: 31.08 GB
M:  17.37 ms: Uptime: 18:21
M:  17.38 ms: CPU: arm64
M:  17.91 ms: Desktop: 1920x1080 1.0
M:  17.95 ms: Screen 0: 1920x1080 0 0 DP-2
M:  17.99 ms: Creating 1280x720 Vulkan Window
[vk_uma_layer] loaded into pid=86723 (build Jun  6 2026 19:10:32)
WARNING: panvk is not a conformant Vulkan implementation, testing use only.
M:  72.33 ms: Using Fetch Mode
M: 160.60 ms: Device: Mali-G720 MC10
M: 160.66 ms: Vendor: 0x13b5
M: 160.67 ms: Version: 26.0.0
M: 160.68 ms: DeviceID: 0xc8700008
M: 160.69 ms: Group Memory: 32.00 KB
M: 160.69 ms: Video Memory: 23.31 GB
M: 160.70 ms: Max Uniform Size: 1.00 MB
M: 160.71 ms: Max Storage Size: 4.00 GB
M: 160.71 ms: Creating SceneManager
M: 408.41 ms: Creating RenderManager
Validation Error: [ VUID-RuntimeSpirv-NonWritable-06341 ] | MessageID = 0x116350f
vkCreateGraphicsPipelines(): pCreateInfos[0].pStages[0] SPIR-V (VK_SHADER_STAGE_VERTEX_BIT) uses descriptor [Set 0, Binding 1, variable "_v13"] (type VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) which is not marked with NonWritable, but vertexPipelineStoresAndAtomics was not enabled.
The Vulkan spec states: If the vertexPipelineStoresAndAtomics feature is not enabled, then all storage image, storage texel buffer, and storage buffer variables in the vertex, tessellation, and geometry stages must be decorated with the NonWritable decoration (https://docs.vulkan.org/spec/latest/appendices/spirvenv.html#VUID-RuntimeSpirv-NonWritable-06341)
Objects: 1
    [0] VkShaderModule 0x4910000000491

M: 652.71 ms: Rasterization Mode
M: 652.77 ms: Creating Scene
M:   1.881 s: Creating 50,000 Asteroids
M:   1.948 s: Updating Scene
M:   1.986 s: GravityMark 1.89 Vulkan is Ready in 2.0 s
M:   1.986 s: Starting 1280x720 Vulkan Benchmark
M:   1.986 s: Count: 1
M:   1.987 s: Resizing 1280x720 frame
Validation Error: [ VUID-vkCmdCopyImage-dstOffset-00150 ] | MessageID = 0x38b5face
vkCmdCopyImage(): pRegions[8].dstOffset.x (0) + extent (4) exceeds miplevel 8 width (2).
The Vulkan spec states: For each element of pRegions, dstOffset.x and (extent.width + dstOffset.x) must both be greater than or equal to 0 and less than or equal to the width of the specified dstSubresource of dstImage (https://docs.vulkan.org/spec/latest/chapters/copies.html#VUID-vkCmdCopyImage-dstOffset-00150)
Objects: 2
    [0] VkCommandBuffer 0x2fe6fbe0
    [1] VkImage 0x75e000000075e

Validation Error: [ VUID-vkCmdCopyImage-dstOffset-00151 ] | MessageID = 0x4bb17a0e
vkCmdCopyImage(): pRegions[8].dstOffset.y (0) + extent (4) exceeds miplevel 8 height (2).
The Vulkan spec states: For each element of pRegions, dstOffset.y and (extent.height + dstOffset.y) must both be greater than or equal to 0 and less than or equal to the height of the specified dstSubresource of dstImage (https://docs.vulkan.org/spec/latest/chapters/copies.html#VUID-vkCmdCopyImage-dstOffset-00151)
Objects: 2
    [0] VkCommandBuffer 0x2fe6fbe0
    [1] VkImage 0x75e000000075e

Validation Error: [ VUID-vkCmdCopyImage-dstOffset-00150 ] | MessageID = 0x38b5face
vkCmdCopyImage(): pRegions[9].dstOffset.x (0) + extent (4) exceeds miplevel 9 width (1).
The Vulkan spec states: For each element of pRegions, dstOffset.x and (extent.width + dstOffset.x) must both be greater than or equal to 0 and less than or equal to the width of the specified dstSubresource of dstImage (https://docs.vulkan.org/spec/latest/chapters/copies.html#VUID-vkCmdCopyImage-dstOffset-00150)
Objects: 2
    [0] VkCommandBuffer 0x2fe6fbe0
    [1] VkImage 0x75e000000075e

Validation Error: [ VUID-vkCmdCopyImage-dstOffset-00151 ] | MessageID = 0x4bb17a0e
vkCmdCopyImage(): pRegions[9].dstOffset.y (0) + extent (4) exceeds miplevel 9 height (1).
The Vulkan spec states: For each element of pRegions, dstOffset.y and (extent.height + dstOffset.y) must both be greater than or equal to 0 and less than or equal to the height of the specified dstSubresource of dstImage (https://docs.vulkan.org/spec/latest/chapters/copies.html#VUID-vkCmdCopyImage-dstOffset-00151)
Objects: 2
    [0] VkCommandBuffer 0x2fe6fbe0
    [1] VkImage 0x75e000000075e

Validation Error: [ VUID-vkCmdCopyImage-dstOffset-00150 ] | MessageID = 0x38b5face
vkCmdCopyImage(): pRegions[4].dstOffset.x (0) + extent (4) exceeds miplevel 4 width (2).
The Vulkan spec states: For each element of pRegions, dstOffset.x and (extent.width + dstOffset.x) must both be greater than or equal to 0 and less than or equal to the width of the specified dstSubresource of dstImage (https://docs.vulkan.org/spec/latest/chapters/copies.html#VUID-vkCmdCopyImage-dstOffset-00150)
Objects: 2
    [0] VkCommandBuffer 0x2fe6fbe0
    [1] VkImage 0x75c000000075c

Validation Error: [ VUID-vkCmdCopyImage-dstOffset-00151 ] | MessageID = 0x4bb17a0e
vkCmdCopyImage(): pRegions[4].dstOffset.y (0) + extent (4) exceeds miplevel 4 height (2).
The Vulkan spec states: For each element of pRegions, dstOffset.y and (extent.height + dstOffset.y) must both be greater than or equal to 0 and less than or equal to the height of the specified dstSubresource of dstImage (https://docs.vulkan.org/spec/latest/chapters/copies.html#VUID-vkCmdCopyImage-dstOffset-00151)
Objects: 2
    [0] VkCommandBuffer 0x2fe6fbe0
    [1] VkImage 0x75c000000075c

Validation Error: [ VUID-vkCmdCopyImage-dstOffset-00150 ] | MessageID = 0x38b5face
vkCmdCopyImage(): pRegions[5].dstOffset.x (0) + extent (4) exceeds miplevel 5 width (1).
The Vulkan spec states: For each element of pRegions, dstOffset.x and (extent.width + dstOffset.x) must both be greater than or equal to 0 and less than or equal to the width of the specified dstSubresource of dstImage (https://docs.vulkan.org/spec/latest/chapters/copies.html#VUID-vkCmdCopyImage-dstOffset-00150)
Objects: 2
    [0] VkCommandBuffer 0x2fe6fbe0
    [1] VkImage 0x75c000000075c

Validation Error: [ VUID-vkCmdCopyImage-dstOffset-00151 ] | MessageID = 0x4bb17a0e
vkCmdCopyImage(): pRegions[5].dstOffset.y (0) + extent (4) exceeds miplevel 5 height (1).
The Vulkan spec states: For each element of pRegions, dstOffset.y and (extent.height + dstOffset.y) must both be greater than or equal to 0 and less than or equal to the height of the specified dstSubresource of dstImage (https://docs.vulkan.org/spec/latest/chapters/copies.html#VUID-vkCmdCopyImage-dstOffset-00151)
Objects: 2
    [0] VkCommandBuffer 0x2fe6fbe0
    [1] VkImage 0x75c000000075c

M:  16.902 s: Clearing Scene
M:  16.968 s: GravityMark 1.89 Done

Secondary — Vulkan stack maturity / performance

Separate from the bug above, a broader concern: panvk is currently the only Vulkan driver for this SoC on Linux, and it self-reports as non-conformant. In my testing, GPU throughput is well below what the hardware appears capable of. I'd like to say it performes really poor.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions