Exemple #1
0
 /// <summary>
 /// No documentation for Direct3D12
 /// </summary>
 /// <param name="startSlot">No documentation.</param>
 /// <param name="descRef">No documentation.</param>
 /// <param name="numBuffers">No documentation.</param>
 /// <include file='.\..\Documentation\CodeComments.xml' path="/comments/comment[@id='ID3D12GraphicsCommandList::SetVertexBuffers']/*"/>
 /// <unmanaged>void ID3D12GraphicsCommandList::SetVertexBuffers([In] unsigned int StartSlot,[In, Buffer, Optional] const D3D12_VERTEX_BUFFER_VIEW* pDesc,[In] unsigned int NumBuffers)</unmanaged>
 /// <unmanaged-short>ID3D12GraphicsCommandList::SetVertexBuffers</unmanaged-short>
 public void SetVertexBuffer(int startSlot, SharpDX.Direct3D12.VertexBufferView descRef)
 {
     unsafe
     {
         SetVertexBuffers(startSlot, 1, (IntPtr)(&descRef));
     }
 }
        // @TODO - I need to wrap command list separately!, it is just temporary method! SHOULD!! FIX!!
        public void setVertexBuffers(SharpDX.Direct3D12.GraphicsCommandList commandList)
        {
            SharpDX.Direct3D12.VertexBufferView positionVertexBufferView = ((Gen2Layer.H1VertexBufferView)m_PositionVertexBuffer.View).View;
            SharpDX.Direct3D12.VertexBufferView normalVertexBufferView   = ((Gen2Layer.H1VertexBufferView)m_NormalVertexBuffer.View).View;
            SharpDX.Direct3D12.VertexBufferView texcoordVertexBufferView = ((Gen2Layer.H1VertexBufferView)m_TexcoordVertexBuffers[0].View).View;
            SharpDX.Direct3D12.VertexBufferView colorVertexBufferView    = ((Gen2Layer.H1VertexBufferView)m_ColorVertexBuffer.View).View;

            commandList.SetVertexBuffer(0, positionVertexBufferView);
            commandList.SetVertexBuffer(1, normalVertexBufferView);
            commandList.SetVertexBuffer(2, texcoordVertexBufferView);
            commandList.SetVertexBuffer(3, colorVertexBufferView);
        }
        // @TODO - I need to wrap command list separately!, it is just temporary method! SHOULD!! FIX!!
        public void setVertexBuffers(SharpDX.Direct3D12.GraphicsCommandList commandList)
        {
            SharpDX.Direct3D12.VertexBufferView PositionBufferView  = ((Gen2Layer.H1VertexBufferView)m_ShaderData.PositionBuffer.View).View;
            SharpDX.Direct3D12.VertexBufferView TangentZBufferView  = ((Gen2Layer.H1VertexBufferView)m_ShaderData.TangentZBuffer.View).View;
            SharpDX.Direct3D12.VertexBufferView TangentXBufferView  = ((Gen2Layer.H1VertexBufferView)m_ShaderData.TangentXBuffer.View).View;
            SharpDX.Direct3D12.VertexBufferView BoneIndicesView     = ((Gen2Layer.H1VertexBufferView)m_ShaderData.BoneIndices.View).View;
            SharpDX.Direct3D12.VertexBufferView BoneWeightsView     = ((Gen2Layer.H1VertexBufferView)m_ShaderData.BoneWeights.View).View;
            SharpDX.Direct3D12.VertexBufferView Texcoord0BufferView = ((Gen2Layer.H1VertexBufferView)m_ShaderData.TexcoordBuffers[0].View).View;
            SharpDX.Direct3D12.VertexBufferView ColorBufferView     = ((Gen2Layer.H1VertexBufferView)m_ShaderData.ColorBuffer.View).View;

            commandList.SetVertexBuffer(0, PositionBufferView);
            commandList.SetVertexBuffer(1, TangentZBufferView);
            commandList.SetVertexBuffer(2, TangentXBufferView);
            commandList.SetVertexBuffer(3, BoneIndicesView);
            commandList.SetVertexBuffer(4, BoneWeightsView);
            commandList.SetVertexBuffer(5, Texcoord0BufferView);
            commandList.SetVertexBuffer(6, ColorBufferView);
        }
        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;
        }