Release notes


Version 1.38.0

Released 21 Feb 2023
FeatureIntroduce a new ‘UI Surface Partitioning’' feature that gives the ability to split the UI in parts that will be rendered in separate textures. See the documentation for more details'
EnhancementAdded documentation for the coh-composition-id, coh-partitioned, and coh-rendering-options
EnhancementEnhanced stroke rounded rects to use geometry instead of Path for better performance
EnhancementImplemented a full page capture feature that can serialize a loaded page to a binary blob for easier debugging
EnhancementAdded support for null when setting style.[top|left|right|bottom]PX for unsetting the property
EnhancementUnreal EngineAdded a way to ignore the automatic binding of specific UFunctions
FixFixed a crash when applying white-space property on input elements
FixFixed a deadlock that can occur during loading of images
FixFixed a regression with user images that may have caused crashes
FixBorders having width less than 1px and using images/gradients as border-image-source are no longer disappearing
FixFix the disappearing of small border corners
FixFixed pausing animations with zero duration to render the correct state
FixFixed a potential crash when creating/destroying video elements or changing the src attribute
FixFixed a potential crash when destroying Vertex/Index buffers in the backend when using the ViewSettings::ExecuteCommandProcessingWithLayout option
FixFixed a crash when nesting elements that use the clip-path property in an SVG
FixFixed potential threading issue when using multiple views along with the ViewSettings::ExecuteCommandProcessingWithLayout option, leading to the missing texture errors
FixRemoved additional memory allocation for texture updates
FixFixed an assert in Debug configuration related to visual AABBs
FixFixed possible GPU hang due to failing Index buffer diagnostic check 16690 in the stock PS4 backend.
FixFixed wrong layout when using font-fit in a dynamically sized flex sub-tree
FixFixed inner HTML in localized content not displayed correctly unless wrapped in a single HTML element
FixFixed unnecessary request for an invalid texture from the backend in the Compositor sample
FixFixed incorrect handling of background-size single value extent and auto value
FixFixed possible assertion for a missing render target when having an element with both coh-composition-id and filter CSS properties
FixFix the occasional disappearing of SVGs used as masks
FixFixed SVGs not drawing correctly when using preserveAspectRatio="none"
FixUnityFixed submission validation errors for PlayStation 5
FixUnreal EngineFix retrieval of game viewport when multiple PIE processes exist

Migration guide

Changed Stroke Circle / Stroke Rounded Rectangle shader

After changing the input.Additional.z for the Stroke Rounded Rectangle and Stroke Circle geometry to be the sum of the radius and half of the stroke width, the shader also had to be altered. Meaning that in this version of Gameface, the Stroke Rounded Rectangle and Stroke Circle shader (when ShaderType is 2) has been changed. Before, to calculate distance2OuterEdge we used to subtract the sum of the radius (input.Additional.z) and half of the stroke width (input.Additional.w) from de(distance between the current pixel and the center of the circle). Now we only subtract the radius. Moreover, to calculate distance2InnerEdge, we now subtract the difference between the radius and half of the stroke width instead of the whole stroke width from de.


> CohShadeGeometryRare.ihlsl

… const float de = length(posPixels - input.Additional.xy); const float distance2OuterEdge = de - (input.Additional.z + input.Additional.w / 2); const float distance2InnerEdge = de - (input.Additional.z - input.Additional.w / 2); …


> CohShadeGeometryRare.ihlsl

… const float de = length(posPixels - input.Additional.xy); const float distance2OuterEdge = de - input.Additional.z; const float distance2InnerEdge = de - (input.Additional.z - input.Additional.w); …

Added new texture property


The description (Texture2D object) has a field named Props. It’s used to set some flags for the texture which can provide some specific information. We’ve added new flag called ImageProperties::IMP_ClearOnInit by which we should understand that the texture should be cleared when it’s being created. Previously, we were sending empty data to the backend, so the flag was added to save up some memory.

Some rendering APIs can directly memset the texture memory while others should allocate some temporary memory and update the texture’s resource with it. Below you can check an example of the simplest approach to migrate this change:

dxVector<unsigned char> empty;
// Renoir expects text atlases to be clear before usage.
// Previsouly we were sending empty data from Renoir, but this can result in memory spikes
// if many atlases need to be allocated in single frame and it was meaningless to send 0's.
if (description.Props & renoir::IMP_ClearOnInit)
	dataLen = description.Width * description.Height * (renoir::BitsPerPixel(description.Format) / 8);
	empty = dxVector<unsigned char>(dataLen, 0);
	data =;