Эх сурвалжийг харах

Fix sub-image copies on intel GPUs (#2198)

gdkchan 5 жил өмнө
parent
commit
001005b3d5

+ 4 - 0
Ryujinx.Graphics.OpenGL/Image/ITextureInfo.cs

@@ -5,6 +5,10 @@ namespace Ryujinx.Graphics.OpenGL.Image
     interface ITextureInfo
     {
         int Handle { get; }
+        int StorageHandle { get; }
+        int FirstLayer => 0;
+        int FirstLevel => 0;
+
         TextureCreateInfo Info { get; }
     }
 }

+ 1 - 1
Ryujinx.Graphics.OpenGL/Image/TextureBase.cs

@@ -3,7 +3,7 @@ using Ryujinx.Graphics.GAL;
 
 namespace Ryujinx.Graphics.OpenGL.Image
 {
-    class TextureBase : ITextureInfo
+    class TextureBase
     {
         public int Handle { get; protected set; }
 

+ 38 - 16
Ryujinx.Graphics.OpenGL/Image/TextureCopy.cs

@@ -205,22 +205,44 @@ namespace Ryujinx.Graphics.OpenGL.Image
                     int copyWidth = sizeInBlocks ? BitUtils.DivRoundUp(width, blockWidth) : width;
                     int copyHeight = sizeInBlocks ? BitUtils.DivRoundUp(height, blockHeight) : height;
 
-                    GL.CopyImageSubData(
-                        srcHandle,
-                        srcInfo.Target.ConvertToImageTarget(),
-                        srcLevel + level,
-                        0,
-                        0,
-                        srcLayer,
-                        dstHandle,
-                        dstInfo.Target.ConvertToImageTarget(),
-                        dstLevel + level,
-                        0,
-                        0,
-                        dstLayer,
-                        copyWidth,
-                        copyHeight,
-                        depth);
+                    if (HwCapabilities.Vendor == HwCapabilities.GpuVendor.Intel)
+                    {
+                        GL.CopyImageSubData(
+                            src.StorageHandle,
+                            srcInfo.Target.ConvertToImageTarget(),
+                            src.FirstLevel + srcLevel + level,
+                            0,
+                            0,
+                            src.FirstLayer + srcLayer,
+                            dst.StorageHandle,
+                            dstInfo.Target.ConvertToImageTarget(),
+                            dst.FirstLevel + dstLevel + level,
+                            0,
+                            0,
+                            dst.FirstLayer + dstLayer,
+                            copyWidth,
+                            copyHeight,
+                            depth);
+                    }
+                    else
+                    {
+                        GL.CopyImageSubData(
+                            srcHandle,
+                            srcInfo.Target.ConvertToImageTarget(),
+                            srcLevel + level,
+                            0,
+                            0,
+                            srcLayer,
+                            dstHandle,
+                            dstInfo.Target.ConvertToImageTarget(),
+                            dstLevel + level,
+                            0,
+                            0,
+                            dstLayer,
+                            copyWidth,
+                            copyHeight,
+                            depth);
+                    }
                 }
 
                 width = Math.Max(1, width >> 1);

+ 1 - 1
Ryujinx.Graphics.OpenGL/Image/TextureStorage.cs

@@ -1,13 +1,13 @@
 using OpenTK.Graphics.OpenGL;
 using Ryujinx.Common.Logging;
 using Ryujinx.Graphics.GAL;
-using System;
 
 namespace Ryujinx.Graphics.OpenGL.Image
 {
     class TextureStorage : ITextureInfo 
     {
         public int Handle { get; private set; }
+        public int StorageHandle => Handle;
         public float ScaleFactor { get; private set; }
 
         public TextureCreateInfo Info { get; }

+ 3 - 1
Ryujinx.Graphics.OpenGL/Image/TextureView.cs

@@ -4,12 +4,14 @@ using System;
 
 namespace Ryujinx.Graphics.OpenGL.Image
 {
-    class TextureView : TextureBase, ITexture
+    class TextureView : TextureBase, ITexture, ITextureInfo
     {
         private readonly Renderer _renderer;
 
         private readonly TextureStorage _parent;
 
+        public int StorageHandle => _parent.Handle;
+
         private TextureView _incompatibleFormatView;
 
         public int FirstLayer { get; private set; }