PowerVR Tools and SDK 2021 Release 1


  • Added support for the Khronos Vulkan Ray Tracing extension. Adding new Ray Tracing examples: Hello Ray Tracing, Hybrid Hard Shadows, Hybrid Soft Shadows, and Hybrid Reflections (currently only compatible with RT ready desktops and laptops, running windows or linux, that support Vulkan version
  • Updated Vulkan version to, glslang version to 11.2 and included the glslang validator binaries in the PowerVR Native SDK repository.
  • Updated build instructions: added the instructions for the correct usage of MoltenVK on macOS and Wayland. Also added a notice that PVRFrame (and OpenGLES examples) aren’t supported on macOS/iOS due to Apple’s deprecation of OpenGL.
  • Vulkan and OpenGLES PostProcessing examples: fixed a bug where the exposure uniform wasn’t found resulting in no blur being applied to the final render, also moved exposure calculations (including log2 and exp2 instructions) to the CPU for model/skybox rendering.
  • Capped XCB width/height to the size of the X surface (Tested on linux X11 platform) in the Vulkan HelloApi example to mirror the behaviour of PVRShell on linux.
  • Fixed an bug in OpenGL ES Image Based Lighting shader compilation that would throw errors on retail PowerVR devices.

PVRCarbon v0.7

  • Added support for recording and playing back VK_KHR_ray_tracing_pipeline.
  • Added support for recording and playing back VK_KHR_acceleration_structure.
  • Added support for recording and playing back OpenCL applications.
  • Update PVRCarbon Vulkan support to Vulkan version 1.2.170.
  • Fixed a regression that stopped PVRCarbon opening large .pvrcbn files on Windows.
  • A warning will now be output during file loading if the file is from a newer version of PVRCarbon.
  • On Windows, when the PVRCarbon console output is redirected to file, it should now be UTF-8.


  • Added a preference option to configure the frame delimiters used on file load. By default, the setting is set to ask the user on load.
  • Updated the ImageViewer used for Renders and Recorded Framebuffers to be the same as the one used for Analysis.
  • The remote recorder’s intent select page now has a filter and now shows all the intent information in a tooltip if hovered on.
  • The remote recorder now allows you to enable/disable APIs for capture.
  • The remote recorder utilises Android 10+ functionality to set up PVRCarbon for recording, if available. It now deploys an Android OpenGL ES layer to go with the Vulkan layer, and sets them up using Android settings instead of the Java debugger and library hooks for more robustness.


  • The API validation setup for OpenGL ES now correctly handles the situation where EGL_CONTEXT_FLAGS_KHR already exists in the create context’s attribute list.
  • Added cross-API native buffer tracking and recording. Can be configured to balance performance and recording size with an option to change the buffer sampling frequency and whether buffer content is written only on change.
  • Increased the minSdkVersion for the Android recording libraries to 26.
  • Fixed a possible crash that could occur when recording VkDescriptorSetLayoutBinding structures and pImmutableSamplers was not null for non-sampler descriptor types.
  • Fixed a crash that could occur if an application called the VK_EXT_debug_marker extension functions without enabling the extension.
  • Fixed a crash that could occur for some applications when determining the best default output directory for pvrcbn files on Android.
  • Fixed an INVALID_ENUM error that could occur during recording if the platform doesn’t support GL_VERTEX_ATTRIB_ARRAY_DIVISOR.
  • Added an Android OpenGL ES recording layer. This can be used on Android 10 onwards instead of the driver replacement libraries that are installed by the PVRCarbonInstaller.sh script. This is the recommended and safest way to perform standalone/system recordings on Android 10+. PVRCarbonInstaller.sh should be used on legacy Android versions only.
  • Added tracking for GL_IMG_multisampled_render_to_texture when not recording from frame 0.
  • Fixed an issue where the tracked internal format for generated mipmap levels may become invalid when not recording from frame 0.

C++ Exporter:

  • Added exports of NvOptimusEnablement and AmdPowerXpressRequestHighPerformance to the exported Windows code so that the best GPU is chosen.
  • When exporting, we now optimise out the creation of any EGLConfigs that aren’t referenced.
  • Fixed a bug where glReadPixels could be exported that tried to read into a buffer of zero size.
  • Added support for exporting OpenCL recordings.
  • Large exported frame functions will now be split up to reduce their stack usage.
  • Optimised the code generated  for arrays of Vulkan handles that only contain a single value.
  • Fixed a race condition that could occur between waking the next thread and pausing the current in exported multi-threaded code.
  • Multi-threaded exported code will now wait until all the threads are setup before starting.
  • Exported code now requires C++14.
  • Vulkan’s create_surface now prioritises platform surface extensions over VK_KHR_DISPLAY.
  • Line endings of exported files are now consistent.
  • Fixed an error that can occur during exporting if the OpenGL ES application enables a vertex attribute array but never defines it.
  • Increased minImageCount when exporting vkCreateSwapchainKHR if it is smaller than the number of swapchain images created at record time to ensure the swapchain is created with the correct number of images used in the application.
  • Vulkan objects that have the same value at record time now get their own variable names during export.
  • vkGetPhysicalDeviceSurfaceSupportKHR is now exported as the validation layers expect it to be called.


  • Implemented missing GL_IMG_multisampled_render_to_texture playback functions.
  • Added command-line option --capture-frames-path= that allows the user to define the output directory of captured screenshots. The output path defaults to /sdcard/ on Android, and the working directory on all other platforms.
  • Added a safety check for GL_EXT_debug_marker functions so they aren’t played back if the platform doesn’t support them.
  • Added command-line option --mode to place the player in a particular mode. Currently the only mode supported is “profile” which will enable several features to reduce I/O stalls when profiling the player.
  • Added native buffer playback on Android and NullWS.
  • Increased the minSdkVersion for the Android player to 26.
  • Improved the playback of Vulkan recordings where the player acquires swapchain images in a different order than recorded.
  • Fixed playback of vkEnumeratePhysicalDeviceGroups which was incorrectly using vkEnumeratePhysicalDeviceGroupsKHR.
  • vkBind*Memory2 functions now better take into account playback and recorded device differences.
  • Window system being used is now printed when not rendering off-screen.
  • If eglCreateWindowSurface fails with BAD_ALLOC, a message informing the user of a possible fix is now printed when running on nullWS
  • Calls that fail during playback that failed at record time are now logged as INFORMATION rather than ERROR.
  • When mapping recorded PhysicalDevices to playback PhysicalDevices, discrete GPUs are now favoured over others.
  • Fixed a bug where the RenderDoc command-line options were order-sensitive.
  • Appends the RenderDoc .dll/.so filename if not found by --renderdoc-path.
  • Implemented playback of eglCreatePlatformWindowSurface and eglCreatePlatformWindowSurfaceEXT.
  • Implemented playback of eglGetPlatformDisplay and eglGetPlatformDisplayEXT.
  • Improved PlatformManager‘s error messages to make it clearer that they don’t refer to EGLDisplay during playback when you have limited context.
  • Implemented option --display so you can choose the display to output to on NullWS.
  • eglCreateWindowSurface playback now filters out EGL_GL_COLORSPACE_KHR from the attribute list if EGL_KHR_gl_colorspace is unsupported.
  • If eglCreateWindowSurface fails with EGL_BAD_NATIVE_WINDOW, we now print out a message informing the user they may need to use ‘--ws‘ to specify the window system to use.
  • Added new options --landscape and --portrait to force the orientation of the screen on platforms that support it (currently only Android).

PVRTexTool v5.1.0

  • Add support for .basis files. .basis files can now be loaded and saved with the PVRTexTool UI, CLI, C API, and Python wrapper. Note that saving textures to a .basis file is only supported when the texture format is Basis Universal.


  • Add a new view mode, ‘Cube Net’, to the image viewer. The cube net view mode allows visualisation of a 3D cube in 2D space, in the form of a single 2D image that comprises all cube faces in the cubemap. The faces are laid out as follows:
    pvrtextool cube net
  • Add ‘New Texture From Current’ (CTRL+ALT+N) option to the UI. This allows the creation of a new texture from the image (current mipmap level, face, etc.) currently visible in the viewer.
  • Allow copy and pasting of user selected cells in the error metrics table.
  • Fix a bug in the Error Metrics table where the RMSE values were being placed in the standard deviation row and vice versa.
  • When in the diff view and hovering over a texel, the UI will now display the left and right texel values as well as the delta (right – left) value.
  • When in diff view channel, masking no longer applies to the central image view when the mode is set to ‘Tolerance’.
  • Fixed an issue with channel masking where in some cases, the wrong channel data was being displayed by the image viewer.
  • Improved how textures with different channel orders are handled in the diff view with respect to channel masking.
  • Synchronise mouse movement (scrolling) between image views when in diff mode.
  • Fixed an issue where the grid would be unavailable in the diff viewer.
  • Added maximum thread controls ‘Jobs’ to Encode dialog window; uses all available cores by default.
  • Fixed an issue in the image viewer where the UI only permitted mouse scrolling in one direction when trying to scroll through texture Z slices (CTRL+ALT) and array surfaces (ALT).
  • The ‘New Texture’ dialog now allows the user to set the texture depth, the channel type, and the channel names and order (e.g. RGBA); additionally the maximum number of mipmap levels are updated as the user configures the texture dimensions.
  • Exposed a new ‘Create IBL Environment Map’ option in the GUI (File->Create IBL Environment Map) which allows generating diffuse and/or specular IBL maps.
  • Added more image view tab options:
    • Close All Left of Current
    • Close All Right of Current
  • Added “Reset” function – behaves like old “Reload” function, which restores texture data from a clean copy held in memory. “Reload” now loads a clean copy from the file stored on disk.


  • Add new optional arg -j (jobs) which allows users to specify the maximum number of threads to use for transcoding; use all available cores by default.
  • Add new command line options to enable generating IBL environment maps from cubemaps:
    • -ibldiffuse [samples, dimensions]
    • -iblspecular [samples, dimensions, levels to discard]
    • -irz (‘Include Roughness Zero’)


  • Added support for loading and saving Basis UASTC compressed textures from/to KTX2.
  • Fixed .pvr & .ktx2 file loading and saving for basis universal encoded 3D textures.
  • Fixed an issue where decompression of 3D textures compressed with basis universal formats could fail or produce incorrect results.
  • Added support for user configuration of the maximum number of threads used for transcoding.
  • Fixed a race condition that could lead to a deadlock.
  • Fixed an issue with loading/saving KTX files for BC4 & BC5 texture formats.
  • Fixed an issue where the KTX orientation meta data was not being written out correctly.
  • Added support for ‘PVRTC HDR’. This enables encoding HDR texture data into PVRTC compressed textures. Two modes are currently supported: 6bpp and 8bpp; the 6bpp comprises of a 4bpp luma texture and 2bpp chroma texture, while the 8bpp comprises of a 4bpp luma texture and 4bpp chroma texture.
  • Added support for generating diffuse irradiance and prefiltered specular environment maps from a cubemap texture. New APIs methods are PVRTexLib_GenerateDiffuseIrradianceCubeMap() and PVRTexLib_GeneratePreFilteredSpecularCubeMap()

PVRVFrame v10.14.0

  • Fixed the pixel buffer size check for pixel operations on packed formats.
  • glBindSampler now returns GL_INVALID_VALUE if the texture unit index is greater than the current profile’s GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS value.
  • Host profile GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS is no longer capped at 32.
  • GL_OES_vertex_array_object is now only added to the extension string if it can be emulated.
  • Fixed a bug where calling glGetFramebufferAttachmentParameteriv on an attachment created with glFramebufferTexture2DMultisample* could return an invalid enum.

PVRTune v14.151


  • New Guided Analysis feature (File → Start Guided Analysis). Highlights potential bottlenecks in a recorded session.
  • If the command-line is unable to read the input file, some output is printed along with an error code instead of exiting randomly.
  • Fixed a bug in which some HW counters were reading 0.
  • Fixed a bug in the counter table where view invalidations and redraws would sometimes be missing.
  • Fixed a bug in the counter table that could result in constant redraw and flickering in the “Frame” column.
  • Added Export Counters to CSV option (--export-csv-counters for command-line) that writes extra rows to the end of the CSV file output that gives the mean, variance, and standard deviation for each counter.
  • Added WASD controls.
  • Increased scroll bar “single step” size from 1 pixel to 5% of the view (minimum value 1).
  • Fixed a bug when using the “View/Split Window Layout” option in graph views where cursor keys did nothing when a task is selected; now changes which task is selected.
  • Added a “Configure” button to graph panes next to the close button.
  • Added an option for the time ruler to be drawn in a “chart”-like style for graph panes.
  • The “Zoom” value is now “Zoom exponent”, allowing for zooming in and out further.
  • Preferences window now has a vertical scroll bar, allowing for smaller sizes.
  • “Hide disabled” in Counter Tables is now set to off by default.
  • No longer stores counter settings in plist if they’re on by default.
  • Fixed excessive storage of yaxis/colour information in plist. Now only saves values that are non-default.
  • Custom counter colours are no longer restored to “Previously used” after use.
  • When the Properties is showing a counter, it now polls on the counter state revision and updates itself any time something else changes a counter (such as the y-axis value, the colour, or edits to the counter or groups).
  • View column can now be hidden from the Counter Table.
  • New command-line option: --default-clockspeed-hz={100000000}. Sets clock speed used to display data if the clock speed is unknown.
  • Fixed an issue where the ‘initial directory’ for future file dialogs was set to the previous sessions/use rather than the directory for an opened .pvrtune file.

PVRTuneComplete :

  • Added a workaround for being unable to use FW Custom Counters on DDK 1.11 and older.
  • Added more default counters for Volcanic.
  • Fixed an issue where the per-PID “System memory load” counter was only enabled for a single HWConfig and group.
  • Improvements to OpenGL ES multi-context tracking.

PVRTuneComplete GUI :

  • Default built-in counters will now be loaded in automatically when there is no existing config file.
  • Items in the Monitor docking window are now editable, along with counters and groups.
  • Fixed a bug where some counters that were in the existing group would not be in the new group when cloning counter groups.
  • CSV Timing Data export now puts each counter reading into a new column for whatever HW counter source it’s reading (rather than effectively left-justifying them). Adds a new row at the end naming each counter reading column.
  • Support loading GLES & Vulkan driver-generated shader analysis XML files. The shader analysis data includes compiler statistics, recompile reasons, trigger/operation, dis-assembly, uniflex, register allocation data, etc.. This data will be presented in the properties window after selecting an event where shaders are used such as a HW task.
  • Show SPIR-V disassembly for Vulkan shaders in addition to the existing (cross-compiled) GLSL.
  • Remapped the task grouping keyboard shortcuts to the number keys 1-5.
  • Added support for shader invocation count data. When enabled, the driver will track the number of invocations per shader, per HW kick. Visualisation of this data can be seen by clicking on ‘Shader Invocation Stats’ in the properties window after selecting the desired HW task.
  • Updated backwards compatibility.
  • Properties window now shows the task duration in clock cycles too.
  • New command-line option --export-csv-tasktiming filename (*.csv), and matching GUI option “File\Export\Export task timing data to CSV…”. Generates a CSV file containing a row per task.


  • New command-line option --ClientShaderInvocCount={0,1}. Allows users to enable the shader invocation count feature from the CLI.


  • Changed MacOS Profiling Compilers to 64-bit.
  • Updated glslangValidator to revision a36d91e5.
  • Updated Rogue GLSL ES Compiler version.
  • Removed Series5 and Series5XT compilers for MacOS.


  • New collection of Vulkan layers: PVRRayTracingSimulation. Simulates ray tracing PowerVR hardware.