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)); }
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); }
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(); } }
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); }
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))); }
public TestShader(WriteableStructuredBuffer <float> buffer, Func <float, float> f) { DestinationBuffer = buffer; this.f = f; }