示例#1
0
        /// <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;
示例#2
0
        /// <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);
        }