Fix buffer to 3D texture copy (#1354)

This commit is contained in:
gdkchan 2020-07-03 20:37:36 -03:00 committed by GitHub
parent bf87f02c0c
commit 76e5af967a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 15 additions and 6 deletions

View file

@ -44,6 +44,7 @@ namespace Ryujinx.Graphics.Gpu.Engine
cbp.SrcStride,
srcLinear,
src.MemoryLayout.UnpackGobBlocksInY(),
src.MemoryLayout.UnpackGobBlocksInZ(),
srcBpp);
var dstCalculator = new OffsetCalculator(
@ -52,6 +53,7 @@ namespace Ryujinx.Graphics.Gpu.Engine
cbp.DstStride,
dstLinear,
dst.MemoryLayout.UnpackGobBlocksInY(),
dst.MemoryLayout.UnpackGobBlocksInZ(),
dstBpp);
ulong srcBaseAddress = _context.MemoryManager.Translate(cbp.SrcAddress.Pack());
@ -70,7 +72,7 @@ namespace Ryujinx.Graphics.Gpu.Engine
{
srcSpan.CopyTo(dstSpan); // No layout conversion has to be performed, just copy the data entirely.
}
else
else
{
unsafe bool Convert<T>(Span<byte> dstSpan, ReadOnlySpan<byte> srcSpan) where T : unmanaged
{

View file

@ -41,7 +41,6 @@ namespace Ryujinx.Graphics.Texture
public BlockLinearLayout(
int width,
int height,
int depth,
int gobBlocksInY,
int gobBlocksInZ,
int bpp)

View file

@ -84,7 +84,6 @@ namespace Ryujinx.Graphics.Texture
BlockLinearLayout layoutConverter = new BlockLinearLayout(
wAligned,
h,
d,
mipGobBlocksInY,
mipGobBlocksInZ,
bytesPerPixel);
@ -256,7 +255,6 @@ namespace Ryujinx.Graphics.Texture
BlockLinearLayout layoutConverter = new BlockLinearLayout(
wAligned,
h,
d,
mipGobBlocksInY,
mipGobBlocksInZ,
bytesPerPixel);

View file

@ -23,6 +23,7 @@ namespace Ryujinx.Graphics.Texture
int stride,
bool isLinear,
int gobBlocksInY,
int gobBlocksInZ,
int bytesPerPixel)
{
_width = width;
@ -40,13 +41,22 @@ namespace Ryujinx.Graphics.Texture
_layoutConverter = new BlockLinearLayout(
wAligned,
height,
1,
gobBlocksInY,
1,
gobBlocksInZ,
bytesPerPixel);
}
}
public OffsetCalculator(
int width,
int height,
int stride,
bool isLinear,
int gobBlocksInY,
int bytesPerPixel) : this(width, height, stride, isLinear, gobBlocksInY, 1, bytesPerPixel)
{
}
public void SetY(int y)
{
if (_isLinear)