Fix mipmap base level being ignored for sampled textures and images (#1911)
* Fix mipmap base level being ignored for sampled textures and images * Fix layer size and max level for textures * Missing XML doc + reorder comments
This commit is contained in:
parent
1e5b37c94f
commit
3bad321d2b
4 changed files with 159 additions and 54 deletions
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue