r.PrimitiveHasTileOffsetData
r.PrimitiveHasTileOffsetData
#Overview
name: r.PrimitiveHasTileOffsetData
This variable is created as a Console Variable (cvar).
- type:
Var
- help:
1 to upload lower-precision tileoffset primitive data to gpu, 0 to use higher-precision double float.\n
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:
- The Renderer module
- 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:
- Keep it at the default value (1) unless you have specific needs for higher precision.
- If working with extremely large worlds or objects far from the origin, consider setting it to 0 for higher precision.
- Be aware that changing this value may require shader recompilation.
Regarding the associated variable CVarPrimitiveHasTileOffsetData:
- It serves the same purpose as r.PrimitiveHasTileOffsetData.
- It’s used in various parts of the engine to retrieve the current setting value.
- It’s typically accessed using IConsoleManager::Get().FindTConsoleVariableDataInt() to get its current value.
- The value is often cached for performance reasons in frequently called functions.
- When using this variable, always consider thread safety, as it’s accessed from different threads (render thread, game thread).
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)