private unsafe void Deserialize(IntPtr pNativePtr) { if (pNativePtr == IntPtr.Zero) { return; } __Native *pNative = (__Native *)pNativePtr; if (pNative->ParameterCount > 0) { Parameters = new RootParameter[pNative->ParameterCount]; RootParameter.__Native *rpn = (RootParameter.__Native *)pNative->ParametersPointer; for (int i = 0; i < Parameters.Length; ++i) { Parameters[i] = new RootParameter(); if (rpn[i].ParameterType == RootParameterType.DescriptorTable) { // Marshal descriptor table DescriptorRange[] ranges = null; int rangeCount = rpn[i].Union.DescriptorTable.DescriptorRangeCount; if (rangeCount > 0) { ranges = new DescriptorRange[rangeCount]; Utilities.Read(rpn[i].Union.DescriptorTable.DescriptorRangesPointer, ranges, 0, ranges.Length); } Parameters[i] = new RootParameter(rpn[i].ShaderVisibility, ranges); } else { // No need to marshal them when RootParameter don't contain DescriptorTable - simple copy as-is Parameters[i] = new RootParameter { native = *rpn }; } } } if (pNative->StaticSamplerCount > 0) { StaticSamplers = new StaticSamplerDescription[pNative->StaticSamplerCount]; Utilities.Read(pNative->StaticSamplerPointer, StaticSamplers, 0, StaticSamplers.Length); } }
private void LoadAssets() { DescriptorRange[] ranges = new DescriptorRange[] { new DescriptorRange() { RangeType = DescriptorRangeType.ShaderResourceView, DescriptorCount = 1, OffsetInDescriptorsFromTableStart = int.MinValue, BaseShaderRegister = 0 } }; StaticSamplerDescription sampler = new StaticSamplerDescription() { Filter = Filter.MinimumMinMagMipPoint, AddressU = TextureAddressMode.Border, AddressV = TextureAddressMode.Border, AddressW = TextureAddressMode.Border, MipLODBias = 0, MaxAnisotropy = 0, ComparisonFunc = Comparison.Never, BorderColor = StaticBorderColor.TransparentBlack, MinLOD = 0.0f, MaxLOD = float.MaxValue, ShaderRegister = 0, RegisterSpace = 0, ShaderVisibility = ShaderVisibility.Pixel, }; RootParameter[] rootParameters = new RootParameter[] { new RootParameter(ShaderVisibility.Pixel, ranges) }; RootSignatureDescription rootSignatureDesc = new RootSignatureDescription(RootSignatureFlags.AllowInputAssemblerInputLayout, rootParameters, new StaticSamplerDescription[] { sampler }); rootSignature = device.CreateRootSignature(0, rootSignatureDesc.Serialize()); // Create the pipeline state, which includes compiling and loading shaders. #if DEBUG var vertexShader = new ShaderBytecode(SharpDX.D3DCompiler.ShaderBytecode.CompileFromFile("shaders.hlsl", "VSMain", "vs_5_0", SharpDX.D3DCompiler.ShaderFlags.Debug)); #else var vertexShader = new ShaderBytecode(SharpDX.D3DCompiler.ShaderBytecode.CompileFromFile("shaders.hlsl", "VSMain", "vs_5_0")); #endif #if DEBUG var pixelShader = new ShaderBytecode(SharpDX.D3DCompiler.ShaderBytecode.CompileFromFile("shaders.hlsl", "PSMain", "ps_5_0", SharpDX.D3DCompiler.ShaderFlags.Debug)); #else var pixelShader = new ShaderBytecode(SharpDX.D3DCompiler.ShaderBytecode.CompileFromFile("shaders.hlsl", "PSMain", "ps_5_0")); #endif // Define the vertex input layout. InputElement[] inputElementDescs = new InputElement[] { new InputElement("POSITION",0,Format.R32G32B32_Float,0,0), new InputElement("TEXCOORD",0,Format.R32G32_Float,12,0) }; // Describe and create the graphics pipeline state object (PSO). GraphicsPipelineStateDescription psoDesc = new GraphicsPipelineStateDescription() { InputLayout = new InputLayoutDescription(inputElementDescs), RootSignature = rootSignature, VertexShader = vertexShader, PixelShader = pixelShader, RasterizerState = RasterizerStateDescription.Default(), BlendState = BlendStateDescription.Default(), DepthStencilFormat = SharpDX.DXGI.Format.D32_Float, DepthStencilState = new DepthStencilStateDescription() { IsDepthEnabled = false, IsStencilEnabled = false }, SampleMask = int.MaxValue, PrimitiveTopologyType = PrimitiveTopologyType.Triangle, RenderTargetCount = 1, Flags = PipelineStateFlags.None, SampleDescription = new SharpDX.DXGI.SampleDescription(1, 0), StreamOutput = new StreamOutputDescription() }; psoDesc.RenderTargetFormats[0] = SharpDX.DXGI.Format.R8G8B8A8_UNorm; pipelineState = device.CreateGraphicsPipelineState(psoDesc); // Create the command list. commandList = device.CreateCommandList(CommandListType.Direct, commandAllocator, pipelineState); // Create the vertex buffer. float aspectRatio = viewport.Width / viewport.Height; // Define the geometry for a triangle. Vertex[] triangleVertices = new Vertex[] { new Vertex() {position=new Vector3(0.0f, 0.25f * aspectRatio, 0.0f ),uv=new Vector2(0.5f, 0.0f) }, new Vertex() {position=new Vector3(0.25f, -0.25f * aspectRatio, 0.0f),uv=new Vector2(1.0f, 1.0f) }, new Vertex() {position=new Vector3(-0.25f, -0.25f * aspectRatio, 0.0f),uv=new Vector2(0.0f, 1.0f) }, }; int vertexBufferSize = Utilities.SizeOf(triangleVertices); // Note: using upload heaps to transfer static data like vert buffers is not // recommended. Every time the GPU needs it, the upload heap will be marshalled // over. Please read up on Default Heap usage. An upload heap is used here for // code simplicity and because there are very few verts to actually transfer. vertexBuffer = device.CreateCommittedResource(new HeapProperties(HeapType.Upload), HeapFlags.None, ResourceDescription.Buffer(vertexBufferSize), ResourceStates.GenericRead); // Copy the triangle data to the vertex buffer. IntPtr pVertexDataBegin = vertexBuffer.Map(0); Utilities.Write(pVertexDataBegin, triangleVertices, 0, triangleVertices.Length); vertexBuffer.Unmap(0); // Initialize the vertex buffer view. vertexBufferView = new VertexBufferView(); vertexBufferView.BufferLocation = vertexBuffer.GPUVirtualAddress; vertexBufferView.StrideInBytes = Utilities.SizeOf<Vertex>(); vertexBufferView.SizeInBytes = vertexBufferSize; Resource textureUploadHeap; // Create the texture. // Describe and create a Texture2D. ResourceDescription textureDesc = ResourceDescription.Texture2D(Format.R8G8B8A8_UNorm, TextureWidth, TextureHeight); texture = device.CreateCommittedResource(new HeapProperties(HeapType.Default), HeapFlags.None, textureDesc, ResourceStates.CopyDestination); long uploadBufferSize = GetRequiredIntermediateSize(this.texture, 0, 1); // Create the GPU upload buffer. textureUploadHeap = device.CreateCommittedResource(new HeapProperties(CpuPageProperty.WriteBack, MemoryPool.L0), HeapFlags.None, ResourceDescription.Texture2D(Format.R8G8B8A8_UNorm, TextureWidth, TextureHeight), ResourceStates.GenericRead); // Copy data to the intermediate upload heap and then schedule a copy // from the upload heap to the Texture2D. byte[] textureData = GenerateTextureData(); GCHandle handle = GCHandle.Alloc(textureData, GCHandleType.Pinned); IntPtr ptr = Marshal.UnsafeAddrOfPinnedArrayElement(textureData, 0); textureUploadHeap.WriteToSubresource(0, null, ptr, TexturePixelSize * TextureWidth, textureData.Length); handle.Free(); commandList.CopyTextureRegion(new TextureCopyLocation(texture, 0), 0, 0, 0, new TextureCopyLocation(textureUploadHeap, 0), null); commandList.ResourceBarrierTransition(this.texture, ResourceStates.CopyDestination, ResourceStates.PixelShaderResource); // Describe and create a SRV for the texture. ShaderResourceViewDescription srvDesc = new ShaderResourceViewDescription() { Shader4ComponentMapping = D3DXUtilities.DefaultComponentMapping(), Format = textureDesc.Format, Dimension = ShaderResourceViewDimension.Texture2D, }; srvDesc.Texture2D.MipLevels = 1; device.CreateShaderResourceView(this.texture, srvDesc, shaderRenderViewHeap.CPUDescriptorHandleForHeapStart); // Command lists are created in the recording state, but there is nothing // to record yet. The main loop expects it to be closed, so close it now. commandList.Close(); commandQueue.ExecuteCommandList(commandList); // Create synchronization objects. fence = device.CreateFence(0, FenceFlags.None); fenceValue = 1; // Create an event handle to use for frame synchronization. fenceEvent = new AutoResetEvent(false); WaitForPreviousFrame(); //release temp texture textureUploadHeap.Dispose(); }
/// <summary> /// Initializes a new instance of the <see cref="RootSignatureDescription"/> class. /// </summary> /// <param name="flags">The flags.</param> /// <param name="parameters">The parameters.</param> /// <param name="samplers">The samplers.</param> public RootSignatureDescription(RootSignatureFlags flags, RootParameter[] parameters = null, StaticSamplerDescription[] samplers = null) { Parameters = parameters; StaticSamplers = samplers; Flags = flags; }
private unsafe void Deserialize(IntPtr pNativePtr) { if(pNativePtr == IntPtr.Zero) { return; } __Native* pNative = (__Native*)pNativePtr; if (pNative->ParameterCount > 0) { Parameters = new RootParameter[pNative->ParameterCount]; RootParameter.__Native* rpn = (RootParameter.__Native * ) pNative->ParametersPointer; for (int i = 0; i < Parameters.Length; ++i) { Parameters[i] = new RootParameter(); if (rpn[i].ParameterType == RootParameterType.DescriptorTable) { // Marshal descriptor table DescriptorRange[] ranges = null; int rangeCount = rpn[i].Union.DescriptorTable.DescriptorRangeCount; if (rangeCount > 0) { ranges = new DescriptorRange[rangeCount]; Utilities.Read(rpn[i].Union.DescriptorTable.DescriptorRangesPointer, ranges, 0, ranges.Length); } Parameters[i] = new RootParameter(rpn[i].ShaderVisibility, ranges); } else { // No need to marshal them when RootParameter don't contain DescriptorTable - simple copy as-is Parameters[i] = new RootParameter {native = *rpn}; } } } if (pNative->StaticSamplerCount > 0) { StaticSamplers = new StaticSamplerDescription[pNative->StaticSamplerCount]; Utilities.Read(pNative->StaticSamplerPointer, StaticSamplers, 0, StaticSamplers.Length); } }
private void PlatformConstruct(GraphicsDevice graphicsDevice, PipelineLayoutDescription description) { var rootParameters = new RootParameter[description.Entries.Length]; for (var i = 0; i < description.Entries.Length; i++) { var entry = description.Entries[i]; switch (entry.EntryType) { case PipelineLayoutEntryType.Resource: rootParameters[i] = new RootParameter( entry.Visibility.ToShaderVisibility(), new RootDescriptor(entry.Resource.ShaderRegister, 0), entry.ResourceType.ToRootParameterType()); break; case PipelineLayoutEntryType.ResourceView: rootParameters[i] = new RootParameter( entry.Visibility.ToShaderVisibility(), new DescriptorRange( entry.ResourceType.ToDescriptorRangeType(), entry.ResourceView.ResourceCount, entry.ResourceView.BaseShaderRegister)); break; default: throw new System.InvalidOperationException(); } } var staticSamplerStates = description.StaticSamplerStates ?? new StaticSamplerDescription[0]; var staticSamplerDescriptions = new D3D12.StaticSamplerDescription[staticSamplerStates.Length]; for (var i = 0; i < staticSamplerStates.Length; i++) { var staticSamplerState = staticSamplerStates[i]; var samplerStateDescription = new D3D12.SamplerStateDescription { Filter = staticSamplerState.SamplerStateDescription.Filter.ToFilter(), AddressU = TextureAddressMode.Wrap, AddressV = TextureAddressMode.Wrap, AddressW = TextureAddressMode.Clamp, ComparisonFunction = Comparison.Always, MinimumLod = 0, MaximumLod = float.MaxValue, MaximumAnisotropy = staticSamplerState.SamplerStateDescription.MaxAnisotropy }; staticSamplerDescriptions[i] = new D3D12.StaticSamplerDescription( samplerStateDescription, staticSamplerState.Visibility.ToShaderVisibility(), staticSamplerState.ShaderRegister, 0); } var rootSignatureDescription = new RootSignatureDescription( RootSignatureFlags.AllowInputAssemblerInputLayout, parameters: rootParameters, samplers: staticSamplerDescriptions); var serializedRootSignatureDescription = rootSignatureDescription.Serialize(); DeviceRootSignature = AddDisposable(graphicsDevice.Device.CreateRootSignature(serializedRootSignatureDescription)); }
public RootSignatureDescription(RootSignatureFlags flags, RootParameter[] parameters = null, StaticSamplerDescription[] samplers = null) { Parameters = new RootParameterArray(parameters); StaticSamplers = new StaticSamplerArray(samplers); Flags = flags; }
internal StaticSamplerArray(StaticSamplerDescription[] parameters) { count = 0; nativeParameters = IntPtr.Zero; managedParameters = parameters; if (parameters != null) { count = parameters.Length; } }