/// <summary> /// Set the vertex buffers /// </summary> /// <param name="vertexBuffers">The vertex buffers to set</param> /// <param name="startSlot">The slot on the device array to start setting vertex buffers to</param> /// <typeparam name="T">The type of the vertex in <see cref="VertexBuffer{TVertex}"/></typeparam> public void SetVertexBuffers <T>(ReadOnlySpan <VertexBuffer <T> > vertexBuffers, uint startSlot = 0) where T : unmanaged { Debug.Assert(StackSentinel.SafeToStackalloc <D3D12_VERTEX_BUFFER_VIEW>(vertexBuffers.Length)); D3D12_VERTEX_BUFFER_VIEW *views = stackalloc D3D12_VERTEX_BUFFER_VIEW[vertexBuffers.Length]; for (int i = 0; i < vertexBuffers.Length; i++) { views[i] = vertexBuffers[i].BufferView; } _list.Get()->IASetVertexBuffers(startSlot, (uint)vertexBuffers.Length, views); }
/// <summary> /// /// </summary> /// <param name="commandList"></param> /// <param name="color"></param> /// <param name="message"></param> public static void BeginEventOnCommandList( ID3D12GraphicsCommandList *commandList, Argb32 color, ReadOnlySpan <char> message ) { var length = Utf8Length(message); var buff = StackSentinel.SafeToStackalloc <byte>(length) ? stackalloc byte[length] : new byte[length]; Encoding.UTF8.GetBytes(message, buff); var hr = _PIXBeginEventOnCommandList(commandList, Argb32.GetAs32BitArgb(color), (byte *)Unsafe.AsPointer(ref MemoryMarshal.GetReference(buff))); Guard.ThrowIfFailed(hr); }
public override bool TryEnablePreferentialOrdering(DevicePreference preference) { DXCoreAdapterPreference *pPreferences = stackalloc DXCoreAdapterPreference[4]; int i = 0; _softwareOnly = preference.HasFlag(DevicePreference.Software) && !preference.HasFlag(DevicePreference.Hardware); if (!TryAdd(DevicePreference.Hardware, DXCoreAdapterPreference.Hardware)) { return(false); } if (!TryAdd(DevicePreference.LowPower, DXCoreAdapterPreference.MinimumPower)) { return(false); } if (!TryAdd(DevicePreference.HighPerformance, DXCoreAdapterPreference.HighPerformance)) { return(false); } Guard.ThrowIfFailed(_list.Ptr->Sort((uint)i, pPreferences)); return(true); bool TryAdd(DevicePreference devicePref, DXCoreAdapterPreference dxCorePref) { if (!preference.HasFlag(devicePref)) { return(true); } if (!_list.Ptr->IsAdapterPreferenceSupported(dxCorePref)) { return(false); } StackSentinel.StackAssert(i < 4); pPreferences[i++] = dxCorePref; return(true); } }
/// <summary> /// Asynchronously makes <paramref name="evicted"/> resident on the device /// </summary> /// <typeparam name="T">The type of the evicted resourcse</typeparam> /// <param name="evicted">The <typeparamref name="T"/>s to make resident</param> /// <returns>A <see cref="GpuTask"/> that can be used to work out when the resource is resident</returns> public GpuTask MakeResidentAsync <T>(ReadOnlySpan <T> evicted) where T : IEvictable { if (DeviceLevel < SupportedDevice.Device3) { ThrowHelper.ThrowNotSupportedException(Error_CantMakeResidentAsync); } var newValue = Interlocked.Increment(ref _lastFenceSignal); // classes will never be blittable to pointer, so this handles that if (default(T)?.IsBlittableToPointer ?? false) { fixed(void *pEvictables = &Unsafe.As <T, byte>(ref MemoryMarshal.GetReference(evicted))) { ThrowIfFailed(As <ID3D12Device3>()->EnqueueMakeResident( D3D12_RESIDENCY_FLAGS.D3D12_RESIDENCY_FLAG_DENY_OVERBUDGET, (uint)evicted.Length, (ID3D12Pageable **)pEvictables, _residencyFence.Ptr, newValue )); } } else { if (StackSentinel.SafeToStackallocPointers(evicted.Length)) { ID3D12Pageable **pEvictables = stackalloc ID3D12Pageable *[evicted.Length]; for (int i = 0; i < evicted.Length; i++) { pEvictables[i] = evicted[i].GetPageable(); } ThrowIfFailed(As <ID3D12Device3>()->EnqueueMakeResident( D3D12_RESIDENCY_FLAGS.D3D12_RESIDENCY_FLAG_DENY_OVERBUDGET, (uint)evicted.Length, pEvictables, _residencyFence.Ptr, newValue )); } else { using var pool = RentedArray <nuint> .Create(evicted.Length, PinnedArrayPool <nuint> .Default); for (int i = 0; i < evicted.Length; i++) { pool.Value[i] = (nuint)evicted[i].GetPageable(); } ThrowIfFailed(As <ID3D12Device3>()->EnqueueMakeResident( D3D12_RESIDENCY_FLAGS.D3D12_RESIDENCY_FLAG_DENY_OVERBUDGET, (uint)evicted.Length, (ID3D12Pageable **)Unsafe.AsPointer(ref MemoryMarshal.GetArrayDataReference(pool.Value)), _residencyFence.Ptr, newValue )); } } return(new GpuTask(this, _residencyFence, newValue)); }