| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- using System.Threading;
- using System.Collections.Generic;
- using System;
- using Silk.NET.Vulkan;
- namespace Ryujinx.Graphics.Vulkan
- {
- class BackgroundResource : IDisposable
- {
- private VulkanRenderer _gd;
- private Device _device;
- private CommandBufferPool _pool;
- private PersistentFlushBuffer _flushBuffer;
- public BackgroundResource(VulkanRenderer gd, Device device)
- {
- _gd = gd;
- _device = device;
- }
- public CommandBufferPool GetPool()
- {
- if (_pool == null)
- {
- bool useBackground = _gd.BackgroundQueue.Handle != 0 && _gd.Vendor != Vendor.Amd;
- Queue queue = useBackground ? _gd.BackgroundQueue : _gd.Queue;
- object queueLock = useBackground ? _gd.BackgroundQueueLock : _gd.QueueLock;
- lock (queueLock)
- {
- _pool = new CommandBufferPool(_gd.Api, _device, queue, queueLock, _gd.QueueFamilyIndex, isLight: true);
- }
- }
- return _pool;
- }
- public PersistentFlushBuffer GetFlushBuffer()
- {
- if (_flushBuffer == null)
- {
- _flushBuffer = new PersistentFlushBuffer(_gd);
- }
- return _flushBuffer;
- }
- public void Dispose()
- {
- _pool?.Dispose();
- _flushBuffer?.Dispose();
- }
- }
- class BackgroundResources : IDisposable
- {
- private VulkanRenderer _gd;
- private Device _device;
- private Dictionary<Thread, BackgroundResource> _resources;
- public BackgroundResources(VulkanRenderer gd, Device device)
- {
- _gd = gd;
- _device = device;
- _resources = new Dictionary<Thread, BackgroundResource>();
- }
- private void Cleanup()
- {
- lock (_resources)
- {
- foreach (KeyValuePair<Thread, BackgroundResource> tuple in _resources)
- {
- if (!tuple.Key.IsAlive)
- {
- tuple.Value.Dispose();
- _resources.Remove(tuple.Key);
- }
- }
- }
- }
- public BackgroundResource Get()
- {
- Thread thread = Thread.CurrentThread;
- lock (_resources)
- {
- BackgroundResource resource;
- if (!_resources.TryGetValue(thread, out resource))
- {
- Cleanup();
- resource = new BackgroundResource(_gd, _device);
- _resources[thread] = resource;
- }
- return resource;
- }
- }
- public void Dispose()
- {
- lock (_resources)
- {
- foreach (var resource in _resources.Values)
- {
- resource.Dispose();
- }
- }
- }
- }
- }
|