コード例 #1
0
        private unsafe void CreateDeviceDependentResourcesInternal()
        {
            ID3D12Device *d3dDevice = _deviceResources.D3DDevice;

            {
                D3D12_DESCRIPTOR_RANGE range =
                    CD3DX12_DESCRIPTOR_RANGE.Create(D3D12_DESCRIPTOR_RANGE_TYPE_CBV, 1, 0);
                CD3DX12_ROOT_PARAMETER.InitAsDescriptorTable(out D3D12_ROOT_PARAMETER parameter, 1, &range, D3D12_SHADER_VISIBILITY_VERTEX);

                D3D12_ROOT_SIGNATURE_FLAGS rootSignatureFlags =
                    D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT | // Only the input assembler stage needs access to the constant buffer.
                    D3D12_ROOT_SIGNATURE_FLAG_DENY_DOMAIN_SHADER_ROOT_ACCESS |
                    D3D12_ROOT_SIGNATURE_FLAG_DENY_GEOMETRY_SHADER_ROOT_ACCESS |
                    D3D12_ROOT_SIGNATURE_FLAG_DENY_HULL_SHADER_ROOT_ACCESS |
                    D3D12_ROOT_SIGNATURE_FLAG_DENY_PIXEL_SHADER_ROOT_ACCESS;

                CD3DX12_ROOT_SIGNATURE_DESC.Init(out D3D12_ROOT_SIGNATURE_DESC descRootSignature, 1, &parameter, 0, null, rootSignatureFlags);

                var pSignature = new ComPtr <ID3DBlob>();
                var pError     = new ComPtr <ID3DBlob>();

                ThrowIfFailed(D3D12SerializeRootSignature(&descRootSignature, D3D_ROOT_SIGNATURE_VERSION_1, pSignature.GetAddressOf(), pError.GetAddressOf()));

                Guid iid = IID_ID3D12RootSignature;
                ID3D12RootSignature *rootSignature;
                ThrowIfFailed(d3dDevice->CreateRootSignature(0, pSignature.Ptr->GetBufferPointer(), pSignature.Ptr->GetBufferSize(), &iid, (void **)&rootSignature));
                _rootSignature = rootSignature;
                NameD3D12Object(_rootSignature.Ptr, nameof(_rootSignature));
            }
        }
コード例 #2
0
 public static void Init([NativeTypeName("D3D12_DESCRIPTOR_RANGE &")] out D3D12_DESCRIPTOR_RANGE range, D3D12_DESCRIPTOR_RANGE_TYPE rangeType, uint numDescriptors, uint baseShaderRegister, uint registerSpace = 0, uint offsetInDescriptorsFromTableStart = D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND)
 {
     range.RangeType          = rangeType;
     range.NumDescriptors     = numDescriptors;
     range.BaseShaderRegister = baseShaderRegister;
     range.RegisterSpace      = registerSpace;
     range.OffsetInDescriptorsFromTableStart = offsetInDescriptorsFromTableStart;
 }
コード例 #3
0
        /// <summary>
        /// Creates a new descriptor table root parameter
        /// </summary>
        /// <param name="ranges">The <see cref="DescriptorRange"/>s to bind</param>
        /// <param name="visibility">Indicates which shaders have access to this parameter</param>
        /// <returns>A new <see cref="RootParameter"/> representing a descriptor table</returns>
        public static RootParameter CreateDescriptorTable(DescriptorRange[] ranges, ShaderVisibility visibility = ShaderVisibility.All)
        {
            // do NOT make this a not pinned array. RootSignature.TranslateRootParameters relies on it
            var d3d12Ranges = GC.AllocateArray <D3D12_DESCRIPTOR_RANGE>(ranges.Length, pinned: true);

            for (var i = 0; i < ranges.Length; i++)
            {
                var range = ranges[i];
                d3d12Ranges[i] = new D3D12_DESCRIPTOR_RANGE(
                    (D3D12_DESCRIPTOR_RANGE_TYPE)range.Type,
                    range.DescriptorCount,
                    range.BaseShaderRegister,
                    range.RegisterSpace,
                    range.DescriptorOffset
                    );
            }

            return(new RootParameter(d3d12Ranges, visibility));
        }
コード例 #4
0
        private Pointer <ID3D12RootSignature> CreateD3D12RootSignature()
        {
            ThrowIfDisposedOrDisposing(_state, nameof(D3D12GraphicsPipelineSignature));

            ID3DBlob *rootSignatureBlob      = null;
            ID3DBlob *rootSignatureErrorBlob = null;

            try
            {
                ID3D12RootSignature *d3d12RootSignature;

                var rootSignatureDesc = new D3D12_ROOT_SIGNATURE_DESC {
                    Flags = D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT,
                };

                var resources       = Resources;
                var resourcesLength = resources.Length;

                var rootParametersLength = 0;
                var staticSamplersLength = 0;

                var rootParametersIndex    = 0;
                var constantShaderRegister = 0;
                var textureShaderRegister  = 0;
                var staticSamplersIndex    = 0;

                for (var inputIndex = 0; inputIndex < resourcesLength; inputIndex++)
                {
                    rootParametersLength++;

                    if (resources[inputIndex].Kind == GraphicsPipelineResourceKind.Texture)
                    {
                        staticSamplersLength++;
                    }
                }

                var rootParameters   = stackalloc D3D12_ROOT_PARAMETER[rootParametersLength];
                var staticSamplers   = stackalloc D3D12_STATIC_SAMPLER_DESC[staticSamplersLength];
                var descriptorRanges = stackalloc D3D12_DESCRIPTOR_RANGE[staticSamplersLength];

                for (var inputIndex = 0; inputIndex < resourcesLength; inputIndex++)
                {
                    var input = resources[inputIndex];

                    switch (input.Kind)
                    {
                    case GraphicsPipelineResourceKind.ConstantBuffer:
                    {
                        var shaderVisibility = GetD3D12ShaderVisiblity(input.ShaderVisibility);
                        rootParameters[rootParametersIndex].InitAsConstantBufferView(unchecked ((uint)constantShaderRegister), registerSpace: 0, shaderVisibility);

                        constantShaderRegister++;
                        rootParametersIndex++;
                        break;
                    }

                    case GraphicsPipelineResourceKind.Texture:
                    {
                        descriptorRanges[staticSamplersIndex] = new D3D12_DESCRIPTOR_RANGE(D3D12_DESCRIPTOR_RANGE_TYPE_SRV, numDescriptors: 1, baseShaderRegister: unchecked ((uint)textureShaderRegister));
                        var shaderVisibility = GetD3D12ShaderVisiblity(input.ShaderVisibility);

                        rootParameters[rootParametersIndex].InitAsDescriptorTable(1, &descriptorRanges[staticSamplersIndex], shaderVisibility);
                        staticSamplers[staticSamplersIndex] = new D3D12_STATIC_SAMPLER_DESC(
                            shaderRegister: unchecked ((uint)staticSamplersIndex),
                            shaderVisibility: shaderVisibility
                            );

                        textureShaderRegister++;
                        rootParametersIndex++;
                        staticSamplersIndex++;
                        break;
                    }

                    default:
                    {
                        break;
                    }
                    }
                }

                rootSignatureDesc.NumParameters = unchecked ((uint)rootParametersLength);
                rootSignatureDesc.pParameters   = rootParameters;

                rootSignatureDesc.NumStaticSamplers = unchecked ((uint)staticSamplersLength);
                rootSignatureDesc.pStaticSamplers   = staticSamplers;

                ThrowExternalExceptionIfFailed(D3D12SerializeRootSignature(&rootSignatureDesc, D3D_ROOT_SIGNATURE_VERSION_1, &rootSignatureBlob, &rootSignatureErrorBlob), nameof(D3D12SerializeRootSignature));

                var iid = IID_ID3D12RootSignature;
                ThrowExternalExceptionIfFailed(Device.D3D12Device->CreateRootSignature(0, rootSignatureBlob->GetBufferPointer(), rootSignatureBlob->GetBufferSize(), &iid, (void **)&d3d12RootSignature), nameof(ID3D12Device.CreateRootSignature));

                return(d3d12RootSignature);
            }
            finally
            {
                ReleaseIfNotNull(rootSignatureErrorBlob);
                ReleaseIfNotNull(rootSignatureBlob);
            }
コード例 #5
0
        private async void CreateDeviceDependentResources()
        {
            unsafe
            {
                ID3D12Device *d3dDevice = _deviceResources.D3DDevice;

                {
                    D3D12_DESCRIPTOR_RANGE range =
                        CD3DX12_DESCRIPTOR_RANGE.Create(D3D12_DESCRIPTOR_RANGE_TYPE.D3D12_DESCRIPTOR_RANGE_TYPE_CBV, 1, 0);
                    CD3DX12_ROOT_PARAMETER.InitAsDescriptorTable(out D3D12_ROOT_PARAMETER parameter, 1, &range,
                                                                 D3D12_SHADER_VISIBILITY.D3D12_SHADER_VISIBILITY_VERTEX);

                    D3D12_ROOT_SIGNATURE_FLAGS rootSignatureFlags =
                        D3D12_ROOT_SIGNATURE_FLAGS
                        .D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT |     // Only the input assembler stage needs access to the constant buffer.
                        D3D12_ROOT_SIGNATURE_FLAGS.D3D12_ROOT_SIGNATURE_FLAG_DENY_DOMAIN_SHADER_ROOT_ACCESS |
                        D3D12_ROOT_SIGNATURE_FLAGS.D3D12_ROOT_SIGNATURE_FLAG_DENY_GEOMETRY_SHADER_ROOT_ACCESS |
                        D3D12_ROOT_SIGNATURE_FLAGS.D3D12_ROOT_SIGNATURE_FLAG_DENY_HULL_SHADER_ROOT_ACCESS |
                        D3D12_ROOT_SIGNATURE_FLAGS.D3D12_ROOT_SIGNATURE_FLAG_DENY_PIXEL_SHADER_ROOT_ACCESS;

                    CD3DX12_ROOT_SIGNATURE_DESC.Init(out D3D12_ROOT_SIGNATURE_DESC descRootSignature, 1, &parameter, 0,
                                                     null, rootSignatureFlags);

                    var pSignature = new ComPtrField <ID3DBlob>();
                    var pError     = new ComPtrField <ID3DBlob>();

                    ThrowIfFailed(D3D12.D3D12SerializeRootSignature(&descRootSignature,
                                                                    D3D_ROOT_SIGNATURE_VERSION.D3D_ROOT_SIGNATURE_VERSION_1, pSignature.DangerousGetAddressOf(),
                                                                    pError.DangerousGetAddressOf()));

                    Guid iid = D3D12.IID_ID3D12RootSignature;
                    ID3D12RootSignature *rootSignature;
                    ThrowIfFailed(d3dDevice->CreateRootSignature(0, pSignature.Ptr->GetBufferPointer(),
                                                                 pSignature.Ptr->GetBufferSize(), &iid, (void **)&rootSignature));
                    _rootSignature = rootSignature;
                    DX.NameD3D12Object(_rootSignature.Ptr, nameof(_rootSignature));
                }
            }

            Task vertexShaderRead = ((Func <Task>)(async() =>
            {
                const string fileName = "Content/SampleVertexShader.cso";

                var size = (UIntPtr) new FileInfo(fileName).Length;
                byte[] shader = await File.ReadAllBytesAsync(fileName);

                unsafe
                {
                    CopyBytesToBlob(out _vertexShader.GetPinnableReference(), size, shader);
                }
            }))();

            Task pixelShaderRead = ((Func <Task>)(async() =>
            {
                const string fileName = "Content/SamplePixelShader.cso";

                var size = (UIntPtr) new FileInfo(fileName).Length;
                byte[] shader = await File.ReadAllBytesAsync(fileName);

                unsafe
                {
                    CopyBytesToBlob(out _pixelShader.GetPinnableReference(), size, shader);
                }
            }))();

            await CreatePipelineState(vertexShaderRead, pixelShaderRead).ContinueWith(CreateRendererAssets);
        }