PowerVR Tools and SDK 2021 Release 2


  • Updated SDK version to match GitHub release tags.
  • Removed VK_LAYER_ARM_mali_perf_doc from the framework, as the validation layer features has same functionality. Kept IMG_PERF_DOC for Imagination-specific best practices validation.
  • Added new assets: Saloon POD scene and textures.
  • Fixed OpenGL ES Image Based Lighting shader compile error on retail PowerVR devices.


  • Added new Vulkan Ray Tracing Example: Hybrid Ray-Traced Refractions. It ray traces two dielectric torus meshes, including all the interactions between each of them and the rest of the scene elements and the environment, and rasterizes the remaining three scene elements which have a diffuse Phong shading.
  • Added new Vulkan Ray Tracing Example: Fully RayTraced Hard Shadows.
  • Added new Vulkan Example: Ambient Occlusion.
  • Replaced VK_LAYER_ARM_mali_perf_doc with VK_VALIDATION_FEATURE_ENABLE_BEST_PRACTICES_EXT in VulkanHelloAPI, VulkanIntroducingPVRShell, and VulkanIntroducingPVRVK.

PVRCarbon v0.8

  • Updated PVRCarbon Vulkan support to version 1.2.198.
  • Fixed packing of hard float builds so they go to Linux_armv7hf instead of Linux_armv7.
  • Changed Windows PVRCarbon’s console output to not write to file as UTF-16.


  • Added support for deploying the Player server to Android and remote Linux devices.
  • Added support for capturing applications on the localhost and remote Linux devices.
  • The option to export recorded framebuffers will now be greyed out if there are no framebuffers to export.
  • Fixed an issue in the Frame Analysis UI where selecting a task may highlight multiple tasks.
  • Added option to the Remote Recorder to control which process from an Android application to record.
  • Fixed the check state for the currently selected Android Intent in the Remote Recorder.
  • Improved the error message shown when Android remote recording fails to set “enable_gpu_debug_layers” due to a lack of permissions; now informs the user to “Disable permission monitoring” in the Developer Options if supported by the device.


  • Fixed a logic error that stopped the state tracking being enabled for multiple range recordings if the first range started at 0.
  • Fixed the SONAME of the non-versioned recording libraries so they work with older non-versioned implementations.
  • Added /usr/local/lib/* paths as possible locations to find the host drivers if the user hasn’t specified them.
  • Fixed a crash that could occur during recording when framebuffer capture was enabled.
  • Added the ability to define repeating frame ranges when recording. The frames option now supports ‘…’ which will repeat the previous range as many times as needed e.g. “0-9,…” will be the equivalent of defining “0-9,10-19,20-29” etc. An offset can also be defined by placing a number before ‘…’ e.g. “0-9,15…” will be the equivalent to “0-9,15-24,30-39”.
  • The frames option is now stricter and requires that defined ranges don’t overlap and are defined in ascending order.
  • The modulus frames option (e.g. %12) has been removed. The same functionality can be achieved with “0,n…”.
  • Added tracking for GL_IMG_multisampled_render_to_texture when not recording from frame 0.
  • Fixed an issue where when not recording from frame 0 the tracked internal format for generated mipmap levels may become invalid.
  • Improved forward compatibility support for unrecognised Vulkan-typed structures.

C++ Exporter:

  • For portability reasons, we now strip out EGL_ANDROID_get_frame_timestamps calls from exported code.
  • Fixed exported VkClearColorValues not correctly handling NaN and infinity values.
  • Fixed a crash that could occur when exporting a gl call and there is no current context. The exporter will now display an error and skip any gl calls with no current context.
  • Fixed a bug where VkSpecializationInfo pData would go out of scope before it had been used for pipeline creation.
  • Fixed the case of the exported EGLuint64KHR variables.
  • Added simple Vulkan return code checking. This feature can be disabled by setting the cmake option ASSERT_ON_VK_ERROR to OFF.
  • Added simple EGL error checking. This feature can be disabled by setting the cmake option ASSERT_ON_EGL_ERROR to OFF.
  • Added simple OpenGL ES error checking. This feature can be disabled by setting the cmake option ASSERT_ON_GL_ERROR to OFF.
  • Added simple OpenCL return error code checking. This feature can be disabled by setting the cmake option ASSERT_ON_CL_ERROR to OFF.
  • Updated dynamic.cpp for both OpenGL ES and EGL to use ‘using’ for defining their function pointers.
  • Android release builds will now use the debug keystore for signing if the user does not define one. This allows the user to easily create release APK files for testing.
  • The exported code now contains cmake toolchain files (cmake/toolchains) for cross-compiling on Linux for armv7, armv7hf, armv8, x86_32, and x86_64.
  • Fixed a scenario where a filename with numbers after the full stops could generate an invalid default Android package name.
  • If available, clang builds will now use the LLD Linker.
  • When exporting vkCreateSwapchainKHR we now increase minImageCount if it happens to be smaller than the number of swapchain images created at record time. This ensures the swapchain is created with the correct number of images used by 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.
  • Fixed the generated code for VkPipelineCacheCreateInfo when pInitialData is not null.


  • The player now adjusts a VkSwapchain minImageCount during playback creation so it falls in the range reported by vkGetPhysicalDeviceSurfaceCapabilitiesKHR.
  • Playback of Vulkan debug marker/util functions will now produce a playback warning if they fail to find the object handle.
  • Fixed a rare issue where we would delete a call object before we had played it. This issue would result in a crash.
  • Add new option --exit-after-frame which will stop the player after the specified frame.
  • Updated the --help for the Linux RenderDoc capture options to explain how to setup for OpenGL ES.
  • The player will now show a warning if the recorded GL version of a context is higher than the playback contexts.
  • If rendering offscreen, we no longer attempt to replace recorded platform surface extensions in VkInstanceCreateInfo::ppEnabledExtensionNames with a supported equivalent. As a result of this, we also filter out any extensions that depend on VK_KHR_surface when rendering offscreen.
  • If rendering offscreen, the window system being used is now printed out.
  • If we replace VK_KHR_Display in VkInstanceCreateInfo::ppEnabledExtensionNames with another platform surface extension we now also filter out any other extensions that depend on it.
  • Fixed a potential crash that could occur when trying to emulate Vulkan 1.1 features with their Vulkan 1.0 extension equivalents.
  • We now filter out any extensions from VkDeviceCreateInfo::ppEnabledExtensionNames if their dependencies weren’t present in VkInstanceCreateInfo::ppEnabledExtensionNames.
  • Native Windows are now destroyed when the EGLSurface/VkSurfaceKHR that use them are destroyed.
  • Changed the SurfaceView used for the playback windows to be Opaque.
  • Android now creates a SurfaceView for each recorded native window at the recorded dimensions. Previously, the first native window created would use the app glue’s fullscreen window.
  • When running on nullws, we now print out a helpful message if eglCreateWindowSurface fails with BAD_ALLOC that informs the user of a possible fix.
  • Calls that fail during playback that failed at record time are now logged as INFORMATION instead of ERRORs.
  • When mapping recorded PhysicalDevices to playback PhysicalDevices, we now favour discrete GPUs over any other.
  • Created common getNativeWindow and createOffscreenWindowSurface functions in egl::playback::Display to be used by the various create window surface calls.
  • Fixed a bug where the order of the RenderDoc command-line options mattered. They can now be defined in any order.
  • If --renderdoc-path doesn’t include RenderDoc’s .dll/.so filename we now append it.
  • Implemented playback of eglCreatePlatformWindowSurface and eglCreatePlatformWindowSurfaceEXT.
  • Implemented playback of eglGetPlatformDisplay and eglGetPlatformDisplayEXT.
  • Created common getNativeWindow and createOffscreenWindowSurface functions in egl::playback::Display to be used by the various create window surface calls.
  • Improved PlatformManager’s error messages to make it clearer that they don’t refer to EGLDisplays during playback when you have limited context.
  • 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 option --display so you can choose the display to output to on NullWS.
  • Added options --landscape--portrait to force the orientation of the screen on platforms that support it (currently only Android).
  • Added option --capture-frames-format to specify the format used for captured frames. Currently supported formats are png (default) and tga.
  • Added “all” as a supported value for option --log-level to enable all levels.

PVRTexTool v5.2.0


  • Added support for users to search for a compressed pixel format in the ‘Wrap Raw Data’ dialog.
  • Added support for the cubemap view scene camera’s direction of movement in the X and Y axes to be inverted (independently) by the user, using the new ‘Mouse Control’ options in the ‘View’ menu.
  • Added support for a rectangular grid, the user may now set the width and height of the grid independently.
  • Added a new thumbnail preview system that will display a small preview of the image(s) when the mouse cursor is hovering over a image view tab. There are three preview mode settings, accessible via View -> Tab Preview; ‘None’ disables all previews; ‘Single’ previews the tab that the mouse cursor is currently hovering; and ‘Multi’ previews all open tabs in a scrollable list. Pressing CTRL will keep the preview list open even when the mouse has moved away from the tab. The current tab may be changed by left clicking a preview in the list. Press CTRL again when done to hide the preview list.
  • Added more image view tab closing options:
    • Close All Unmodified – closes any tabs where the texture has not been modified since last saved;
    • Close All but Current – closes all tabs except the currently active tab;
    • Close All Left of Current – closes all tabs to the left of the currently active tab;
    • Close All Right of Current – closes all tabs to the right of the currently active tab.
  • Added a new “Reset” function, which behaves similar to the old “Reload” functionality which restores texture data from a clean copy held in memory; “Reload” now loads a clean copy of the file stored on disk.


  • Fixed the format (-f) option not correctly recognising ‘d‘ (depth) and ‘s‘ (stencil) as valid channel names.



  • Added a setup.py script which allows users to install the PVRTexLibPy Python module on their system. To use, run ‘python setup.py’. Can be uninstalled with python -m pip uninstall PVRTexLibPy.

PVRVFrame v10.15.0

  • When converting glsl es shaders to glsl we now strip out “#extension GL_EXT_texture_buffer" directives.
  • glPopGroupMarker will no longer error if there isn’t something to pop.
    Fixed GL_EXT_buffer_storage emulation so it no longer exposes glNamedBufferStorageEXT. This function should only be exposed if GL_EXT_direct_state_access is supported (which it isn’t).
  • Fixed the GL_SHADING_LANGUAGE_VERSION string so it has a space between the version and the vendor specific information.
    Fixed a bug in glIsVertexArray where it could return GL_TRUE if the name is 0.
  • Fixed a crash on Linux that would occur if GLX_EXT_framebuffer_sRGB was not supported.
  • Fixed a bug where glGetTexParameter would incorrectly return invalid enum if the target was GL_TEXTURE_CUBE_MAP_ARRAY.
  • Fixed the EGL_VERSION string so it fits the format described in the egl spec.
    eglQueryString now works with EGL_NO_DISPLAY and EGL_VERSION to return the client version.
  • 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.
    The host profile’s 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 invalid enum.

PVRTune v14.152

  • Added support for global/system-wide CPU HW counters. Add global CPU HW counters to PVRTune’s default built-in counters under ‘/System/CPU Performance Events’.
  • Fixed issue DTEC-1826 where Nexus Player GPU was not being recognised.
  • Added support for Volcanic ray tracing HW counters.


  • Removed legacy checkbox from Preferences dialog: “Draw Marks across all timelines”.
  • Moved “Global” Marks, e.g. when the user presses ‘m’ in PVRPerfServer console, because modern PVRTune can display too much data to have PVRPerfServer Marks covering the entire view. They now go into their own PVRPerfServer timeline, which is hidden by default and appears when a Mark is first received (or can be enabled via the Timelines docking window). Also fixed an issue where the string for these did not appear during mouse hover (it only showed in the Properties docking window).
  • Fixed issue DTEC-1578, where PVRTune selection history was not properly recalling selected Marks.
  • Add new per-CPU core Perf Events counters to PVRTune’s default counters.
  • Improved the following connection screen elements:
    • Merged “broadcasting” and “shortcuts” server list.
    • Added an entry for the “current” connection, with a close cross. Show a LoadingSpinner while connecting to a server.
    • Removed the “Cancel” button; there is now a cancel button on the “Current” server entry in the list.
    • Remove the connecting animation; we have the progress spinner now.
    • No longer disabled while connected; it was already possible to conect to a new server (using the Menu) before disconnecting, so now it’s allowed here too. (Improve behaviour when “Hide unnecessary tabs” is disabled).
  • Implemented feature DTEC-1794, which adds diff capabilities across Graphs.
  • Implemented feature DTEC-2146, which adds diff capabilities across multiple PVRTune processes. The PVRTune processes can be on the same PC or different PCs (if they are on the same subnet).
  • Starting to select a time range in a graph window while a popup window is still open, no longer results in a selection that lasts until the end of time.
  • Fixed connection screen tool tip and status tip on broadcasting servers, so they once again show some information about the server.
  • “Save Image with HUD” (F10) and “Save Image” (F11) now save to the “current” directory as used in file dialogs. “Save Image To…” (Ctrl+F11) already did this automatically.
  • PVRTune now shows a busy cursor during [potentially] slow file exports.
  • Fixed issue DTEC-1780, where there were insufficient significant figures in shorthand numbers (e.g. when selecting small time ranges it’s a bit too keen to show 0.1s when it ought to use ms with more significant figures).
  • Enabled run-time choice of showing a per-graph counter list (default off).


  • Fixed issue DTEC-1927, where the PVRTune/PVRPerfServer Windows CLI was limited to ANSI paths & files.
  • Added new command line processor for PVRTune and PVRPerfServer.
    • It now respects the “–” syntax to stop processing further arguments as options.
    • It now allows a space between an option and its value, e.g. the option “--sendto=FILE” can now also be written as “--sendto FILE“. On Linux/macOS, this allows the shell do its thing: support the ~ tilde character in path/file options, and allow tab completion. (Some shells can do one or the other with the old syntax too.)
  • Fixed issue DTEC-1848, where PVRPerfServer/PVRTune CLI prevented tab-completion and ~ in paths.
  • Implemented feature “DTEC-511”, which adds a CLI help option (-h--help, and --version).

PVRTuneComplete :

  • Support shader invocation counts received from the Vulkan driver.
  • Added support for the OpenGL client stream. PVRTune can now capture and present events generated by the OpenGL driver in a similar fashion to other client API streams, GL events will be presented on their own timeline, per context.

PVRTuneComplete GUI :

  • Fixed issue DTEC-2317, so that TA OOM events now go to the Tiler or Geometry queue as appropriate. Additionally fixed an issue where these events would show up as a Mark in both the Stream and in the Queue Timeline.
  • Preferences dialog: removed those checkboxes that control the visibility of various types of Mark; they are now available more conveniently and reactively from the Graph Config pop-up.
  • The data contained in host client info process name events is now presented in the properties widget, when the user selects the mark.
  • The ‘System’ and ‘PID’ folders in the ‘Input Sources’ tab in the ‘Create New Counters’ dialog now have ‘CPU Performance Events’ sub-folders, the per-PID variants of the CPU HW counters are distinguished by a ‘PID’ prefix. Note per-PID CPU HW counters are only supported on Linux based platforms.
  • Fixed issue DTEC-1851, Added support for Alternate Geometry Processing (AGP) where 2 cores in a multicore setup will execute separate GEOM kicks.
  • Fixed issue DTEC-1524, where “Export frame timing” only has a PID column but data is now “per context per PID”.
  • Fixed issue DTEC-1953, which caused empty “Timing” data exports. This could happen if no HW counters were enabled.
  • Implemented feature DTEC-1523, allowing “Frame Timing” to also export TA etc.. “Frame Timing” exports now have three modes:
    • File/Export/Export frame timing data to CSV… --export-csv-frametiming Only the 3D core/DM is processed. Time between activities is included. Frame time on all DMs should tend to be equal. On the first, last or only frame, if e.g. TA limited, could give an artificially high FPS due to assuming 3D limited. Should very closely match the output from previous releases (21.1 and earlier). // Cores: 3D FrameGap: counted per-core output: no
    • File/Export/Export frame timing data (all cores) to CSV… --export-csv-frametiming-all As above but all DMs are processed and the highest frame time chosen, to fix the first/last/only frame issue when not 3D limited. // Cores: all FrameGap: counted per-core output: no
    • File/Export/Export frame timing data (all cores, verbose) to CSV… --export-csv-frametiming-verbose" As above, but gaps between tasks of different frames are ignored. I.e. every frame is treated as though it were a standalone PVRTune file. This also avoids the above-mentioned detail that otherwise, frame time on all DMs would tend to be equal. Stats are output per DM, plus an estimate of the limiting DM, the maximum possible FPS and minimum possible frame time. // Cores: all FrameGap: ignored per-core output: yes
  • Support loading OpenCL shader analysis XML files.
  • Fixed issue DTEC-2511, where new counter dialog showed instanced inputs. It now only shows pre-instanced inputs.


  • Added the PVRPerfServer command line options --help (alongside the existing -h) and –version. The /h alias is removed.
  • Add new --HostClientInfo CLI option – enabled by default. Enabling this option results in (client) PID & process name(s) being emitted into the HOST stream by the DDK.
  • Help output now also lists the --ClientAPIOpenGL option.
  • Fixed issue DTEC-1845, where .bin to .pvrtune file conversion loops were looking for PVRScopeServices.
  • Add a new command line option to enable OpenGL client stream events: --ClientAPIOpenGL.


  • Fixed PVRScope packet stream geometry events being filtered out.
  • Fixed issue DTEC-2216, where pplWaitForConnection() should be able to take an array of pointers.
  • PVRScopeGetCounters(): expose the full counter name, including the “folder” name. This is to distinguish e.g. the GPU FPS counter from the per-PID FPS counter.
  • Fixed issue DTEC-2465, where PVRScope instances wouldn’t attempt to reconnect after PVRPerfServer crashes or closes through kill -9 (shared memory implementation). PVRScope instances now attempt a reconnect.

PVRStudio vBeta.1.0

  • Updated branding on Welcome and Help widgets.
  • Cleaned up menu icons and removed system icons so the style is consistent.
  • Added context-menu to the toolbar so it can be configured.
  • Fixed the list of Recent Projects to show the project name in the list and the full path in the tooltip.
  • Added GLSL ES compilation. This allows validation, per-line cycles count, shader statistics and USC disassembly output for any GLSL ES shader open for edition. As-you-type and on-demand compilation.


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