r.PrimitiveHasTileOffsetData

r.PrimitiveHasTileOffsetData

#Overview

name: r.PrimitiveHasTileOffsetData

This variable is created as a Console Variable (cvar).

It is referenced in 8 C++ source files.

#Summary

#Usage in the C++ source code

The purpose of r.PrimitiveHasTileOffsetData is to control the precision of primitive data uploaded to the GPU for rendering. Specifically, it determines whether to use lower-precision tile offset data or higher-precision double-precision floating-point values for primitive positioning.

This setting variable is primarily used in the rendering system of Unreal Engine 5. It affects how primitive (object) positions are handled in shaders and during rendering calculations.

The Unreal Engine subsystems that rely on this setting variable include:

  1. The Renderer module
  2. The Engine module, particularly in shader compilation and primitive uniform parameter building

The value of this variable is set through the console variable system. It’s defined as a TAutoConsoleVariable with a default value of 1, meaning it defaults to using lower-precision tile offset data.

This variable interacts closely with its associated variable CVarPrimitiveHasTileOffsetData. They share the same value and are used interchangeably in different parts of the code.

Developers must be aware that changing this variable can affect rendering precision and potentially impact performance. Using tile offset data (value 1) can be more efficient but may introduce some precision loss for very large worlds or objects far from the origin.

Best practices when using this variable include:

  1. Keep it at the default value (1) unless you have specific needs for higher precision.
  2. If working with extremely large worlds or objects far from the origin, consider setting it to 0 for higher precision.
  3. Be aware that changing this value may require shader recompilation.

Regarding the associated variable CVarPrimitiveHasTileOffsetData:

Developers should treat CVarPrimitiveHasTileOffsetData as an internal implementation detail and prefer using r.PrimitiveHasTileOffsetData when manually adjusting the setting.

#References in C++ code

#Callsites

This variable is referenced in the following C++ source code:

#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/SceneRendering.cpp:273

Scope: file

Source code excerpt:


static TAutoConsoleVariable<int32> CVarPrimitiveHasTileOffsetData(
	TEXT("r.PrimitiveHasTileOffsetData"),
	1,
	TEXT("1 to upload lower-precision tileoffset primitive data to gpu, 0 to use higher-precision double float.\n"),
	ECVF_ReadOnly | ECVF_RenderThreadSafe);

#if !(UE_BUILD_SHIPPING || UE_BUILD_TEST)
static TAutoConsoleVariable<float> CVarGeneralPurposeTweak(

#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/ShaderCompiler/ShaderCompiler.cpp:8013

Scope (from outer to inner):

file
function     void GlobalBeginCompileShader

Source code excerpt:

	SET_SHADER_DEFINE_AND_COMPILE_ARGUMENT(Input.Environment, VIEW_HAS_TILEOFFSET_DATA, bViewHasTileOffsetData);

	static const auto CVarPrimitiveHasTileOffsetData = IConsoleManager::Get().FindTConsoleVariableDataInt(TEXT("r.PrimitiveHasTileOffsetData"));
	const bool bPrimitiveHasTileOffsetData = CVarPrimitiveHasTileOffsetData->GetValueOnAnyThread() != 0;
	SET_SHADER_DEFINE_AND_COMPILE_ARGUMENT(Input.Environment, PRIMITIVE_HAS_TILEOFFSET_DATA, bPrimitiveHasTileOffsetData);

	// Set VR definitions
	if (ShaderFrequencyNeedsInstancedStereoMods(ShaderType))
	{

#Loc: <Workspace>/Engine/Source/Runtime/Engine/Public/PrimitiveUniformShaderParametersBuilder.h:339

Scope (from outer to inner):

file
function     inline const FPrimitiveUniformShaderParameters& Build

Source code excerpt:


		static TConsoleVariableData<int32>* CVarPrimitiveHasTileOffsetData = nullptr;
		CVarPrimitiveHasTileOffsetData = CVarPrimitiveHasTileOffsetData ? CVarPrimitiveHasTileOffsetData : IConsoleManager::Get().FindTConsoleVariableDataInt(TEXT("r.PrimitiveHasTileOffsetData")); // null at first
		const bool bPrimitiveHasTileOffsetData = CVarPrimitiveHasTileOffsetData ? (CVarPrimitiveHasTileOffsetData->GetValueOnAnyThread() != 0) : false;
		if (bPrimitiveHasTileOffsetData)
		{
			const FLargeWorldRenderPosition AbsoluteActorWorldPositionTO { AbsoluteActorWorldPosition };
			Parameters.ActorWorldPositionHigh = AbsoluteActorWorldPositionTO.GetTile();
			Parameters.ActorWorldPositionLow = AbsoluteActorWorldPositionTO.GetOffset();

#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/InstanceCulling/InstanceCullingContext.cpp:546

Scope (from outer to inner):

file
function     class FOcclusionCullInstancesDim : SHADER_PERMUTATION_BOOL

Source code excerpt:

		OutEnvironment.SetDefine(TEXT("INSTANCE_DATA_STRIDE_ELEMENTS"), GetInstanceDataStrideElements(Parameters.Platform, ProcessingMode));

		static const auto CVarPrimitiveHasTileOffsetData = IConsoleManager::Get().FindTConsoleVariableDataInt(TEXT("r.PrimitiveHasTileOffsetData"));
		const bool bPrimitiveHasTileOffsetData = CVarPrimitiveHasTileOffsetData->GetValueOnAnyThread() != 0;
		OutEnvironment.SetDefine(TEXT("PRIMITIVE_HAS_TILEOFFSET_DATA"), bPrimitiveHasTileOffsetData ? 1 : 0);
	}

	BEGIN_SHADER_PARAMETER_STRUCT(FParameters, )
		SHADER_PARAMETER_RDG_BUFFER_SRV(StructuredBuffer<float4>, GPUSceneInstanceSceneData)

#Associated Variable and Callsites

This variable is associated with another variable named CVarPrimitiveHasTileOffsetData. They share the same value. See the following C++ source code.

#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/ShaderCompiler/ShaderCompiler.cpp:8013

Scope (from outer to inner):

file
function     void GlobalBeginCompileShader

Source code excerpt:

	SET_SHADER_DEFINE_AND_COMPILE_ARGUMENT(Input.Environment, VIEW_HAS_TILEOFFSET_DATA, bViewHasTileOffsetData);

	static const auto CVarPrimitiveHasTileOffsetData = IConsoleManager::Get().FindTConsoleVariableDataInt(TEXT("r.PrimitiveHasTileOffsetData"));
	const bool bPrimitiveHasTileOffsetData = CVarPrimitiveHasTileOffsetData->GetValueOnAnyThread() != 0;
	SET_SHADER_DEFINE_AND_COMPILE_ARGUMENT(Input.Environment, PRIMITIVE_HAS_TILEOFFSET_DATA, bPrimitiveHasTileOffsetData);

	// Set VR definitions
	if (ShaderFrequencyNeedsInstancedStereoMods(ShaderType))
	{
		const UE::StereoRenderUtils::FStereoShaderAspects Aspects(ShaderPlatform);

#Loc: <Workspace>/Engine/Source/Runtime/Engine/Public/PrimitiveUniformShaderParametersBuilder.h:338

Scope (from outer to inner):

file
function     inline const FPrimitiveUniformShaderParameters& Build

Source code excerpt:

		}

		static TConsoleVariableData<int32>* CVarPrimitiveHasTileOffsetData = nullptr;
		CVarPrimitiveHasTileOffsetData = CVarPrimitiveHasTileOffsetData ? CVarPrimitiveHasTileOffsetData : IConsoleManager::Get().FindTConsoleVariableDataInt(TEXT("r.PrimitiveHasTileOffsetData")); // null at first
		const bool bPrimitiveHasTileOffsetData = CVarPrimitiveHasTileOffsetData ? (CVarPrimitiveHasTileOffsetData->GetValueOnAnyThread() != 0) : false;
		if (bPrimitiveHasTileOffsetData)
		{
			const FLargeWorldRenderPosition AbsoluteActorWorldPositionTO { AbsoluteActorWorldPosition };
			Parameters.ActorWorldPositionHigh = AbsoluteActorWorldPositionTO.GetTile();
			Parameters.ActorWorldPositionLow = AbsoluteActorWorldPositionTO.GetOffset();
			const FLargeWorldRenderPosition ObjectWorldPositionTO { AbsoluteObjectWorldPosition };

#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/InstanceCulling/InstanceCullingContext.cpp:546

Scope (from outer to inner):

file
function     class FOcclusionCullInstancesDim : SHADER_PERMUTATION_BOOL

Source code excerpt:

		OutEnvironment.SetDefine(TEXT("INSTANCE_DATA_STRIDE_ELEMENTS"), GetInstanceDataStrideElements(Parameters.Platform, ProcessingMode));

		static const auto CVarPrimitiveHasTileOffsetData = IConsoleManager::Get().FindTConsoleVariableDataInt(TEXT("r.PrimitiveHasTileOffsetData"));
		const bool bPrimitiveHasTileOffsetData = CVarPrimitiveHasTileOffsetData->GetValueOnAnyThread() != 0;
		OutEnvironment.SetDefine(TEXT("PRIMITIVE_HAS_TILEOFFSET_DATA"), bPrimitiveHasTileOffsetData ? 1 : 0);
	}

	BEGIN_SHADER_PARAMETER_STRUCT(FParameters, )
		SHADER_PARAMETER_RDG_BUFFER_SRV(StructuredBuffer<float4>, GPUSceneInstanceSceneData)
		SHADER_PARAMETER_RDG_BUFFER_SRV(StructuredBuffer<float4>, GPUSceneInstancePayloadData)

#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/SceneRendering.cpp:272

Scope: file

Source code excerpt:

	ECVF_ReadOnly | ECVF_RenderThreadSafe);

static TAutoConsoleVariable<int32> CVarPrimitiveHasTileOffsetData(
	TEXT("r.PrimitiveHasTileOffsetData"),
	1,
	TEXT("1 to upload lower-precision tileoffset primitive data to gpu, 0 to use higher-precision double float.\n"),
	ECVF_ReadOnly | ECVF_RenderThreadSafe);

#if !(UE_BUILD_SHIPPING || UE_BUILD_TEST)