diff options
| author | gdkchan <gab.dark.100@gmail.com> | 2019-12-31 21:08:02 -0300 |
|---|---|---|
| committer | Thog <thog@protonmail.com> | 2020-01-09 02:13:00 +0100 |
| commit | 0dbfe3c23ee072ec9dbc477f955a163107af2be1 (patch) | |
| tree | f7f3501ef32891e80197717ab18b22a8d88fdb9f /Ryujinx.Graphics.Nvdec/Vic/StructUnpacker.cs | |
| parent | 6e092c05584ccbbd548ac26c056c1a7edfa6c1a0 (diff) | |
Re-add NVDEC project (not integrated)
Diffstat (limited to 'Ryujinx.Graphics.Nvdec/Vic/StructUnpacker.cs')
| -rw-r--r-- | Ryujinx.Graphics.Nvdec/Vic/StructUnpacker.cs | 69 |
1 files changed, 69 insertions, 0 deletions
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 |
