diff options
Diffstat (limited to 'Ryujinx.Graphics.Gpu/Image/TextureInfo.cs')
| -rw-r--r-- | Ryujinx.Graphics.Gpu/Image/TextureInfo.cs | 76 |
1 files changed, 70 insertions, 6 deletions
diff --git a/Ryujinx.Graphics.Gpu/Image/TextureInfo.cs b/Ryujinx.Graphics.Gpu/Image/TextureInfo.cs index 2bcafd72..d27194b8 100644 --- a/Ryujinx.Graphics.Gpu/Image/TextureInfo.cs +++ b/Ryujinx.Graphics.Gpu/Image/TextureInfo.cs @@ -1,4 +1,5 @@ using Ryujinx.Graphics.GAL; +using Ryujinx.Graphics.Texture; namespace Ryujinx.Graphics.Gpu.Image { @@ -92,14 +93,17 @@ namespace Ryujinx.Graphics.Gpu.Image /// Texture swizzle for the red color channel. /// </summary> public SwizzleComponent SwizzleR { get; } + /// <summary> /// Texture swizzle for the green color channel. /// </summary> public SwizzleComponent SwizzleG { get; } + /// <summary> /// Texture swizzle for the blue color channel. /// </summary> public SwizzleComponent SwizzleB { get; } + /// <summary> /// Texture swizzle for the alpha color channel. /// </summary> @@ -176,7 +180,19 @@ namespace Ryujinx.Graphics.Gpu.Image /// <returns>Texture depth</returns> public int GetDepth() { - return Target == Target.Texture3D ? DepthOrLayers : 1; + return GetDepth(Target, DepthOrLayers); + } + + /// <summary> + /// Gets the real texture depth. + /// Returns 1 for any target other than 3D textures. + /// </summary> + /// <param name="target">Texture target</param> + /// <param name="depthOrLayers">Texture depth if the texture is 3D, otherwise ignored</param> + /// <returns>Texture depth</returns> + public static int GetDepth(Target target, int depthOrLayers) + { + return target == Target.Texture3D ? depthOrLayers : 1; } /// <summary> @@ -186,15 +202,27 @@ namespace Ryujinx.Graphics.Gpu.Image /// <returns>The number of texture layers</returns> public int GetLayers() { - if (Target == Target.Texture2DArray || Target == Target.Texture2DMultisampleArray) + return GetLayers(Target, DepthOrLayers); + } + + /// <summary> + /// Gets the number of layers of the texture. + /// Returns 1 for non-array textures, 6 for cubemap textures, and layer faces for cubemap array textures. + /// </summary> + /// <param name="target">Texture target</param> + /// <param name="depthOrLayers">Texture layers if the is a array texture, ignored otherwise</param> + /// <returns>The number of texture layers</returns> + public static int GetLayers(Target target, int depthOrLayers) + { + if (target == Target.Texture2DArray || target == Target.Texture2DMultisampleArray) { - return DepthOrLayers; + return depthOrLayers; } - else if (Target == Target.CubemapArray) + else if (target == Target.CubemapArray) { - return DepthOrLayers * 6; + return depthOrLayers * 6; } - else if (Target == Target.Cubemap) + else if (target == Target.Cubemap) { return 6; } @@ -203,5 +231,41 @@ namespace Ryujinx.Graphics.Gpu.Image return 1; } } + + /// <summary> + /// Calculates the size information from the texture information. + /// </summary> + /// <param name="layerSize">Optional size of each texture layer in bytes</param> + /// <returns>Texture size information</returns> + public SizeInfo CalculateSizeInfo(int layerSize = 0) + { + if (Target == Target.TextureBuffer) + { + return new SizeInfo(Width * FormatInfo.BytesPerPixel); + } + else if (IsLinear) + { + return SizeCalculator.GetLinearTextureSize( + Stride, + Height, + FormatInfo.BlockHeight); + } + else + { + return SizeCalculator.GetBlockLinearTextureSize( + Width, + Height, + GetDepth(), + Levels, + GetLayers(), + FormatInfo.BlockWidth, + FormatInfo.BlockHeight, + FormatInfo.BytesPerPixel, + GobBlocksInY, + GobBlocksInZ, + GobBlocksInTileX, + layerSize); + } + } } }
\ No newline at end of file |
