aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.OpenGL/Image
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2021-11-03 20:58:24 -0300
committerGitHub <noreply@github.com>2021-11-03 20:58:24 -0300
commitf78bcb80485419466fde56812425a53e22705765 (patch)
tree4e7674da6d1ace1be146d5f3b6dacaf94ed98bfc /Ryujinx.Graphics.OpenGL/Image
parentf41687f4c1948e9e111afd70e979e98ea5de52fa (diff)
Clamp number of mipmap levels to avoid API errors due to invalid textures (#2808)
Diffstat (limited to 'Ryujinx.Graphics.OpenGL/Image')
-rw-r--r--Ryujinx.Graphics.OpenGL/Image/TextureStorage.cs16
-rw-r--r--Ryujinx.Graphics.OpenGL/Image/TextureView.cs16
2 files changed, 20 insertions, 12 deletions
diff --git a/Ryujinx.Graphics.OpenGL/Image/TextureStorage.cs b/Ryujinx.Graphics.OpenGL/Image/TextureStorage.cs
index ce4616e4..215446ec 100644
--- a/Ryujinx.Graphics.OpenGL/Image/TextureStorage.cs
+++ b/Ryujinx.Graphics.OpenGL/Image/TextureStorage.cs
@@ -50,12 +50,14 @@ namespace Ryujinx.Graphics.OpenGL.Image
internalFormat = (SizedInternalFormat)format.PixelInternalFormat;
}
+ int levels = Info.GetLevelsClamped();
+
switch (Info.Target)
{
case Target.Texture1D:
GL.TexStorage1D(
TextureTarget1d.Texture1D,
- Info.Levels,
+ levels,
internalFormat,
Info.Width);
break;
@@ -63,7 +65,7 @@ namespace Ryujinx.Graphics.OpenGL.Image
case Target.Texture1DArray:
GL.TexStorage2D(
TextureTarget2d.Texture1DArray,
- Info.Levels,
+ levels,
internalFormat,
Info.Width,
Info.Height);
@@ -72,7 +74,7 @@ namespace Ryujinx.Graphics.OpenGL.Image
case Target.Texture2D:
GL.TexStorage2D(
TextureTarget2d.Texture2D,
- Info.Levels,
+ levels,
internalFormat,
Info.Width,
Info.Height);
@@ -81,7 +83,7 @@ namespace Ryujinx.Graphics.OpenGL.Image
case Target.Texture2DArray:
GL.TexStorage3D(
TextureTarget3d.Texture2DArray,
- Info.Levels,
+ levels,
internalFormat,
Info.Width,
Info.Height,
@@ -112,7 +114,7 @@ namespace Ryujinx.Graphics.OpenGL.Image
case Target.Texture3D:
GL.TexStorage3D(
TextureTarget3d.Texture3D,
- Info.Levels,
+ levels,
internalFormat,
Info.Width,
Info.Height,
@@ -122,7 +124,7 @@ namespace Ryujinx.Graphics.OpenGL.Image
case Target.Cubemap:
GL.TexStorage2D(
TextureTarget2d.TextureCubeMap,
- Info.Levels,
+ levels,
internalFormat,
Info.Width,
Info.Height);
@@ -131,7 +133,7 @@ namespace Ryujinx.Graphics.OpenGL.Image
case Target.CubemapArray:
GL.TexStorage3D(
(TextureTarget3d)All.TextureCubeMapArray,
- Info.Levels,
+ levels,
internalFormat,
Info.Width,
Info.Height,
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);