diff options
author | gdkchan <gab.dark.100@gmail.com> | 2021-11-03 20:58:24 -0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-11-03 20:58:24 -0300 |
commit | f78bcb80485419466fde56812425a53e22705765 (patch) | |
tree | 4e7674da6d1ace1be146d5f3b6dacaf94ed98bfc /Ryujinx.Graphics.OpenGL/Image/TextureView.cs | |
parent | f41687f4c1948e9e111afd70e979e98ea5de52fa (diff) |
Clamp number of mipmap levels to avoid API errors due to invalid textures (#2808)
Diffstat (limited to 'Ryujinx.Graphics.OpenGL/Image/TextureView.cs')
-rw-r--r-- | Ryujinx.Graphics.OpenGL/Image/TextureView.cs | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/Ryujinx.Graphics.OpenGL/Image/TextureView.cs b/Ryujinx.Graphics.OpenGL/Image/TextureView.cs index a70ab595..137f7d6e 100644 --- a/Ryujinx.Graphics.OpenGL/Image/TextureView.cs +++ b/Ryujinx.Graphics.OpenGL/Image/TextureView.cs @@ -48,13 +48,15 @@ namespace Ryujinx.Graphics.OpenGL.Image pixelInternalFormat = format.PixelInternalFormat; } + int levels = Info.GetLevelsClamped(); + GL.TextureView( Handle, target, _parent.Handle, pixelInternalFormat, FirstLevel, - Info.Levels, + levels, FirstLayer, Info.GetLayers()); @@ -81,7 +83,7 @@ namespace Ryujinx.Graphics.OpenGL.Image GL.TexParameter(target, TextureParameterName.TextureSwizzleRgba, swizzleRgba); - int maxLevel = Info.Levels - 1; + int maxLevel = levels - 1; if (maxLevel < 0) { @@ -122,8 +124,9 @@ namespace Ryujinx.Graphics.OpenGL.Image public unsafe ReadOnlySpan<byte> GetData() { int size = 0; + int levels = Info.GetLevelsClamped(); - for (int level = 0; level < Info.Levels; level++) + for (int level = 0; level < levels; level++) { size += Info.GetMipSize(level); } @@ -227,7 +230,9 @@ namespace Ryujinx.Graphics.OpenGL.Image faces = 6; } - for (int level = 0; level < Info.Levels; level++) + int levels = Info.GetLevelsClamped(); + + for (int level = 0; level < levels; level++) { for (int face = 0; face < faces; face++) { @@ -465,10 +470,11 @@ namespace Ryujinx.Graphics.OpenGL.Image int width = Info.Width; int height = Info.Height; int depth = Info.Depth; + int levels = Info.GetLevelsClamped(); int offset = 0; - for (int level = 0; level < Info.Levels; level++) + for (int level = 0; level < levels; level++) { int mipSize = Info.GetMipSize(level); |