Release notes
Changelog
Version 1.9.0.11
Released 17 Jun 2020
Feature | Unity3D Package Manager packages for console platforms |
Feature | Added custom memory allocator support to Renoir backends |
Feature | Added callbacks for resources lifetime in Renoir backends |
Enhancement | Improved the performance of loading font collections |
Enhancement | Reduced the repaint area when a small part of the view is changed |
Enhancement | Improved error messages when binding map-like objects with non-string keys |
Enhancement | Improved using custom SystemSettings in Unity3D |
Enhancement | Added engine.off information to the Documentation |
Enhancement | Updated support for Unity3D HDRP to the latest rendering pipeline API changes |
Fix | Text wrapping properly respects |
Fix | Query selectors and CSS selectors work with data- attributes |
Fix | Fixed crash when multiple gradient definitions are parsed in parallel |
Fix | Fixed assert on view destruction for ChakraCore platforms with multiple views and data-binding are used |
Fix | Fixed degrading performance when using hover on complex selectors |
Fix | Fixed updated layout styles depending on rem or em units when the unit changes |
Fix | Fixed flex properties that continued to be in effect after removing their CSS declarations |
Fix | Fixed loading resources with a backslash in the URL for Unity3D |
Fix | Fixed gamma-correctness for Unity3D HDRP |
Fix | Fixed handling of events by the TextInputHandler when Advance() is not called on the System |
Fix | Fixed crash caused by updating of the pointed/hovered elements after scrolling. |
API | Deprecated handled flag for input events |
Version 1.9.0.12
Released 18 Jun 2020
Feature | Support for Unreal Engine 4 4.25 |
API | This version is not compatible with versions of Unreal Engine 4 different that 4.25 |
Version 1.9.2.2
Released 14 Jul 2020
Feature | Paint rectangles can be toggled by the Inspector rendering panel |
Enhancement | Added support for percent values in SVG images |
Enhancement | Reduced per-frame allocations for transformations |
Enhancement | Extended the performance timeline of the Inspector with additional events |
Enhancement | Made the destruction of the UCohtmlWidget non-blocking in the Unreal Engine 4 plugin |
Fix | QuerySelectorAll returns elements in the correct depth-first-search order |
Fix | Fixed crash when dispatching events during document unloading |
Fix | Fixed crash when starting a XmlHTTPRequest during document unloading |
Fix | Fixed elements disappearing during scrolling |
API | Deprecated the Android builds with the gnustl standard library. They are moved to the *_gnustl folders |
Fix | Fixed lifetime of the AudioWrapper objects in the Unreal Engine 4 plugin |
Fix | Fixed the plugin unload order in the Unreal Engine 4 |
Fix | Crash when responding to XmlHTTPRequests after the plugin has been uninitialized in Unreal Engine 4 |
Version 1.9.2.4
Released 20 Jul 2020
Feature | Support for PlayStation 4 SDK 7.5 |
Version 1.9.5.4
Released 06 Aug 2020
Feature | Added line break iterator API to aid text wrapping |
Feature | Enabled saving profile from Inspector’s Performance tab |
Feature | Added support for aborting of resource requests when the view is destroyed or navigate to another page |
Feature | Update PlayStation 4 SDK to version 7.5 |
Feature | Added setting for converting property names to lower case in Unreal Engine 4 when using the automatic UType binder |
Feature | Added a special CSS property “coh-composition-id” which allows users to compose the element with a custom renderer |
Feature | Added special CSS properties “coh-custom-effect-name” along with several custom animatable parameters that allow users to apply a custom shader to the element |
Feature | Added new RendererCaps members which allow customizing the maximum allowed texture size. These new properties must be filled in the RendererBackend::FillCaps method. |
Feature | Support for Live Views in Unity3D |
Enhancement | Increased the maximum allowed paint rectangles |
Enhancement | Paint rectangles now leave a short trail |
Enhancement | Made CohtmlView and CohtmlUISystem Unity3D specific methods virtual |
Enhancement | Added customizing the Library configuration in Unity3D |
Fix | Fixed getPropertyValue for the transform CSS property |
Fix | Fixed crash when using toLocaleLowerCase on Xbox |
Fix | Fixed FInputGesture deprecated warnings in Unreal Engine 4 |
Fix | Fixed History feature minor memory retention on reload |
Fix | Fixed capital letters, spaces and special characters in Unity3D with the new Input System |
Fix | Fixed multiple views rendering and overlaying in HDRP mode for Unity3D |
Fix | Fixed crash in the CSS parser for malformed calc expressions |
Fix | Fixed crash when toggling view visibility in Unreal Engine 4 |
Fix | Fixed crash when responding to resource requests after destroying the library in Unreal Engine 4 |
API | Added an API for an external break iterator implementation |
API | Add View::SetCustomSceneCompositor method that forwards the passed arguments the Renoir scene, which fires callbacks on the interface |
API | Add View::SetSceneCustomEffectRenderer method that forwards the passed arguments the Renoir scene, which fires callbacks on the interface |
API | Added API for clearing the navigation history of a given cohtml::View |
API | Added an option to receive resource request calls on the main thread |
Version 1.9.7.2
Released 17 Aug 2020
Feature | Support for WebSockets in Unreal Engine 4 |
Fix | Fixed disappearing elements with certain style changes |
Fix | Fixed crash when registering new engine.on handers during execution of a handler |
Fix | Fixed crash when locking vertex or index buffers fails |
Fix | Renamed internal rapidjson and rapidxml libraries to avoid clashes |
Version 1.9.9.2
Released 02 Sep 2020
Enhancement | Added support for the background-position-x and background-position-y CSS properties |
Enhancement | Improved Dualshock 4 contoller support for Unity3D |
Fix | Fixed wrongly fired resource abort notifications for already completed requests |
Fix | Fixed race issues when executing layout tasks in parallel |
Fix | Fixed linker issues when the library is delay loaded with certain compiler options |
Fix | Fixed a crash which was occuring during event dispatching |
Fix | Fixed an error about missing context argument in engine.off |
Fix | Fixed a bug causing rare failures to load style sheets |
Fix | Improved tagging of memory allocations to better reflect its usage |
Fix | Fixed chaining CSS animations on the same CSS property |
Fix | Fixed by ref binding of empty std::vector collections |
Fix | Removed requirement for Vulkan runtime on Windows for Unity3D plugin |
Fix | Fixed scrolling on Linux in Unity3D with the new InputSystem |
Fix | Fixed Unity3D editor deadlocks when stopping the game |
Fix | Fixed checkout issues for Perforce users in the Unreal Engine 4 plugin |
Fix | Fixed memory allignment issue in VirtualAllocators on PS5 and Switch |
API | Added option to disable internal allocators that retain memory |
API | Added “pixels per scroll” to set the speed of the scrolling in Unity3D |
API | Increased the version of cohmtl.js – update all your copies |
Version 1.9.9.5
Released 10 Sep 2020
Fix | Fixed possible deadlock when advancing the views |
Version 1.9.9.8
Released 16 Sep 2020
Fix | Fixed crash when calling FreeRenderingResources on views with SVG images |
Fix | Fixed possible leak of SVG tessellated data |
Migration guide
Prysm version 1.9 introduces two new features in all example backends - user texture and user depth stencil lifetime event callbacks and custom allocators.
User resources callbacks
User texture and depth stencil callbacks give the user the ability to be informed about user texture wrapping, destruction, user depth stencil wrapping and destruction. To enable this functionality, the user is required to provide a class that inherits from IUserResourcesListener
by calling the SetUserResourcesListener
of the used backend. The backend will then inform the user about relevant events as they happen. If no such IUserResourcesListener
is set, all backends will continue to work as they currently do. It’s proper to point out that destruction callbacks will only be called for resources that have been wrapped after providing an IUserResourcesListener
.
Example:
// Create an instance of a class that inherits IUserResourcesListener
EngineResourceListener m_EngineResourceListener(...);
...
// Create a backend and initialize it
auto dx11 = new renoir::Dx11Backend(...);
if (!dx11->InitializeStaticResources())
{
APP_LOG(Error, "Unable to initialize backend static resources!");
return false;
}
...
// Set the texture listener
dx11->SetUserResourcesListener(&m_EngineResourceListener);
...
// Wrap a user resource - texture/depth stencil
dx11->WrapUserTexture(userObject, description, object);
...
// Destroy a user resource - texture/depth stencil
dx11->DestroyTexture(object);
...
// Receive a callback in the EngineResourceListener::OnUserTextureDestroyed() callback
void EngineResourceListener::OnUserTextureDestroyed(void* userObject)
{
// Inform the engine that the texture is no longer being used
}
Custom backend allocators
The second and bigger feature is the addition of user backend allocators that are used to allocate memory for data in the backends. Please note, that this memory is only used by the backend itself, but it does not encompass memory needed by graphics driver calls (e.g. D3D). While for some backends this memory is required from the user anyway (e.g. PS4), in general, the feature doesn’t target those kinds of allocations. To provide an allocator to the backend, the user might supply an object that implements the IBackendAllocator
interface to the backend constructor. Once set, the allocator should NOT be changed and should be used for the whole lifetime of the backend. If no such allocator is set, everything will continue to work as it has until now, as there’s a default malloc/free-based allocator provided.
Due to the specifics of each backend, there are some differences in the way (and cases where) these allocators are used.
- For all backends, the allocator is used for dynamically allocated objects and all STL-based containers and STL-based objects.
- For the NVN backend - the allocator is also used for GPU allocations under the hood.
- For the Vulkan backend - if no
VulkanBackendAllocator
is provided in its constructor, the defaultVulkanBackendAllocator
implementation uses theIBackendAllocator
passed to theVulkanBackend
(if one is given) for allocations made inside it. - For the PS4 backend - the memory allocators that were passed in the constructor had their types changed to
IBackendAllocator
and are now used for everything that they were previously used for with the following improvement - the Onion allocator now additionally handles the dynamic allocations inside the backend. Requires user changes. - For the PS5 backend - the memory allocator that was passed in the constructor had its type changed to
IBackendAllocator
and is now used for everything that it was used so far, plus all dynamic allocations inside the backend. Requires user changes.
Example:
// Create an instance of a class that inherits IBackendAllocator
EngineBackendAllocator m_EngineBackendAllocator(...);
...
// Create a backend and initialize it with the desired custom IBackendAllocator
auto dx11 = new renoir::Dx11Backend(
m_Renderer.get())->GetDevice(), false, m_PreferCPUWorkload, &m_EngineBackendAllocator);
// All backend allocations will now use the m_EngineBackendAllocator
// Again note that depending on the backend used, graphics driver calls may or may not
// use the custom allocator for allocation.
Transitioning to Prysm 1.9.5
New fields in the renoir::RendererCaps
structure.
There are 2 new fields in the renoir::RendererCaps
structure: renoir::RendererCaps::MaxTextureWidth
and renoir::RendererCaps::MaxTextureHeight
. The default versions of all backends are updated to fill in these values, which represent the maximum possible width
and height
of a 2D texture for the device, respectively. These values are used to limit the size of temporary textures that the Renoir library creates. A good default is 8192 by 8192 pixels, which is what was used internally before exposing these options.
renoir::RendererCaps::MaxTextureWidth
and renoir::RendererCaps::MaxTextureHeight
fields since otherwise these limits will end up with uninitialized values and lead to undefined behavior.