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

View File

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