예제 #1
0
        /// <summary>
        /// Creates a new <see cref="GraphicsDevice"/> instance for the input <see cref="ID3D12Device"/>.
        /// </summary>
        /// <param name="d3D12Device">The <see cref="ID3D12Device"/> to use for the new <see cref="GraphicsDevice"/> instance.</param>
        /// <param name="dxgiAdapter">The <see cref="IDXGIAdapter"/> that <paramref name="d3D12Device"/> was created from.</param>
        /// <param name="dxgiDescription1">The available info for the new <see cref="GraphicsDevice"/> instance.</param>
        internal GraphicsDevice(ID3D12Device *d3D12Device, IDXGIAdapter *dxgiAdapter, DXGI_ADAPTER_DESC1 *dxgiDescription1)
        {
            this.d3D12Device = new ComPtr <ID3D12Device>(d3D12Device);
            this.d3D12ComputeCommandQueue = d3D12Device->CreateCommandQueue(D3D12_COMMAND_LIST_TYPE_COMPUTE);
            this.d3D12CopyCommandQueue    = d3D12Device->CreateCommandQueue(D3D12_COMMAND_LIST_TYPE_COPY);
            this.d3D12ComputeFence        = d3D12Device->CreateFence();
            this.d3D12CopyFence           = d3D12Device->CreateFence();

            this.computeCommandAllocatorPool           = new ID3D12CommandAllocatorPool(D3D12_COMMAND_LIST_TYPE_COMPUTE);
            this.copyCommandAllocatorPool              = new ID3D12CommandAllocatorPool(D3D12_COMMAND_LIST_TYPE_COPY);
            this.shaderResourceViewDescriptorAllocator = new ID3D12DescriptorHandleAllocator(d3D12Device);

            Luid = Luid.FromLUID(dxgiDescription1->AdapterLuid);
            Name = new string((char *)dxgiDescription1->Description);
            DedicatedMemorySize   = dxgiDescription1->DedicatedVideoMemory;
            SharedMemorySize      = dxgiDescription1->SharedSystemMemory;
            IsHardwareAccelerated = (dxgiDescription1->Flags & (uint)DXGI_ADAPTER_FLAG_SOFTWARE) == 0;

            var d3D12Options1Data = d3D12Device->CheckFeatureSupport <D3D12_FEATURE_DATA_D3D12_OPTIONS1>(D3D12_FEATURE_D3D12_OPTIONS1);

            ComputeUnits  = d3D12Options1Data.TotalLaneCount;
            WavefrontSize = d3D12Options1Data.WaveLaneCountMin;

            var d3D12Architecture1Data = d3D12Device->CheckFeatureSupport <D3D12_FEATURE_DATA_ARCHITECTURE1>(D3D12_FEATURE_ARCHITECTURE1);

            IsCacheCoherentUMA = d3D12Architecture1Data.CacheCoherentUMA != 0;

            D3D12MA_ALLOCATOR_DESC allocatorDesc = default;

            allocatorDesc.pDevice  = d3D12Device;
            allocatorDesc.pAdapter = dxgiAdapter;

            if (!IsCacheCoherentUMA)
            {
                fixed(D3D12MA_Allocator **allocator = this.allocator)
                {
                    D3D12MemAlloc.D3D12MA_CreateAllocator(&allocatorDesc, allocator).Assert();
                }
            }
        }
예제 #2
0
    /// <summary>
    /// Creates a new <see cref="GraphicsDevice"/> instance for the input <see cref="ID3D12Device"/>.
    /// </summary>
    /// <param name="d3D12Device">The <see cref="ID3D12Device"/> to use for the new <see cref="GraphicsDevice"/> instance.</param>
    /// <param name="dxgiAdapter">The <see cref="IDXGIAdapter"/> that <paramref name="d3D12Device"/> was created from.</param>
    /// <param name="dxgiDescription1">The available info for the new <see cref="GraphicsDevice"/> instance.</param>
    internal GraphicsDevice(ID3D12Device *d3D12Device, IDXGIAdapter *dxgiAdapter, DXGI_ADAPTER_DESC1 *dxgiDescription1)
    {
        this.d3D12Device = new ComPtr <ID3D12Device>(d3D12Device);

        this.d3D12ComputeCommandQueue = d3D12Device->CreateCommandQueue(D3D12_COMMAND_LIST_TYPE_COMPUTE);
        this.d3D12CopyCommandQueue    = d3D12Device->CreateCommandQueue(D3D12_COMMAND_LIST_TYPE_COPY);
        this.d3D12ComputeFence        = d3D12Device->CreateFence();
        this.d3D12CopyFence           = d3D12Device->CreateFence();

        this.shaderResourceViewDescriptorAllocator = new ID3D12DescriptorHandleAllocator(d3D12Device);
        this.computeCommandListPool = new ID3D12CommandListPool(D3D12_COMMAND_LIST_TYPE_COMPUTE);
        this.copyCommandListPool    = new ID3D12CommandListPool(D3D12_COMMAND_LIST_TYPE_COPY);

        Luid = Luid.FromLUID(dxgiDescription1->AdapterLuid);
        Name = new string((char *)dxgiDescription1->Description);
        DedicatedMemorySize   = dxgiDescription1->DedicatedVideoMemory;
        SharedMemorySize      = dxgiDescription1->SharedSystemMemory;
        IsHardwareAccelerated = (dxgiDescription1->Flags & (uint)DXGI_ADAPTER_FLAG_SOFTWARE) == 0;

        var d3D12Options1Data = d3D12Device->CheckFeatureSupport <D3D12_FEATURE_DATA_D3D12_OPTIONS1>(D3D12_FEATURE_D3D12_OPTIONS1);

        ComputeUnits  = d3D12Options1Data.TotalLaneCount;
        WavefrontSize = d3D12Options1Data.WaveLaneCountMin;

        var d3D12Architecture1Data = d3D12Device->CheckFeatureSupport <D3D12_FEATURE_DATA_ARCHITECTURE1>(D3D12_FEATURE_ARCHITECTURE1);

        IsCacheCoherentUMA = d3D12Architecture1Data.CacheCoherentUMA != 0;

#if NET6_0_OR_GREATER
        this.allocator = d3D12Device->CreateAllocator(dxgiAdapter);

        if (IsCacheCoherentUMA)
        {
            this.pool = this.allocator.Get()->CreatePoolForCacheCoherentUMA();
        }
#endif
    }