aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics/Graphics3d/Texture/TextureHelper.cs
blob: 1de81008ee694cfeed4aeb7093a89eed3d906213 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
using ChocolArm64.Memory;
using Ryujinx.Common;
using Ryujinx.Graphics.Gal;
using Ryujinx.Graphics.Memory;

namespace Ryujinx.Graphics.Texture
{
    static class TextureHelper
    {
        public static ISwizzle GetSwizzle(GalImage image)
        {
            int blockWidth    = ImageUtils.GetBlockWidth   (image.Format);
            int blockHeight   = ImageUtils.GetBlockHeight  (image.Format);
            int blockDepth    = ImageUtils.GetBlockDepth   (image.Format);
            int bytesPerPixel = ImageUtils.GetBytesPerPixel(image.Format);

            int width  = BitUtils.DivRoundUp(image.Width,  blockWidth);
            int height = BitUtils.DivRoundUp(image.Height, blockHeight);
            int depth  = BitUtils.DivRoundUp(image.Depth,  blockDepth);

            if (image.Layout == GalMemoryLayout.BlockLinear)
            {
                int alignMask = image.TileWidth * (64 / bytesPerPixel) - 1;

                width = (width + alignMask) & ~alignMask;

                return new BlockLinearSwizzle(
                    width,
                    height,
                    depth,
                    image.GobBlockHeight,
                    image.GobBlockDepth,
                    bytesPerPixel);
            }
            else
            {
                return new LinearSwizzle(image.Pitch, bytesPerPixel, width, height);
            }
        }

        public static (MemoryManager Memory, long Position) GetMemoryAndPosition(
            IMemory memory,
            long    position)
        {
            if (memory is NvGpuVmm vmm)
            {
                return (vmm.Memory, vmm.GetPhysicalAddress(position));
            }

            return ((MemoryManager)memory, position);
        }
    }
}