コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
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;
        }
コード例 #4
0
 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);
     }
 }
コード例 #5
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);
            }
        }
コード例 #6
0
 public void CopyVertexCount(DeviceContext ctx, UnorderedAccessView uav)
 {
     ctx.CopyStructureCount(uav, this.Buffer, 0);
 }
コード例 #7
0
 public void CopyIndicesCount(DeviceContext ctx, UnorderedAccessView uav)
 {
     ctx.CopyStructureCount(this.ArgumentBuffer, 0, uav);
 }
コード例 #8
0
        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();
                
            }

        }
コード例 #9
0
ファイル: UAVBufferViewProxy.cs プロジェクト: alir14/3DModel
 /// <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);
 }
コード例 #10
0
        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;
        }