From c86aacde76b5f8e503e2b412385c8491ecc86b3b Mon Sep 17 00:00:00 2001 From: gdkchan Date: Mon, 3 Dec 2018 00:38:47 -0200 Subject: NVDEC implementation using FFmpeg (#443) * Initial nvdec implementation using FFmpeg * Fix swapped channels on the video decoder and the G8R8 texture format * Fix texture samplers not being set properly (regression) * Rebased * Remove unused code introduced on the rebase * Add support for RGBA8 output format on the video image composer * Correct spacing * Some fixes for rebase and other tweaks * Allow size mismatch on frame copy * Get rid of GetHostAddress calls on VDec --- Ryujinx.Graphics/Vic/StructUnpacker.cs | 69 ++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 Ryujinx.Graphics/Vic/StructUnpacker.cs (limited to 'Ryujinx.Graphics/Vic/StructUnpacker.cs') diff --git a/Ryujinx.Graphics/Vic/StructUnpacker.cs b/Ryujinx.Graphics/Vic/StructUnpacker.cs new file mode 100644 index 00000000..62777aad --- /dev/null +++ b/Ryujinx.Graphics/Vic/StructUnpacker.cs @@ -0,0 +1,69 @@ +using Ryujinx.Graphics.Memory; +using System; + +namespace Ryujinx.Graphics.Vic +{ + class StructUnpacker + { + private NvGpuVmm Vmm; + + private long Position; + + private ulong Buffer; + private int BuffPos; + + public StructUnpacker(NvGpuVmm Vmm, long Position) + { + this.Vmm = Vmm; + this.Position = Position; + + BuffPos = 64; + } + + public int Read(int Bits) + { + if ((uint)Bits > 32) + { + throw new ArgumentOutOfRangeException(nameof(Bits)); + } + + int Value = 0; + + while (Bits > 0) + { + RefillBufferIfNeeded(); + + int ReadBits = Bits; + + int MaxReadBits = 64 - BuffPos; + + if (ReadBits > MaxReadBits) + { + ReadBits = MaxReadBits; + } + + Value <<= ReadBits; + + Value |= (int)(Buffer >> BuffPos) & (int)(0xffffffff >> (32 - ReadBits)); + + BuffPos += ReadBits; + + Bits -= ReadBits; + } + + return Value; + } + + private void RefillBufferIfNeeded() + { + if (BuffPos >= 64) + { + Buffer = Vmm.ReadUInt64(Position); + + Position += 8; + + BuffPos = 0; + } + } + } +} \ No newline at end of file -- cgit v1.2.3