/// <summary> /// /// </summary> /// <param name="context"></param> /// <param name="deviceContext"></param> protected override void OnUpdate(RenderContext context, DeviceContextProxy deviceContext) { UpdateTime(context, ref totalElapsed); //Set correct instance count from instance buffer drawArgument.InstanceCount = InstanceBuffer == null || !InstanceBuffer.HasElements ? 1 : (uint)InstanceBuffer.Buffer.ElementCount; //Upload the draw argument particleCountGSIABuffer.UploadDataToBuffer(deviceContext, ref drawArgument); updatePass.BindShader(deviceContext); updatePass.ComputeShader.BindUAV(deviceContext, currentStateSlot, BufferProxies[0]); updatePass.ComputeShader.BindUAV(deviceContext, newStateSlot, BufferProxies[1]); if (isRestart) { FrameVariables.NumParticles = 0; perFrameCB.UploadDataToBuffer(deviceContext, ref FrameVariables); // Call ComputeShader to add initial particles deviceContext.Dispatch(1, 1, 1); isRestart = false; } else { #region Get consume buffer count // Get consume buffer count. //Due to some intel integrated graphic card having issue copy structure count directly into constant buffer. //Has to use staging buffer to read and pass into constant buffer FrameVariables.NumParticles = (uint)ReadCount("", deviceContext, BufferProxies[0]); perFrameCB.UploadDataToBuffer(deviceContext, ref FrameVariables); #endregion deviceContext.Dispatch(Math.Max(1, (int)Math.Ceiling((double)FrameVariables.NumParticles / 512)), 1, 1); // Get append buffer count BufferProxies[1].CopyCount(deviceContext, particleCountGSIABuffer.Buffer, 0); } #if OUTPUTDEBUGGING ReadCount("UAV 0", deviceContext, BufferProxies[0].UAV); #endif if (totalElapsed > InsertElapseThrottle) { insertCB.UploadDataToBuffer(deviceContext, ref InsertVariables); // Add more particles insertPass.BindShader(deviceContext); insertPass.ComputeShader.BindUAV(deviceContext, newStateSlot, BufferProxies[1]); deviceContext.Dispatch(1, 1, 1); totalElapsed = 0; #if OUTPUTDEBUGGING ReadCount("UAV 1", deviceContext, BufferProxies[1].UAV); #endif } // Swap UAV buffers for next frame var bproxy = BufferProxies[0]; BufferProxies[0] = BufferProxies[1]; BufferProxies[1] = bproxy; }