Example #1
0
        private static void CreateBuffers(GraphicsDevice device, float[] array, out StructuredBuffer <float> sourceBufferView, out WriteableStructuredBuffer <float> destinationBufferView)
        {
            GraphicsResource sourceBuffer      = GraphicsResource.CreateBuffer <float>(device, array, ResourceFlags.None);
            GraphicsResource destinationBuffer = GraphicsResource.CreateBuffer <float>(device, array.Length * 2, ResourceFlags.AllowUnorderedAccess);

            sourceBufferView      = new StructuredBuffer <float>(ShaderResourceView.FromBuffer <float>(sourceBuffer));
            destinationBufferView = new WriteableStructuredBuffer <float>(UnorderedAccessView.FromBuffer <float>(destinationBuffer));
        }
Example #2
0
        private static TestShader CreateTestShader(GraphicsDevice device, int sumCount)
        {
            GraphicsResource buffer = GraphicsResource.CreateBuffer <float>(device, sumCount, ResourceFlags.AllowUnorderedAccess);
            WriteableStructuredBuffer <float> bufferView = new WriteableStructuredBuffer <float>(UnorderedAccessView.FromBuffer <float>(buffer));

            TestShader shader = new TestShader(bufferView, Sigmoid);

            return(shader);
        }
Example #3
0
        private static async Task ExecuteOnGpu(GraphicsDevice device, StructuredBuffer <float> sourceBufferView, WriteableStructuredBuffer <float> destinationBufferView)
        {
            bool generateWithDelegate = false;

            DescriptorSet descriptorSet = new DescriptorSet(device, 2);

            descriptorSet.AddResourceViews(destinationBufferView);
            descriptorSet.AddResourceViews(sourceBufferView);

            // Generate computer shader
            ShaderGenerator shaderGenerator = generateWithDelegate
                ? CreateShaderGeneratorWithDelegate(sourceBufferView, destinationBufferView)
                : CreateShaderGeneratorWithClass();

            ShaderGeneratorResult result = shaderGenerator.GenerateShader();

            // Compile shader

            byte[] shaderBytecode = ShaderCompiler.Compile(ShaderStage.ComputeShader, result.ShaderSource, result.EntryPoints["compute"]);

            DescriptorRange[] descriptorRanges = new DescriptorRange[]
            {
                new DescriptorRange(DescriptorRangeType.UnorderedAccessView, 1, 0),
                new DescriptorRange(DescriptorRangeType.ShaderResourceView, 1, 0)
            };

            RootParameter rootParameter = new RootParameter(new RootDescriptorTable(descriptorRanges), ShaderVisibility.All);

            RootSignatureDescription rootSignatureDescription = new RootSignatureDescription(RootSignatureFlags.None, new[] { rootParameter });
            RootSignature            rootSignature            = new RootSignature(device, rootSignatureDescription);
            PipelineState            pipelineState            = new PipelineState(device, rootSignature, shaderBytecode);

            // Execute computer shader

            using (CommandList commandList = new CommandList(device, CommandListType.Compute))
            {
                commandList.SetPipelineState(pipelineState);
                commandList.SetComputeRootDescriptorTable(0, descriptorSet);

                commandList.Dispatch(1, 1, 1);
                await commandList.FlushAsync();
            }
        }
Example #4
0
        private static Task ExecuteOnCpu(GraphicsDevice device, StructuredBuffer <float> sourceBufferView, WriteableStructuredBuffer <float> destinationBufferView)
        {
            MyComputeShader myComputeShader = new MyComputeShader
            {
                Source      = sourceBufferView,
                Destination = destinationBufferView
            };

            for (int x = 0; x < 100; x++)
            {
                myComputeShader.CSMain(new CSInput {
                    DispatchThreadId = new Int3 {
                        X = x
                    }
                });
            }

            return(Task.CompletedTask);
        }
Example #5
0
        private static ShaderGenerator CreateShaderGeneratorWithDelegate(StructuredBuffer <float> sourceBuffer, WriteableStructuredBuffer <float> destinationBuffer)
        {
            Action <CSInput> action = input =>
            {
                destinationBuffer[input.DispatchThreadId.X] = Math.Max(sourceBuffer[input.DispatchThreadId.X], 45);
            };

            return(new ShaderGenerator(action, new ShaderAttribute("compute"), new NumThreadsAttribute(100, 1, 1)));
        }
Example #6
0
 public TestShader(WriteableStructuredBuffer <float> buffer, Func <float, float> f)
 {
     DestinationBuffer = buffer;
     this.f            = f;
 }