Re-add NVDEC project (not integrated)
This commit is contained in:
parent
6e092c0558
commit
0dbfe3c23e
31 changed files with 2547 additions and 18 deletions
69
Ryujinx.Graphics.Nvdec/Vic/StructUnpacker.cs
Normal file
69
Ryujinx.Graphics.Nvdec/Vic/StructUnpacker.cs
Normal file
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue