/// <summary> /// Pass the graph plot through the velocity compute shader, to adjust the node velocity based on the positions of other nodes /// </summary> /// <param name="RSetDesc">Position shader resource set</param> /// <param name="cl">Commandlist to run the commands on</param> /// <param name="plot">PlottedGraph to compute</param> /// <param name="delta">A float representing how much time has passed since the last frame. Higher values => bigger movements</param> private void RenderVelocity(ResourceSetDescription RSetDesc, CommandList cl, PlottedGraph plot, float delta) { //if (GlobalConfig.Settings.Logs.BulkLogging) Logging.RecordLogEvent($"RenderVelocity {this.EngineID}", Logging.LogFilterType.BulkDebugLogFile); _timer.Restart(); cl.Begin(); ResourceSet resourceSet = _gd.ResourceFactory.CreateResourceSet(RSetDesc); uint nodeCount = (uint)plot.RenderedNodeCount(); //if (GlobalConfig.Settings.Logs.BulkLogging) Logging.RecordLogEvent($"RenderVelocityBlocks {this.EngineID}", Logging.LogFilterType.BulkDebugLogFile); GraphLayoutState layout = plot.LayoutState; VelocityShaderParams parameters = new VelocityShaderParams { delta = delta, //not used temperature = Math.Min(plot.Temperature, GlobalConfig.MaximumNodeTemperature), repulsionK = GlobalConfig.RepulsionK, nodeCount = nodeCount }; Debug.Assert(nodeCount <= (layout.VelocitiesVRAM1 !.SizeInBytes / 16)); //if (GlobalConfig.Settings.Logs.BulkLogging) Logging.RecordLogEvent($"RenderVelocity {this.EngineID} submit", Logging.LogFilterType.BulkDebugLogFile); cl.UpdateBuffer(_velocityParamsBuffer, 0, parameters); cl.SetPipeline(_velocityComputePipeline); cl.SetComputeResourceSet(0, resourceSet); //16 == sizeof(Vector4) uint elemCount = layout.VelocitiesVRAM1 !.SizeInBytes / 16; uint grpSizeX = (uint)Math.Ceiling(elemCount / 256.0); //Console.WriteLine($"VRAM Size: {layout.VelocitiesVRAM1!.SizeInBytes}bytes, WkX: {grpSizeX}, nodeCount: {nodeCount}, bufVel4Count: {layout.VelocitiesVRAM1!.SizeInBytes/16}"); cl.Dispatch(grpSizeX, 1, 1); //_cl.Dispatch((uint)Math.Ceiling(layout.VelocitiesVRAM1!.SizeInBytes / (256.0 * 16)), 1, 1); //if (GlobalConfig.Settings.Logs.BulkLogging) Logging.RecordLogEvent($"RenderVelocity {this.EngineID} done in {watch.ElapsedMilliseconds} MS", Logging.LogFilterType.BulkDebugLogFile); cl.End(); _timer.Stop(); VelocitySetupTime = _timer.Elapsed.TotalMilliseconds; _timer.Restart(); _gd !.SubmitCommands(cl); _gd !.WaitForIdle(); _gd.DisposeWhenIdle(resourceSet); _timer.Stop(); VelocityTime = _timer.Elapsed.TotalMilliseconds; }
/// <summary> /// Pass the graph plot through the velocity compute shader, to adjust the node velocity based on the positions of other nodes /// </summary> /// <param name="RSetDesc">Position shader resource set</param> /// <param name="cl">Commandlist to run the commands on</param> /// <param name="plot">PlottedGraph to compute</param> /// <param name="delta">A float representing how much time has passed since the last frame. Higher values => bigger movements</param> private void RenderVelocity(ResourceSetDescription RSetDesc, CommandList cl, PlottedGraph plot, float delta) { //if (GlobalConfig.Settings.Logs.BulkLogging) Logging.RecordLogEvent($"RenderVelocity {this.EngineID}", Logging.LogFilterType.BulkDebugLogFile); _timer.Restart(); cl.Begin(); ResourceSet resourceSet = _gd.ResourceFactory.CreateResourceSet(RSetDesc); //if (GlobalConfig.Settings.Logs.BulkLogging) Logging.RecordLogEvent($"RenderVelocityBlocks {this.EngineID}", Logging.LogFilterType.BulkDebugLogFile); GraphLayoutState layout = plot.LayoutState; VelocityShaderParams parameters = new VelocityShaderParams { nodeCount = (uint)plot.RenderedNodeCount(), speedDivisor = GlobalConfig.PresetSpeedDivisor }; //if (GlobalConfig.Settings.Logs.BulkLogging) Logging.RecordLogEvent($"RenderVelocity {this.EngineID} submit", Logging.LogFilterType.BulkDebugLogFile); cl.UpdateBuffer(_velocityParamsBuffer, 0, parameters); cl.SetPipeline(_velocityComputePipeline); cl.SetComputeResourceSet(0, resourceSet); //16 == sizeof(Vector4) cl.Dispatch((uint)Math.Ceiling(layout.VelocitiesVRAM1 !.SizeInBytes / (256.0 * 16)), 1, 1); //if (GlobalConfig.Settings.Logs.BulkLogging) Logging.RecordLogEvent($"RenderVelocity {this.EngineID} done in {watch.ElapsedMilliseconds} MS", Logging.LogFilterType.BulkDebugLogFile); cl.End(); _timer.Stop(); VelocitySetupTime = _timer.Elapsed.TotalMilliseconds; _timer.Restart(); _gd !.SubmitCommands(cl); _gd !.WaitForIdle(); _gd.DisposeWhenIdle(resourceSet); _timer.Stop(); VelocityTime = _timer.Elapsed.TotalMilliseconds; }