/// <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);
        }
Beispiel #3
0
    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;
    }
Beispiel #4
0
        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);
        }
Beispiel #6
0
        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);
 }