Files
UnrealEngineUWP/Engine/Source/Developer/TaskGraph/Private/SBarVisualizer.cpp
Gil Gribb ab5d7150f4 Copying //UE4/Dev-Rendering to //UE4/Dev-Main (Source: //UE4/Dev-Rendering @ 3154632)
#lockdown Nick.Penwarden
#rb none

==========================
MAJOR FEATURES + CHANGES
==========================

Change 3122543 on 2016/09/13 by Ben.Woodhouse

	Override HasOcclusion for Widget3DComponentProxy to detect if the material is has depth testing enabled.

	#jira UE-35878

Change 3122544 on 2016/09/13 by Ben.Woodhouse

	Shadow stencil optimisation with cvar (enabled by default)

	Avoids redundant clearing the stencil buffer for per-object and pre shadows by zeroing the stencil during testing, following discussion on UDN.

	This means we don't benefit from Hi Stencil on GCN for the shadow projection draw calls, but it's still faster in all the cases I could find, including for the player character where the bounding box is quite large. (Note: early stencil still works fine, according to PIX)

	Shadow projection GPU time profiling :
	Test map with 35 characters, stationary directional light
	  - 4ms-2ms on XB1
	  - 2.5ms to 0.9ms on PC (r9-390X)
	  - 3ms-2ms on PS4

	Paragon PS4 (roughly 20% reduced - from ~0.39ms)

Change 3122687 on 2016/09/13 by Rolando.Caloca

	DR - vk - Fix ES31 crash

Change 3122691 on 2016/09/13 by Rolando.Caloca

	DR - vk - Fixes for SDK 1.0.26.0

Change 3122778 on 2016/09/13 by Rolando.Caloca

	DR - vk - Fix number of layers on barrier

Change 3122921 on 2016/09/13 by Rolando.Caloca

	DR - vk - Fix ES3.1

Change 3122925 on 2016/09/13 by Ben.Woodhouse

	Fix sky lighting issue with skin and re-enable non-checkerboard lighting by default (fallout from lightaccumulator refactor)
	#jira UE-35904

Change 3123016 on 2016/09/13 by Chris.Bunner

	Fixed adaptive tessellation, broken by CL 3089208 refactor.
	#jira UE-35341

Change 3123079 on 2016/09/13 by Rolando.Caloca

	DR - vk - Force StoreOp store instead of DontCare everywhere (temporarily)

Change 3123503 on 2016/09/13 by David.Hill

	#jira UE-25623
	converted a check() to checkf() to include better diagnostic information.

Change 3123617 on 2016/09/13 by Guillaume.Abadie

	Fixes artifact when the camera direction is almost parallel to a wide plane with SSR.

	#jira UE-35128

Change 3123743 on 2016/09/13 by Brian.Karis

	Separate mesh reduction interfaces for static and skeletal.

	Zero bad tangents from input mesh.

Change 3125378 on 2016/09/14 by Arne.Schober

	DR - [UE-34481] - Extract all the State which is necessary to execute the DebugTextDrawingDelegate from the SceneProxy into its own Helpers to be drawn to the canvas later on. The issue was that the SceneProxys are only owned by the RT after their creation and the GT should avoid reading from or writing state to them.

Change 3125527 on 2016/09/14 by Arne.Schober

	DR - [UE-34481] - Fix UT build and mac

Change 3125741 on 2016/09/14 by Rolando.Caloca

	DR - Extra debug mode for tracking down SCW crashes (r.DumpSCWQueuedJobs=1)

Change 3125763 on 2016/09/14 by Rolando.Caloca

	DR - vk - Added new Renderpass cache
	- Fix buffer barrier warning

Change 3125769 on 2016/09/14 by Rolando.Caloca

	DR - Renamed cvar to r.DumpSCWQueuedJobs

Change 3125771 on 2016/09/14 by Rolando.Caloca

	DR - Added support for SV_ClipDistance on GL3 & 4

Change 3125792 on 2016/09/14 by Arne.Schober

	DR - [UE-34481] - Fix Odin and PS4

Change 3125880 on 2016/09/14 by Arne.Schober

	DR - [UE-34481] - Fix Fortnite

Change 3125968 on 2016/09/14 by Brian.Karis

	Removed comment

Change 3126315 on 2016/09/15 by Ben.Woodhouse

	GPU profiler robustness
	-  Change stat gathering update to handle multiple views and non-scenerenderer stats (such Slate) properly
	- Simplify gathering logic
	- Fix race condition where we could read back queries before they're submitted on the RHI thread.
	- Fix for movie player stat gathering - disable gathering outside of the main engine tick
	#jira UE-35975

Change 3126792 on 2016/09/15 by Rolando.Caloca

	DR - vk - Release render pass cache

Change 3126804 on 2016/09/15 by Rolando.Caloca

	DR - vk - Fix UpdateTexture2D()
	#jira UE-34151

Change 3126884 on 2016/09/15 by Rolando.Caloca

	DR - vk - Compile fix

Change 3126953 on 2016/09/15 by Rolando.Caloca

	DR - Enable GPU capture when running OpenGL under RenderDoc
	- Will also set the memory mode to non coherent so not to kill performance on RenderDoc

Change 3126966 on 2016/09/15 by Rolando.Caloca

	DR - Allow cooking for Vulkan SM4 to help with packaging

Change 3127082 on 2016/09/15 by Guillaume.Abadie

	Wraps up contact shadows for release fixing different artifacts and handling correctly their screen space length.

	#jira UE-35367, UE-33602, UE-33603, UE-33604
	#review-3125887 @brian.karis

Change 3127130 on 2016/09/15 by Mark.Satterthwaite

	Add overloads to as* functions in hlslcc - HLSL allows you to call these on variables of the same type, in which case it simply returns the existing value but we had only defined the float<->u/int conversions, so hlslcc added implicit casts that broke such cases (i.e. asuint(uint) -> floatBitsToUint(float(uint))). This change defines the missing overloads as returns with regular casts.
	#jira FORT-25869
	#jira UE-34263

Change 3127475 on 2016/09/15 by Rolando.Caloca

	DR - vk - Debug dump

Change 3128131 on 2016/09/16 by Ben.Woodhouse

	(Integrated from //UE4/Private-Partner-NREAL/...)

	Alpha output support for postprocess materials (optional via a parameter)

	Needed for end of frame compositing. Could be used to pass intermediate data from one blendable postprocess to another (e.g edge detection)

Change 3128135 on 2016/09/16 by Ben.Woodhouse

	GPU profiler (PS4) - remove bubbles between commandlist submissions from query times

	Use r.ps4.AdjustRenderQueryTimestamps cvar to enable/disable (defaults to on)

	Also fixes some potential precision issues with unit GPU timing

Change 3128247 on 2016/09/16 by Rolando.Caloca

	DR - vk - Cache framebuffers

Change 3128593 on 2016/09/16 by Rolando.Caloca

	DR - vk - Fix for crash loading map
	#jira UE-36072

Change 3128759 on 2016/09/16 by Mark.Satterthwaite

	Back out changelist 3127130 - its causing a build failure in FPostProcessVelocityScatterVS because hlslcc is picking the wrong as_* overload.

Change 3130236 on 2016/09/19 by Chris.Bunner

	Exposed full SceneCaptureComponent classes instead of select methods.
	#jira UE-35996

Change 3130388 on 2016/09/19 by Rolando.Caloca

	DR - Avoid crash when adding dynamic primitives
	#jira UE-35327

Change 3130393 on 2016/09/19 by Marc.Olano

	Improve vector noise tooltips & documentation

Change 3130547 on 2016/09/19 by Ben.Woodhouse

	Fix for ensure fail when initializing point light shadowmaps.

	This came about because cubemap rendertargets always have Extents of (Resolution, 0). The Y component was implicitly used to determine if it was a cubemap, which is odd... The fix was to make the definition explicit via a flag and initialize both the X and Y parameters.

	I suspect the ensure started happening recently due to a more recent change, but fixing the underlying logic seems like the correct fix.
	#jira UE-35837

Change 3130578 on 2016/09/19 by Daniel.Wright

	Workaround OpenGL/NVidia bug with non-power-of-2 textures by disabling CSM atlassing if we're using OpenGL

Change 3130682 on 2016/09/19 by Rolando.Caloca

	DR - Better fix for UE-35327
	#jira UE-35327

Change 3130767 on 2016/09/19 by Uriel.Doyon

	Better handling of color array in VisualizeComplexity code to prevent assert.
	#jira UE-29332

Change 3130965 on 2016/09/19 by Arne.Schober

	DR - [UE-35679] - the crash was caused by the Resource of the UTexture being Null. And one of the Kismet Nodes calling a function on that resource. The solution was to disable that call from Kismet when only cooking.

Change 3130967 on 2016/09/19 by Chris.Bunner

	Hid redundant texture sampler properties from texture object parameter.
	Hid redundant texture property input on texture parameter nodes.
	Fixed copy-paste error in expression texture parameter docs.
	#jira UE-32724

Change 3131118 on 2016/09/19 by Mark.Satterthwaite

	Second attempt - this time with the correct input types. Add overloads to as* functions in hlslcc - HLSL allows you to call these on variables of the same type, in which case it simply returns the existing value but we had only defined the float<->u/int conversions, so hlslcc added implicit casts that broke such cases (i.e. asuint(uint) -> floatBitsToUint(float(uint))). This change defines the missing overloads as returns with regular casts.
	#jira FORT-25869
	#jira UE-34263

Change 3131153 on 2016/09/19 by Rolando.Caloca

	DR - Fix recompute normals when triangles have a LHS tangent basis

	Integrate from 3028634
	- Also make meshes that don't have morphs be able to run through the recompute normals path
	#jira UE-35472

Change 3131228 on 2016/09/19 by Mark.Satterthwaite

	Duplicate CL #3114668: Always disable asynchronous shader compilation for the global shader map on Metal as some of them are needed very early.
	#jira UE-35240

Change 3131246 on 2016/09/19 by Rolando.Caloca

	DR - Shrink gpu skinning permutations

Change 3131261 on 2016/09/19 by Mark.Satterthwaite

	Fix Metal validation failures due to particle rendering not binding buffers to all buffer inputs declared in the shader.
	ContentExamples Effects no longer aborts complaining that the particle system didn't bind a required buffer.

Change 3131265 on 2016/09/19 by Mark.Satterthwaite

	Fix FMetalDynamicRHI::RHIReadSurfaceData for shared textures on iOS.

Change 3131271 on 2016/09/19 by Mark.Satterthwaite

	Use private memory for the Metal stencil SRV workaround needed on El Capitan.

Change 3131273 on 2016/09/19 by Mark.Satterthwaite

	Disable the lazy-encoder construction in Metal for AMD - there is a situation that causes the lazy construction to perform a clear that isn't wanted and so far this hasn't been tracked down and fixed. Until then, this will render correctly.

Change 3131280 on 2016/09/19 by Mark.Satterthwaite

	For GLSL interpolation mode flags must come before storage mode flags and you can't redeclare the system variable gl_Layer to use a differing interpolation mode.

Change 3131283 on 2016/09/19 by Mark.Satterthwaite

	Change the ShaderCache to not cache resource bindings in the draw states for shader platforms that don't care - reduces the number of draw states considered significantly without reducing effectiveness. We can support ShaderCache with Metal SM5 but not the RHI thread enabled so change when we enable it and make sure we load the binary shader cache.

Change 3131402 on 2016/09/19 by Rolando.Caloca

	DR - Disambiguate callstack
	#jira UE-34415

Change 3131469 on 2016/09/19 by Rolando.Caloca

	DR - vk - Check if we can allocate descriptors off a pool

Change 3131482 on 2016/09/19 by Rolando.Caloca

	DR - vk - Remove unused var

Change 3131506 on 2016/09/19 by Mark.Satterthwaite

	With permission from Josh.A & Michael.T, deprecate Mac OpenGL support. For now this just means visibly warning users with message boxes - but in a future release OpenGL support will be removed from macOS.

Change 3131536 on 2016/09/19 by Rolando.Caloca

	DR - vk - Compile fix

Change 3131564 on 2016/09/19 by Rolando.Caloca

	DR - vk - Submit Hint
	- Disable framebuffer recycling as its causing a hang

Change 3131625 on 2016/09/19 by Mark.Satterthwaite

	Inside MetalRHI add an optional cache for disposed texture objects so we may reuse them - controlled by CVAR rhi.Metal.TextureCacheMode which must be set prior to running as it can't be changed at runtime. Settings: 0 = off, 1 (default) = will attempt to reuse private memory texture objects within the frame they are released otherwise they are disposed of as before. Setting 2 extends the caching to all textures - though Managed/Shared textures cannot be reused until after the frame in which they were released has been processed on the GPU. In this mode id<MTLTexture> objects are never returned to the OS so in order to conserve VRAM calls to setPurgeableState are made to allow the driver to reclaim unusued memory if required.

Change 3131630 on 2016/09/19 by Mark.Satterthwaite

	More statistics in Metal added to track down where performance was going in a particular project but which may be more generally useful.

Change 3131955 on 2016/09/20 by Gil.Gribb

	Merging //UE4/Dev-Main@3129758 to Dev-Rendering (//UE4/Dev-Rendering)

Change 3131978 on 2016/09/20 by Gil.Gribb

	CIS fix

Change 3132584 on 2016/09/20 by Ben.Woodhouse

	Add some additional checks to help track down a rare crash with terrain rendering and shader recompiling

	#jira UE-35937

Change 3132696 on 2016/09/20 by Mark.Satterthwaite

	Use set*Bytes to handle uploading buffers < 4Kb when available - this is faster than lots of small Metal buffers and reduces the amount of GPU heap fragmentation. Where the API feature isn't available or hasn't been tested yet we'll use another ring-buffer inside the MetalCommandEncoder to emulate it.

Change 3132772 on 2016/09/20 by Mark.Satterthwaite

	Rework Metal's handling of RHISetStreamSource calls that override the stride of vertex declarations to be much more efficient.

Change 3132870 on 2016/09/20 by Ben.Woodhouse

	Fix mac compile error

Change 3133049 on 2016/09/20 by Brian.Karis

	Changed light source shapes in reflection captures to use alpha

Change 3133057 on 2016/09/20 by Brian.Karis

	Alphaed out on spot light cone as well.

Change 3133263 on 2016/09/20 by Rolando.Caloca

	DR - vk - Debug names for objects

Change 3133292 on 2016/09/20 by Rolando.Caloca

	DR - vk - Fix SRGB upload/formats

Change 3133395 on 2016/09/20 by Rolando.Caloca

	DR - vk - SM5 fixes

Change 3134026 on 2016/09/21 by Gil.Gribb

	Merging //UE4/Dev-Main@3133983 to Dev-Rendering (//UE4/Dev-Rendering)

Change 3134663 on 2016/09/21 by Chris.Bunner

	Merging Dev-MaterialLayers to Dev-Rendering, CL 3134208. Initial material attribute extensibility changes.
	#jira UE-34347

Change 3134730 on 2016/09/21 by Arne.Schober

	DR - [UE-34481] - Fix minor brokenness found by Gil

Change 3134792 on 2016/09/21 by Chris.Bunner

	Fixed compile errors for non-editor builds.

Change 3135214 on 2016/09/21 by Rolando.Caloca

	DR - vk - Fix visualize texture
	- Dump memory when OOM (to track leaks)

Change 3135225 on 2016/09/21 by Rolando.Caloca

	DR - vk - Ensure on exit if mem leak
	- Update fences if running wait for idle

Change 3135672 on 2016/09/22 by Gil.Gribb

	Merging //UE4/Dev-Main@3135568 to Dev-Rendering (//UE4/Dev-Rendering)

Change 3135793 on 2016/09/22 by Rolando.Caloca

	DR - vk - Set dynamic state after binding pipeline or on a fresh cmd buffer

Change 3135816 on 2016/09/22 by Rolando.Caloca

	DR - Add names for d3d on renderdoc

Change 3135894 on 2016/09/22 by Chris.Bunner

	Fixed initialization order warning.

Change 3136024 on 2016/09/22 by Rolando.Caloca

	DR - vk - Fix stencil faces

Change 3136042 on 2016/09/22 by Marcus.Wassmer

	Fix compile error

Change 3136046 on 2016/09/22 by Chris.Bunner

	Renamed material for PostTonemapHDRColor visualization to reflect actual usage.

Change 3136308 on 2016/09/22 by Uriel.Doyon

	Changed how the component relative rotation is computed, in order to have more consistency after blueprint rescript.
	#jira UE-36094

Change 3136798 on 2016/09/22 by Chris.Bunner

	Gather object references from stereo view state in USceneCaptureComponent. This matches behavior of other classes such as ULocalPlayer.

Change 3137092 on 2016/09/22 by Rolando.Caloca

	DR - vk - Rename pipeline to gfx pipeline

Change 3137263 on 2016/09/22 by Mark.Satterthwaite

	Duplicate CL #3135157:
	Fix one cause of Metal crashes loading into a zone - the PlanarReflection shader code needs to always set the IsStereoParameter so that the shader can perform the if-test without causing an invalid GPU access.
	#jira FORT-30061

Change 3137265 on 2016/09/22 by Mark.Satterthwaite

	Duplicate CL #3135169:
	Correct Metal texture creation for AVF media framework - we can't provide a render-targetable version of the texture without blitting. The native texture we get is a GPU copy that can be made CPU accessible (i.e. it is not tiled).

Change 3137266 on 2016/09/22 by Mark.Satterthwaite

	Duplicate CL #3135237:
	Metal validation layer fix: under Metal if there are no reads from the vertex stage-in buffers we should use the Empty vertex declaration, not the filter declaration, otherwise we have to bind a redundant vertex stream buffer to silence the validation layer.

Change 3137268 on 2016/09/22 by Mark.Satterthwaite

	Duplicate CL #3136033:
	To fix the Fortnite login screen force Nvidia Macs to use the set*Bytes API for small buffer updates even on El Capitan. We can't do this globally as Intel didn't implement these functions until macOS Sierra.
	Fix GPU selection code in MetalRHI to confirm everything is working.
	#jira FORT-30385

Change 3137269 on 2016/09/22 by Mark.Satterthwaite

	Duplicate CL #3137164:
	Add stats to track exactly how many command buffers are allocated and committed each frame to work out why Fortnite on AMD is hanging, which turns out to be because each texture update/reallocation ends up in its own command-buffer. This needs to be rethought to pack these into fewer command buffers with the same synchronisation requirements to minimise command-buffer splits but for now we'll just make the default sufficiently large that we shouldn't see the hang until the work is done. Also ensure that command-buffer failure is always fatal - there is no way to recover or continue if a command-buffer fails.
	#jira FORT-30377

Change 3137606 on 2016/09/23 by Gil.Gribb

	Merging //UE4/Dev-Main@3137560 to Dev-Rendering (//UE4/Dev-Rendering)

Change 3137936 on 2016/09/23 by Rolando.Caloca

	DR - Split RHICmdList clear into color & ds in prep for changes

Change 3138346 on 2016/09/23 by Rolando.Caloca

	DR - vk - Some renaming and splitting classes in prep for compute

Change 3138628 on 2016/09/23 by Rolando.Caloca

	DR - vk - Fix mem leak on framebuffers

Change 3138721 on 2016/09/23 by Daniel.Wright

	Better comment for r.DefaultFeature.AntiAliasing

Change 3138722 on 2016/09/23 by Daniel.Wright

	Fixed assert from decals with MSAA due to binding the Scene Depth Texture instead of surface

Change 3138723 on 2016/09/23 by Daniel.Wright

	Corrected GC doc

Change 3138892 on 2016/09/23 by Daniel.Wright

	Fixed instanced static meshes being unbuilt after a lighting build if you ever cancelled a previous lighting build

Change 3138905 on 2016/09/23 by Daniel.Wright

	"Optimizations" -> "Optimization Viewmodes"

Change 3138939 on 2016/09/23 by Daniel.Wright

	Disabled the stationary light overlap viewmode with forward shading

Change 3139710 on 2016/09/26 by Rolando.Caloca

	DR - Rename and added texture RHIClearDepthStencil -> RHIClearDepthStencilTexture

Change 3139820 on 2016/09/26 by Rolando.Caloca

	DR - Remove prefix from shader frequency strings

Change 3139828 on 2016/09/26 by Marcus.Wassmer

	Add SetShaderValue() specialization for bools on AsyncCompute commandlists to match the Gfx specialization.

Change 3139840 on 2016/09/26 by Benjamin.Hyder

	Adding VectorNoise Examples to TM-Noise map

Change 3139862 on 2016/09/26 by Rolando.Caloca

	DR - Better log to track down crash
	#jira UE-36271

Change 3140142 on 2016/09/26 by Rolando.Caloca

	DR - Fix clang warning

Change 3140145 on 2016/09/26 by Rolando.Caloca

	DR - Rename RHIClearColor(MRT) to RHIClearColorTextures and pass textures as parameters

Change 3140360 on 2016/09/26 by Daniel.Wright

	Lighting Scenarios and lightmaps moved to separate package
	* Levels can be marked as lighting scenarios (eg Day, Night).  Lighting is built separately for each lighting scenario with actors / lights in all other scenario levels hidden.  Only one lighting scenario level should be visible at a time in game, and its lightmaps will be applied to the world.
	* Most outputs of the lighting build now go into a separate _BuiltData package.  This improves level Save and AutoSave times as the separate package will only be dirtied after lighting rebuilds.
	* If a lighting scenario is present, all lightmaps are placed inside it's _BuiltData package.  This means that only the currently loaded lighting scenario's lightmaps will be loaded (Day or Night, but not both).  This also means that lightmaps for a streaming level will not be streamed with it.
	* For backwards compatibility, existing lightmaps are moved to a new _BuiltData package on load.
	* Reflection captures and precomputed visibility were not moved to the separate package.  Reflection captures are force updated on load of a lighting scenario level, which can increase load times.

Change 3140361 on 2016/09/26 by Daniel.Wright

	Lighting Scenarios UI

Change 3140582 on 2016/09/26 by Mark.Satterthwaite

	Duplicate CL #3140166
	Fix the video playback in Fortnite - bind our shader resource texture as the render-target texture as for some reason the playback code expects it there, even though we could never provide one.
	#jira FORT-30551

Change 3140584 on 2016/09/26 by Mark.Satterthwaite

	Duplicate CL #3140131:
	Fix crash under the validation layer & Nvidia's El Capitan (10.11) drivers when distance field particle collisions are used without any scene distance fields available - bind the black volume texture when that is the case to avoid bad access on the GPU.
	#jira FORT-30622

Change 3140586 on 2016/09/26 by Mark.Satterthwaite

	Duplicate CL #3140450:
	Fix launching the game on Intel GPUs by disabling Tiled Reflections on Intel for macOS Sierra like we did for El Capitan as there's currently a driver bug to means it doesn't work properly.
	#jira FORT-30649

Change 3140594 on 2016/09/26 by Zabir.Hoque

	Fix benchmark shaders register bindings. TEXCOORD0 was bound to register 1 in VS and then register 0 in PS. DX12 treats this a PSO creation failuer unlike DX11 this was an error.

Change 3140601 on 2016/09/26 by Marcus.Wassmer

	New 'Cinematic' Scalability level.  Remove unused 'new' motionblur CVAR

Change 3140602 on 2016/09/26 by Zabir.Hoque

	CreateTexture3D on XB1 DX11 was leaking ESRAM by reserving it but not allocating to it.

	#Tests: Fix was tested by licensee (GearBox).

Change 3140622 on 2016/09/26 by Rolando.Caloca

	DR - vk - More prep for sm5

Change 3140765 on 2016/09/26 by Rolando.Caloca

	DR - Fix ensure from bad clear depth surface

Change 3141251 on 2016/09/27 by Rolando.Caloca

	DR - vk - Rename & cleanup

Change 3141394 on 2016/09/27 by Rolando.Caloca

	DR - vk - Compute pipeline state

Change 3141463 on 2016/09/27 by Mark.Satterthwaite

	Fix the include order to avoid compile errors on Mac.

Change 3141529 on 2016/09/27 by Gil.Gribb

	Merging //UE4/Dev-Main@3139632 to Dev-Rendering (//UE4/Dev-Rendering)

Change 3141830 on 2016/09/27 by zachary.wilson

	Adding testing content for lighting scenarios to collaborate with Ben

Change 3141941 on 2016/09/27 by Olaf.Piesche

	Speculative fix for UE-34815; have yet to repro this but there's really only so many things it could be. I currently don't see how the sim resources could go away after queueing, so I'm replacing the check with an ensure and null checking the resource pointer.

Change 3142035 on 2016/09/27 by Olaf.Piesche

	Fix compiler error from silly leftover bit of code.

Change 3142065 on 2016/09/27 by Benjamin.Hyder

	Updating Lighting Scenario map

Change 3142262 on 2016/09/27 by Mark.Satterthwaite

	Change Apple RHI initialisation to select the first compatible shader platform to decide which RHI to initialise. Internally in MetalRHI we must gracefully fallback to a lower feature-level when this initial selection is not available on the current device/OS, in which case we need to validate that the selected shader platform was actually packaged. The order of initialisation is different per-platform:
	On Mac: Order of initialisation is the order listed in TargetedRHIs .ini specifications.
	On iOS/tvOS: Order is explicit: Metal MRT > Metal ES 3.1 > OpenGL ES 2
	#jira UE-35749

Change 3142292 on 2016/09/27 by Rolando.Caloca

	DR - hlslcc - Fix for warning X3206: implicit truncation of vector type causing error
	#jira UE-31438

Change 3142397 on 2016/09/27 by Mark.Satterthwaite

	Update hlslcc for Mac including RCO's changes in CL #3142292.
	#jira UE-31438

Change 3142438 on 2016/09/27 by Daniel.Wright

	UMapBuildDataRegistry's created for legacy lightmap data are placed in the map package, which avoids problems with cooking

Change 3142452 on 2016/09/27 by Rolando.Caloca

	DR - Proper support for int defines

Change 3142519 on 2016/09/27 by Arne.Schober

	DR - [UE-33438] - Added a Project Setting to enable Skincache Shader Permuations. The Default value for the Skincache mode was changed to enabled. The reasoning behind this was that it will be auto disabled when Skincache Shaders are disabled, and runtime toggle is a debuging feature that mainly programmers are dealing with. The Recompute Tangents option in the Skinned Mesh is now automatically grayed out when no Skincache Shader Permuations are available.

Change 3142537 on 2016/09/27 by Daniel.Wright

	Fixed r.ScreenPercentage with MSAA - a scissor rect was being setup during the resolve and not reset

Change 3142691 on 2016/09/27 by Daniel.Wright

	Disabled renaming of legacy ULightmap2D's to the separate package since UMapBuildDataRegistry is no longer put in a separate package for legacy content

Change 3142711 on 2016/09/27 by Daniel.Wright

	GComponentsWithLegacyLightmaps entries get handled by USceneComponent::AddReferencedObjects, fixes a crash when you open a map directly from the content browser

Change 3142712 on 2016/09/27 by Daniel.Wright

	Separate category for ParticleCutout properties

Change 3142762 on 2016/09/27 by Uriel.Doyon

	Added per static mesh and per skeletal mesh UV density data. The data is now saved and available in cooked builds.
	The density are computed by the engine but can be overridden by the user in the material tabs.

	Texture streaming intermediate component data is now per material instead of per lod-section.

	New ViewModeParam in FSceneViewFamily allowing context specific param per viewmode.
	This is currently used to show which UV channel and which texture index is being
	shown in the texture streaming accuracy viewmodes.
	This replaces r.Streaming.AnalysisIndex

	Renamed texture streaming viewmodes:
	MeshTexCoordSizeAccuracy -> MeshUVDensityAccuracy
	MaterialTexCoordScalesAccuracy -> MaterialTextureScaleAccuracy
	MaterialTexCoordScalesAnalysis -> OutputMaterialTextureScales

	Improved UV density computation and viewmode.

	LightmapUVDensity is now computed separately from UVChannel Density.

	Fixed texture streaming for instanced static mesh component and derived types.

Change 3143464 on 2016/09/28 by Daniel.Wright

	Removed 'experimental' from forward shading setting

Change 3143508 on 2016/09/28 by Chris.Bunner

	Added component type handling to FoldedMath and Length material expressions.
	#jira UE-36304

Change 3143557 on 2016/09/28 by Rolando.Caloca

	DR - Back out changelist 3142292

Change 3143563 on 2016/09/28 by Rolando.Caloca

	DR - vk - Force hlslcc re-link

Change 3143648 on 2016/09/28 by Daniel.Wright

	Moved GetMeshMapBuildData to UStaticMeshComponent since FStaticMeshComponentLODInfo::OwningComponent can't be initialized reliably in the case of SpawnActor off of a blueprint default that has LODData entries already.

Change 3143661 on 2016/09/28 by Chris.Bunner

	Warning fix.

Change 3143723 on 2016/09/28 by Daniel.Wright

	DumpUnbuiltLightIteractions after lighting build for debugging

Change 3143822 on 2016/09/28 by Arne.Schober

	DR - Refactoring of the ViewMatrices. Moved the Derived Matrices into the FViewMatrix struct. Made all members private do emphasize the static constness of that struct after creation. Renamed the heavy weight members on this struct to Compute*. Methods that modify The ViewMatrices have been renamed to Hack* to discurage their use in the future until a better solution for those problems is found. The ViewMatrix modification is especially misleading because it only changes the State of the ViewMatrices to read their Position from the Material Editior as if coming from the Lightsource (mainly for manual bilboards) as well as doing someting similar to generate CPU bilboards for shadows.

Change 3143860 on 2016/09/28 by Benjamin.Hyder

	Updating TM-Noise map to include 3d noise examples

Change 3143939 on 2016/09/28 by Rolando.Caloca

	DR - vk - Better debugging of submissions
	- Added r.Vulkan.IgnoreCPUReads to help track down hangs on some ihvs

Change 3144006 on 2016/09/28 by Brian.Karis

	Fixed PixelError not being set correctly with LOD groups.

	Removed unneeded Simplygon references.
	Mesh reduction module can now be chosen by name with r.MeshReductionModule

Change 3144026 on 2016/09/28 by Benjamin.Hyder

	Updating QA-Effects map to correct numbering issue

Change 3144098 on 2016/09/28 by Arne.Schober

	DR - ViewMatrices Refactoring - Fix UT

Change 3144158 on 2016/09/28 by Rolando.Caloca

	DR - Undo splitting RHI command context

Change 3144952 on 2016/09/29 by Rolando.Caloca

	DR - vk - Missing swapchain flag

Change 3145064 on 2016/09/29 by Olaf.Piesche

	#jira UE-36091

	Pulling range update for vector distributions even when UDist is not dirty; some content has a lookup table and a clean dist, but the range values have not been baked; always pulling them should be safe and not significantly costly.

Change 3145354 on 2016/09/29 by Benjamin.Hyder

	Updating Tm-ContactShadows

Change 3145485 on 2016/09/29 by Daniel.Wright

	Made SeamlessTravelLoadCallback handle legacy lightmaps

Change 3145527 on 2016/09/29 by Daniel.Wright

	Don't clear legacy lightmap annotations on each map - fixes lighting unbuilt when doing seamless travel

Change 3145530 on 2016/09/29 by Simon.Tovey

	UE-36188 - Editor crash when updating hierarchical instance static mesh component

	Dirtied render state rather than unsafe update of bounds.

Change 3145608 on 2016/09/29 by Gil.Gribb

	Attempt to fix a random compiler error under win32

Change 3145749 on 2016/09/29 by Uriel.Doyon

	Fix for static analysis warning

Change 3146091 on 2016/09/29 by Zabir.Hoque

	RHI Interface changes to support PSO based APIs

Change 3146092 on 2016/09/29 by Zabir.Hoque

	D3D12 RHI support for PSO based APIs.

Change 3146590 on 2016/09/30 by Gil.Gribb

	Merging //UE4/Dev-Main@3146520 to Dev-Rendering (//UE4/Dev-Rendering)

Change 3146731 on 2016/09/30 by Rolando.Caloca

	DR - Fix merge conflicts

Change 3146778 on 2016/09/30 by Rolando.Caloca

	DR - More integration compile fixes

Change 3146790 on 2016/09/30 by Rolando.Caloca

	DR - Integration fix

Change 3146849 on 2016/09/30 by Rolando.Caloca

	DR - Final integration fix

Change 3146899 on 2016/09/30 by Daniel.Wright

	Static analysis fix for dereferencing World

Change 3147020 on 2016/09/30 by Rolando.Caloca

	DR - vk - Fix depth issue on AMD cards
	- Added VULKAN_KEEP_CREATE_INFO to help debugging creation
	- Added num color attachments to pipeline key

Change 3147034 on 2016/09/30 by Rolando.Caloca

	DR - Fix Kite crash where shader pipelines were optimizing non-tessellation pipelines
	#jira UE-36277
	#jira UE-36500

Change 3147080 on 2016/09/30 by Rolando.Caloca

	DR - vk - Disable debug info by default

Change 3147082 on 2016/09/30 by Chris.Bunner

	Allow tessellation to be used with DrawTile calls by swapping fixed mesh to triangle list.
	#jira UE-36491

Change 3147388 on 2016/09/30 by Chris.Bunner

	Blacklisted Nvidia driver 372.70 as it has known stability issues skewing our top crashes list. Also updated recommended version numbers.
	#jira UE-35288

Change 3147394 on 2016/09/30 by Chris.Bunner

	Additional logging for rare error.
	#jira UE-35812

Change 3147459 on 2016/09/30 by Rolando.Caloca

	DR - vk - Some more srgb formats

Change 3147537 on 2016/09/30 by Rolando.Caloca

	DR - vk - Standarize srgb flag like D3D11
	- Minor FVulkanShader cleanup

Change 3147620 on 2016/09/30 by Olaf.Piesche

	#jira UE=34486
	particle component tick function task can be invalid during pause; add check

Change 3148028 on 2016/10/01 by Daniel.Wright

	Renamed RenderingSettings.cpp to match header

Change 3148059 on 2016/10/01 by Daniel.Wright

	Disabled reparenting in the profiler which is disorienting

Change 3148067 on 2016/10/01 by Daniel.Wright

	Support for ReflectionEnvironment and light type show flags with ForwardShading

Change 3148069 on 2016/10/01 by Daniel.Wright

	Added CapsuleIndirectShadowMinVisibility to SkinnedMeshComponent, so artists have control over indirect capsule shadow darkness without changing cvars

Change 3148072 on 2016/10/01 by Daniel.Wright

	Added a rendering setting to disable the new lightmap mixing behavior, where smooth surfaces don't have any mixing.  r.ReflectionEnvironmentLightmapMixBasedOnRoughness

Change 3148073 on 2016/10/01 by Daniel.Wright

	r.VertexFoggingForOpaque only affects forward shading - manual copy of Ben's fix from Orion stream

Change 3148074 on 2016/10/01 by Daniel.Wright

	Enabled planar reflection receiving on the material used for the preview of a APlanarReflection

Change 3148084 on 2016/10/01 by Daniel.Wright

	Fixed reflections on Surface TranslucencyVolume in deferred

Change 3148085 on 2016/10/01 by Daniel.Wright

	Fixed planar reflection composite being done too many times in stereo deferred

Change 3148086 on 2016/10/01 by Daniel.Wright

	Clamp IndirectLightingQuality to 1 in preview builds - keeps preview useful even with IndirectLightingQuality jacked up to 10.

Change 3148107 on 2016/10/01 by Daniel.Wright

	CIS fix

Change 3148113 on 2016/10/01 by Daniel.Wright

	Translucency lighting modes for forward shading
	* Per-vertex modes use GetSimpleDynamicLighting since they can't support specular anyway

Change 3148306 on 2016/10/02 by Rolando.Caloca

	DR - vk - Fix for some NV drivers on Win10

Change 3148307 on 2016/10/02 by Rolando.Caloca

	DR - vk - Compute pipeline

Change 3148358 on 2016/10/02 by Rolando.Caloca

	DR - vk - Consolidate and renumber enum for binding types

Change 3148396 on 2016/10/03 by Rolando.Caloca

	DR - vk - Warning fix

Change 3148697 on 2016/10/03 by Benjamin.Hyder

	Submitting M_Chromebal after enabling planar reflectionsl

Change 3148799 on 2016/10/03 by Rolando.Caloca

	DR - vk - static analysis fix

Change 3148934 on 2016/10/03 by Chris.Bunner

	Added pre-skinned local position material graph node, vertex shader only.

Change 3148994 on 2016/10/03 by Chris.Bunner

	Added missing header file.

Change 3149085 on 2016/10/03 by Daniel.Wright

	Support for ReflectionEnvironment show flag in base pass reflections without any shader overhead

Change 3149095 on 2016/10/03 by Rolando.Caloca

	DR - vk - Disable new render passes

Change 3149125 on 2016/10/03 by Rolando.Caloca

	DR - vk - Fix for multiple memory types

Change 3149181 on 2016/10/03 by Rolando.Caloca

	DR - Better message when missing pipelines

Change 3149215 on 2016/10/03 by Rolando.Caloca

	DR - RHIClearColor -> RHIClearColorTexture
	#tests Orion Editor run match on Agora_P

Change 3149288 on 2016/10/03 by Chris.Bunner

	Added PreTonemapHDRColor for buffer visualization and target output.
	#jira UE-36333

Change 3149402 on 2016/10/03 by Daniel.Wright

	Light attenuation buffer is now multisampled, fixes preshadows with MSAA (depth testing failed during stencil pass) but adds a resolve (.12ms at VR res)

Change 3149403 on 2016/10/03 by Daniel.Wright

	Forward lighting supports lighting channels

Change 3149574 on 2016/10/03 by Marcus.Wassmer

	PR #2817: Ansel/Photography system (Contributed by adamnv)
	Modified to become a plugin

Change 3149615 on 2016/10/03 by Rolando.Caloca

	DR - vk - Fix PF_G16R16 which fixes reflections

Change 3149639 on 2016/10/03 by Olaf.Piesche

	Adding more ensures to catch NaNs occasionally appearing in particle locations early

Change 3149745 on 2016/10/03 by Uriel.Doyon

	Moved UVDensity computation in the staticmesh DDC.

Change 3149749 on 2016/10/03 by Daniel.Wright

	Fixed lightmaps on BSP, which was fallout from Lighting Scenarios backwards compatibility

Change 3149755 on 2016/10/03 by Benjamin.Hyder

	Checking in built lighting for QA-postprocessing

Change 3149758 on 2016/10/03 by Benjamin.Hyder

	re-submitting built lighting for QA-PostProcessing

Change 3149940 on 2016/10/04 by Gil.Gribb

	Merging //UE4/Dev-Main@3149754 to Dev-Rendering (//UE4/Dev-Rendering)

Change 3150098 on 2016/10/04 by Marcus.Wassmer

	Fix some clang and win32 errors

Change 3150323 on 2016/10/04 by Rolando.Caloca

	DR - vk - Static analysis fix

Change 3150456 on 2016/10/04 by Daniel.Wright

	Revert temp logs

Change 3150731 on 2016/10/04 by Daniel.Wright

	Static lights now add a dummy map build data entry for their ULightComponent::IsPrecomputedLightingValid

Change 3150795 on 2016/10/04 by Marcus.Wassmer

	Fix RHIClearUAV and Drawindirect bugs on PS4.
	Also fix PS4 compile error from bad merge.

Change 3151065 on 2016/10/04 by Ben.Marsh

	Merging //UE4/Dev-Main to Dev-Rendering (//UE4/Dev-Rendering)

Change 3151134 on 2016/10/04 by Brian.Karis

	Fixed corrupt mesh generation from quadric simplifier due to uninitialized color array.

Change 3151201 on 2016/10/04 by Marcus.Wassmer

	Nvidia approved icon for ansel plugin.

Change 3151240 on 2016/10/04 by Marcus.Wassmer

	Fix string concat build error.

Change 3151258 on 2016/10/04 by Ben.Marsh

	Fix compile error.

Change 3151290 on 2016/10/04 by Marcus.Wassmer

	Bumping static mesh DDC key to hopefully fix distancefield crashes after brian's quadric simplifier fix.

Change 3152104 on 2016/10/05 by Chris.Bunner

	Workaround for legacy BreakMA material node invalid component masks.
	#jira UE-36832

Change 3152130 on 2016/10/05 by Ben.Woodhouse

	Fix issue with skylight SH and fast semantics on DX11. We need to clear the cube scratch textures before writing to them to avoid issues when reading them back for mip downsampling
	#jira UE-35890

Change 3152240 on 2016/10/05 by Rolando.Caloca

	DR - Fix for missing gizmo colors
	#jira UE-36515

Change 3152338 on 2016/10/05 by Daniel.Wright

	Hopeful fix for FDistanceFieldVolumeTexture assert in the cooker

Change 3152833 on 2016/10/05 by Brian.Karis

	Improved precision of quadrics. Fixes bad triangles on large meshes

Change 3153376 on 2016/10/06 by Rolando.Caloca

	DR - Fix for SM4 missing pipelines fallout

Change 3153650 on 2016/10/06 by Gil.Gribb

	Merging //UE4/Dev-Main@3153068 to Dev-Rendering (//UE4/Dev-Rendering)

Change 3153656 on 2016/10/06 by Uriel.Doyon

	Fixed main integration compilation issues.
	Some of the Mesh UVDensity UI is temporary disabled.

Change 3153725 on 2016/10/06 by Uriel.Doyon

	Fixed crash when source data is missing for lightmaps
	#jira UE-36157

Change 3153998 on 2016/10/06 by Gil.Gribb

	Merging //UE4/Dev-Main to Dev-Rendering@3153705 (//UE4/Dev-Rendering)

Change 3154056 on 2016/10/06 by Marcus.Wassmer

	Fix compile errors from merge.  Also restore some light scencario code

Change 3154176 on 2016/10/06 by Marcus.Wassmer

	Fix deprecation warning

Change 3154252 on 2016/10/06 by Marcus.Wassmer

	Fix more deprecation warnings

Change 3154632 on 2016/10/07 by Chris.Bunner

	Fix for incorrect re-entrant detection with a function called twice in a row. The function input Preview expression is overridden when the function is called to link it into the caller graph, but it was restored too late for chained calls to the same function.
	#jira UE-37002

[CL 3154728 by Gil Gribb in Main branch]
2016-10-07 10:20:36 -04:00

655 lines
20 KiB
C++

// Copyright 1998-2016 Epic Games, Inc. All Rights Reserved.
#include "TaskGraphPrivatePCH.h"
#include "SlateBasics.h"
#include "TaskGraphInterfaces.h"
#include "VisualizerEvents.h"
#include "SGraphBar.h"
#include "SBarVisualizer.h"
#include "STimeline.h"
#include "TaskGraphStyle.h"
BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION
void SBarVisualizer::Construct( const FArguments& InArgs )
{
ZoomSliderValue = 0.0f;
ScrollbarOffset = 0.0f;
ProfileData = InArgs._ProfileData.Get();
OnBarGraphSelectionChangedDelegate = InArgs._OnBarGraphSelectionChanged;
OnBarGraphExpansionChangedDelegate = InArgs._OnBarGraphExpansionChanged;
OnBarEventSelectionChangedDelegate = InArgs._OnBarEventSelectionChanged;
OnBarGraphContextMenuDelegate = InArgs._OnBarGraphContextMenu;
bSuppressBarGraphSelectionChangedDelegate = false;
ViewMode = EVisualizerViewMode::Hierarchical;
SelectedBarGraph = ProfileData;
CreateDataView();
// Drop down menu
const bool bInShouldCloseWindowAfterMenuSelection = true;
FMenuBuilder ViewMenuBuilder( bInShouldCloseWindowAfterMenuSelection, NULL );
{
FUIAction Action( FExecuteAction::CreateSP( this, &SBarVisualizer::SetViewMode, EVisualizerViewMode::Hierarchical ),
FCanExecuteAction(),
FIsActionChecked::CreateSP( this, &SBarVisualizer::CheckViewMode, EVisualizerViewMode::Hierarchical ) );
ViewMenuBuilder.AddMenuEntry( NSLOCTEXT("SBarVisualizer", "Hierarchical", "Hierarchical"), FText(), FSlateIcon(), Action, NAME_None, EUserInterfaceActionType::Check );
}
{
FUIAction Action( FExecuteAction::CreateSP( this, &SBarVisualizer::SetViewMode, EVisualizerViewMode::Flat ),
FCanExecuteAction(),
FIsActionChecked::CreateSP( this, &SBarVisualizer::CheckViewMode, EVisualizerViewMode::Flat ) );
ViewMenuBuilder.AddMenuEntry( NSLOCTEXT("SBarVisualizer", "Flat", "Flat"), FText(), FSlateIcon(), Action, NAME_None, EUserInterfaceActionType::Check );
}
const FSlateBrush* HomeButtonBrush = FTaskGraphStyle::Get()->GetBrush( "TaskGraph.Home" );
const FSlateBrush* ToParentButtonBrush = FTaskGraphStyle::Get()->GetBrush( "TaskGraph.ToParent" );
this->ChildSlot
[
SNew( SVerticalBox )
+SVerticalBox::Slot().AutoHeight() .Padding( 2 ) .VAlign( VAlign_Fill )
[
SNew( SBorder )
.BorderImage( FTaskGraphStyle::Get()->GetBrush("StatsHeader") )
.ForegroundColor( FTaskGraphStyle::Get()->GetSlateColor("DefaultForeground") )
[
SNew(SHorizontalBox)
+SHorizontalBox::Slot().AutoWidth() .Padding( 2 ) .HAlign( HAlign_Left )
[
SNew(SButton)
.ButtonStyle( FCoreStyle::Get(), "NoBorder" )
.ForegroundColor( FSlateColor::UseForeground() )
.ContentPadding(FMargin(0))
.Visibility( this, &SBarVisualizer::GetToParentButtonVisibility )
.OnClicked( this, &SBarVisualizer::OnToParentClicked )
[
SNew(SImage)
.Image( ToParentButtonBrush )
]
]
+SHorizontalBox::Slot().AutoWidth().Padding( 2 ).HAlign( HAlign_Left )
[
SNew(SButton)
.ButtonStyle( FCoreStyle::Get(), "NoBorder" )
.HAlign(HAlign_Center)
.VAlign(VAlign_Center)
.ForegroundColor( FSlateColor::UseForeground() )
.ContentPadding(FMargin(0))
.Visibility( this, &SBarVisualizer::GetHomeButtonVisibility )
.OnClicked( this, &SBarVisualizer::OnHomeClicked )
[
SNew(SImage)
.Image( HomeButtonBrush )
]
]
+SHorizontalBox::Slot() .Padding( 2 ) .FillWidth( 20 ) .HAlign( HAlign_Fill )
[
SNew( STextBlock )
.Text( this, &SBarVisualizer::GetSelectedCategoryName )
]
+SHorizontalBox::Slot().AutoWidth() .HAlign( HAlign_Right ) .Padding( FMargin(1.0f, 2.0f, 1.0f, 2.0f) )
[
SNew( SComboButton )
//.ToolTipText(NSLOCTEXT("PropertyEditor", "ResetToDefaultToolTip", "Reset to Default").ToString())
.HasDownArrow( false )
.ButtonStyle( FCoreStyle::Get(), "NoBorder" )
.ContentPadding(0)
.ButtonContent()
[
SNew(SImage)
.Image( FTaskGraphStyle::Get()->GetBrush("TaskGraph.MenuDropdown") )
]
.MenuContent()
[
ViewMenuBuilder.MakeWidget()
]
]
]
]
+SVerticalBox::Slot() .Padding( 2 ) .FillHeight( 1 ) .VAlign( VAlign_Fill )
[
SNew(SHorizontalBox)
+SHorizontalBox::Slot() .Padding( 2 ) .FillWidth( 1 ) .HAlign( HAlign_Fill )
[
// List of thread graphs
SAssignNew( BarGraphsList, SListView< TSharedPtr< FVisualizerEvent > > )
// List view items are this tall
.ItemHeight( 24 )
// Tell the list view where to get its source data
.ListItemsSource( &ProfileDataView )
// When the list view needs to generate a widget for some data item, use this method
.OnGenerateRow( this, &SBarVisualizer::OnGenerateWidgetForList )
// Single selection mode
.SelectionMode( ESelectionMode::Single )
// Selection changed callback
.OnSelectionChanged( this, &SBarVisualizer::OnBarGraphSelectionChanged )
]
]
+SVerticalBox::Slot().AutoHeight() .Padding( 2 ) .VAlign( VAlign_Fill )
[
SAssignNew( Timeline, STimeline )
.MinValue(0.0f)
.MaxValue(SelectedBarGraph->DurationMs)
]
+SVerticalBox::Slot().AutoHeight() .Padding( 2 ) .VAlign( VAlign_Fill )
[
SAssignNew( ScrollBar, SScrollBar )
.Orientation( Orient_Horizontal )
.OnUserScrolled( this, &SBarVisualizer::ScrollBar_OnUserScrolled )
]
+SVerticalBox::Slot().AutoHeight() .Padding( 2 ) .VAlign( VAlign_Fill )
[
SNew( SHorizontalBox )
+SHorizontalBox::Slot()
.Padding( 2 )
.FillWidth( 1 )
.HAlign( HAlign_Fill )
[
SAssignNew( ZoomLabel, STextBlock )
.Text( this, &SBarVisualizer::GetZoomLabel )
]
+SHorizontalBox::Slot()
.Padding( 2 )
.FillWidth( 5 )
.HAlign( HAlign_Fill )
[
SNew( SSlider )
.Value( this, &SBarVisualizer::GetZoomValue )
.OnValueChanged( this, &SBarVisualizer::OnSetZoomValue )
]
]
];
ScrollBar->SetState(0.0f, 1.0f);
}
END_SLATE_FUNCTION_BUILD_OPTIMIZATION
void SBarVisualizer::ScrollBar_OnUserScrolled( float InScrollOffsetFraction )
{
if( ZoomSliderValue > 0.0f )
{
const float MaxOffset = GetMaxScrollOffsetFraction();
const float MaxGraphOffset = GetMaxGraphOffset();
InScrollOffsetFraction = FMath::Clamp( InScrollOffsetFraction, 0.0f, MaxOffset );
float GraphOffset = -( InScrollOffsetFraction / MaxOffset ) * MaxGraphOffset;
ScrollBar->SetState( InScrollOffsetFraction, 1.0f / GetZoom() );
for( int32 Index = 0; Index < Graphs.Num(); Index++ )
{
Graphs[ Index ]->SetOffset( GraphOffset );
}
Timeline->SetOffset( GraphOffset );
ScrollbarOffset = GraphOffset;
}
}
FText SBarVisualizer::GetZoomLabel() const
{
static const FNumberFormattingOptions ZoomFormatOptions = FNumberFormattingOptions()
.SetMinimumFractionalDigits(2)
.SetMaximumFractionalDigits(2);
return FText::Format( NSLOCTEXT("TaskGraph", "ZoomLabelFmt", "Zoom: {0}x"), FText::AsNumber(GetZoom(), &ZoomFormatOptions) );
}
float SBarVisualizer::GetZoomValue() const
{
return ZoomSliderValue;
}
void SBarVisualizer::OnSetZoomValue( float NewValue )
{
const float PrevZoom = GetZoom();
const float PrevVisibleRange = 1.0f / PrevZoom;
ZoomSliderValue = NewValue;
const float Zoom = GetZoom();
float GraphOffset = 0.0f;
float ScrollOffsetFraction = 0.0f;
if( Graphs.Num() )
{
const float MaxOffset = GetMaxScrollOffsetFraction();
const float MaxGraphOffset = GetMaxGraphOffset();
const float PrevGraphOffset = -Graphs[ 0 ]->GetOffset();
GraphOffset = FMath::Clamp( -Graphs[ 0 ]->GetOffset(), 0.0f, MaxGraphOffset );
const float VisibleRange = 1.0f / GetZoom();
const float PrevGraphCenterValue = PrevGraphOffset / PrevZoom + PrevVisibleRange * 0.5f;
const float NewGraphCenterValue = GraphOffset / Zoom + VisibleRange * 0.5f;
GraphOffset += ( PrevGraphCenterValue - NewGraphCenterValue ) * Zoom;
GraphOffset = FMath::Clamp( GraphOffset, 0.0f, MaxGraphOffset );
ScrollOffsetFraction = FMath::Clamp( MaxOffset * GraphOffset / MaxGraphOffset, 0.0f, MaxOffset );
}
ScrollBar->SetState( ScrollOffsetFraction, 1.0f / Zoom );
for( int32 Index = 0; Index < Graphs.Num(); Index++ )
{
Graphs[ Index ]->SetZoom( Zoom );
Graphs[ Index ]->SetOffset( -GraphOffset );
}
Timeline->SetZoom( Zoom );
Timeline->SetOffset( -GraphOffset );
ScrollbarOffset = -GraphOffset;
}
void SBarVisualizer::OnBarGraphSelectionChanged( TSharedPtr< FVisualizerEvent > Selection, ESelectInfo::Type SelectInfo )
{
if( Selection.IsValid() )
{
BarGraphsList->RequestListRefresh();
}
if( !bSuppressBarGraphSelectionChangedDelegate )
{
OnBarGraphSelectionChangedDelegate.ExecuteIfBound( Selection );
}
}
void SBarVisualizer::ClearBarSelection( TSharedPtr< FVisualizerEvent > GraphEvents, TSharedPtr<FVisualizerEvent> Selection )
{
for( int32 ChildIndex = 0; ChildIndex < GraphEvents->Children.Num(); ChildIndex++ )
{
// Don't clear selection on the event to be selected
if ( Selection != GraphEvents->Children[ ChildIndex ] )
{
GraphEvents->Children[ ChildIndex ]->IsSelected = false;
}
ClearBarSelection( GraphEvents->Children[ ChildIndex ], Selection );
}
}
void SBarVisualizer::OnBarEventSelectionChanged( TSharedPtr<FVisualizerEvent> Selection, ESelectInfo::Type SelectInfo, int32 BarId )
{
HandleEventSelectionChanged( Selection );
OnBarEventSelectionChangedDelegate.ExecuteIfBound( BarId, Selection );
}
TSharedPtr< FVisualizerEvent > SBarVisualizer::FindSelectedEventsParent( TArray< TSharedPtr< FVisualizerEvent > >& BarGraphs, TSharedPtr< FVisualizerEvent > Selection )
{
for( int32 Index = 0; Index < BarGraphs.Num(); Index++ )
{
if( BarGraphs[ Index ]->Children.Contains( Selection ) )
{
return BarGraphs[ Index ];
}
TSharedPtr< FVisualizerEvent > SelectionParent = FindSelectedEventsParent( BarGraphs[ Index ]->Children, Selection );
if ( SelectionParent.IsValid() )
{
return SelectionParent;
}
}
return TSharedPtr< FVisualizerEvent >();
}
void SBarVisualizer::HandleEventSelectionChanged( TSharedPtr< FVisualizerEvent > Selection )
{
// Clear any selected events from the other bar graphs
const int32 BarId = Selection.IsValid() ? Selection->Category : INDEX_NONE;
int32 BarIndex = INDEX_NONE;
TSharedPtr< FVisualizerEvent > Root = ProfileData;
while ( Root->ParentEvent.IsValid() )
{
Root = Root->ParentEvent;
}
ClearBarSelection( Root, Selection );
// Since we're changing the selection as a result of selection change we don't want to create an infinite loop
bSuppressBarGraphSelectionChangedDelegate = true;
BarGraphsList->ClearSelection();
if( Selection.IsValid() )
{
// Check if one of the bars has been selected
bool BarGraphFound = false;
for( int32 Index = 0; Index < ProfileDataView.Num() && BarGraphFound == false; Index++ )
{
TSharedPtr< FVisualizerEvent > BarGraph = ProfileDataView[ Index ];
if( BarGraph->EventName == Selection->EventName )
{
BarGraphsList->SetSelection( BarGraph );
BarGraphsList->RequestScrollIntoView( BarGraph );
BarGraphFound = true;
}
}
}
bSuppressBarGraphSelectionChangedDelegate = false;
}
BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION
TSharedRef<ITableRow> SBarVisualizer::OnGenerateWidgetForList( TSharedPtr<FVisualizerEvent> InItem, const TSharedRef<STableViewBase>& OwnerTable )
{
TSharedPtr<SGraphBar> RowGraph = SNew( SGraphBar )
.OnSelectionChanged( this, &SBarVisualizer::OnBarEventSelectionChanged, InItem->Category )
.OnGeometryChanged( this, &SBarVisualizer::OnBarGeometryChanged );
const double EventsStartTime = InItem->ParentEvent.IsValid() ? InItem->ParentEvent->Start : 0.0;
const double EventsEndTime = InItem->ParentEvent.IsValid() ? InItem->ParentEvent->Duration : 1.0;
RowGraph->SetEvents( InItem->Children, EventsStartTime, EventsEndTime );
Graphs.Add( RowGraph );
RowGraph->SetZoom( GetZoom() );
RowGraph->SetOffset( ScrollbarOffset );
TSharedPtr<SWidget> BarTitle;
if( IsExpandable( InItem ) )
{
BarTitle = SNew( SHorizontalBox )
+SHorizontalBox::Slot()
.AutoWidth()
[
SNew(SButton)
.ButtonStyle( FCoreStyle::Get(), "NoBorder" )
.ForegroundColor( FSlateColor::UseForeground() )
.ContentPadding(FMargin(0))
.OnClicked( this, &SBarVisualizer::ExpandBar, InItem )
[
SNew(SBorder)
.BorderImage( FCoreStyle::Get().GetBrush("NoBorder") )
.HAlign(HAlign_Center)
.VAlign(VAlign_Center)
.Padding(0)
[
SNew(SImage)
.Image( FCoreStyle::Get().GetBrush( "TreeArrow_Collapsed" ) )
]
]
]
+SHorizontalBox::Slot()
.AutoWidth()
[
SNew( STextBlock ).Text( FText::FromString(InItem->EventName) )
];
}
else
{
BarTitle = SNew( STextBlock ).Text( FText::FromString(InItem->EventName) );
}
return SNew( STableRow< TSharedPtr< FVisualizerEvent > >, OwnerTable )
[
SNew( SBorder )
.Padding(0)
.BorderImage( FCoreStyle::Get().GetBrush("NoBorder") )
// Handle right-click event for context menu
.OnMouseButtonDown( this, &SBarVisualizer::OnBarRightClicked, InItem )
[
SNew( SVerticalBox )
+SVerticalBox::Slot()
.AutoHeight()
[
BarTitle.ToSharedRef()
]
+SVerticalBox::Slot()
.AutoHeight()
[
RowGraph.ToSharedRef()
]
]
];
}
END_SLATE_FUNCTION_BUILD_OPTIMIZATION
/** Checks if the selected event has children with children */
bool SBarVisualizer::IsExpandable( TSharedPtr< FVisualizerEvent > InEvent )
{
for( int32 ChildIndex = 0; ChildIndex < InEvent->Children.Num(); ChildIndex++ )
{
if( InEvent->Children[ ChildIndex ]->Children.Num() > 0 )
{
return true;
}
}
return false;
}
void SBarVisualizer::OnGetChildrenForList( TSharedPtr<FVisualizerEvent> InItem, TArray<TSharedPtr<FVisualizerEvent> >& OutChildren )
{
OutChildren = InItem->Children;
}
FReply SBarVisualizer::OnBarRightClicked( const FGeometry& BarGeometry, const FPointerEvent& MouseEvent, TSharedPtr<FVisualizerEvent> Selection )
{
if( MouseEvent.GetEffectingButton() == EKeys::RightMouseButton )
{
if(OnBarGraphContextMenuDelegate.IsBound())
{
// Forward the event to the visualizer main frame
// Disabled for now, may be useful in the future
return FReply::Handled();
}
}
return FReply::Unhandled();
}
void SBarVisualizer::CreateFlattenedData( TSharedPtr< FVisualizerEvent > InData, TArray< TSharedPtr< FVisualizerEvent > >& FlattenedData )
{
for( int32 EventIndex = 0; EventIndex < InData->Children.Num(); EventIndex++ )
{
TSharedPtr< FVisualizerEvent > Event = InData->Children[ EventIndex ];
TSharedPtr< FVisualizerEvent > FlattendedDataSet;
if( Event->Category >= FlattenedData.Num() || FlattenedData[ Event->Category ].IsValid() == false )
{
// Fill with empty categories if necessary
for( int32 CategoryIndex = FlattenedData.Num(); CategoryIndex <= Event->Category; CategoryIndex++ )
{
FlattenedData.Add( TSharedPtr< FVisualizerEvent >() );
}
// Create a separate data set for this category (thread)
FlattendedDataSet = MakeShareable< FVisualizerEvent >( new FVisualizerEvent( 0.0, 1.0, 0.0, Event->Category, Event->EventName ) );
FlattendedDataSet->Category = Event->Category;
FlattenedData[ Event->Category ] = FlattendedDataSet;
// Get the category name by looking for the first occurence of the category in the tree
for( TSharedPtr< FVisualizerEvent > CategoryData = Event->ParentEvent; CategoryData.IsValid() && FlattendedDataSet->EventName.IsEmpty(); CategoryData = CategoryData->ParentEvent )
{
if( CategoryData->ParentEvent.IsValid() == false || CategoryData->ParentEvent->Category != Event->Category )
{
FlattendedDataSet->EventName = CategoryData->EventName;
}
}
}
else
{
FlattendedDataSet = FlattenedData[ Event->Category ];
}
// Fill with events
if( InData->Children[ EventIndex ]->Children.Num() == 0 )
{
FlattendedDataSet->Children.Add( InData->Children[ EventIndex ] );
}
}
for( int32 ChildIndex = 0; ChildIndex < InData->Children.Num(); ChildIndex++ )
{
CreateFlattenedData( InData->Children[ ChildIndex ], FlattenedData );
}
}
void SBarVisualizer::CreateDataView()
{
// Each time new data set is being displayed, clear all cached Bar Graphs
Graphs.Empty();
if( ViewMode == EVisualizerViewMode::Flat )
{
ProfileDataView.Empty();
TArray< TSharedPtr< FVisualizerEvent > > FlattenedBarGraphData;
// At the top level each bar may represent a different subset of data (like a thread) so only flatten within one data set
CreateFlattenedData( ProfileData, FlattenedBarGraphData );
ProfileDataView.Append( FlattenedBarGraphData );
}
else
{
// Default to hierarchical. Choose the selected subset
if( SelectedBarGraph.IsValid() == false )
{
ProfileDataView.Empty( 1 );
ProfileDataView.Add( ProfileData );
}
else
{
ProfileDataView.Empty( SelectedBarGraph->Children.Num() );
// Get all leaf events into one bar graph
TArray< TSharedPtr< FVisualizerEvent > > LeafEvents;
for( int32 EventIndex = 0; EventIndex < SelectedBarGraph->Children.Num(); EventIndex++ )
{
TSharedPtr< FVisualizerEvent > Event = SelectedBarGraph->Children[ EventIndex ];
if( Event->Children.Num() == 0 )
{
LeafEvents.Add( Event );
}
else
{
ProfileDataView.Add( Event );
}
}
if( LeafEvents.Num() > 0 )
{
TSharedPtr< FVisualizerEvent > LeafEventsBarGraph( new FVisualizerEvent( SelectedBarGraph->Start, SelectedBarGraph->Duration, SelectedBarGraph->DurationMs, SelectedBarGraph->Category, SelectedBarGraph->EventName + TEXT(" Leaf Events") ) );
LeafEventsBarGraph->ParentEvent = SelectedBarGraph;
LeafEventsBarGraph->Children = LeafEvents;
ProfileDataView.Add( LeafEventsBarGraph );
}
}
}
}
void SBarVisualizer::SetViewMode( EVisualizerViewMode::Type InMode )
{
ViewMode = InMode;
SelectedBarGraph = ProfileData;
CreateDataView();
BarGraphsList->RequestListRefresh();
OnBarGraphExpansionChangedDelegate.ExecuteIfBound( SelectedBarGraph );
}
FReply SBarVisualizer::OnToParentClicked()
{
if( SelectedBarGraph.IsValid() && SelectedBarGraph->ParentEvent.IsValid() )
{
SelectedBarGraph = SelectedBarGraph->ParentEvent;
CreateDataView();
BarGraphsList->RequestListRefresh();
OnBarGraphExpansionChangedDelegate.ExecuteIfBound( SelectedBarGraph );
AdjustTimeline( SelectedBarGraph );
}
return FReply::Handled();
}
FReply SBarVisualizer::OnHomeClicked()
{
SelectedBarGraph = ProfileData;
CreateDataView();
BarGraphsList->RequestListRefresh();
OnBarGraphExpansionChangedDelegate.ExecuteIfBound( SelectedBarGraph );
AdjustTimeline( SelectedBarGraph );
return FReply::Handled();
}
void SBarVisualizer::OnBarGeometryChanged( FGeometry Geometry )
{
Timeline->SetDrawingGeometry( Geometry );
}
FText SBarVisualizer::GetSelectedCategoryName() const
{
if( SelectedBarGraph.IsValid() )
{
FString EventName( SelectedBarGraph->EventName );
for( TSharedPtr< FVisualizerEvent > BarGraph = SelectedBarGraph->ParentEvent; BarGraph.IsValid(); BarGraph = BarGraph->ParentEvent )
{
EventName = BarGraph->EventName + TEXT("\\") + EventName;
}
return FText::FromString(EventName);
}
else
{
return NSLOCTEXT("SBarVisualizer", "Frame", "Frame");
}
}
EVisibility SBarVisualizer::GetHomeButtonVisibility() const
{
if( SelectedBarGraph.IsValid() && SelectedBarGraph->ParentEvent.IsValid() && SelectedBarGraph->ParentEvent->ParentEvent.IsValid() )
{
return EVisibility::Visible;
}
else
{
return EVisibility::Collapsed;
}
}
EVisibility SBarVisualizer::GetToParentButtonVisibility() const
{
if( SelectedBarGraph.IsValid() && SelectedBarGraph->ParentEvent.IsValid() )
{
return EVisibility::Visible;
}
else
{
return EVisibility::Collapsed;
}
}
FReply SBarVisualizer::ExpandBar( TSharedPtr<FVisualizerEvent> BarGraphEvents )
{
if( BarGraphEvents.IsValid() && BarGraphEvents->Children.Num() > 0 )
{
SelectedBarGraph = BarGraphEvents;
CreateDataView();
BarGraphsList->RequestListRefresh();
OnBarGraphExpansionChangedDelegate.ExecuteIfBound( SelectedBarGraph );
// Set Timeline scale appropriate for the selected events
AdjustTimeline( BarGraphEvents );
}
return FReply::Handled();
}
void SBarVisualizer::AdjustTimeline( TSharedPtr< FVisualizerEvent > InEvent )
{
check( InEvent.IsValid() );
const double TotalTimeMs = InEvent->DurationMs / InEvent->Duration;
const double StartMs = InEvent->Start * TotalTimeMs;
Timeline->SetMinMaxValues( StartMs, StartMs + InEvent->DurationMs );
}