private GpuDescriptorHandle CopyDescriptors(DescriptorAllocator descriptorAllocator, CpuDescriptorHandle baseDescriptor, int descriptorCount) { CpuDescriptorHandle destinationDescriptor = descriptorAllocator.Allocate(descriptorCount); GraphicsDevice.NativeDevice.CopyDescriptorsSimple(descriptorCount, destinationDescriptor, baseDescriptor, descriptorAllocator.DescriptorHeap.Description.Type); return(descriptorAllocator.GetGpuDescriptorHandle(destinationDescriptor)); }
public GraphicsDevice(FeatureLevel minFeatureLevel = FeatureLevel.Level11_0, bool enableDebugLayer = false) { #if DEBUG if (enableDebugLayer) { Result debugResult = D3D12.D3D12GetDebugInterface(out ID3D12Debug debugInterface); using ID3D12Debug debug = debugInterface; if (debugResult.Success) { debug.EnableDebugLayer(); } } #endif FeatureLevel = minFeatureLevel < FeatureLevel.Level11_0 ? FeatureLevel.Level11_0 : minFeatureLevel; Result result = D3D12.D3D12CreateDevice(null, (Vortice.Direct3D.FeatureLevel)FeatureLevel, out ID3D12Device device); if (result.Failure) { throw new COMException("Device creation failed.", result.Code); } NativeDevice = device; NativeComputeCommandQueue = NativeDevice.CreateCommandQueue(new CommandQueueDescription(Vortice.Direct3D12.CommandListType.Compute)); NativeCopyCommandQueue = NativeDevice.CreateCommandQueue(new CommandQueueDescription(Vortice.Direct3D12.CommandListType.Copy)); NativeDirectCommandQueue = NativeDevice.CreateCommandQueue(new CommandQueueDescription(Vortice.Direct3D12.CommandListType.Direct)); BundleAllocatorPool = new CommandAllocatorPool(this, CommandListType.Bundle); ComputeAllocatorPool = new CommandAllocatorPool(this, CommandListType.Compute); CopyAllocatorPool = new CommandAllocatorPool(this, CommandListType.Copy); DirectAllocatorPool = new CommandAllocatorPool(this, CommandListType.Direct); NativeComputeFence = NativeDevice.CreateFence(0, FenceFlags.None); NativeCopyFence = NativeDevice.CreateFence(0, FenceFlags.None); NativeDirectFence = NativeDevice.CreateFence(0, FenceFlags.None); DepthStencilViewAllocator = new DescriptorAllocator(this, DescriptorHeapType.DepthStencilView, 1); RenderTargetViewAllocator = new DescriptorAllocator(this, DescriptorHeapType.RenderTargetView, 2); ShaderResourceViewAllocator = new DescriptorAllocator(this, DescriptorHeapType.ConstantBufferViewShaderResourceViewUnorderedAccessView, 4096); SamplerAllocator = new DescriptorAllocator(this, DescriptorHeapType.Sampler, 256); ShaderVisibleShaderResourceViewAllocator = new DescriptorAllocator(this, DescriptorHeapType.ConstantBufferViewShaderResourceViewUnorderedAccessView, 4096, DescriptorHeapFlags.ShaderVisible); ShaderVisibleSamplerAllocator = new DescriptorAllocator(this, DescriptorHeapType.Sampler, 256, DescriptorHeapFlags.ShaderVisible); CommandList = new CommandList(this, CommandListType.Direct); CommandList.Close(); CopyCommandList = new CommandList(this, CommandListType.Copy); CopyCommandList.Close(); }
public DescriptorSet(GraphicsDevice device, int descriptorCount, DescriptorHeapType descriptorHeapType = DescriptorHeapType.ConstantBufferViewShaderResourceViewUnorderedAccessView) { if (descriptorCount < 1) { throw new ArgumentOutOfRangeException(nameof(descriptorCount)); } GraphicsDevice = device; DescriptorHeapType = descriptorHeapType; DescriptorCapacity = descriptorCount; DescriptorAllocator = GetDescriptorAllocator(); StartCpuDescriptorHandle = DescriptorAllocator.Allocate(DescriptorCapacity); }
public unsafe GraphicsDevice(FeatureLevel minFeatureLevel = FeatureLevel.Level11_0, bool enableDebugLayer = false) { if (enableDebugLayer) { Result debugResult = D3D12.D3D12GetDebugInterface(out ID3D12Debug debugInterface); if (debugResult.Success) { ID3D12Debug1 debug = debugInterface.QueryInterface <ID3D12Debug1>(); debug.EnableDebugLayer(); } } FeatureLevel = minFeatureLevel < FeatureLevel.Level11_0 ? FeatureLevel.Level11_0 : minFeatureLevel; Result result = D3D12.D3D12CreateDevice(null, (Vortice.Direct3D.FeatureLevel)FeatureLevel, out ID3D12Device device); if (result.Failure) { throw new COMException("Device creation failed.", result.Code); } NativeDevice = device; DirectCommandQueue = new CommandQueue(this, CommandListType.Direct); ComputeCommandQueue = new CommandQueue(this, CommandListType.Compute); CopyCommandQueue = new CommandQueue(this, CommandListType.Copy); DepthStencilViewAllocator = new DescriptorAllocator(this, DescriptorHeapType.DepthStencilView, 1); RenderTargetViewAllocator = new DescriptorAllocator(this, DescriptorHeapType.RenderTargetView, 2); ShaderResourceViewAllocator = new DescriptorAllocator(this, DescriptorHeapType.ConstantBufferViewShaderResourceViewUnorderedAccessView, 4096); SamplerAllocator = new DescriptorAllocator(this, DescriptorHeapType.Sampler, 256); ShaderVisibleShaderResourceViewAllocator = new DescriptorAllocator(this, DescriptorHeapType.ConstantBufferViewShaderResourceViewUnorderedAccessView, 4096, DescriptorHeapFlags.ShaderVisible); ShaderVisibleSamplerAllocator = new DescriptorAllocator(this, DescriptorHeapType.Sampler, 256, DescriptorHeapFlags.ShaderVisible); CommandList = new CommandList(this, CommandListType.Direct); CommandList.Close(); }
private void SetGraphicsRootDescriptorTable(int rootParameterIndex, DescriptorAllocator descriptorAllocator, CpuDescriptorHandle baseDescriptor, int descriptorCount) { GpuDescriptorHandle gpuDescriptorHandle = CopyDescriptors(descriptorAllocator, baseDescriptor, descriptorCount); currentCommandList.NativeCommandList.SetGraphicsRootDescriptorTable(rootParameterIndex, gpuDescriptorHandle); }