From 10a0baf627a484eba4174fe36063b028cf4c193e Mon Sep 17 00:00:00 2001 From: gdkchan Date: Thu, 22 Nov 2018 11:00:24 -0300 Subject: [PATCH] Fix reinterpret when texture sizes are different --- Ryujinx.Graphics/Gal/OpenGL/OGLRenderTarget.cs | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/Ryujinx.Graphics/Gal/OpenGL/OGLRenderTarget.cs b/Ryujinx.Graphics/Gal/OpenGL/OGLRenderTarget.cs index 9c00ae9af6..ce5364e154 100644 --- a/Ryujinx.Graphics/Gal/OpenGL/OGLRenderTarget.cs +++ b/Ryujinx.Graphics/Gal/OpenGL/OGLRenderTarget.cs @@ -447,7 +447,9 @@ namespace Ryujinx.Graphics.Gal.OpenGL return; } - if (NewImage.Format == OldImage.Format) + if (NewImage.Format == OldImage.Format && + NewImage.Width == OldImage.Width && + NewImage.Height == OldImage.Height) { return; } @@ -459,7 +461,11 @@ namespace Ryujinx.Graphics.Gal.OpenGL GL.BindBuffer(BufferTarget.PixelPackBuffer, CopyPBO); - GL.BufferData(BufferTarget.PixelPackBuffer, Math.Max(ImageUtils.GetSize(OldImage), ImageUtils.GetSize(NewImage)), IntPtr.Zero, BufferUsageHint.StreamCopy); + //The buffer should be large enough to hold the largest texture. + int BufferSize = Math.Max(ImageUtils.GetSize(OldImage), + ImageUtils.GetSize(NewImage)); + + GL.BufferData(BufferTarget.PixelPackBuffer, BufferSize, IntPtr.Zero, BufferUsageHint.StreamCopy); if (!Texture.TryGetImageHandler(Key, out ImageHandler CachedImage)) { @@ -475,8 +481,12 @@ namespace Ryujinx.Graphics.Gal.OpenGL GL.BindBuffer(BufferTarget.PixelPackBuffer, 0); GL.BindBuffer(BufferTarget.PixelUnpackBuffer, CopyPBO); + GL.PixelStore(PixelStoreParameter.UnpackRowLength, OldImage.Width); + Texture.Create(Key, ImageUtils.GetSize(NewImage), NewImage); + GL.PixelStore(PixelStoreParameter.UnpackRowLength, 0); + GL.BindBuffer(BufferTarget.PixelUnpackBuffer, 0); }