/// <summary> /// The InitAsBufferUAV /// </summary> /// <param name="register">The <see cref="int"/></param> /// <param name="visibility">The <see cref="ShaderVisibility"/></param> public void InitAsBufferUAV(int register, ShaderVisibility visibility = ShaderVisibility.All) { var buffer = new RootDescriptor1 { RegisterSpace = 0, ShaderRegister = register, Flags = RootDescriptorFlags.None }; Parameter = new RootParameter1(visibility, buffer, RootParameterType.UnorderedAccessView); }
/// <summary> /// The InitAsConstantBuffer /// </summary> /// <param name="register">The <see cref="int"/></param> /// <param name="visibility">The <see cref="ShaderVisibility"/></param> public void InitAsConstantBuffer(int register, ShaderVisibility visibility = ShaderVisibility.All) { var cbuffer = new RootDescriptor1 { RegisterSpace = 0, ShaderRegister = register, Flags = RootDescriptorFlags.None }; Parameter = new RootParameter1(visibility, cbuffer, RootParameterType.ConstantBufferView); }
internal unsafe void __MarshalFrom(ref __Native @ref) { Parameters = new RootParameter1[@ref.NumParameters]; if (@ref.NumParameters > 0) { UnsafeUtilities.Read(@ref.PParameters, Parameters); } StaticSamplers = new StaticSamplerDescription[@ref.NumStaticSamplers]; if (@ref.NumStaticSamplers > 0) { UnsafeUtilities.Read(@ref.PStaticSamplers, StaticSamplers); } Flags = @ref.Flags; }
internal void Sign1(GraphicsDevice graphicsDevice, int registerSpace = 0) { //static samplers StaticSamplerDescription[] samplerDescription = null; if (flags != RootSignatureFlags.LocalRootSignature) { samplerDescription = new StaticSamplerDescription[4]; samplerDescription[0] = new StaticSamplerDescription() { AddressU = TextureAddressMode.Clamp, AddressV = TextureAddressMode.Clamp, AddressW = TextureAddressMode.Clamp, BorderColor = StaticBorderColor.OpaqueBlack, ComparisonFunction = ComparisonFunction.Never, Filter = Filter.MinMagMipLinear, MipLODBias = 0, MaxAnisotropy = 0, MinLOD = 0, MaxLOD = float.MaxValue, ShaderVisibility = ShaderVisibility.All, RegisterSpace = 0, ShaderRegister = 0, }; samplerDescription[1] = samplerDescription[0]; samplerDescription[1].AddressU = TextureAddressMode.Wrap; samplerDescription[1].AddressV = TextureAddressMode.Wrap; samplerDescription[1].AddressW = TextureAddressMode.Wrap; samplerDescription[2] = samplerDescription[0]; samplerDescription[3] = samplerDescription[0]; samplerDescription[1].ShaderRegister = 1; samplerDescription[2].ShaderRegister = 2; samplerDescription[3].ShaderRegister = 3; samplerDescription[1].MaxAnisotropy = 16; samplerDescription[1].Filter = Filter.Anisotropic; samplerDescription[2].ComparisonFunction = ComparisonFunction.Less; samplerDescription[2].Filter = Filter.ComparisonMinMagMipLinear; samplerDescription[3].Filter = Filter.MinMagMipPoint; } RootParameter1[] rootParameters = new RootParameter1[descs.Length]; int cbvCount = 0; int srvCount = 0; int uavCount = 0; cbv.Clear(); srv.Clear(); uav.Clear(); for (int i = 0; i < descs.Length; i++) { ResourceAccessType t = descs[i]; switch (t) { case ResourceAccessType.CBV: rootParameters[i] = new RootParameter1(RootParameterType.ConstantBufferView, new RootDescriptor1(cbvCount, registerSpace), ShaderVisibility.All); cbv[cbvCount] = i; cbvCount++; break; case ResourceAccessType.SRV: rootParameters[i] = new RootParameter1(RootParameterType.ShaderResourceView, new RootDescriptor1(srvCount, registerSpace), ShaderVisibility.All); srv[srvCount] = i; srvCount++; break; case ResourceAccessType.UAV: rootParameters[i] = new RootParameter1(RootParameterType.UnorderedAccessView, new RootDescriptor1(uavCount, registerSpace), ShaderVisibility.All); uav[uavCount] = i; uavCount++; break; case ResourceAccessType.CBVTable: rootParameters[i] = new RootParameter1(new RootDescriptorTable1(new DescriptorRange1(DescriptorRangeType.ConstantBufferView, 1, cbvCount, registerSpace)), ShaderVisibility.All); cbv[cbvCount] = i; cbvCount++; break; case ResourceAccessType.SRVTable: rootParameters[i] = new RootParameter1(new RootDescriptorTable1(new DescriptorRange1(DescriptorRangeType.ShaderResourceView, 1, srvCount, registerSpace)), ShaderVisibility.All); srv[srvCount] = i; srvCount++; break; case ResourceAccessType.UAVTable: rootParameters[i] = new RootParameter1(new RootDescriptorTable1(new DescriptorRange1(DescriptorRangeType.UnorderedAccessView, 1, uavCount, registerSpace)), ShaderVisibility.All); uav[uavCount] = i; uavCount++; break; } } RootSignatureDescription1 rootSignatureDescription = new RootSignatureDescription1(); rootSignatureDescription.StaticSamplers = samplerDescription; rootSignatureDescription.Flags = flags; rootSignatureDescription.Parameters = rootParameters; rootSignature?.Release(); rootSignature = graphicsDevice.device.CreateRootSignature <ID3D12RootSignature>(0, rootSignatureDescription); }
private static async Task Main() { // Create graphics device using GraphicsDevice device = new GraphicsDevice(FeatureLevel.Level11_0); // Create graphics buffer int width = 10; int height = 10; float[] array = new float[width * height]; for (int i = 0; i < array.Length; i++) { array[i] = i; } float[] outputArray = new float[width * height]; using GraphicsBuffer <float> sourceBuffer = GraphicsBuffer.ShaderResource.New(device, array.AsSpan()); using GraphicsBuffer <float> destinationBuffer = GraphicsBuffer.UnorderedAccess.New <float>(device, array.Length * 2); GraphicsBuffer <float> slicedDestinationBuffer = destinationBuffer.Slice(20, 60); slicedDestinationBuffer = slicedDestinationBuffer.Slice(10, 50); DescriptorSet descriptorSet = new DescriptorSet(device, 2); descriptorSet.AddUnorderedAccessViews(slicedDestinationBuffer); descriptorSet.AddShaderResourceViews(sourceBuffer); // Generate computer shader bool generateWithDelegate = true; ShaderGenerator shaderGenerator = generateWithDelegate ? CreateShaderGeneratorWithDelegate(sourceBuffer, destinationBuffer) : CreateShaderGeneratorWithClass(); ShaderGeneratorResult result = shaderGenerator.GenerateShader(); // Copmile shader byte[] shaderBytecode = ShaderCompiler.Compile(DxcShaderStage.ComputeShader, result.ShaderSource, result.EntryPoints["compute"]); DescriptorRange1[] descriptorRanges = new DescriptorRange1[] { new DescriptorRange1(DescriptorRangeType.UnorderedAccessView, 1, 0), new DescriptorRange1(DescriptorRangeType.ShaderResourceView, 1, 0) }; RootParameter1 rootParameter = new RootParameter1(new RootDescriptorTable1(descriptorRanges), ShaderVisibility.All); var rootSignatureDescription = new VersionedRootSignatureDescription(new RootSignatureDescription1(RootSignatureFlags.None, new[] { rootParameter })); var rootSignature = device.CreateRootSignature(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(); } // Print matrix Console.WriteLine("Before:"); PrintMatrix(array, width, height); destinationBuffer.GetData(outputArray.AsSpan()); Console.WriteLine(); Console.WriteLine("After:"); PrintMatrix(outputArray, width, height); }
public void CreateRootSignature(RootSignature rootSignature, IList <RootSignatureParamP> types) { //static samplers StaticSamplerDescription[] samplerDescription = new StaticSamplerDescription[4]; samplerDescription[0] = new StaticSamplerDescription(ShaderVisibility.All, 0, 0) { AddressU = TextureAddressMode.Clamp, AddressV = TextureAddressMode.Clamp, AddressW = TextureAddressMode.Clamp, BorderColor = StaticBorderColor.OpaqueBlack, ComparisonFunction = ComparisonFunction.Never, Filter = Filter.MinMagMipLinear, MipLODBias = 0, MaxAnisotropy = 0, MinLOD = 0, MaxLOD = float.MaxValue, ShaderVisibility = ShaderVisibility.All, RegisterSpace = 0, ShaderRegister = 0, }; samplerDescription[1] = samplerDescription[0]; samplerDescription[2] = samplerDescription[0]; samplerDescription[3] = samplerDescription[0]; samplerDescription[1].ShaderRegister = 1; samplerDescription[2].ShaderRegister = 2; samplerDescription[3].ShaderRegister = 3; samplerDescription[1].MaxAnisotropy = 16; samplerDescription[1].Filter = Filter.Anisotropic; samplerDescription[2].ComparisonFunction = ComparisonFunction.Less; samplerDescription[2].Filter = Filter.ComparisonMinMagMipLinear; samplerDescription[3].Filter = Filter.MinMagMipPoint; RootParameter1[] rootParameters = new RootParameter1[types.Count]; int cbvCount = 0; int srvCount = 0; int uavCount = 0; rootSignature.cbv.Clear(); rootSignature.srv.Clear(); rootSignature.uav.Clear(); for (int i = 0; i < types.Count; i++) { RootSignatureParamP t = types[i]; switch (t) { case RootSignatureParamP.CBV: rootParameters[i] = new RootParameter1(RootParameterType.ConstantBufferView, new RootDescriptor1(cbvCount, 0), ShaderVisibility.All); rootSignature.cbv[cbvCount] = i; cbvCount++; break; case RootSignatureParamP.SRV: rootParameters[i] = new RootParameter1(RootParameterType.ShaderResourceView, new RootDescriptor1(srvCount, 0), ShaderVisibility.All); rootSignature.srv[srvCount] = i; srvCount++; break; case RootSignatureParamP.UAV: rootParameters[i] = new RootParameter1(RootParameterType.UnorderedAccessView, new RootDescriptor1(uavCount, 0), ShaderVisibility.All); rootSignature.uav[uavCount] = i; uavCount++; break; case RootSignatureParamP.CBVTable: rootParameters[i] = new RootParameter1(new RootDescriptorTable1(new DescriptorRange1(DescriptorRangeType.ConstantBufferView, 1, cbvCount)), ShaderVisibility.All); rootSignature.cbv[cbvCount] = i; cbvCount++; break; case RootSignatureParamP.SRVTable: rootParameters[i] = new RootParameter1(new RootDescriptorTable1(new DescriptorRange1(DescriptorRangeType.ShaderResourceView, 1, srvCount)), ShaderVisibility.All); rootSignature.srv[srvCount] = i; srvCount++; break; case RootSignatureParamP.UAVTable: rootParameters[i] = new RootParameter1(new RootDescriptorTable1(new DescriptorRange1(DescriptorRangeType.UnorderedAccessView, 1, uavCount)), ShaderVisibility.All); rootSignature.uav[uavCount] = i; uavCount++; break; } } RootSignatureDescription1 rootSignatureDescription = new RootSignatureDescription1(); rootSignatureDescription.StaticSamplers = samplerDescription; rootSignatureDescription.Flags = RootSignatureFlags.AllowInputAssemblerInputLayout; rootSignatureDescription.Parameters = rootParameters; rootSignature.rootSignature = device.CreateRootSignature <ID3D12RootSignature>(0, rootSignatureDescription); }
/// <summary> /// The InitAsDescriptorTable /// </summary> /// <param name="rangeCount">The <see cref="int"/></param> /// <param name="visibility">The <see cref="ShaderVisibility"/></param> public void InitAsDescriptorTable(int rangeCount, ShaderVisibility visibility) { var ranges = new List <DescriptorRange>(rangeCount); Parameter = new RootParameter1(visibility, ranges.ToArray()); }
/// <summary> /// The InitAsConstants /// </summary> /// <param name="register">The <see cref="int"/></param> /// <param name="numDwords">The <see cref="int"/></param> /// <param name="visibility">The <see cref="ShaderVisibility"/></param> public void InitAsConstants(int register, int numDwords, ShaderVisibility visibility = ShaderVisibility.All) { var constant = new RootConstants(register, 0, numDwords); Parameter = new RootParameter1(visibility, constant); }
public RootParameter(RootDescriptorTable descriptorTable, ShaderVisibility visibility) { NativeRootParameter = new RootParameter1(new RootDescriptorTable1(descriptorTable.Ranges.Select(r => Unsafe.As <DescriptorRange, DescriptorRange1>(ref r)).ToArray()), (Vortice.Direct3D12.ShaderVisibility)visibility); }
public RootParameter(RootParameterType parameterType, RootDescriptor rootDescriptor, ShaderVisibility visibility) { NativeRootParameter = new RootParameter1((Vortice.Direct3D12.RootParameterType)parameterType, Unsafe.As <RootDescriptor, RootDescriptor1>(ref rootDescriptor), (Vortice.Direct3D12.ShaderVisibility)visibility); }
public RootParameter(RootConstants rootConstants, ShaderVisibility visibility) { NativeRootParameter = new RootParameter1(Unsafe.As <RootConstants, Vortice.Direct3D12.RootConstants>(ref rootConstants), (Vortice.Direct3D12.ShaderVisibility)visibility); }