2019-12-26 14:45:42 -05:00
|
|
|
// Copyright Epic Games, Inc. All Rights Reserved.
|
2015-12-10 21:55:37 -05:00
|
|
|
|
Copying //UE4/Dev-Build to //UE4/Dev-Main (Source: //UE4/Dev-Build @ 3209340)
#lockdown Nick.Penwarden
#rb none
==========================
MAJOR FEATURES + CHANGES
==========================
Change 3209340 on 2016/11/23 by Ben.Marsh
Convert UE4 codebase to an "include what you use" model - where every header just includes the dependencies it needs, rather than every source file including large monolithic headers like Engine.h and UnrealEd.h.
Measured full rebuild times around 2x faster using XGE on Windows, and improvements of 25% or more for incremental builds and full rebuilds on most other platforms.
* Every header now includes everything it needs to compile.
* There's a CoreMinimal.h header that gets you a set of ubiquitous types from Core (eg. FString, FName, TArray, FVector, etc...). Most headers now include this first.
* There's a CoreTypes.h header that sets up primitive UE4 types and build macros (int32, PLATFORM_WIN64, etc...). All headers in Core include this first, as does CoreMinimal.h.
* Every .cpp file includes its matching .h file first.
* This helps validate that each header is including everything it needs to compile.
* No engine code includes a monolithic header such as Engine.h or UnrealEd.h any more.
* You will get a warning if you try to include one of these from the engine. They still exist for compatibility with game projects and do not produce warnings when included there.
* There have only been minor changes to our internal games down to accommodate these changes. The intent is for this to be as seamless as possible.
* No engine code explicitly includes a precompiled header any more.
* We still use PCHs, but they're force-included on the compiler command line by UnrealBuildTool instead. This lets us tune what they contain without breaking any existing include dependencies.
* PCHs are generated by a tool to get a statistical amount of coverage for the source files using it, and I've seeded the new shared PCHs to contain any header included by > 15% of source files.
Tool used to generate this transform is at Engine\Source\Programs\IncludeTool.
[CL 3209342 by Ben Marsh in Main branch]
2016-11-23 15:48:37 -05:00
|
|
|
#include "PostProcess/PostProcessVisualizeComplexity.h"
|
|
|
|
|
#include "CanvasTypes.h"
|
|
|
|
|
#include "RenderTargetTemp.h"
|
2020-09-24 00:43:27 -04:00
|
|
|
#include "UnrealEngine.h"
|
2021-01-11 14:49:16 -04:00
|
|
|
#include "SystemTextures.h"
|
2015-12-10 21:55:37 -05:00
|
|
|
|
2019-10-01 13:03:04 -04:00
|
|
|
class FVisualizeComplexityApplyPS : public FGlobalShader
|
2015-12-10 21:55:37 -05:00
|
|
|
{
|
2019-10-01 13:03:04 -04:00
|
|
|
public:
|
|
|
|
|
DECLARE_GLOBAL_SHADER(FVisualizeComplexityApplyPS);
|
|
|
|
|
SHADER_USE_PARAMETER_STRUCT(FVisualizeComplexityApplyPS, FGlobalShader);
|
2018-05-23 21:04:31 -04:00
|
|
|
|
2019-10-01 13:03:04 -04:00
|
|
|
BEGIN_SHADER_PARAMETER_STRUCT(FParameters, )
|
|
|
|
|
SHADER_PARAMETER_STRUCT(FScreenPassTextureViewportParameters, Input)
|
|
|
|
|
SHADER_PARAMETER_RDG_TEXTURE(Texture2D, InputTexture)
|
|
|
|
|
SHADER_PARAMETER_SAMPLER(SamplerState, InputSampler)
|
|
|
|
|
SHADER_PARAMETER_RDG_TEXTURE(Texture2D<uint>, QuadOverdrawTexture)
|
|
|
|
|
SHADER_PARAMETER_TEXTURE(Texture2D, MiniFontTexture)
|
|
|
|
|
SHADER_PARAMETER_ARRAY(FLinearColor, ShaderComplexityColors, [MaxNumShaderComplexityColors])
|
|
|
|
|
SHADER_PARAMETER(FIntPoint, UsedQuadTextureSize)
|
|
|
|
|
SHADER_PARAMETER(uint32, bLegend)
|
|
|
|
|
SHADER_PARAMETER(uint32, bShowError)
|
|
|
|
|
SHADER_PARAMETER(uint32, DebugViewShaderMode)
|
|
|
|
|
SHADER_PARAMETER(uint32, ColorSamplingMethod)
|
|
|
|
|
SHADER_PARAMETER(float, ShaderComplexityColorCount)
|
|
|
|
|
SHADER_PARAMETER(float, ComplexityScale)
|
|
|
|
|
RENDER_TARGET_BINDING_SLOTS()
|
|
|
|
|
END_SHADER_PARAMETER_STRUCT()
|
|
|
|
|
|
2020-03-09 18:04:35 -04:00
|
|
|
enum class EQuadOverdraw
|
|
|
|
|
{
|
|
|
|
|
Disable,
|
|
|
|
|
Enable,
|
|
|
|
|
MAX
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class FQuadOverdraw : SHADER_PERMUTATION_ENUM_CLASS("READ_QUAD_OVERDRAW", EQuadOverdraw);
|
|
|
|
|
using FPermutationDomain = TShaderPermutationDomain<FQuadOverdraw>;
|
|
|
|
|
|
2019-10-01 13:03:04 -04:00
|
|
|
static bool ShouldCompilePermutation(const FGlobalShaderPermutationParameters& Parameters)
|
|
|
|
|
{
|
2020-03-09 18:04:35 -04:00
|
|
|
const FPermutationDomain PermutationVector(Parameters.PermutationId);
|
|
|
|
|
if (PermutationVector.Get<FVisualizeComplexityApplyPS::FQuadOverdraw>() == FVisualizeComplexityApplyPS::EQuadOverdraw::Enable)
|
|
|
|
|
{
|
|
|
|
|
return AllowDebugViewShaderMode(DVSM_QuadComplexity, Parameters.Platform, GetMaxSupportedFeatureLevel(Parameters.Platform));
|
|
|
|
|
}
|
2019-10-01 13:03:04 -04:00
|
|
|
return true;
|
2018-05-23 21:04:31 -04:00
|
|
|
}
|
|
|
|
|
|
2019-10-01 13:03:04 -04:00
|
|
|
static void ModifyCompilationEnvironment(const FGlobalShaderPermutationParameters& Parameters, FShaderCompilerEnvironment& OutEnvironment)
|
|
|
|
|
{
|
|
|
|
|
FGlobalShader::ModifyCompilationEnvironment(Parameters, OutEnvironment);
|
|
|
|
|
OutEnvironment.SetDefine(TEXT("MAX_NUM_COMPLEXITY_COLORS"), MaxNumShaderComplexityColors);
|
|
|
|
|
// EVisualizeComplexityColorSamplingMethod values
|
|
|
|
|
OutEnvironment.SetDefine(TEXT("CS_RAMP"), (uint32)FVisualizeComplexityInputs::EColorSamplingMethod::Ramp);
|
|
|
|
|
OutEnvironment.SetDefine(TEXT("CS_LINEAR"), (uint32)FVisualizeComplexityInputs::EColorSamplingMethod::Linear);
|
|
|
|
|
OutEnvironment.SetDefine(TEXT("CS_STAIR"), (uint32)FVisualizeComplexityInputs::EColorSamplingMethod::Stair);
|
|
|
|
|
// EDebugViewShaderMode values
|
|
|
|
|
OutEnvironment.SetDefine(TEXT("DVSM_None"), (uint32)DVSM_None);
|
|
|
|
|
OutEnvironment.SetDefine(TEXT("DVSM_ShaderComplexity"), (uint32)DVSM_ShaderComplexity);
|
|
|
|
|
OutEnvironment.SetDefine(TEXT("DVSM_ShaderComplexityContainedQuadOverhead"), (uint32)DVSM_ShaderComplexityContainedQuadOverhead);
|
|
|
|
|
OutEnvironment.SetDefine(TEXT("DVSM_ShaderComplexityBleedingQuadOverhead"), (uint32)DVSM_ShaderComplexityBleedingQuadOverhead);
|
|
|
|
|
OutEnvironment.SetDefine(TEXT("DVSM_QuadComplexity"), (uint32)DVSM_QuadComplexity);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
IMPLEMENT_GLOBAL_SHADER(FVisualizeComplexityApplyPS, "/Engine/Private/ShaderComplexityApplyPixelShader.usf", "Main", SF_Pixel);
|
|
|
|
|
|
|
|
|
|
float GetMaxShaderComplexityCount(ERHIFeatureLevel::Type FeatureLevel)
|
|
|
|
|
{
|
|
|
|
|
switch (FeatureLevel)
|
|
|
|
|
{
|
|
|
|
|
case ERHIFeatureLevel::ES3_1:
|
|
|
|
|
return GEngine->MaxES3PixelShaderAdditiveComplexityCount;
|
|
|
|
|
default:
|
|
|
|
|
return GEngine->MaxPixelShaderAdditiveComplexityCount;
|
|
|
|
|
}
|
2015-12-10 21:55:37 -05:00
|
|
|
}
|
|
|
|
|
|
2019-10-01 13:03:04 -04:00
|
|
|
FScreenPassTexture AddVisualizeComplexityPass(FRDGBuilder& GraphBuilder, const FViewInfo& View, const FVisualizeComplexityInputs& Inputs)
|
2015-12-10 21:55:37 -05:00
|
|
|
{
|
2019-10-01 13:03:04 -04:00
|
|
|
check(Inputs.SceneColor.IsValid());
|
2015-12-10 21:55:37 -05:00
|
|
|
|
2019-10-01 13:03:04 -04:00
|
|
|
FScreenPassRenderTarget Output = Inputs.OverrideOutput;
|
2015-12-10 21:55:37 -05:00
|
|
|
|
2019-10-01 13:03:04 -04:00
|
|
|
if (!Output.IsValid())
|
2015-12-10 21:55:37 -05:00
|
|
|
{
|
2019-10-01 13:03:04 -04:00
|
|
|
Output = FScreenPassRenderTarget::CreateFromInput(GraphBuilder, Inputs.SceneColor, View.GetOverwriteLoadAction(), TEXT("VisualizeComplexity"));
|
2015-12-10 21:55:37 -05:00
|
|
|
}
|
|
|
|
|
|
2019-10-01 13:03:04 -04:00
|
|
|
const FScreenPassTextureViewport InputViewport(Inputs.SceneColor);
|
|
|
|
|
|
|
|
|
|
FVisualizeComplexityApplyPS::FParameters* PassParameters = GraphBuilder.AllocParameters<FVisualizeComplexityApplyPS::FParameters>();
|
|
|
|
|
PassParameters->RenderTargets[0] = Output.GetRenderTargetBinding();
|
|
|
|
|
PassParameters->Input = GetScreenPassTextureViewportParameters(InputViewport);
|
|
|
|
|
PassParameters->InputTexture = Inputs.SceneColor.Texture;
|
|
|
|
|
PassParameters->InputSampler = TStaticSamplerState<SF_Bilinear, AM_Clamp, AM_Clamp, AM_Clamp>::GetRHI();
|
2015-12-10 21:55:37 -05:00
|
|
|
|
|
|
|
|
{
|
2019-10-01 13:03:04 -04:00
|
|
|
const int32 ClampedColorCount = FMath::Min<int32>(Inputs.Colors.Num(), MaxNumShaderComplexityColors);
|
|
|
|
|
if (ClampedColorCount > 0)
|
2015-12-10 21:55:37 -05:00
|
|
|
{
|
2019-10-01 13:03:04 -04:00
|
|
|
for (int32 ColorIndex = 0; ColorIndex < ClampedColorCount; ColorIndex++)
|
|
|
|
|
{
|
|
|
|
|
PassParameters->ShaderComplexityColors[ColorIndex] = Inputs.Colors[ColorIndex];
|
|
|
|
|
}
|
|
|
|
|
PassParameters->ShaderComplexityColorCount = ClampedColorCount;
|
2015-12-10 21:55:37 -05:00
|
|
|
}
|
2019-10-01 13:03:04 -04:00
|
|
|
else // Otherwise fallback to a safe value.
|
2015-12-10 21:55:37 -05:00
|
|
|
{
|
2019-10-01 13:03:04 -04:00
|
|
|
PassParameters->ShaderComplexityColors[0] = FLinearColor::Gray;
|
|
|
|
|
PassParameters->ShaderComplexityColorCount = 1;
|
2015-12-10 21:55:37 -05:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2019-10-01 13:03:04 -04:00
|
|
|
const uint32 ShaderComplexityColorCount = PassParameters->ShaderComplexityColorCount;
|
2015-12-10 21:55:37 -05:00
|
|
|
|
2019-10-01 13:03:04 -04:00
|
|
|
PassParameters->MiniFontTexture = GetMiniFontTexture();
|
2015-12-10 21:55:37 -05:00
|
|
|
|
UE5_MAIN: Multi-view-family scene renderer refactor, part 2. Move FSceneTextures singleton out of RDG blackboard and FSceneTexturesConfig global variable singleton, into FViewFamilyInfo. This is necessary to allow multiple view families to render in a single render graph and a single scene renderer call.
* Existing calls to CreateSceneTextureShaderParameters and similar functions use "GetSceneTexturesChecked", which allows for the possibility that they are reached in a code path where scene textures haven't been initialized, and nullptr is returned instead of asserting. The shader parameter setup functions then fill in dummy defaults for that case. The goal was to precisely match the original behavior, which queried the RDG blackboard, and gracefully handled null if scene textures weren't there. This definitely appears to occur in FNiagaraGpuComputeDispatch::ProcessPendingTicksFlush, which can be called with a dummy scene with no scene textures. In the future, I may change this so dummy defaults are filled in for FSceneTextures at construction time, so the structure is never in an uninitialized state, but I would like to set up a test case for the Niagara code path before doing that, and the checks aren't harmful in the meantime.
* I marked as deprecated global functions which query values from FSceneTexturesConfig, but they'll still work with the caveat that if you use multi-view-family rendering, the results will be indeterminate (whatever view family rendered last). There was only one case outside the scene renderer that accessed the globals (depth clear value), which I removed, noting that there is nowhere in the code where we modify the depth clear value from its global default. I would like to permanently deprecate or remove these at some point. Display Cluster is the only code that's currently using the multi-view-family code path, and as a new (still incomplete) feature, third party code can't be using it, and won't be affected.
#jira NONE
#rb chris.kulla zach.bethel mihnea.balta
#preflight 6261aca76119a1a496bd2644
[CL 19873983 by jason hoerner in ue5-main branch]
2022-04-22 17:33:02 -04:00
|
|
|
const FSceneTextures& SceneTextures = View.GetSceneTextures();
|
2019-10-01 13:03:04 -04:00
|
|
|
const EDebugViewShaderMode DebugViewShaderMode = View.Family->GetDebugViewShaderMode();
|
2015-12-10 21:55:37 -05:00
|
|
|
|
2020-03-09 18:04:35 -04:00
|
|
|
PassParameters->DebugViewShaderMode = DVSM_ShaderComplexity;
|
|
|
|
|
FVisualizeComplexityApplyPS::EQuadOverdraw QuadOverdrawEnum = FVisualizeComplexityApplyPS::EQuadOverdraw::Disable;
|
|
|
|
|
|
2021-01-11 14:49:16 -04:00
|
|
|
if (SceneTextures.QuadOverdraw)
|
2015-12-10 21:55:37 -05:00
|
|
|
{
|
2021-01-11 14:49:16 -04:00
|
|
|
const FRDGSystemTextures& SystemTextures = FRDGSystemTextures::Get(GraphBuilder);
|
|
|
|
|
PassParameters->QuadOverdrawTexture = GetIfProduced(SceneTextures.QuadOverdraw, SystemTextures.Black);
|
2019-10-01 13:03:04 -04:00
|
|
|
PassParameters->DebugViewShaderMode = DebugViewShaderMode;
|
2020-03-09 18:04:35 -04:00
|
|
|
QuadOverdrawEnum = FVisualizeComplexityApplyPS::EQuadOverdraw::Enable;
|
2015-12-10 21:55:37 -05:00
|
|
|
}
|
|
|
|
|
|
2019-10-01 13:03:04 -04:00
|
|
|
PassParameters->bLegend = Inputs.bDrawLegend;
|
|
|
|
|
PassParameters->bShowError = PassParameters->DebugViewShaderMode != DVSM_QuadComplexity;
|
|
|
|
|
PassParameters->ColorSamplingMethod = (uint32)Inputs.ColorSamplingMethod;
|
|
|
|
|
PassParameters->ComplexityScale = Inputs.ComplexityScale;
|
|
|
|
|
PassParameters->UsedQuadTextureSize = FIntPoint(View.ViewRect.Size() + FIntPoint(1, 1)) / 2;
|
2015-12-10 21:55:37 -05:00
|
|
|
|
2020-03-09 18:04:35 -04:00
|
|
|
FVisualizeComplexityApplyPS::FPermutationDomain PermutationVector;
|
|
|
|
|
PermutationVector.Set<FVisualizeComplexityApplyPS::FQuadOverdraw>(QuadOverdrawEnum);
|
|
|
|
|
TShaderMapRef<FVisualizeComplexityApplyPS> PixelShader(View.ShaderMap, PermutationVector);
|
2015-12-10 21:55:37 -05:00
|
|
|
|
2019-10-01 13:03:04 -04:00
|
|
|
RDG_EVENT_SCOPE(GraphBuilder, "VisualizeComplexity");
|
|
|
|
|
|
2020-02-06 13:13:41 -05:00
|
|
|
AddDrawScreenPass(GraphBuilder, RDG_EVENT_NAME("Visualizer"), View, FScreenPassTextureViewport(Output), InputViewport, PixelShader, PassParameters);
|
2019-10-01 13:03:04 -04:00
|
|
|
|
|
|
|
|
Output.LoadAction = ERenderTargetLoadAction::ELoad;
|
|
|
|
|
|
|
|
|
|
AddDrawCanvasPass(GraphBuilder, RDG_EVENT_NAME("Overlay"), View, Output,
|
|
|
|
|
[Output, &View, ShaderComplexityColorCount](FCanvas& Canvas)
|
2018-10-26 19:28:13 -04:00
|
|
|
{
|
Copying //UE4/Dev-Rendering to Dev-Main (//UE4/Dev-Main)
#lockdown ben.marsh
==========================
MAJOR FEATURES + CHANGES
==========================
Change 2774277 on 2015/11/19 by Gil.Gribb
UE4 - Did minor optimizations to the PS4 RHI and drawlists.
Change 2791226 on 2015/12/04 by Uriel.Doyon
Added source code for Embree 2.7.0
Removed duplicate files from the /doc folder.
Change 2800193 on 2015/12/11 by Marcus.Wassmer
SSAO AsyncCompute support.
#rb Martin.Mittring
Change 2801631 on 2015/12/14 by Olaf.Piesche
Making auto deactivate true by default, moving checks to HasCompleted, eliminating some unnecessary logic
#rb martin.mittring
Change 2803240 on 2015/12/15 by Gil.Gribb
UE4 - Added command to collect stats on spammy stats.
Change 2803476 on 2015/12/15 by Rolando.Caloca
DR - Allow toggling compute skin dispatch at runtime
- r.SkinCacheShaders Now enable the shaders and feature
- r.SkinCaching enables toggling at runtime
- r.SkinCache.BufferSize Sets the size in bytes of buffer for outputting
- Now uses 3 UAV buffers instead of one (avoid RenderDoc crashes)
#codereview Marcus.Wassmer, Martin.Mittring
Change 2803940 on 2015/12/15 by Marcus.Wassmer
Add r.PS4.AsyncComputeBudgetMode to switch between CUMasking and WaveLimit modes. So far it looks like WaveLimits behave better in UE4.
Also rearrange AsyncSSAO to run immediately after HZB to overlap with occlusion queries. In my testing this takes SSAO cost from .5ms -> .2ms. However it had to be hacked to run without normals. Hopefully Martin can get some real AsyncSSAO in.
#rb Martin.Mittring
#codereview Martin.Mittring
Change 2803999 on 2015/12/15 by Uriel.Doyon
Refactored the shader complexity material override logic to allow other viewmodes shader overrides.
TexelFactorAccuracy ViewMode : shows the accuracy of the static mesh texel factors, used for streaming.
WantedMipsAccuracy ViewMode : shows the accuracy of the static mesh wanted mips accuracy, used for streaming.
Added an option to stream textures based on the AABB distance instead of using the sphere approximation.
Added an option to only keep a the wanted mips.
Moved optimization related viewmodes into a submenu to avoid polluting the interface.
#jira UE-24502
#jira UE-24503
#jira UERNDR-89
Change 2804150 on 2015/12/15 by Olaf.Piesche
make separate translucency screen percentage a bit more robust; add numsamples to the render target creation functions in preparation for MSAA support for higher quality with low res separate translucency
#rb martin.mittring
Change 2804367 on 2015/12/15 by Daniel.Wright
Capsule shadow primitives are tracked separately on registration - saves 2.6ms of RT time doing the view frustum culling in a medium sized map
Change 2805293 on 2015/12/16 by Olaf.Piesche
logging if potentially immortal emitters are spawned from gameplay; this should catch if we spawn burst only emitters with indefinite life spans (muzzle flashes, hit impacts, etc.)
#rb martin.mittring
Change 2805586 on 2015/12/16 by Zabir.Hoque
Adding support for decals to fade and destroy themselves automatically.
#CodeReview: Martin.Mittring, Daniel.Wright, Olaf.Piesche
Change 2807663 on 2015/12/17 by Rolando.Caloca
DR - Remove expensive logging
#codereview Marcus.Wassmer
Change 2807903 on 2015/12/17 by Zabir.Hoque
Refactored DecalComponent's lifetime management such that it can be set and reset from Blueprints.
#CodeReview Daniel.Wright, Martin.Mittring, Olaf.Piesche
Change 2809261 on 2015/12/18 by Martin.Mittring
Added VisualizeShadingModels to track down issues like that:
FORT-16913 Textures on Hero Mesh is not shown
#rb:David.Hill
#code_review:Bob.Tellez
Change 2810136 on 2015/12/21 by Rolando.Caloca
DR - Added back draw event colors
PR #1602
#jira UE-21526
#codereview Mark.Satterthwaite, Keith.Judge, Marcus.Wassmer, Josh.Adams
Change 2810680 on 2015/12/21 by Martin.Mittring
moved SSAO ComputeShader running without per pixel normal (for AsyncCompute) into DevRendering
#test:editor
Change 2811205 on 2015/12/22 by Brian.Karis
Pulled clear coat out of the reflection compute shader. Added permutation for skylight.
Clear coat base layer now done in base pass. It only picks up the closest capture. This will cause popping when the object moves. Still needs a cross fade.
Change 2811275 on 2015/12/22 by David.Hill
UE-24675
#rb martin.mittring
Corrected buffer-size related problem with fringe.
Change 2811397 on 2015/12/22 by Brian.Karis
2016-01-08 11:12:28 -05:00
|
|
|
if (View.Family->GetDebugViewShaderMode() == DVSM_QuadComplexity)
|
2015-12-10 21:55:37 -05:00
|
|
|
{
|
2019-10-01 13:03:04 -04:00
|
|
|
int32 StartX = Output.ViewRect.Min.X + 62;
|
|
|
|
|
int32 EndX = Output.ViewRect.Max.X - 66;
|
|
|
|
|
int32 NumOffset = (EndX - StartX) / (ShaderComplexityColorCount - 1);
|
2015-12-10 21:55:37 -05:00
|
|
|
for (int32 PosX = StartX, Number = 0; PosX <= EndX; PosX += NumOffset, ++Number)
|
|
|
|
|
{
|
|
|
|
|
FString Line;
|
|
|
|
|
Line = FString::Printf(TEXT("%d"), Number);
|
2019-10-01 13:03:04 -04:00
|
|
|
Canvas.DrawShadowedString(PosX, Output.ViewRect.Max.Y - 87, *Line, GetStatsFont(), FLinearColor(0.5f, 0.5f, 0.5f));
|
2015-12-10 21:55:37 -05:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2019-10-01 13:03:04 -04:00
|
|
|
Canvas.DrawShadowedString(Output.ViewRect.Min.X + 63, Output.ViewRect.Max.Y - 51, TEXT("Good"), GetStatsFont(), FLinearColor(0.5f, 0.5f, 0.5f));
|
|
|
|
|
Canvas.DrawShadowedString(Output.ViewRect.Min.X + 63 + (int32)(Output.ViewRect.Width() * 107.0f / 397.0f), Output.ViewRect.Max.Y - 51, TEXT("Bad"), GetStatsFont(), FLinearColor(0.5f, 0.5f, 0.5f));
|
|
|
|
|
Canvas.DrawShadowedString(Output.ViewRect.Max.X - 162, Output.ViewRect.Max.Y - 51, TEXT("Extremely bad"), GetStatsFont(), FLinearColor(0.5f, 0.5f, 0.5f));
|
2015-12-10 21:55:37 -05:00
|
|
|
|
2019-10-01 13:03:04 -04:00
|
|
|
Canvas.DrawShadowedString(Output.ViewRect.Min.X + 62, Output.ViewRect.Max.Y - 87, TEXT("0"), GetStatsFont(), FLinearColor(0.5f, 0.5f, 0.5f));
|
2015-12-10 21:55:37 -05:00
|
|
|
|
|
|
|
|
FString Line;
|
2019-10-01 13:03:04 -04:00
|
|
|
Line = FString::Printf(TEXT("MaxShaderComplexityCount=%d"), (int32)GetMaxShaderComplexityCount(View.GetFeatureLevel()));
|
|
|
|
|
Canvas.DrawShadowedString(Output.ViewRect.Max.X - 260, Output.ViewRect.Max.Y - 88, *Line, GetStatsFont(), FLinearColor(0.5f, 0.5f, 0.5f));
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
return MoveTemp(Output);
|
|
|
|
|
}
|