Ejemplo n.º 1
0
        /// <summary>
        /// No documentation for Direct3D12
        /// </summary>
        /// <param name="descRef">No documentation.</param>
        /// <param name="riid">No documentation.</param>
        /// <returns>No documentation.</returns>
        /// <include file='.\..\Documentation\CodeComments.xml' path="/comments/comment[@id='ID3D12Device::CreateGraphicsPipelineState']/*"/>
        /// <unmanaged>HRESULT ID3D12Device::CreateGraphicsPipelineState([In] const void* pDesc,[In] const GUID&amp; riid,[Out] ID3D12PipelineState** ppPipelineState)</unmanaged>
        /// <unmanaged-short>ID3D12Device::CreateGraphicsPipelineState</unmanaged-short>
        public unsafe SharpDX.Direct3D12.PipelineState CreateGraphicsPipelineState(SharpDX.Direct3D12.GraphicsPipelineStateDescription desc)
        {
            // Use a custom marshalling routine for this class
            var nativeDesc = new GraphicsPipelineStateDescription.__Native();

            desc.__MarshalTo(ref nativeDesc);

            // Pin buffers if necessary
            fixed(void *pVertexShader = desc.VertexShader.Buffer)
            fixed(void *pGeometryShader = desc.GeometryShader.Buffer)
            fixed(void *pDomainShader   = desc.DomainShader.Buffer)
            fixed(void *pHullShader     = desc.HullShader.Buffer)
            fixed(void *pPixelShader    = desc.PixelShader.Buffer)
            {
                // Transfer pin buffer address to marshal
                desc.VertexShader.UpdateNative(ref nativeDesc.VertexShader, (IntPtr)pVertexShader);
                desc.GeometryShader.UpdateNative(ref nativeDesc.GeometryShader, (IntPtr)pGeometryShader);
                desc.DomainShader.UpdateNative(ref nativeDesc.DomainShader, (IntPtr)pDomainShader);
                desc.HullShader.UpdateNative(ref nativeDesc.HullShader, (IntPtr)pHullShader);
                desc.PixelShader.UpdateNative(ref nativeDesc.PixelShader, (IntPtr)pPixelShader);

                // Marshal input elements
                var elements       = desc.InputLayout.Elements;
                var nativeElements = (InputElement.__Native *) 0;

                if (elements != null && elements.Length > 0)
                {
                    var ptr = stackalloc InputElement.__Native[elements.Length];
                    nativeElements = ptr;
                    for (int i = 0; i < elements.Length; i++)
                    {
                        elements[i].__MarshalTo(ref nativeElements[i]);
                    }

                    nativeDesc.InputLayout.InputElementsPointer = new IntPtr(nativeElements);
                    nativeDesc.InputLayout.ElementCount         = elements.Length;
                }

                try
                {
                    // Create the pipeline state
                    return(CreateGraphicsPipelineState(new IntPtr(&nativeDesc), Utilities.GetGuidFromType(typeof(PipelineState))));
                }
                finally
                {
                    if (elements != null)
                    {
                        for (int i = 0; i < elements.Length; i++)
                        {
                            nativeElements[i].__MarshalFree();
                        }
                    }
                }
            }
        }
Ejemplo n.º 2
0
        public PipelineAssets(Pipeline pipeline)
        {
            var rootSignatureParameters = new SharpDX.Direct3D12.RootParameter[]
            {
                new SharpDX.Direct3D12.RootParameter(
                    SharpDX.Direct3D12.ShaderVisibility.Vertex,
                    new SharpDX.Direct3D12.DescriptorRange()
                {
                    RangeType          = SharpDX.Direct3D12.DescriptorRangeType.ConstantBufferView,
                    BaseShaderRegister = 0,
                    OffsetInDescriptorsFromTableStart = int.MinValue,
                    DescriptorCount = 1
                }
                    )
            };
            var rootSignatureDescription = new SharpDX.Direct3D12.RootSignatureDescription(SharpDX.Direct3D12.RootSignatureFlags.AllowInputAssemblerInputLayout, rootSignatureParameters);
            var rootSignature            = pipeline.D3D12Device.CreateRootSignature(rootSignatureDescription.Serialize());

            var vertexShader      = new SharpDX.Direct3D12.ShaderBytecode(SharpDX.D3DCompiler.ShaderBytecode.CompileFromFile("src/Shaders/FlatColor.hlsl", "VSMain", "vs_5_0"));
            var pixelShader       = new SharpDX.Direct3D12.ShaderBytecode(SharpDX.D3DCompiler.ShaderBytecode.CompileFromFile("src/Shaders/FlatColor.hlsl", "PSMain", "ps_5_0"));
            var inputElementDescs = new[]
            {
                new SharpDX.Direct3D12.InputElement("POSITION", 0, SharpDX.DXGI.Format.R32G32B32_Float, 0, 0),
                new SharpDX.Direct3D12.InputElement("COLOR", 0, SharpDX.DXGI.Format.R32G32B32A32_Float, 12, 0)
            };
            var pipelineStateObjectDescription = new SharpDX.Direct3D12.GraphicsPipelineStateDescription()
            {
                InputLayout        = new SharpDX.Direct3D12.InputLayoutDescription(inputElementDescs),
                RootSignature      = rootSignature,
                VertexShader       = vertexShader,
                PixelShader        = pixelShader,
                RasterizerState    = SharpDX.Direct3D12.RasterizerStateDescription.Default(),
                BlendState         = SharpDX.Direct3D12.BlendStateDescription.Default(),
                DepthStencilFormat = SharpDX.DXGI.Format.D32_Float,
                DepthStencilState  = new SharpDX.Direct3D12.DepthStencilStateDescription()
                {
                    IsDepthEnabled = false, IsStencilEnabled = false
                },
                SampleMask            = int.MaxValue,
                PrimitiveTopologyType = SharpDX.Direct3D12.PrimitiveTopologyType.Triangle,
                RenderTargetCount     = 1,
                Flags             = SharpDX.Direct3D12.PipelineStateFlags.None,
                SampleDescription = new SharpDX.DXGI.SampleDescription(1, 0),
                StreamOutput      = new SharpDX.Direct3D12.StreamOutputDescription()
            };

            pipelineStateObjectDescription.RenderTargetFormats[0] = SharpDX.DXGI.Format.R8G8B8A8_UNorm;
            var pipelineState = pipeline.D3D12Device.CreateGraphicsPipelineState(pipelineStateObjectDescription);

            var cbvHeapDescription = new SharpDX.Direct3D12.DescriptorHeapDescription()
            {
                DescriptorCount = 1,
                Flags           = SharpDX.Direct3D12.DescriptorHeapFlags.ShaderVisible,
                Type            = SharpDX.Direct3D12.DescriptorHeapType.ConstantBufferViewShaderResourceViewUnorderedAccessView
            };
            var constantBufferViewHeap = pipeline.D3D12Device.CreateDescriptorHeap(cbvHeapDescription);

            var constantBuffer = pipeline.D3D12Device.CreateCommittedResource(new SharpDX.Direct3D12.HeapProperties(SharpDX.Direct3D12.HeapType.Upload), SharpDX.Direct3D12.HeapFlags.None, SharpDX.Direct3D12.ResourceDescription.Buffer(1024 * 64), SharpDX.Direct3D12.ResourceStates.GenericRead);
            var cbvDescription = new SharpDX.Direct3D12.ConstantBufferViewDescription()
            {
                BufferLocation = constantBuffer.GPUVirtualAddress,
                SizeInBytes    = (SharpDX.Utilities.SizeOf <ConstantBuffer>() + 255) & ~255
            };

            pipeline.D3D12Device.CreateConstantBufferView(cbvDescription, constantBufferViewHeap.CPUDescriptorHandleForHeapStart);
            var constantBufferPointer = constantBuffer.Map(0);

            var triangleVertices = new[]
            {
                new Vertex()
                {
                    Position = new SharpDX.Vector3(0.0f, 0.25f, 0.0f), Color = new SharpDX.Vector4(1.0f, 0.0f, 0.0f, 1.0f)
                },
                new Vertex()
                {
                    Position = new SharpDX.Vector3(0.25f, -0.25f, 0.0f), Color = new SharpDX.Vector4(0.0f, 1.0f, 0.0f, 1.0f)
                },
                new Vertex()
                {
                    Position = new SharpDX.Vector3(-0.25f, -0.25f, 0.0f), Color = new SharpDX.Vector4(0.0f, 0.0f, 1.0f, 1.0f)
                }
            };
            var vertexBufferSize = SharpDX.Utilities.SizeOf(triangleVertices);
            var vertexBuffer     = pipeline.D3D12Device.CreateCommittedResource(new SharpDX.Direct3D12.HeapProperties(SharpDX.Direct3D12.HeapType.Upload), SharpDX.Direct3D12.HeapFlags.None, SharpDX.Direct3D12.ResourceDescription.Buffer(vertexBufferSize), SharpDX.Direct3D12.ResourceStates.GenericRead);
            var pVertexDataBegin = vertexBuffer.Map(0);

            SharpDX.Utilities.Write(pVertexDataBegin, triangleVertices, 0, triangleVertices.Length);
            vertexBuffer.Unmap(0);
            var vertexBufferView = new SharpDX.Direct3D12.VertexBufferView();

            vertexBufferView.BufferLocation = vertexBuffer.GPUVirtualAddress;
            vertexBufferView.StrideInBytes  = SharpDX.Utilities.SizeOf <Vertex>();
            vertexBufferView.SizeInBytes    = vertexBufferSize;

            PipelineState          = pipelineState;
            RootSignature          = rootSignature;
            VertexBufferView       = vertexBufferView;
            ConstantBufferViewHeap = constantBufferViewHeap;
            ConstantBufferPointer  = constantBufferPointer;
        }