PVRCarbon cannot capture multi-process Vulkan app

Hello,

I am encountering an issue when using PVRCarbon to capture multi-process Vulkan applications.

While single-process Vulkan applications record and replay without any issues (with correct file sizes), the .pvrcbn file generated for multi-process applications is abnormally small, only 2.7 KB. The same multi-process Vulkan application can be captured successfully using GFXReconstruct.

Due to confidentiality, I cannot share the specific game. I would like to ask: is capturing multi-process Vulkan applications simply not supported in this version, or is there likely an error in my configuration?

Environment Details:

  • Version: PVRCarbon v0.15

  • Container Environment: Android 11

  • Library:PVRCarbon_v0.15\Recorder\Vk\Linux_armv8_64\libVkLayer_PowerVR_carbon.so

Troubleshooting Steps:
I have tried capturing from Frame 0 and Frame 1000. In all attempts, the generated parts folder and the final .pvrcbn file remain only 2.7KB.

Attachments/Logs:

pvrcarbon.json:

{
        "recording":
        {
          "enable": true,
          "frames": "0-1100",
          "frameDelimiters": "vkFrameBoundary,vkQueuePresentKHR",
          "bundleParts": true,
          "exitAfterFrame": 1000000,
          "output":
          {
                          "debug": true,
                          "verbose": true,
                          "information": true,
                          "warning": true,
                          "error": true
          }
        }
}

logcat -s PVRCarbon,vulkan:

D vulkan  : searching for layers in '/data/local/debug/vulkan'
I PVRCarbon: Detected the Android Vulkan Loader querying for  information. Switching to passthrough mode
D vulkan  : added global layer 'VK_LAYER_POWERVR_carbon' from library '/data/local/debug/vulkan/libVkLayer_PowerVR_carbon.so'
D vulkan  : searching for layers in '/data/user/0/com.myapp'
D vulkan  : searching for layers in '/data/app/~~4p5gDNcx7mKSxELefbELrQ==/com.myapp-rNcwPvC0w-v-lVSysu_WrQ==/lib/arm64'
D vulkan  : searching for layers in '/data/app/~~4p5gDNcx7mKSxELefbELrQ==/com.myapp-rNcwPvC0w-v-lVSysu_WrQ==/base.apk!/lib/arm64-v8a'
I vulkan  : Loaded layer VK_LAYER_POWERVR_carbon
I PVRCarbon: Found Config: '/data/local/debug/vulkan/pvrcarbon.json'
D PVRCarbon: JsonConfig: Enabled recording
D PVRCarbon: JsonConfig: Set frames to '0-1100'
D PVRCarbon: JsonConfig: Set frame delimiters to 'vkFrameBoundary,vkQueuePresentKHR'
D PVRCarbon: JsonConfig: Enabled bundle parts
D PVRCarbon: JsonConfig: Set exit after frame to 1000000
D PVRCarbon: Failed to get JNI_GetCreatedJavaVMs
D PVRCarbon: Using fallback method for setting default output path
I PVRCarbon: Recording process: 'com.myapp'
D PVRCarbon: Failed to retrieve the fully qualified path for library 'libc.so' (Unsupported)
D PVRCarbon: Library 'libc.so' loaded
D PVRCarbon: Library 'libc.so' unloaded
D PVRCarbon: Failed to retrieve the fully qualified path for library 'libdl.so' (Unsupported)
D PVRCarbon: Library 'libdl.so' loaded
D PVRCarbon: Library 'libdl.so' unloaded
I PVRCarbon: Successfully installed syshooks
I PVRCarbon: Recording frames: 0-1100
I PVRCarbon: Writing intermediate data to '/data/data/com.myapp/files/com.myapp_frames_0-1100.0000.parts'
D PVRCarbon: Vk Interface: Creating shared layer state
D PVRCarbon: Vk Interface: Adding Host Layer
D PVRCarbon: Vk Interface: Adding Overrides Layer
D PVRCarbon: Vk Interface: Adding Record Layer
D PVRCarbon: Vk Interface: Adding Memory Layer
D PVRCarbon: Vk Interface: Adding Native Buffer Layer
D PVRCarbon: Vk Interface: Adding handle lifetimes Serialisation Layer
D PVRCarbon: Failed to retrieve the fully qualified path for library '/system/lib64/libvulkan.so' (Unsupported)
D PVRCarbon: Library '/system/lib64/libvulkan.so' loaded
I PVRCarbon: Supported Instance Extensions (11 in total):
I PVRCarbon:     VK_KHR_surface : Spec Version [25]
I PVRCarbon:     VK_KHR_android_surface : Spec Version [6]
I PVRCarbon:     VK_EXT_swapchain_colorspace : Spec Version [4]
I PVRCarbon:     VK_KHR_get_surface_capabilities2 : Spec Version [1]
I PVRCarbon:     VK_KHR_device_group_creation : Spec Version [1]
I PVRCarbon:     VK_KHR_external_fence_capabilities : Spec Version [1]
I PVRCarbon:     VK_KHR_external_memory_capabilities : Spec Version [1]
I PVRCarbon:     VK_KHR_external_semaphore_capabilities : Spec Version [1]
I PVRCarbon:     VK_KHR_get_physical_device_properties2 : Spec Version [2]
I PVRCarbon:     VK_EXT_debug_report : Spec Version [9]
I PVRCarbon:     VK_EXT_debug_utils : Spec Version [2]
I PVRCarbon: Supported Instance Layers (1 in total):
I PVRCarbon:     VK_LAYER_POWERVR_carbon : Spec Version [4211009], Implementation Version [61440]
V PVRCarbon: Opening '/data/data/com.myapp/files/com.myapp_frames_0-1100.0000.parts/0.calls.pvrcbn.part' for writing
I PVRCarbon: Enabling instance extension: VK_KHR_get_physical_device_properties2
I PVRCarbon: Enabling instance extension: VK_KHR_device_group_creation
I PVRCarbon: Created Vulkan '1.0.1' instance
I PVRCarbon:     Application Info: 'UE4' (0)
I PVRCarbon:     Engine Info: 'UE4' (0)
D PVRCarbon: Vk Interface: Enabling passthrough mode
D PVRCarbon: Library '/system/lib64/libvulkan.so' unloaded
D PVRCarbon: Vk Interface: Adding Host Layer
D PVRCarbon: Vk Interface: Adding Memory Layer
D PVRCarbon: Recorder: Finalising Recording...
I PVRCarbon: Packaging up '/data/data/com.myapp/files/com.myapp_frames_0-1100.0000.parts' using compression 'zlib'...
D PVRCarbon: Adding zip entry for parts file '/data/data/com.myapp/files/com.myapp_frames_0-1100.0000.parts/0.calls.pvrcbn.part' ('36448' bytes uncompressed)...
I PVRCarbon: Successfully created '/data/data/com.myapp/files/com.myapp_frames_0-1100.pvrcbn'
D PVRCarbon: Recorder: Finalising Complete

ls -hl /data/data/com.myapp/files/com.myapp_frames_0-1100.pvrcbn
-rw------- 1 u0_a122 u0_a122 2.7K 2026-03-31 14:50 /data/data/com.myapp/files/com.myapp_frames_0-1100.pvrcbn

adb multi-process log print:

adb shell '
pkg=com.myapp

echo "== Process List =="
ps -A -o PID,NAME 2>/dev/null | grep "$pkg" 2>/dev/null

echo ""
echo "== Unique Process Names =="
ps -A -o NAME 2>/dev/null | grep "$pkg" 2>/dev/null | sort -u

echo ""
echo "== Vulkan Usage =="
for p in /proc/[0-9]*; do
  pid=${p##*/}

  name=$(cat $p/cmdline 2>/dev/null)
  [ -z "$name" ] && continue

  echo "$name" | grep -q "$pkg" 2>/dev/null || continue

  if grep -q "vulkan.powervr.so" $p/maps 2>/dev/null; then
    echo "$pid: $name"
  fi
done

output:
== Process List ==
 35201 com.myapp:xg_vip_service
 35619 com.myapp:psoprogramservice
 35625 com.myapp:psoprogramservice1
 37336 com.myapp
== Unique Process Names ==
com.myapp
com.myapp:psoprogramservice
com.myapp:psoprogramservice1
com.myapp:xg_vip_service
== Vulkan Usage ==
35201: com.myapp:xg_vip_service
35619: com.myapp:psoprogramservice
35625: com.myapp:psoprogramservice1
37336: com.myapp

Thank you for your help.

Hi logic,

Thanks for your message and welcome to the PowerVR Developer Forum!

We will need an executable to reproduce the issue and look into it. Can you provide a sample application we could use?

Also, in case your game can be built for Windows, you can try to take a recording on Windows as PVRCarbon also works on that platform.

Best regards,
Alejandro

Hi logic,

Also, please take into account the two points below:

  1. Make sure you are using the correct PVRCarbon library for Android (I can see in your comment you mention PVRCarbon_v0.15\Recorder\Vk\Linux_armv8_64\libVkLayer_PowerVR_carbon.sobut then you use Android OS. It should bePVRCarbon\Recorder\Vk\Android[Target_arch]
  2. For a multi-process recording, you might need to set the filename configuration option with a name that includes the process ID. For example, /data/data/com.myapp/files/%pname_%pid.pvrcbn. This will allow the different processes to not write to the same file.

Best regards,
Alejandro

I figured it out. It turns out the issue wasn’t with the tool itself, but the Vulkan Driver.

After updating the driver, the capture works perfectly and the file size is correct.

Just to clarify, I am actually using the library from the Android folder:
PVRCarbon_v0.15\Recorder\Vk\Android\arm64-v8a\libVkLayer_PowerVR_carbon.so

Thanks for the support! :grinning_face: