// MonoGame - Copyright (C) The MonoGame Team // This file is subject to the terms and conditions defined in // file 'LICENSE.txt', which is part of this source code package. using System; using System.Diagnostics; using System.Threading; namespace Microsoft.Xna.Framework.Graphics { public abstract partial class Texture : GraphicsResource { internal SurfaceFormat _format; internal int _levelCount; private readonly int _sortingKey = Interlocked.Increment(ref _lastSortingKey); private static int _lastSortingKey; /// /// Gets a unique identifier of this texture for sorting purposes. /// /// /// For example, this value is used by when drawing with . /// The value is an implementation detail and may change between application launches or MonoGame versions. /// It is only guaranteed to stay consistent during application lifetime. /// public int SortingKey { get { return _sortingKey; } } public SurfaceFormat Format { get { return _format; } } public int LevelCount { get { return _levelCount; } } internal static int CalculateMipLevels(int width, int height = 0, int depth = 0) { int levels = 1; int size = Math.Max(Math.Max(width, height), depth); while (size > 1) { size = size / 2; levels++; } return levels; } internal static void GetSizeForLevel(int width, int height, int level, out int w, out int h) { w = width; h = height; while (level > 0) { --level; w /= 2; h /= 2; } if (w == 0) w = 1; if (h == 0) h = 1; } internal static void GetSizeForLevel(int width, int height, int depth, int level, out int w, out int h, out int d) { w = width; h = height; d = depth; while (level > 0) { --level; w /= 2; h /= 2; d /= 2; } if (w == 0) w = 1; if (h == 0) h = 1; if (d == 0) d = 1; } internal int GetPitch(int width) { Debug.Assert(width > 0, "The width is negative!"); int pitch; switch (_format) { case SurfaceFormat.Dxt1: case SurfaceFormat.Dxt1SRgb: case SurfaceFormat.Dxt1a: case SurfaceFormat.RgbPvrtc2Bpp: case SurfaceFormat.RgbaPvrtc2Bpp: case SurfaceFormat.RgbEtc1: case SurfaceFormat.Dxt3: case SurfaceFormat.Dxt3SRgb: case SurfaceFormat.Dxt5: case SurfaceFormat.Dxt5SRgb: case SurfaceFormat.RgbPvrtc4Bpp: case SurfaceFormat.RgbaPvrtc4Bpp: pitch = ((width + 3) / 4) * _format.GetSize(); break; default: pitch = width * _format.GetSize(); break; }; return pitch; } internal protected override void GraphicsDeviceResetting() { PlatformGraphicsDeviceResetting(); } } }