bIsMobile

bIsMobile

#Overview

name: bIsMobile

The value of this variable can be defined or overridden in .ini config files. 11 .ini config files referencing this setting variable.

It is referenced in 35 C++ source files.

#Summary

#Usage in the C++ source code

The purpose of bIsMobile is to identify if the current platform or device being targeted is a mobile platform, specifically one using the ES3_1 (OpenGL ES 3.1) feature level. This variable is commonly used throughout the Unreal Engine 5 codebase to conditionally execute or skip certain rendering and performance-related code paths that are specific to mobile devices.

Key points about bIsMobile:

  1. It is typically set based on the feature level of the current platform, where ERHIFeatureLevel::ES3_1 indicates a mobile device.

  2. It is used in various Unreal Engine subsystems, including rendering, materials, and shader compilation.

  3. The value is usually determined at runtime based on the current platform and graphics capabilities.

  4. It’s often used in conditional statements to enable or disable certain features or optimizations for mobile platforms.

  5. The variable interacts with other platform-specific flags and settings to determine the appropriate rendering and performance behavior for mobile devices.

Best practices when using this variable:

  1. Always check the current context and platform capabilities before relying solely on bIsMobile.

  2. Consider using it in conjunction with other platform-specific checks for more granular control.

  3. Be aware that mobile-specific optimizations may impact visual quality or feature availability.

  4. Test thoroughly on various mobile devices to ensure proper behavior when bIsMobile is true.

  5. Keep in mind that the definition of “mobile” may evolve over time, so consider the long-term implications of using this flag.

Developers should be aware that using bIsMobile may result in different rendering paths or feature sets being used, which can affect performance and visual quality on mobile devices. It’s important to balance the need for mobile-specific optimizations with maintaining a consistent experience across platforms.

#Setting Variables

#References In INI files

Location: <Workspace>/Engine/Config/Android/DataDrivenPlatformInfo.ini:60, section: [ShaderPlatform OPENGL_ES3_1_ANDROID]

Location: <Workspace>/Engine/Config/Android/DataDrivenPlatformInfo.ini:78, section: [ShaderPlatform VULKAN_ES3_1_ANDROID]

Location: <Workspace>/Engine/Config/IOS/DataDrivenPlatformInfo.ini:53, section: [ShaderPlatform METAL]

Location: <Workspace>/Engine/Config/IOS/DataDrivenPlatformInfo.ini:78, section: [ShaderPlatform METAL_SIM]

Location: <Workspace>/Engine/Config/Mac/DataDrivenPlatformInfo.ini:130, section: [ShaderPlatform METAL_MACES3_1]

Location: <Workspace>/Engine/Config/TVOS/DataDrivenPlatformInfo.ini:35, section: [ShaderPlatform METAL_TVOS]

Location: <Workspace>/Engine/Config/VulkanPC/DataDrivenPlatformInfo.ini:16, section: [ShaderPlatform VULKAN_SM5]

Location: <Workspace>/Engine/Config/VulkanPC/DataDrivenPlatformInfo.ini:147, section: [ShaderPlatform VULKAN_SM6]

Location: <Workspace>/Engine/Config/VulkanPC/DataDrivenPlatformInfo.ini:266, section: [ShaderPlatform VULKAN_PCES3_1]

Location: <Workspace>/Engine/Config/Windows/DataDrivenPlatformInfo.ini:151, section: [ShaderPlatform PCD3D_ES3_1]

Location: <Workspace>/Engine/Config/Windows/DataDrivenPlatformInfo.ini:177, section: [ShaderPlatform OPENGL_PCES3_1]

#References in C++ code

#Callsites

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

#Loc: <Workspace>/Engine/Source/Developer/Apple/MetalShaderFormat/Private/MetalShaderCompiler.cpp:281

Scope (from outer to inner):

file
function     void BuildMetalShaderOutput

Source code excerpt:


	//TODO read from toolchain
	const bool bIsMobile = (ShaderInput.Target.Platform == SP_METAL || ShaderInput.Target.Platform == SP_METAL_MRT || ShaderInput.Target.Platform == SP_METAL_TVOS || ShaderInput.Target.Platform == SP_METAL_MRT_TVOS || ShaderInput.Target.Platform == SP_METAL_SIM);
	bool bNoFastMath = ShaderInput.Environment.CompilerFlags.Contains(CFLAG_NoFastMath);
	const bool bUsingWPO = ShaderInput.Environment.GetCompileArgument(TEXT("USES_WORLD_POSITION_OFFSET"), false);
	if (bUsingWPO && (ShaderInput.Target.Platform == SP_METAL_MRT || ShaderInput.Target.Platform == SP_METAL_MRT_TVOS) && Frequency == SF_Vertex)
	{
		// WPO requires that we make all multiply/sincos instructions invariant :(
		bNoFastMath = true;

#Loc: <Workspace>/Engine/Source/Developer/Apple/MetalShaderFormat/Private/MetalShaderCompiler.cpp:764

Scope (from outer to inner):

file
function     void BuildMetalShaderOutput

Source code excerpt:

			if (bSucceeded)
			{
				if (!bIsMobile && !ShaderInput.Environment.CompilerFlags.Contains(CFLAG_Archive))
				{
					uint32 CodeSize = FCStringAnsi::Strlen(TCHAR_TO_UTF8(*MetalCode)) + 1;

					int32 CompressedSize = FCompression::CompressMemoryBound(NAME_Zlib, CodeSize);
					DebugCode.CompressedData.SetNum(CompressedSize);

#Loc: <Workspace>/Engine/Source/Developer/Apple/MetalShaderFormat/Private/MetalShaderCompiler.cpp:901

Scope (from outer to inner):

file
function     void CompileMetalShader

Source code excerpt:


	// TODO read from toolchain
	const bool bIsMobile = FMetalCompilerToolchain::Get()->IsMobile((EShaderPlatform)Input.Target.Platform);
	const bool bAppleTV = (Input.ShaderFormat == NAME_SF_METAL_TVOS || Input.ShaderFormat == NAME_SF_METAL_MRT_TVOS);
	const bool bIsSimulator = (Input.ShaderFormat == NAME_SF_METAL_SIM);

	FString MinOSVersion;
	FString StandardVersion;
	switch (VersionEnum)

#Loc: <Workspace>/Engine/Source/Developer/Apple/MetalShaderFormat/Private/MetalShaderCompiler.cpp:915

Scope (from outer to inner):

file
function     void CompileMetalShader

Source code excerpt:

			MinOSVersion = TEXT("-mtvos-version-min=17.0");
		}
		else if (bIsMobile)
		{
			if (bIsSimulator)
			{
				MinOSVersion = TEXT("-miphonesimulator-version-min=17.0");
			}
			else

#Loc: <Workspace>/Engine/Source/Developer/Apple/MetalShaderFormat/Private/MetalShaderCompiler.cpp:937

Scope (from outer to inner):

file
function     void CompileMetalShader

Source code excerpt:

			MinOSVersion = TEXT("-mtvos-version-min=16.0");
		}
		else if (bIsMobile)
		{
			if (bIsSimulator)
			{
				MinOSVersion = TEXT("-miphonesimulator-version-min=16.0");
			}
			else

#Loc: <Workspace>/Engine/Source/Developer/Apple/MetalShaderFormat/Private/MetalShaderCompiler.cpp:960

Scope (from outer to inner):

file
function     void CompileMetalShader

Source code excerpt:

			MinOSVersion = TEXT("-mtvos-version-min=15.0");
		}
		else if (bIsMobile)
		{
			if (bIsSimulator)
			{
				MinOSVersion = TEXT("-miphonesimulator-version-min=15.0");
			}
			else

#Loc: <Workspace>/Engine/Source/Developer/Apple/MetalShaderFormat/Private/MetalShaderCompiler.cpp:982

Scope (from outer to inner):

file
function     void CompileMetalShader

Source code excerpt:

			MinOSVersion = TEXT("-mtvos-version-min=15.0");
		}
		else if (bIsMobile)
		{
			if (bIsSimulator)
			{
				MinOSVersion = TEXT("-miphonesimulator-version-min=15.0");
			}
			else

#Loc: <Workspace>/Engine/Source/Developer/Apple/MetalShaderFormat/Private/MetalShaderCompiler.cpp:1010

Scope (from outer to inner):

file
function     void CompileMetalShader

Source code excerpt:

			MinOSVersion = TEXT("-mtvos-version-min=15.0");
		}
		else if (bIsMobile)
		{
			if (bIsSimulator)
			{
				MinOSVersion = TEXT("-miphonesimulator-version-min=15.0");
			}
			else

#Loc: <Workspace>/Engine/Source/Developer/Apple/MetalShaderFormat/Private/MetalShaderCompiler.cpp:1042

Scope (from outer to inner):

file
function     void CompileMetalShader

Source code excerpt:

	}

	TCHAR const* StandardPlatform = bIsMobile ? TEXT("ios") : TEXT("macos");
	FString Standard;
	if (VersionEnum >= 8) //-V547
	{
		Standard = FString::Printf(TEXT("-std=metal%s"), *StandardVersion);
	}
	else

#Loc: <Workspace>/Engine/Source/Developer/Apple/MetalShaderFormat/Private/MetalShaderCompiler.cpp:1099

Scope (from outer to inner):

file
function     void CompileMetalShader

Source code excerpt:

		FMetalCompileShaderSPIRV::DoCompileMetalShader(Input, Output, PreprocessedSource, GUIDHash, VersionEnum, Semantics, MaxUnrollLoops, (EShaderFrequency)Input.Target.Frequency, bDumpDebugInfo, Standard, MinOSVersion);
	}
	ShaderParameterParser.ValidateShaderParameterTypes(Input, bIsMobile, Output);
}

void OutputMetalDebugData(const FShaderCompilerInput& Input, const FShaderPreprocessOutput& PreprocessOutput, const FShaderCompilerOutput& Output)
{
	UE::ShaderCompilerCommon::DumpExtendedDebugShaderData(Input, PreprocessOutput, Output);
}

#Loc: <Workspace>/Engine/Source/Developer/Apple/MetalShaderFormat/Private/MetalShaderFormat.cpp:339

Scope (from outer to inner):

file
class        class FMetalShaderFormat : public IShaderFormat
function     virtual void ModifyShaderCompilerInput

Source code excerpt:

		// Work out which standard we need, this is dependent on the shader platform.
		// TODO: Read from toolchain class
		const bool bIsMobile = FMetalCompilerToolchain::Get()->IsMobile((EShaderPlatform)Input.Target.Platform);
		if (bIsMobile)
		{
			Input.Environment.SetDefine(TEXT("IOS"), 1);
		}
		else
		{
			Input.Environment.SetDefine(TEXT("MAC"), 1);

#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/Components/SkyLightComponent.cpp:1121

Scope (from outer to inner):

file
function     bool USkyLightComponent::IsRealTimeCaptureEnabled

Source code excerpt:

	// See FORT-301037, FORT-302324	
	// Don't call in PostLoad and SetCaptureIsDirty, because the LocalScene could be null and sky wouldn't be updated on mobile.
	const bool bIsMobile = LocalScene && LocalScene->GetFeatureLevel() <= ERHIFeatureLevel::ES3_1;
	return bRealTimeCapture && (Mobility == EComponentMobility::Movable || Mobility == EComponentMobility::Stationary) && GSkylightRealTimeReflectionCapture >0 && !bIsMobile;
}

void USkyLightComponent::SetRealTimeCaptureEnabled(bool bNewRealTimeCaptureEnabled)
{
	bRealTimeCapture = bNewRealTimeCaptureEnabled;
	MarkRenderStateDirty();

#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/GPUSkinVertexFactory.cpp:597

Scope (from outer to inner):

file
function     void TGPUSkinVertexFactory<BoneInfluenceType>::ModifyCompilationEnvironment

Source code excerpt:


	// Mobile doesn't support motion blur, don't use previous frame morph delta for mobile.
	const bool bIsMobile = IsMobilePlatform(Parameters.Platform);
	OutEnvironment.SetDefine(TEXT("GPUSKIN_MORPH_USE_PREVIOUS"), !bIsMobile);

	// Whether the material supports morph targets
	OutEnvironment.SetDefine(TEXT("GPUSKIN_MORPH_BLEND"), Parameters.MaterialParameters.bIsUsedWithMorphTargets || Parameters.MaterialParameters.bIsSpecialEngineMaterial);
}

/**

#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/GPUSkinVertexFactory.cpp:910

Scope (from outer to inner):

file
class        class FGPUSkinVertexFactoryShaderParameters : public FVertexFactoryShaderParameters
function     void GetElementShaderBindings

Source code excerpt:

		// Mobile doesn't support motion blur, don't use previous frame morph delta for mobile.
		const EShaderPlatform ShaderPlatform = GetFeatureLevelShaderPlatform(FeatureLevel);
		const bool bIsMobile = IsMobilePlatform(ShaderPlatform);
		if (!bIsMobile)
		{
			const auto* GPUSkinVertexFactory = (const FGPUBaseSkinVertexFactory*)VertexFactory;
			bool bMorphUpdatedThisFrame = (View->Family->FrameCounter == GPUSkinVertexFactory->GetMorphVertexBufferUpdatedFrameNumber());
			bool bPrevious = !View->Family->bWorldIsPaused && bMorphUpdatedThisFrame;
			const FMorphVertexBuffer* MorphVertexBuffer = GPUSkinVertexFactory->GetMorphVertexBuffer(bPrevious);
			ShaderBindings.Add(PreviousMorphBufferParameter, MorphVertexBuffer ? MorphVertexBuffer->GetSRV() : GNullVertexBuffer.VertexBufferSRV.GetReference());

#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/GPUSkinVertexFactory.cpp:951

Scope (from outer to inner):

file
function     bool FGPUBaseSkinAPEXClothVertexFactory::IsClothEnabled

Source code excerpt:

	static FShaderPlatformCachedIniValue<bool> MobileEnableClothIniValue(TEXT("r.Mobile.EnableCloth"));
	const bool bEnableClothOnMobile = (MobileEnableClothIniValue.Get(Platform) != 0);
	const bool bIsMobile = IsMobilePlatform(Platform);
	return !bIsMobile || bEnableClothOnMobile;
}


/*-----------------------------------------------------------------------------
	TGPUSkinAPEXClothVertexFactoryShaderParameters
-----------------------------------------------------------------------------*/

#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/GPUSkinVertexFactory.cpp:1012

Scope (from outer to inner):

file
class        class TGPUSkinAPEXClothVertexFactoryShaderParameters : public FGPUSkinVertexFactoryShaderParameters
function     void GetElementShaderBindings

Source code excerpt:

		// Mobile doesn't support motion blur, no need to feed the previous frame cloth data
		const EShaderPlatform ShaderPlatform = GetFeatureLevelShaderPlatform(FeatureLevel);
		const bool bIsMobile = IsMobilePlatform(ShaderPlatform);
		if (!bIsMobile)
		{
			ShaderBindings.Add(PreviousClothSimulVertsPositionsNormalsParameter, ClothShaderData.GetClothBufferForReading(true).VertexBufferSRV);
			ShaderBindings.Add(PreviousClothToLocalParameter, ClothShaderData.GetClothToLocalForReading(true));
		}

		ShaderBindings.Add(GPUSkinApexClothParameter, ClothVertexFactory->GetClothBuffer());

#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/GPUSkinVertexFactory.cpp:1194

Scope (from outer to inner):

file
function     void TGPUSkinAPEXClothVertexFactory<BoneInfluenceType>::ModifyCompilationEnvironment

Source code excerpt:

	
	// Mobile doesn't support motion blur, don't use previous frame data.
	const bool bIsMobile = IsMobilePlatform(Parameters.Platform);
	OutEnvironment.SetDefine(TEXT("GPUSKIN_APEX_CLOTH_PREVIOUS"), !bIsMobile);
}

template <GPUSkinBoneInfluenceType BoneInfluenceType>
bool TGPUSkinAPEXClothVertexFactory<BoneInfluenceType>::ShouldCompilePermutation(const FVertexFactoryShaderPermutationParameters& Parameters)
{
	return IsClothEnabled(Parameters.Platform)

#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/Materials/MaterialInterface.cpp:435

Scope (from outer to inner):

file
function     FMaterialRelevance UMaterialInterface::GetRelevance_Internal

Source code excerpt:

		}

		const bool bIsMobile = InFeatureLevel <= ERHIFeatureLevel::ES3_1;
		const bool bUsesSingleLayerWaterMaterial = MaterialResource->GetShadingModels().HasShadingModel(MSM_SingleLayerWater);
		const bool bIsSinglePassWaterTranslucent = bIsMobile && bUsesSingleLayerWaterMaterial;
		const bool bIsMobilePixelProjectedTranslucent = MaterialResource->IsUsingPlanarForwardReflections() 
														&& IsUsingMobilePixelProjectedReflection(GetFeatureLevelShaderPlatform(InFeatureLevel));

		// Note that even though XX_GameThread() api is called, this function can be called on non game thread via 
		// GetRelevance_Concurrent()
		bool bUsesAnisotropy = MaterialResource->GetShadingModels().HasAnyShadingModel({ MSM_DefaultLit, MSM_ClearCoat }) && 

#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/Materials/MaterialInterface.cpp:464

Scope (from outer to inner):

file
function     FMaterialRelevance UMaterialInterface::GetRelevance_Internal

Source code excerpt:

		if (bIsTranslucent && bSupportsSeparateTranslucency)
		{
			if (bIsMobile)
			{
				if (Material->bEnableMobileSeparateTranslucency)
				{
					TranslucencyPass = MTP_AfterDOF;
				}
			}

#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/PostProcessVolume.cpp:111

Scope (from outer to inner):

file
function     bool APostProcessVolume::CanEditChange

Source code excerpt:

		PRAGMA_DISABLE_DEPRECATION_WARNINGS
		{
			bool bIsMobile = false;

			if (UWorld* World = GetWorld())
			{
				if (FSceneInterface* Scene = World->Scene)
				{
					bIsMobile = Scene->GetShadingPath(Scene->GetFeatureLevel()) == EShadingPath::Mobile;
				}
			}

			bool bHaveCinematicDOF = !bIsMobile;
			bool bHaveGaussianDOF = bIsMobile;

			if (PropertyName == GET_MEMBER_NAME_STRING_CHECKED(FPostProcessSettings, DepthOfFieldScale) ||
				PropertyName == GET_MEMBER_NAME_STRING_CHECKED(FPostProcessSettings, DepthOfFieldNearBlurSize) ||
				PropertyName == GET_MEMBER_NAME_STRING_CHECKED(FPostProcessSettings, DepthOfFieldFarBlurSize) ||
				PropertyName == GET_MEMBER_NAME_STRING_CHECKED(FPostProcessSettings, DepthOfFieldSkyFocusDistance) ||
				PropertyName == GET_MEMBER_NAME_STRING_CHECKED(FPostProcessSettings, DepthOfFieldVignetteSize) ||

#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/SkeletalRenderGPUSkin.cpp:697

Scope: file

Source code excerpt:


	const EShaderPlatform ShaderPlatform = GetFeatureLevelShaderPlatform(FeatureLevel);
	const bool bIsMobile = IsMobilePlatform(ShaderPlatform);
	const bool bClothEnabled = FGPUBaseSkinAPEXClothVertexFactory::IsClothEnabled(ShaderPlatform);
	if (bDataPresent)
	{
		bool bSkinCacheResult = true;
		for (int32 SectionIdx = 0; SectionIdx < Sections.Num(); SectionIdx++)
		{

#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/SkeletalRenderGPUSkin.cpp:806

Scope: file

Source code excerpt:

			// Mobile doesn't support motion blur so no need to double buffer cloth data.
			// Skin cache doesn't need double buffering, if failed to enter skin cache then the fall back GPU skinned VF needs double buffering.
			if (bClothFactory && !bIsMobile && !SkinCacheEntry && Mode == EGPUSkinCacheEntryMode::Raster)
			{
				FGPUBaseSkinAPEXClothVertexFactory::ClothShaderType& ClothShaderData = VertexFactoryData.ClothVertexFactories[SectionIdx]->GetClothShaderData();
				ClothShaderData.EnableDoubleBuffer();
			}
		}
	}

	// Mobile doesn't support motion blur so no need to double buffer morph deltas
	if (bMorph && !bIsMobile && !SkinCacheEntry && Mode == EGPUSkinCacheEntryMode::Raster && !LOD.MorphVertexBufferPool->IsDoubleBuffered())
	{
		// Going through GPU skinned vertex factory, turn on double buffering for motion blur
		LOD.MorphVertexBufferPool->EnableDoubleBuffer(RHICmdList);
	}
}

#Loc: <Workspace>/Engine/Source/Runtime/Landscape/Private/Landscape.cpp:2315

Scope (from outer to inner):

file
function     const TArray<FWeightmapLayerAllocationInfo>& ULandscapeComponent::GetCurrentRuntimeWeightmapLayerAllocations

Source code excerpt:

{

	bool bIsMobile = GetWorld()->GetFeatureLevel() == ERHIFeatureLevel::ES3_1;
	return bIsMobile ? MobileWeightmapLayerAllocations : WeightmapLayerAllocations;
}

TArray<FWeightmapLayerAllocationInfo>& ULandscapeComponent::GetCurrentRuntimeWeightmapLayerAllocations()
{
	bool bIsMobile = GetWorld()->GetFeatureLevel() == ERHIFeatureLevel::ES3_1;
	return bIsMobile ? MobileWeightmapLayerAllocations : WeightmapLayerAllocations;
}

#if WITH_EDITOR

FLandscapeLayerComponentData* ULandscapeComponent::GetEditingLayer()
{

#Loc: <Workspace>/Engine/Source/Runtime/RHI/Private/DataDrivenShaderPlatformInfo.cpp:198

Scope (from outer to inner):

file
function     void FGenericDataDrivenShaderPlatformInfo::ParseDataDrivenShaderInfo

Source code excerpt:

	ADD_PROPERTY_TO_SHADERPLATFORM_FUNCTIONMAP(IsConsole, GetIsConsole);

	GET_SECTION_BOOL_HELPER(bIsMobile);
	GET_SECTION_BOOL_HELPER(bIsMetalMRT);
	GET_SECTION_BOOL_HELPER(bIsPC);
	GET_SECTION_BOOL_HELPER(bIsConsole);
	GET_SECTION_BOOL_HELPER(bIsAndroidOpenGLES);
	GET_SECTION_BOOL_HELPER(bSupportsDebugViewShaders);
	GET_SECTION_BOOL_HELPER(bSupportsMobileMultiView);

#Loc: <Workspace>/Engine/Source/Runtime/RHI/Public/DataDrivenShaderPlatformInfo.h:23

Scope (from outer to inner):

file
class        class FGenericDataDrivenShaderPlatformInfo

Source code excerpt:

	FName ShaderFormat;
	uint32 ShaderPropertiesHash;
	uint32 bIsMobile : 1;
	uint32 bIsMetalMRT : 1;
	uint32 bIsPC : 1;
	uint32 bIsConsole : 1;
	uint32 bIsAndroidOpenGLES : 1;

	uint32 bSupportsDebugViewShaders : 1;

#Loc: <Workspace>/Engine/Source/Runtime/RHI/Public/DataDrivenShaderPlatformInfo.h:203

Scope (from outer to inner):

file
class        class FGenericDataDrivenShaderPlatformInfo
function     static const bool GetIsMobile

Source code excerpt:

	{
		check(IsValid(Platform));
		return Infos[Platform].bIsMobile;
	}

	static FORCEINLINE_DEBUGGABLE const bool GetIsMetalMRT(const FStaticShaderPlatform Platform)
	{
		check(IsValid(Platform));
		return Infos[Platform].bIsMetalMRT;

#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/CompositionLighting/PostProcessDeferredDecals.cpp:78

Scope (from outer to inner):

file
function     FDeferredDecalPassTextures GetDeferredDecalPassTextures

Source code excerpt:

	auto* Parameters = GraphBuilder.AllocParameters<FDecalPassUniformParameters>();
	
	const bool bIsMobile = (View.GetFeatureLevel() == ERHIFeatureLevel::ES3_1);
	ESceneTextureSetupMode TextureReadAccess = ESceneTextureSetupMode::None;
	EMobileSceneTextureSetupMode MobileTextureReadAccess = EMobileSceneTextureSetupMode::None;
	if (bIsMobile)
	{
		MobileTextureReadAccess = EMobileSceneTextureSetupMode::SceneDepth | EMobileSceneTextureSetupMode::CustomDepth;
	}
	else
	{
		TextureReadAccess = ESceneTextureSetupMode::GBufferA | ESceneTextureSetupMode::SceneDepth | ESceneTextureSetupMode::CustomDepth;

#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/CompositionLighting/PostProcessDeferredDecals.cpp:99

Scope (from outer to inner):

file
function     FDeferredDecalPassTextures GetDeferredDecalPassTextures

Source code excerpt:


	// Mobile deferred renderer does not use dbuffer 
	if (!bIsMobile)
	{
		PassTextures.GBufferA = (*SceneTextures.UniformBuffer)->GBufferATexture;
		PassTextures.GBufferB = (*SceneTextures.UniformBuffer)->GBufferBTexture;
		PassTextures.GBufferC = (*SceneTextures.UniformBuffer)->GBufferCTexture;
		PassTextures.GBufferE = (*SceneTextures.UniformBuffer)->GBufferETexture;
	}

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

Scope (from outer to inner):

file
function     FSceneRenderer::FSceneRenderer

Source code excerpt:

			&& ViewFamily.EngineShowFlags.SeparateTranslucency;

		const bool bIsMobile = ViewFamily.GetFeatureLevel() == ERHIFeatureLevel::ES3_1;
		if (bIsMobile)
		{
			const bool bMobileMSAA = GetDefaultMSAACount(ERHIFeatureLevel::ES3_1) > 1;
			SeparateTranslucencyEnabled &= (IsMobileHDR() && !bMobileMSAA); // on <= ES3_1 separate translucency requires HDR on and MSAA off
		}

		ViewFamily.bAllowTranslucencyAfterDOF = SeparateTranslucencyEnabled && CVarAllowTranslucencyAfterDOF.GetValueOnAnyThread() != 0;

		if (!ViewFamily.bAllowTranslucencyAfterDOF && !bIsMobile && CVarTSRForceSeparateTranslucency.GetValueOnAnyThread() != 0)
		{
			for (FViewInfo* View : AllViews)
			{
				if (View->AntiAliasingMethod == AAM_TSR)
				{
					ViewFamily.bAllowTranslucencyAfterDOF = true;

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

Scope (from outer to inner):

file
function     FSceneRenderer::FSceneRenderer

Source code excerpt:

		// When MSAA sample count is >1 it works, but hair has not been properly tested so far due to other issues, so MSAA cannot use separted standard translucent for now.
		uint32 MSAASampleCount = GetDefaultMSAACount(ViewFamily.GetFeatureLevel());
		ViewFamily.bAllowStandardTranslucencySeparated = SeparateTranslucencyEnabled && MSAASampleCount == 1 && !bIsMobile && CVarTranslucencyStandardSeparated.GetValueOnAnyThread() != 0;
	}

	check(!ViewFamily.AllViews.Num());
	ViewFamily.AllViews.Append(AllViews);

	Scene->CustomRenderPassRendererInputs.Reset();

#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/WaterInfoTextureRendering.cpp:120

Scope (from outer to inner):

file
class        class FWaterInfoTexturePassMeshProcessor : public FSceneRenderingAllocatorObject<FWaterInfoTexturePassMeshProcessor>, public FMeshPassProcessor

Source code excerpt:

{
public:
	FWaterInfoTexturePassMeshProcessor(const FScene* Scene, ERHIFeatureLevel::Type FeatureLevel, const FSceneView* InViewIfDynamicMeshCommand, FMeshPassDrawListContext* InDrawListContext, bool bIsMobile);

	virtual void AddMeshBatch(const FMeshBatch& RESTRICT MeshBatch, uint64 BatchElementMask, const FPrimitiveSceneProxy* RESTRICT PrimitiveSceneProxy, int32 StaticMeshId = -1) override final;
	virtual void CollectPSOInitializers(const FSceneTexturesConfig& SceneTexturesConfig, const FMaterial& Material, const FPSOPrecacheVertexFactoryData& VertexFactoryData, const FPSOPrecacheParams& PreCacheParams, TArray<FPSOPrecacheData>& PSOInitializers) override final;

private:
	bool TryAddMeshBatch(

#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/WaterInfoTextureRendering.cpp:136

Scope (from outer to inner):

file
class        class FWaterInfoTexturePassMeshProcessor : public FSceneRenderingAllocatorObject<FWaterInfoTexturePassMeshProcessor>, public FMeshPassProcessor

Source code excerpt:

	FMeshPassProcessorRenderState PassDrawRenderState;
	TArray<const TCHAR*, TInlineAllocator<1>> MaterialAllowList;
	bool bIsMobile;
};

FWaterInfoTexturePassMeshProcessor::FWaterInfoTexturePassMeshProcessor(const FScene* Scene, ERHIFeatureLevel::Type FeatureLevel, const FSceneView* InViewIfDynamicMeshCommand, FMeshPassDrawListContext* InDrawListContext, bool bIsMobile)
	: FMeshPassProcessor(EMeshPass::WaterInfoTexturePass, Scene, FeatureLevel, InViewIfDynamicMeshCommand, InDrawListContext),
	bIsMobile(bIsMobile)
{
	PassDrawRenderState.SetBlendState(TStaticBlendState<>::GetRHI());
	PassDrawRenderState.SetDepthStencilAccess(FExclusiveDepthStencil::DepthWrite_StencilNop);
	PassDrawRenderState.SetDepthStencilState(TStaticDepthStencilState<true, CF_DepthNearOrEqual>::GetRHI());

	// HACK: This whole path for rendering the water info texture is a temporary solution, so in order to avoid supporting generic material setups, we use an allow list to restrict

#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/WaterInfoTextureRendering.cpp:193

Scope (from outer to inner):

file
function     void FWaterInfoTexturePassMeshProcessor::CollectPSOInitializers

Source code excerpt:

		SetupDepthStencilInfo(PF_DepthStencil, TexCreate_DepthStencilTargetable | TexCreate_ShaderResource, ERenderTargetLoadAction::EClear, ERenderTargetLoadAction::ENoAction, FExclusiveDepthStencil::DepthWrite_StencilNop, RenderTargetsInfo);

		if (!bIsMobile)
		{
			// Get the shaders if possible for given vertex factory
			TMeshProcessorShaders<
				TBasePassVertexShaderPolicyParamType<FUniformLightMapPolicy>,
				TBasePassPixelShaderPolicyParamType<FUniformLightMapPolicy>> PassShaders;
			if (!GetBasePassShaders<FUniformLightMapPolicy>(

#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/WaterInfoTextureRendering.cpp:275

Scope (from outer to inner):

file
function     bool FWaterInfoTexturePassMeshProcessor::TryAddMeshBatch

Source code excerpt:

		const FVertexFactory* VertexFactory = MeshBatch.VertexFactory;

		if (!bIsMobile)
		{
			TMeshProcessorShaders<
				TBasePassVertexShaderPolicyParamType<FUniformLightMapPolicy>,
				TBasePassPixelShaderPolicyParamType<FUniformLightMapPolicy>> PassShaders;

			if (!GetBasePassShaders<FUniformLightMapPolicy>(

#Loc: <Workspace>/Engine/Source/Runtime/Sockets/Private/IOS/SocketSubsystemIOS.cpp:169

Scope (from outer to inner):

file
function     bool FSocketSubsystemIOS::GetLocalAdapterAddresses

Source code excerpt:

			// Also drop any interface that's not a wifi or mobile adapter
			bool bIsWifi = strncmp(Travel->ifa_name, "en", 2) == 0;
			bool bIsMobile = strncmp(Travel->ifa_name, "pdp_ip", 6) == 0;
			if (!bIsWifi && !bIsMobile)
			{
				continue;
			}

			// Otherwise, this is an address we can consider.
			FSortedPriorityAddresses NewAddress(this);