PowerVR Tools and SDK 2019 Release 2

SDK v5.4

  • Added MoltenVK implementation. The Vulkan part of the PowerVR SDK can now work on macOS.
  • Updated the Android build tools to 29, Gradle wrapper to 5.1 and the Android Gradle plugin to 3.5.
  • Updated the CMake version used in Android builds to 3.10.2 so that newer toolchains are supported. The Android SDK ships with 3.6 and 3.10.2 so no additional steps are required.
  • Simplified dependencies of Android Gradle projects, optimising parallelism.
  • Increased the Java virtual machine’s memory usage for Gradle.
  • Greatly improved the use of CMake. The modularisation of the SDK should now be enhanced and writing examples using the SDK should be even easier and cleaner now, as should be adding and removing examples. This is done by using a target-centric CMake approach to the assets and resources management, resulting in a ~30-50% reduction in the size of the CMakeLists.txt of each example.
  • Upgraded the command line options of CMake to use the naming convention PVR_XXXXXX. The old variables are still working.
  • Updated external project MoodyCamel::Concurrent Queue to latest version. The updated version provides a timeout API, allowing us to remove some modifications we had performed. This allows blocking calls to return on a queue marked for deletion.
  • Small overhaul of PVRShell/StateMachine and the application lifecycle. This will affect Android most of all. The state machine can now handle the back-and-forth of the various Android state changes (such as screen on/off, destroy events, and so on) more gracefully.
  • Allowed PVRCore to build without GLM and/or pugixml: If SDK/external/glm and/or /SDK/external/pugixml are not present, the relevant files (geometry/math utilities for GLM, xml parsing for pugixml) will not be compiled in and relevant typedefs will be defined.
  • Fixed a bug in OpenGL ES UIRenderer that could set the wrong value on winding order and depth mask, and a corresponding bug on OpenGLESDeferredShading that was not setting the depth mask when it should.
  • Updated the ImageBasedLighting examples to be in line with each other. The OpenGL ES version now uses a VBO for the sphere instance parameters, and the shader code bindings and UBO structures were brought inline to each other.
  • The constructor for AxisAlignedBoxMinMax now initialises max to the minimum floating point value and min to maximum floating point value, This means that the user can immediately start adding points to it.
  • Added conversions between AxisAlignedBox and AxisAlignedBoxMinMax.
  • Added an overload to ModelGLES which allows the user to pass a smart pointer to a Model instead of a raw object. This means ModelGLES can now manage the lifetime of the Model. Also, added flags to allow the user to specify which of VBOs/Textures should be loaded.
  • Fixed a bug in StructuredBufferView, where the copy constructor would end up with an incorrectly copied object.
  • Fixed the name of the OpenCL Utils function for loading a kernel file from disk from clutils::loadKernel to clutils::loadKernelProgram.
  • Added a pure (non-graphic) OpenCL example, OpenCLMatrixMultiplication.
  • The existing PVRVk structures pvrvk::ImageCreateInfo and pvrvk::BufferCreateInfo for creating images and buffers are now used with pvr::utils::createImage and pvr::utils::createBuffer respectively.
  • Reordered pvrvk::ImageCreateInfo parameters so that the default arguments align with more common usecases.
  • Fixed a bug in the assertion function where it would not output the custom assert message.
  • Fixed a bug in StructuredBufferView where the copy constructor would end up with an incorrectly copied object.
  • Changed the usage of log.txt as originally the file was continuously opened and closed, causing performance losses.
  • Retired the AssetReader and AssetWriter interfaces and replaced them with functions. Most usages of stream function pointers have now been replaced with simple references. Reading and writing files should now be considerably more concise.
  • Greatly simplified the interface of the Stream class, ensuring opening on construction and closing on destruction.
  • MinGW support : A number of changes have been made that should now account for MinGW being used as a generator for Windows.
  • Added a readme file to IBL map generator.
  • Completed a revamp of the synchronisation used in VulkanParticleSystem based on latest synchronisation findings. This has resulted in both correct and optimal usage of a GPU accelerated particle system integrated in a traditional graphics application.
  • Added overloads for fractional times in the pvr::Time class.
  • Made all Time::getTimeXXX functions constant.
  • Made a number of changes to the .clang-format file.
  • Removed unused uniforms for metallic/roughness when textures are used for them in the OpenGL ES version of the ImageBasedLighting example.
  • Removed wrong dependency from PVRVk to PVRCore.
  • Added touch screen support for non-window system (NullWS) Linux platforms.

PVRShaderEditor v2.13.0

  • Fixed a bug where “Worst” performance estimates were not being calculated correctly.

PVRTexTool v4.23.0

  • Fixed a bug where functions were not being exported in Windows DLL.
  • Fixed a bug where KTX files would be generated with incorrect capitalisation of “KTXorientation” key.
  • Enabled DXT support on Linux and OSX.

PVRVFrame v10.11.0

  • Added support for EGL_KHR_wait_sync.
  • Fixed a bug in eglTerminate() where contexts and surfaces were being incorrectly destroyed while they were still bound to a thread.

PVRTune Developer v14.148

  • Added a command-line option to override the default Comms Buffer Size, for example, –CommsBufSize=3145728.
  • If there an unexpected disconnect, such as the packet buffer becoming full, PVRTune now pops up a dialog box offering automatic reconnection after 10 seconds or a cancel button.
  • When clicking on a point on the timeline where there are multiple marks together, PVRTune will now show them all rather than just the ‘first’ one.


  • A GPU string is now placed into the GPU folder name.
  • The CPU per-core counters have been moved into a subfolder. The CPU core name now shows in the Counter Table, and in the Monitor tooltips.
  • Fixed formatting on CPU description strings.
  • Moved the per-PID counters into a GPU specific subfolder.

PVRTune Complete v14.148

  • Added support for detailed Vulkan client stream information:
    • Vulkan tasks that are part of a frame are now grouped correctly with the corresponding HW tasks.
    • TA, 3D, Compute & TQ HW tasks will now display the appropriate Vulkan client stream information, this includes renderpass, compute pipeline and the source / destination buffer/image details respectively.
    • Capture SPIR-V shaders and cross-compile into human-readable GLSL to allow for inspection.
    • Vulkan object creation information for the following is displayed on the timeline:
      • VkPipeline (Graphics & Compute)
      • VkRenderPass
      • VkPipelineLayout
      • VkFramebuffer
      • VkImageView
      • VkImage
      • VkSampler
      • VkDescriptorSetLayout
      • VkDescriptorSet
      • VkShaderModule
      • VkCommandBuffer
      • VkBuffer
    • The following Vulkan commands now contain detailed information regarding the current pipeline state:
      • vkBeginCommandBuffer
      • vkEndCommandBuffer
      • vkCmdBeginRenderPass
      • vkCmdEndRenderPass
      • vkCmdBindPipeline (Graphics & Compute)
      • vkCmdBindDescriptorSets
      • vkCmdDraw
      • vkCmdDrawIndexed
      • vkCmdDrawIndirect
      • vkCmdDrawIndexedIndirect
      • vkCmdDrawIndirectCountKHR
      • vkCmdDispatch
      • vkCmdExecuteCommands
      • vkCmdCopyBuffer
      • vkCmdCopyImage
      • vkCmdBlitImage
      • vkCmdCopyBufferToImage
      • vkCmdCopyImageToBuffer
      • vkQueueSubmit
  • Added support for capturing default framebuffer and off-screen intermediate buffers from a GLES3 application. If PVRTune is connected to a compatible device then a framebuffer capture can be requested from a running GLES3 application via the new “Resource Viewer” widget. The desired application can be selected using PID and context ID. Additionally, the type of capture can be selected from this widget, the options are “default framebuffer” or “offscreen buffers”.
  • Added the latest options to the example command line in PVRPerfServer.

Counter Group Editor:

  • The editor now shows/edits the available definitions rather than the instantiated counters.
  • Merged the two tree views into one.
  • Counters and folders can now be renamed directly.
  • When a new counter is created, it is automatically added to the group.
  • Dragging and dropping into the root item is now allowed, otherwise reorganising folders in the GUI is impossible.


  • Appended “@INSTANCESTR@” to the “Host (KM)” folder name.
  • A GPU string, BVNC, and codename are now placed into the GPU folder name.
  • The New Counter GUI now also shows tabs for System, PID and Abstract counters.
  • Counters and groups are now fully defined in the GUI.

PVRGeoPOD v2.27

  • Blender v2.27 plugin: Removed scene.update() which is not supported in Blender 2.80.

PVRTrace v3.13

  • Fixed a crash that could occur if the recording contained glSamplerParameter*v.

PVRCarbon v0.4

  • Updated Vulkan to version 1.1.116.
  • Moved the Vulkan PVRTC/ETC decompression out of the player and into a layer (VK_LAYER_POWERVR_format_emulation) that can be used with any application.


  • Fixed a bug where the current frame would not be updated correctly in the export dialogs.
  • Added support to the remote recorder for Android 10.
  • Fixed an issue where the remote recorder was not able to remotely kill an application on non-rooted devices.
  • eglGetCurrentSurface will now correctly show EGL_READ/EGL_DRAW instead of their enum values.
  • The package list of remote recorder now supports filtering the list and launching the packages with command-line options.
  • Extended the remote recorder options to include the majority of the recorder options.
  • Fixed highlighting of EGL and GL in the current call widget.
  • The properties dialog now mentions the ‘frames’ config option.
  • Export to code dialog now allows the user to define the name and package name of the output.
  • Added support for Android makefiles to the c++ exporter.

Command-Line Interface:

  • Added support for Android makefiles to the c++ exporter.


  • Implemented VK_KHR_descriptor_update_template support.
  • If eglCreateContext fails with bad config because EGL_KHR_no_config_context is not supported, it will now tell the user.
  • Added EGL support for Wayland.
  • Fixed playback of eglSwapInterval.
  • Updated the Android version to use adaptive icons.
  • Added the command-line option: –large-data-memory-hint. This provides a hint to the Player on how much ‘large’ data (for example buffers and textures) should be resident in memory.
  • Fixed an issue where some calls would not be loaded if a multi-threaded application died part way through writing to file.
  • Added experimental support for multiple windows, meaning the option -w does not need to be specified when playing back.
    • Note: Though all windows can now be rendered they may not be rendered in their original layout/position/format.
  • Added the –preload command-line option that preloads the Carbon file fully into memory before playing back.
  • Offscreen rendering for OpenGL ES now uses framebuffer objects.
  • Saved TGAs are no longer flipped for OpenGL ES 2.x contexts.
  • RGB and RGBA formats are converted to BGR and BGRA.
  • Added playback support for GL_EXT_separate_shader_objects.
  • Fixed the usage description on Android so it shows the correct am start command for execution.
  • On Android if the Player now fails to create an instance with VK_ERROR_LAYER_NOT_PRESENT, it will inform the user to correct their debug.vulkan.layers property.
  • The -w option now works for Vulkan.
  • Implemented EGL_ANDROID_presentation_time playback.
  • eglSwapBuffersWithDamage falls back to eglSwapBuffers if the extension is not available during playback.
  • Draws using client vertex buffers and non-client index buffers now record and play back correctly.
  • eglSwapBuffersWithDamage calls will play back as eglSwapBuffers calls on non-window surfaces to prevent crashing on Android.


  • Implemented VK_KHR_descriptor_update_template support.
  • When disabling ASTC, BC, and ETC2 texture support for Vulkan, vkGetPhysicalDeviceFormatProperties is now overridden to return 0 for any affected formats.
  • Added the ability to flush at the end of frames.
  • OpenGL ES framebuffer capturing now handles sRGB framebuffers correctly.
  • Coherent buffer changes are now flushed on post-OpenGL ES 2.0 draw calls and compute dispatches.
  • Fixed bug with glGetBufferPointerv where incorrect pointer was returned for coherently mapped buffers.
  • OpenGL ES draw calls using client vertex arrays together with non-client index buffers now record correctly.
  • Fixed crashing during SIGTERM handling on Android.
  • OpenGL ES uniform locations for uniform array indices greater than 0 are now recorded at program link time. This allows the Player to load uniform arrays starting from an index greater than 0.
  • Fixed incorrect data being recorded for coherent buffer updates.
  • Recorder: Fixed the recording of multiple frame ranges.

C++ Exporter:

  • eglInitialize/eglTerminate are now reference counted by default to emulate the behaviour of Android.
  • Fixed an issue in the Windows platform implementation where the native display type was not consistent.
  • Fixed an issue where the name of the first exEGL_ANDROID_presentation_timeported variable would conflict with Vulkan namespace create_surface.
  • The exported code now supports Wayland.
  • Some filtering will now be performed on the EGL_RENDERABLE_TYPE and EGL_SURFACE_TYPE config attributes to increase portability of exported code.
  • Fixed exporting glProgramUniform* calls when location is 0.
  • Exported files now all end in a new line.
  • Fixed a crash that could occur when processing vkAllocateDescriptorSets calls.
  • Added support for Android makefiles.