public int GetAppendStructureCount(DeviceContext context) { context.CopyStructureCount(m_UnorderedAccessView, m_StagingCountBufferObject, 0); DataBox box = context.MapSubresource(m_StagingCountBufferObject, MapMode.Read, SlimDX.Direct3D11.MapFlags.None); int result = box.Data.Read <int>(); context.UnmapSubresource(m_StagingCountBufferObject, 0); return(result); }
private void DebugCount(string src, DeviceContext context, UnorderedAccessView uav) { context.CopyStructureCount(particleCountStaging, 0, uav); DataStream ds; var db = context.MapSubresource(particleCountStaging, MapMode.Read, MapFlags.None, out ds); int CurrentParticleCount = ds.ReadInt(); Debug.WriteLine("{0}: {1}", src, CurrentParticleCount); context.UnmapSubresource(particleCountStaging, 0); }
public void Update(string generatorCS, string updaterCS) { var append = particleUAVs[0]; var consume = particleUAVs[1]; // Assign UAV of particles context.ComputeShader.SetUnorderedAccessView(0, append); context.ComputeShader.SetUnorderedAccessView(1, consume); // Update the constant buffers // Generate the next random seed for particle generator Frame.RandomSeed = (uint)random.Next(int.MinValue, int.MaxValue); context.UpdateSubresource(ref Frame, perFrame); // Copy current consume buffer count into perFrame context.CopyStructureCount(perFrame, 4 * 3, consume); context.ComputeShader.SetConstantBuffer(0, perComputeBuffer); context.ComputeShader.SetConstantBuffer(1, perFrame); // Update existing particles UpdateCS(updaterCS, append, consume); // Generate new particles (if reached limiter time) genTime += Frame.FrameTime; if (genTime > limiter) { genTime = 0; GenerateCS(generatorCS, append); } // Retrieve the particle count for the render phase context.CopyStructureCount(indirectArgsBuffer, 4, append); // Clear the shader and resources from pipeline stage context.ComputeShader.SetUnorderedAccessViews(0, null, null, null); context.ComputeShader.SetUnorderedAccessViews(1, null, null, null); context.ComputeShader.Set(null); // Flip UAVs/SRVs particleUAVs[0] = consume; particleUAVs[1] = append; var s = particleSRVs[0]; particleSRVs[0] = particleSRVs[1]; particleSRVs[1] = s; }
private void DebugCount(string src, DeviceContext context, UnorderedAccessView uav) { if (elapsedSinceGenerator > 2) { elapsedSinceGenerator = 0; context.CopyStructureCount(particleCountStaging, 0, uav); DataStream ds; var db = context.MapSubresource(particleCountStaging, MapMode.Read, SharpDX.Direct3D11.MapFlags.None, out ds); CurrentParticleCount = ds.ReadInt(); System.Diagnostics.Debug.WriteLine("{0}: {1},{2},{3},{4}", src, CurrentParticleCount, (uint)ds.ReadInt(), (uint)ds.ReadInt(), (uint)ds.ReadInt()); context.UnmapSubresource(particleCountStaging, 0); } }
public void Update(DX11RenderContext context) { Device device = context.Device; DeviceContext ctx = context.CurrentDeviceContext; if (!this.FOutBuffer[0].Contains(context)) { DX11RawBuffer rb = new DX11RawBuffer(device, 16); this.FOutBuffer[0][context] = rb; } if (this.FInBuffer.IsConnected) { UnorderedAccessView uav = this.FInBuffer[0][context].UAV; ctx.CopyStructureCount(uav, this.FOutBuffer[0][context].Buffer, 0); } }
public void CopyVertexCount(DeviceContext ctx, UnorderedAccessView uav) { ctx.CopyStructureCount(uav, this.Buffer, 0); }
public void CopyIndicesCount(DeviceContext ctx, UnorderedAccessView uav) { ctx.CopyStructureCount(this.ArgumentBuffer, 0, uav); }
public void Update(IPluginIO pin, DX11RenderContext context) { Device device = context.Device; DeviceContext ctx = context.CurrentDeviceContext; if ( !this.FOutPointcloudRingBuffer[0].Contains(context) || !this.FOutUpdatedBuffer[0].Contains(context) || !this.bCounter.Contains(context) || !this.bOffset.Contains(context) || this.FInPointcloudRingBufferSize.IsChanged || this.FInEleCount.IsChanged) { this.FOutPointcloudRingBuffer[0].Dispose(context); DX11RWStructuredBuffer brPointcloud = new DX11RWStructuredBuffer(device, FInPointcloudRingBufferSize[0], FInStride[0], eDX11BufferMode.Counter); this.FOutPointcloudRingBuffer[0][context] = brPointcloud; this.FOutUpdatedBuffer[0].Dispose(context); DX11RWStructuredBuffer brUpdated = new DX11RWStructuredBuffer(device, FInPointcloudRingBufferSize[0], 4, eDX11BufferMode.Counter); this.FOutUpdatedBuffer[0][context] = brUpdated; this.bOffset.Dispose(context); this.bOffset[context] = new DX11RawBuffer(device, 16); this.bCounter.Dispose(context); this.bCounter[context] = new DX11RWStructuredBuffer(device, FInEleCount[0], 4, eDX11BufferMode.Counter); } // load shader if (this.shader == null) { string basepath = "RingBuffer.effects.RingBuffer.fx"; DX11Effect effect = DX11Effect.FromResource(Assembly.GetExecutingAssembly(), basepath); this.shader = new DX11ShaderInstance(context, effect); } if (this.FInPointcloudBuffer.PluginIO.IsConnected && FInSet[0] && currentFrame != FHDEHost.FrameTime) { currentFrame = FHDEHost.FrameTime; // prevents to execute this a second time int[] mask = new int[4] { 0, 0, 0, 0 }; ctx.ClearUnorderedAccessView(FOutUpdatedBuffer[0][context].UAV, mask); shader.SelectTechnique("AddPoints"); shader.SetBySemantic("POINTCLOUDBUFFER", FInPointcloudBuffer[0][context].SRV); shader.SetBySemantic("POINTCLOUDCOUNTBUFFER", FInCountBuffer[0][context].SRV); shader.SetBySemantic("POINTCLOUDRINGBUFFER", FOutPointcloudRingBuffer[0][context].UAV, FInPointcloudRingBufferSize[0]); shader.SetBySemantic("UPDATEDRINGBUFFER", FOutUpdatedBuffer[0][context].UAV, FInPointcloudRingBufferSize[0]); shader.SetBySemantic("POINTCLOUDRINGBUFFERSIZE", FInPointcloudRingBufferSize[0]); shader.SetBySemantic("OFFSETBUFFER", this.bOffset[context].SRV); shader.SetBySemantic("COUNTERBUFFER", this.bCounter[context].UAV, 0); shader.ApplyPass(0); ctx.Dispatch((FInEleCount[0] + 63) / 64, 1, 1); ctx.CopyStructureCount(this.bCounter[context].UAV, this.bOffset[context].Buffer, 0); shader.SelectTechnique("CalcOffset"); shader.ApplyPass(0); ctx.Dispatch(1, 1, 1); context.CleanUp(); context.CleanUpCS(); } }
/// <summary> /// Copies the count. /// </summary> /// <param name="device">The device.</param> /// <param name="destBuffer">The dest buffer.</param> /// <param name="offset">The offset.</param> public void CopyCount(DeviceContext device, SDX11.Buffer destBuffer, int offset) { device.CopyStructureCount(destBuffer, offset, UAV); }
public int GetAppendStructureCount(DeviceContext context) { context.CopyStructureCount(m_UnorderedAccessView, m_StagingCountBufferObject, 0); DataBox box = context.MapSubresource(m_StagingCountBufferObject, MapMode.Read, SlimDX.Direct3D11.MapFlags.None); int result = box.Data.Read<int>(); context.UnmapSubresource(m_StagingCountBufferObject, 0); return result; }