/// <summary>Initializes a new instance of the <see cref="GraphicsMemoryBlockCollection" /> class.</summary> /// <param name="device">The device for which the memory block collection is being created</param> /// <param name="allocator">The allocator that manages the collection.</param> /// <exception cref="ArgumentNullException"><paramref name="device" /> is <c>null</c>.</exception> /// <exception cref="ArgumentNullException"><paramref name="allocator" /> is <c>null</c>.</exception> /// <exception cref="ArgumentOutOfRangeException"><paramref name="allocator" /> was not created for <paramref name="device" />.</exception> protected GraphicsMemoryBlockCollection(GraphicsDevice device, GraphicsMemoryAllocator allocator) : base(device) { ThrowIfNull(allocator, nameof(allocator)); if (allocator.Device != device) { ThrowForInvalidParent(allocator.Device, nameof(allocator)); } _allocator = allocator; _blocks = new List <GraphicsMemoryBlock>(); _mutex = new ReaderWriterLockSlim(); ref readonly var allocatorSettings = ref _allocator.Settings;
/// <summary>Initializes a new instance of the <see cref="GraphicsMemoryBlockCollection" /> class.</summary> /// <param name="blockMinimumSize">The minimum size of any new memory blocks created for the collection, in bytes.</param> /// <param name="blockPreferredSize">The preferred size of any new memory blocks created for the collection, in bytes.</param> /// <param name="blockMarginSize">The minimum size of free regions to keep on either side of an allocated region, in bytes.</param> /// <param name="blockMinimumFreeRegionSizeToRegister">The minimum size of a free region for it to be registered as available, in bytes.</param> /// <param name="allocator">The allocator that manages the collection.</param> /// <param name="minimumBlockCount">The minimum number of blocks allowed in the collection.</param> /// <param name="maximumBlockCount">The maximum number of blocks allowed in the collection.</param> /// <exception cref="ArgumentOutOfRangeException"><paramref name="blockMinimumSize" /> is <c>zero</c>.</exception> /// <exception cref="ArgumentOutOfRangeException"><paramref name="blockPreferredSize" /> is less than <paramref name="blockMinimumSize"/>.</exception> /// <exception cref="ArgumentNullException"><paramref name="allocator" /> is <c>null</c>.</exception> /// <exception cref="ArgumentOutOfRangeException"><paramref name="maximumBlockCount" /> is <c>zero</c>.</exception> /// <exception cref="ArgumentOutOfRangeException"><paramref name="blockMinimumSize"/> is greater than <paramref name="maximumBlockCount"/>.</exception> protected GraphicsMemoryBlockCollection(ulong blockMinimumSize, ulong blockPreferredSize, ulong blockMarginSize, ulong blockMinimumFreeRegionSizeToRegister, GraphicsMemoryAllocator allocator, nuint minimumBlockCount, nuint maximumBlockCount) { ThrowIfZero(blockMinimumSize, nameof(blockMinimumSize)); if (blockPreferredSize < blockMinimumSize) { ThrowArgumentOutOfRangeException(nameof(blockPreferredSize), blockPreferredSize); } ThrowIfNull(allocator, nameof(allocator)); ThrowIfZero(maximumBlockCount, nameof(maximumBlockCount)); if (minimumBlockCount > maximumBlockCount) { ThrowArgumentOutOfRangeException(nameof(minimumBlockCount), minimumBlockCount); } _blockMarginSize = blockMarginSize; _blockMinimumSize = blockMinimumSize; _blockMinimumFreeRegionSizeToRegister = blockMinimumFreeRegionSizeToRegister; _blockPreferredSize = blockPreferredSize; _allocator = allocator; _blocks = new List <GraphicsMemoryBlock>(); _mutex = new ReaderWriterLockSlim(); _maximumBlockCount = maximumBlockCount; _minimumBlockCount = minimumBlockCount; for (nuint i = 0; i < _minimumBlockCount; ++i) { var block = CreateBlock(blockMinimumSize); _blocks.Add(block); } _ = _state.Transition(to: Initialized); }