public BaseIndirectBuffer(DX11RenderContext context, T args) { this.context = context; int size = Marshal.SizeOf(args); BufferDescription bd = new BufferDescription(); bd.Usage = ResourceUsage.Default; bd.StructureByteStride = 0; bd.SizeInBytes = size; bd.CpuAccessFlags = CpuAccessFlags.None; bd.BindFlags = BindFlags.None; bd.OptionFlags = ResourceOptionFlags.DrawIndirect; DataStream dsb = new DataStream(size, false, true); dsb.Position = 0; dsb.Write <T>(args); dsb.Position = 0; this.Buffer = new SlimDX.Direct3D11.Buffer(context.Device, dsb, bd); dsb.Dispose(); m_structuredBuffer = new DX11RWStructuredBuffer(context.Device, size / 4, 4); }
public void Update(IPluginIO pin, DX11RenderContext context) { Device device = context.Device; DeviceContext ctx = context.CurrentDeviceContext; if (!this.FOutLinkBuffer[0].Contains(context) || !this.FOutOffsetBuffer[0].Contains(context) || FInGridcellCount.IsChanged) { this.FOutLinkBuffer[0].Dispose(context); this.FOutOffsetBuffer[0].Dispose(context); DX11RWStructuredBuffer lb = new DX11RWStructuredBuffer(device, FInEleCount[0], 8, eDX11BufferMode.Counter); DX11RWStructuredBuffer ob = new DX11RWStructuredBuffer(device, FInGridcellCount[0] * FInGridcellCount[0] * FInGridcellCount[0], 4, eDX11BufferMode.Counter); this.FOutLinkBuffer[0][context] = lb; this.FOutOffsetBuffer[0][context] = ob; } // clear offsetbuffer int[] mask = new int[4] { -1, -1, -1, -1 }; ctx.ClearUnorderedAccessView(FOutOffsetBuffer[0][context].UAV,mask); // load shader if (this.shader == null) { string basepath = "LinkedList.effects.LinkedList.fx"; DX11Effect effect = DX11Effect.FromResource(Assembly.GetExecutingAssembly(), basepath); this.shader = new DX11ShaderInstance(context, effect); } if (this.FInPcBuffer.PluginIO.IsConnected) { shader.SelectTechnique("BuildHash"); shader.SetBySemantic("POINTCLOUDBUFFER", FInPcBuffer[0][context].SRV); shader.SetBySemantic("POINTTRANSFORM", FInTransform[0]); shader.SetBySemantic("RWLINKBUFFER", FOutLinkBuffer[0][context].UAV, 0); shader.SetBySemantic("RWOFFSETBUFFER", FOutOffsetBuffer[0][context].UAV); shader.SetBySemantic("GRIDCELLSIZE", FInGridcellCount[0]); shader.ApplyPass(0); ctx.Dispatch((FInEleCount[0] + 63) / 64, 1, 1); context.CleanUp(); context.CleanUpCS(); } }
public void Update(IPluginIO pin, DX11RenderContext context) { Device device = context.Device; DeviceContext ctx = context.CurrentDeviceContext; if (!this.FOutPointcloudBuffer[0].Contains(context) || !this.FOutIndexBuffer[0].Contains(context) || this.FInEleCount.IsChanged ) { this.FOutPointcloudBuffer[0].Dispose(context); this.FOutIndexBuffer[0].Dispose(context); DX11RWStructuredBuffer pcBuffer = new DX11RWStructuredBuffer(device, FInEleCount[0], FInStride[0], eDX11BufferMode.Counter); DX11RWStructuredBuffer idBuffer = new DX11RWStructuredBuffer(device, FInEleCount[0], 4, eDX11BufferMode.Counter); this.FOutPointcloudBuffer[0][context] = pcBuffer; this.FOutIndexBuffer[0][context] = idBuffer; } // clear offsetbuffer int[] mask = new int[4] { -1, -1, -1, -1 }; ctx.ClearUnorderedAccessView(FOutIndexBuffer[0][context].UAV,mask); // load shader if (this.shader == null) { string basepath = "RingBufferIndexing.effects.RingBufferIndexing.fx"; DX11Effect effect = DX11Effect.FromResource(Assembly.GetExecutingAssembly(), basepath); this.shader = new DX11ShaderInstance(context, effect); } if (this.FInPointcloudBuffer.PluginIO.IsConnected /* && currentFrame != FHDEHost.FrameTime*/) { currentFrame = FHDEHost.FrameTime; // prevents to execute this a second time shader.SelectTechnique("BuildHash"); shader.SetBySemantic("POINTCLOUDBUFFERIN", FInPointcloudBuffer[0][context].SRV); shader.SetBySemantic("POINTCLOUDBUFFEROUT", FOutPointcloudBuffer[0][context].UAV, 0); shader.SetBySemantic("INDEXBUFFER", FOutIndexBuffer[0][context].UAV); shader.ApplyPass(0); ctx.Dispatch((FInEleCount[0] + 63) / 64, 1, 1); context.CleanUp(); context.CleanUpCS(); } }
public void Update(IPluginIO pin, DX11RenderContext context) { if (reset || !this.FOutBuffers[0].Contains(context)) { this.DisposeBuffers(context); eDX11BufferMode mode = this.FInAppendable[0] ? eDX11BufferMode.Append : eDX11BufferMode.Default; DX11RWStructuredBuffer rt = new DX11RWStructuredBuffer(context.Device, this.cnt, this.stride, mode); this.FOutBuffers[0][context] = rt; } this.updateddevices.Add(context); }
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(); } }