Archived
1
0
Fork 0
forked from Mirror/Ryujinx

Do not throw for invalid ASTC compressed textures

This commit is contained in:
gdk 2019-11-08 21:55:53 -03:00 committed by Thog
parent 769c02235f
commit fd196b3d19
2 changed files with 31 additions and 13 deletions

View file

@ -253,7 +253,7 @@ namespace Ryujinx.Graphics.Gpu.Image
if (!_context.Capabilities.SupportsAstcCompression && _info.FormatInfo.Format.IsAstc())
{
data = AstcDecoder.DecodeToRgba8(
if (!AstcDecoder.TryDecodeToRgba8(
data,
_info.FormatInfo.BlockWidth,
_info.FormatInfo.BlockHeight,
@ -261,7 +261,13 @@ namespace Ryujinx.Graphics.Gpu.Image
_info.Width,
_info.Height,
_depth,
_info.Levels);
_info.Levels,
out Span<byte> decoded))
{
// TODO: Error.
}
data = decoded;
}
HostTexture.SetData(data);

View file

@ -47,16 +47,19 @@ namespace Ryujinx.Graphics.Texture.Astc
}
}
public static Span<byte> DecodeToRgba8(
Span<byte> data,
int blockWidth,
int blockHeight,
int blockDepth,
int width,
int height,
int depth,
int levels)
public static bool TryDecodeToRgba8(
Span<byte> data,
int blockWidth,
int blockHeight,
int blockDepth,
int width,
int height,
int depth,
int levels,
out Span<byte> decoded)
{
bool success = true;
using (MemoryStream inputStream = new MemoryStream(data.ToArray()))
{
BinaryReader binReader = new BinaryReader(inputStream);
@ -85,7 +88,14 @@ namespace Ryujinx.Graphics.Texture.Astc
{
int[] decompressedData = new int[144];
DecompressBlock(binReader.ReadBytes(0x10), decompressedData, blockWidth, blockHeight);
try
{
DecompressBlock(binReader.ReadBytes(0x10), decompressedData, blockWidth, blockHeight);
}
catch (Exception)
{
success = false;
}
int decompressedWidth = Math.Min(blockWidth, width - i);
int decompressedHeight = Math.Min(blockHeight, height - j);
@ -112,9 +122,11 @@ namespace Ryujinx.Graphics.Texture.Astc
height = Math.Max(1, height >> 1);
}
return outputStream.ToArray();
decoded = outputStream.ToArray();
}
}
return success;
}
public static bool DecompressBlock(