diff options
Diffstat (limited to 'Ryujinx.Graphics.Nvdec/NvdecDevice.cs')
| -rw-r--r-- | Ryujinx.Graphics.Nvdec/NvdecDevice.cs | 45 |
1 files changed, 35 insertions, 10 deletions
diff --git a/Ryujinx.Graphics.Nvdec/NvdecDevice.cs b/Ryujinx.Graphics.Nvdec/NvdecDevice.cs index 08f802a1..5319429b 100644 --- a/Ryujinx.Graphics.Nvdec/NvdecDevice.cs +++ b/Ryujinx.Graphics.Nvdec/NvdecDevice.cs @@ -2,17 +2,20 @@ using Ryujinx.Graphics.Device; using Ryujinx.Graphics.Gpu.Memory; using Ryujinx.Graphics.Nvdec.Image; -using System; +using System.Collections.Concurrent; using System.Collections.Generic; +using System.Threading; namespace Ryujinx.Graphics.Nvdec { - public class NvdecDevice : IDeviceState + public class NvdecDevice : IDeviceStateWithContext { private readonly ResourceManager _rm; private readonly DeviceState<NvdecRegisters> _state; - public event Action<FrameDecodedEventArgs> FrameDecoded; + private long _currentId; + private ConcurrentDictionary<long, NvdecDecoderContext> _contexts; + private NvdecDecoderContext _currentContext; public NvdecDevice(MemoryManager gmm) { @@ -21,6 +24,33 @@ namespace Ryujinx.Graphics.Nvdec { { nameof(NvdecRegisters.Execute), new RwCallback(Execute, null) } }); + _contexts = new ConcurrentDictionary<long, NvdecDecoderContext>(); + } + + public long CreateContext() + { + long id = Interlocked.Increment(ref _currentId); + _contexts.TryAdd(id, new NvdecDecoderContext()); + + return id; + } + + public void DestroyContext(long id) + { + if (_contexts.TryRemove(id, out var context)) + { + context.Dispose(); + } + + _rm.Cache.Trim(); + } + + public void BindContext(long id) + { + if (_contexts.TryGetValue(id, out var context)) + { + _currentContext = context; + } } public int Read(int offset) => _state.Read(offset); @@ -36,20 +66,15 @@ namespace Ryujinx.Graphics.Nvdec switch (codecId) { case CodecId.H264: - H264Decoder.Decode(this, _rm, ref _state.State); + H264Decoder.Decode(_currentContext, _rm, ref _state.State); break; case CodecId.Vp9: - Vp9Decoder.Decode(this, _rm, ref _state.State); + Vp9Decoder.Decode(_rm, ref _state.State); break; default: Logger.Error?.Print(LogClass.Nvdec, $"Unsupported codec \"{codecId}\"."); break; } } - - internal void OnFrameDecoded(CodecId codecId, uint lumaOffset, uint chromaOffset) - { - FrameDecoded?.Invoke(new FrameDecodedEventArgs(codecId, lumaOffset, chromaOffset)); - } } } |
