Fix sub-image copies on intel GPUs (#2198)
This commit is contained in:
parent
b662a26c7e
commit
001005b3d5
5 changed files with 47 additions and 19 deletions
|
@ -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; }
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,7 +3,7 @@ using Ryujinx.Graphics.GAL;
|
|||
|
||||
namespace Ryujinx.Graphics.OpenGL.Image
|
||||
{
|
||||
class TextureBase : ITextureInfo
|
||||
class TextureBase
|
||||
{
|
||||
public int Handle { get; protected set; }
|
||||
|
||||
|
|
|
@ -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,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; }
|
||||
|
|
|
@ -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; }
|
||||
|
|
Reference in a new issue