From 0dbfe3c23ee072ec9dbc477f955a163107af2be1 Mon Sep 17 00:00:00 2001 From: gdkchan Date: Tue, 31 Dec 2019 21:08:02 -0300 Subject: Re-add NVDEC project (not integrated) --- Ryujinx.Graphics.Nvdec/Vic/StructUnpacker.cs | 69 ++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 Ryujinx.Graphics.Nvdec/Vic/StructUnpacker.cs (limited to 'Ryujinx.Graphics.Nvdec/Vic/StructUnpacker.cs') diff --git a/Ryujinx.Graphics.Nvdec/Vic/StructUnpacker.cs b/Ryujinx.Graphics.Nvdec/Vic/StructUnpacker.cs new file mode 100644 index 00000000..4957e6b6 --- /dev/null +++ b/Ryujinx.Graphics.Nvdec/Vic/StructUnpacker.cs @@ -0,0 +1,69 @@ +using Ryujinx.Graphics.Gpu.Memory; +using System; + +namespace Ryujinx.Graphics.Vic +{ + class StructUnpacker + { + private MemoryAccessor _vmm; + + private ulong _position; + + private ulong _buffer; + private int _buffPos; + + public StructUnpacker(MemoryAccessor vmm, ulong position) + { + _vmm = vmm; + _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