// ----------------------------------------------------------------------------- // file="glFunction.SourceManager" // Project: StgSharp // Copyright (c) Nitload. // SPDX-License-Identifier: MIT // ----------------------------------------------------------------------------- using StgSharp; using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Runtime.CompilerServices; namespace StgSharp.Graphics.OpenGL { public partial class OpenGLFunction { private readonly int textureUnitCountGetter; public int TextureUnitCount => textureUnitCountGetter; private ConcurrentQueue UnusedTextureImageUint { [MethodImpl(MethodImplOptions.AggressiveInlining)] get; } = []; internal void ReturnAvailableUnit( IEnumerable source ) { int v = glConst.TEXTURE0 + TextureUnitCount; foreach (TextureUnit unit in source) { if ((int)unit > v) { throw new InvalidOperationException( "Source contains texture unit beyond context support."); } } } internal int TryGetAvailableTextureUnit( int count, out IEnumerable result ) { result = new Queue(); for (int i = 0; i < count; i++) { if (UnusedTextureImageUint.TryDequeue(out TextureUnit unit)) { (result as Queue)!.Enqueue(unit); } else { return i; } } return count; } private ConcurrentQueue InitializeUnusedTextureImageUint() { ConcurrentQueue result = new ConcurrentQueue(); for (int index = 0; index < TextureUnitCount; index++) { result.Enqueue((TextureUnit)(glConst.TEXTURE0 + index)); } return result; } } }