PowerVR Tools and SDK 2022 Release 1


  • Changed instance creation methodology to ensure that applications target a specific version of Vulkan instead of targeting the Vulkan loader version on the device.
  • Allowed users to initialise UI Renderer with a custom font, given an image view.
  • Allowed users to set the flags required for the debug callback mesenger to log during the instance creation and destruction. Defaults to only errors and warnings.
  • Allowed users to specify validation warnings to disable by passing a vector of IDs.
  • Updated CMake to 3.18.
  • Updated Gradle build tools to 4.1.2.


  • Added new Vulkan Raytracing Example: Hybrid transparency.
  • Added Vulkan Subgroups demo.
  • Added new GL ES and Vulkan Examples: Shadows.
  • Added new Vulkan Raytracing Example: Denoising.
  • Added new Vulkan Example: YCbCr Texture Sampling.
  • Explicitly set the targeted instance version. Previous examples would set the instance version to the highest one supported on the device.
  • Simplified the Vk device extension feature loading, especially in the RT examples.
  • Set the Vulkan raytracing demos to Vulkan version 1.1.

PVRCarbon v0.9

  • Added a check in the state tracker for a valid current context before dereferencing it.
  • Limited the symbols exported by shared libraries to only those that are necessary.
  • Updated PVRCarbon Vulkan support to 1.3.204.
  • Added an option to export the API errors to text files. Previously this was always enabled, but now it can be turned off, hiding all failed API calls from the text output as a result.
  • Added the ability to export text files in CSV format.


  • Fixed displaying cube map level thumbnails in the frame analysis.
  • Fixed a regression in the EGL context state model introduced last release.
  • When performing a local capture on Windows, we now remove the .exe extension when generating the default filename.
  • Added Android am instrument support to the remote recorder. Instrumentation entry points for APKswill now be listed in the UI with the activities. If selected, am instrument will be used instead of am start for launching.
  • Improved the error message seen if Android remote recording fails to set enable_gpu_debug_layers due to a lack of permissions. It now informs the user to enable “Disable permission monitoring” in “Developer Options” if the device supports it.
  • Added glDrawElementsBaseVertexOES support to the frame analysis.
  • The GUI will now update the displayed final frame number when it begins finalising the data instead of after.
  • Added a statistics graph to give an overview of API usage across a recording.
  • Updated all icons to be svg.


  • Fix for catching exceptions that could occur if we fail to capture Vulkan buffer/image data when writing out the state.
  • Fix bundling up the .pvrcbn file on Android when a signal is caught.
  • On Windows and Linux we now search for all undefined host libraries when the user only provides paths for some of them. Previously we would only search if all paths were unset.
  • On Windows we now package up the pvrcbn file if an unhandled exception occurs during recording.
  • Added a texture data transcode step to the writing out of the texture state if the implementation read format of the queried texture data doesn’t match the expected texture level’s format.
  • Added debug.print_frames option which can be used to output frame numbers whilst recording.
  • Fixed a segmentation fault that could occur during setup on non-rooted Android devices.
  • Improved forward compatibility support for unrecognised Vulkan-typed structures.
  • Add state tracking of extension GL_IMG_framebuffer_downsample when not recording from the start of an application.

C++ Exporter:

  • Fixed exported code of vkInvalidateMappedMemoryRanges when VMA is disabled
  • Fixed a bug that in rare circumstances could result in pointer to array members of Vulkan structures pointing at an invalid address.
  • Add exporting of eglQuerySurfaces that query for EGL_BUFFER_AGE_KHR. This stops eglSetDamageRegionKHR failing with EGL_BAD_ACCESS.
  • Updated VMA version to v3.0.0.
  • Added support for Vulkan Structure pNext chains.
  • Updated the exported code to use gradle version 7.3.2 for Android builds.
  • Added missing include to the exported errors.h.
  • The exported code has been updated to use the KDE Extra CMake Modules for finding Wayland and XCB dependencies.
  • Fixed the generation of code for VkPipelineCacheCreateInfo when pInitialData is not null.


  • Improve XCB and X11 window system support.
  • On Windows, we now ignore dpi scaling.
  • Remove command-line option --skip-failed-calls and make the skipping of failed api calls during playback the default behaviour.
  • Add command-line option --do-failed-calls for playing back calls that failed at record time.
  • Add --skip-apis option to skip calls at playback time based on their api.
  • Fix for --show-windows failing for OpenGL ES recordings if eglCreateWindowSurface re-uses handles.
  • Fix offscreen rendering when resizing framebuffer attachments is required.
  • Implement playback of glGetQueryiv[EXT] and glGetQueryObjectuiv[EXT].
  • Made glClientWaitSync wait until the sync object is signalled if it was signalled at record time.
  • Removed a double lookup of the object handle in vkDebugMarkerSetObjectNameEXT and vkDebugMarkerSetObjectTagEXT. This should fix any incorrectly reported playback warnings about failing to find the object.
  • Added checks to vkCreateComputePipelines and vkCreateGraphicsPipelines to see if all extensions required (if any) for the requested shader stages are supported.
  • Added support for saving A2_B10_G10_R10 and RGB565 framebuffers to the --capture-frames png code path.
  • Captured frames will now be saved out by default with the filename _frame_.png.
  • Added new option, --capture-frames-filename-template which can be used to define the filename template used when saving our captured frames.
  • Added --skip-calls option to skip calls at playback time based on their uids.
  • Added --print-frames command line option which can be used to print frame numbers whilst playing back.
  • Added --capture-frames-format command-line option to specify the format used for captured frames. Current supported formats are png (default) or tga.
  • The command-line option --log-level now supports ‘all’ as a value (–log-level=all). This option will enable all levels.
  • Fixed playback of eglCreatePlatformWindowSurface[EXT] on Android and Wayland.
  • Various bug fixes and improvements for playing back calls from VK_KHR_acceleration_structure and VK_KHR_ray_tracing_pipeline.

PVRTexTool v5.3.0

  • Add support for loading single-part OpenEXR files.


  • Added a ‘Show Current In File Explorer’ option, which will open the folder containing the texture in the system file explorer. This option is available from the right-click tab-bar context menu, or via the File menu.
  • Fixed an issue that could cause the undo/redo history to become invalid, resulting in unwanted image transformations being applied.
  • Added a ‘pixel picker’ display output to the image viewer. Left clicking a texel will now persitantly display the texel co-ordinate and (RGBA) values, in addition to the mouse on-hover values.
  • The current image dimensions (WxHxD) text is now displayed as part of the current Mip level.
  • Removed the ‘Zoom’ text label in favour of a icon.
  • UI now allows users to control the cube view’s vertical field of view.
  • UI now displays the pixel value and cube face currently under the mouse cursor when in cube view.
  • Fixed incorrect sampling of the +/-Y faces when in cube net view.
  • Allow saving a texture in a PVR container as a C style header.
  • Allow the user to customise the pixel display per image viewer via the View -> Set Pixel Display dialog.
    • The user may pick from one of the following pixel display modes: integer, hexadecimal (applicable for integer textures only), float-decimal, or float-scientific.
    • The user may also set the number of decimal digits for floating point modes.
    • When a float mode is selected, texture data encoded as integer types will be displayed as a normalised value in the range -1 to 1 or 0 to 1.


  • The -diff option is now accepted when the -f (format) option is present, this has the effect of diff’ing the transcoded input texture with the texture specified by -diff.


  • Fixed incorrect decompression of EAC RG11, which caused the red and green channel data to be swapped.
  • Fixed a bug in the PVRTC compressor that could cause the compressed output to differ between runs when compressing with multiple threads. This was generally seen when utilising close to or the maximum number of threads supported by the host CPU and/or the system was being heavily utilised by other apps while compression was running.
  • Fixed a bug in the ETC codec which caused the last byte of compressed data to not be set.
  • Updated the PVRTC compressor to v1.228. This revision improves load balancing which in turn increases multi-threaded efficiency. Additionally, this update fixes a previous regression that was causing the compressed result to vary depending on the number of threads used to compress the input.
  • Added the following texture comparison error metric functions to PVRTexLib’s public API: PVRTexLib_MaxDifference, PVRTexLib_MeanError, PVRTexLib_MeanSquaredError, PVRTexLib_RootMeanSquaredError, PVRTexLib_StandardDeviation, and PVRTexLib_PeakSignalToNoiseRatio.
    • These APIs are also available via the Python wrapper (PVRTexLibPy) as MaxDifference, MeanError, MeanSquaredError, RootMeanSquaredError, StandardDeviation, and PeakSignalToNoiseRatio.
  • Added a overloaded constructor to the PVRTexLib API C++ wrapper that accepts a file path as a const char*.
  • PVRTexLib_GetTextureDataSize now returns a 64-bit unsigned integer.
  • Enabled PVRTC support for texture dimensions up to 16k * 16k on Linux & macOS (same as Windows).
  • Added new PVRTexLib_SaveTextureToMemory API to PVRTexLib (and PVRTexture::SaveTextureToMemory to the C++ wrapper). This API is similar to the existing ‘save to file’ routines but allows for the file data to be output into a memory buffer, the API currently supports PVR, KTX, ASTC, BASIS and DDS file container types.
  • Added a Decompress function to PVRTexLib’s public API and Python wrapper. This API provides a convienient way to decompresses a texture into the most appropriate format based on the textures ‘compressed’ format, for example a PVRTC compressed texture may decompress to RGB888 or RGBA8888. This API may also be used to ‘decompress’ packed formats into something easier to manipulate for example RGB565 will be decompressed to RGB888.

PVRVFrame v10.15.2

  • Fixed ASTC glTexStorage emulation on Intel GPUs.
  • Fixed a bug in glFramebufferTextureLayer that could cause an invalid operation error or the wrong texture to be attached.
  • Worked around Intel link program error “Varying ‘gl_PerVertex;_IN’ has different block does not match across different shaders.” that could occur when using geometry shaders.

PVRTune v14.153


  • Automatic reconnection dialog box
    • Now has a “Never” button to disable the feature.
  • Preferences dialog box
    • Now has a check box to enable/disable the automatic reconnection dialog.
    • Now remembers its size and position on the desktop.
    • Added keyboard shortcuts.
  • Improved layout of the Warnings pop-up, often broken in the Developer build, and improved the layout/wrapping of the PVRPerfServer Details docking window (which combines Server Control, Server Details and Warnings), which improves behaviour at high DPI scaling settings or low resolution.
  • Reduced minimum size of docking and central windows. This gives the the user the flexibility to make them very small if they wish to, so as to give space to other GUI areas; this is particularly useful at high DPI scaling settings or low resolution.
  • PVRTune splash-screen/about-box: no longer low resolution and pixellated when OS high DPI scaling is enabled.
  • Improved visual quality of icons when DPI scaling is in use: icons are now vector graphics.
  • Counter Contributions
    • Implement DTEC-2676: split counters, where meaningful, into contributions. Affects HW counters and Rogue ‘custom’ counters (Complete build only), CPU counters, and CPU perf counters. Show in Counter Table.
    • Implement DTEC-3477: add new graph option “Fill Solo Graphs”: when a graph view has this enabled and one counter is graphed and Render Timing Data disabled, then the area under graphed counter will be drawn filled, with contributions shown as stacked graphs.
    • Add Counter Table context menu option “Show Verbose Tree”. Shows counter contributions explicitly; disabled by default because showing a level in the tree for a single core/contribution is typically a poor use of screen space.
    • Implement DTEC-3645: show counter contributions in “Export Counters to CSV”.

PVRTuneComplete :

  • Added support for ePVRSSFWActFilterSet.
  • Added support for ePVRSSClientOpenCLMarkID_clCreateProgramWithIL.
  • Added support for ePVRSSClientOpenCLMarkID_clSetProgramSpecializationConstant.
  • Added support for ePVRSSClientTAKickReason_OutOfTABufferSets.
  • Added support for PVRSS_POWERDOMAIN_DAUTES.
  • Added support for PVRSS_POWERDOMAIN_MARS.
  • ePVRSSTiming4PowerSafetyReset renamed (from ePVRSSTiming4PowerPHRPartial) to match DDK.

PVRTuneComplete GUI :

    • Fix DTEC-237 HWPerf: support GPU periodic HW reset events (PHR). “Power Safety Reset” events can now be seen.
    • Display the MSAA mode in the properties window for Tiler and Renderer HW kicks when the OpenGL[ES] client stream is enabled (requires a compatible driver).
    • “Resource Viewer” docking window, layout improvements to improve situations at high DPI settings (or low resolution) where this window is preventing docked windows from being made narrower:
      • Remove margins to remove wasted whitespace.
      • Enable word wrap on the string.
      • Move the resource type combo box to be beside the resource scale factor, as they go together, and because scale factor is a parameter to “Capture”, not a view setting for the GUI.
    • Add Time/Cycles/Ordinal abscissa modes. Abscissa choice is a per-graph setting.
      • Clock and Ordinal modes are implemented by dividing the view equally according to the zoom level, then converting each per-pixel-column abscissa-range to time-range. This has the effect of squashing time between events, and allows all timelines and counters to be shown; e.g. no need to disable timelines that don’t have clock counter readings when in clock-cycle abscissa mode.
      • Ordinal (logical sequence?) absicissa mode: when timelines are disabled, the events squash up closer; it’s the sequence of shown events that are evenly spaced.
    • The properties widget now shows the shared EGL graphics context ID (if applicable) and context type (OpenGL, OpenGLES 1, or OpenGLES 3) when a eglCreateContext event is selected. (requires a compatible driver)
    • Support cross-referencing API data (for example shader objects) between shared graphics contexts.
      • Add shared context editor user interface (Edit -> Shared Context Editor) which allows the user to manually specify shared graphics contexts for OpenGL and OpenGLES. This UI exists to facilitate shared graphics contexts when capturing performance data from drivers that do not send the required data that would allow PVRTune to automatically deduce context sharing.


  • PVRPerfServer now sends CPU time stamps with nanosecond precision (was microseconds).


  • Fixed a crash that could occur when reading counter data via PVRScopeReadCounters API.
  • PVRScope now sends CPU time stamps with nanosecond precision (was microseconds).