mirror of
				https://github.com/Ryujinx/Ryujinx.git
				synced 2025-11-04 02:53:41 +00:00 
			
		
		
		
	Remove CommandBufferScoped Dependencies (#6958)
This commit is contained in:
		
							parent
							
								
									eb212aa91b
								
							
						
					
					
						commit
						344f4f52c1
					
				@ -31,11 +31,9 @@ namespace Ryujinx.Graphics.Vulkan
 | 
			
		||||
            public int SubmissionCount;
 | 
			
		||||
            public CommandBuffer CommandBuffer;
 | 
			
		||||
            public FenceHolder Fence;
 | 
			
		||||
            public SemaphoreHolder Semaphore;
 | 
			
		||||
 | 
			
		||||
            public List<IAuto> Dependants;
 | 
			
		||||
            public List<MultiFenceHolder> Waitables;
 | 
			
		||||
            public HashSet<SemaphoreHolder> Dependencies;
 | 
			
		||||
 | 
			
		||||
            public void Initialize(Vk api, Device device, CommandPool pool)
 | 
			
		||||
            {
 | 
			
		||||
@ -51,7 +49,6 @@ namespace Ryujinx.Graphics.Vulkan
 | 
			
		||||
 | 
			
		||||
                Dependants = new List<IAuto>();
 | 
			
		||||
                Waitables = new List<MultiFenceHolder>();
 | 
			
		||||
                Dependencies = new HashSet<SemaphoreHolder>();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@ -143,14 +140,6 @@ namespace Ryujinx.Graphics.Vulkan
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void AddDependency(int cbIndex, CommandBufferScoped dependencyCbs)
 | 
			
		||||
        {
 | 
			
		||||
            Debug.Assert(_commandBuffers[cbIndex].InUse);
 | 
			
		||||
            var semaphoreHolder = _commandBuffers[dependencyCbs.CommandBufferIndex].Semaphore;
 | 
			
		||||
            semaphoreHolder.Get();
 | 
			
		||||
            _commandBuffers[cbIndex].Dependencies.Add(semaphoreHolder);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void AddWaitable(int cbIndex, MultiFenceHolder waitable)
 | 
			
		||||
        {
 | 
			
		||||
            ref var entry = ref _commandBuffers[cbIndex];
 | 
			
		||||
@ -354,14 +343,8 @@ namespace Ryujinx.Graphics.Vulkan
 | 
			
		||||
                waitable.RemoveBufferUses(cbIndex);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            foreach (var dependency in entry.Dependencies)
 | 
			
		||||
            {
 | 
			
		||||
                dependency.Put();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            entry.Dependants.Clear();
 | 
			
		||||
            entry.Waitables.Clear();
 | 
			
		||||
            entry.Dependencies.Clear();
 | 
			
		||||
            entry.Fence?.Dispose();
 | 
			
		||||
 | 
			
		||||
            if (refreshFence)
 | 
			
		||||
 | 
			
		||||
@ -26,11 +26,6 @@ namespace Ryujinx.Graphics.Vulkan
 | 
			
		||||
            _pool.AddWaitable(CommandBufferIndex, waitable);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void AddDependency(CommandBufferScoped dependencyCbs)
 | 
			
		||||
        {
 | 
			
		||||
            _pool.AddDependency(CommandBufferIndex, dependencyCbs);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public FenceHolder GetFence()
 | 
			
		||||
        {
 | 
			
		||||
            return _pool.GetFence(CommandBufferIndex);
 | 
			
		||||
 | 
			
		||||
@ -1,60 +0,0 @@
 | 
			
		||||
using Silk.NET.Vulkan;
 | 
			
		||||
using System;
 | 
			
		||||
using System.Threading;
 | 
			
		||||
using VkSemaphore = Silk.NET.Vulkan.Semaphore;
 | 
			
		||||
 | 
			
		||||
namespace Ryujinx.Graphics.Vulkan
 | 
			
		||||
{
 | 
			
		||||
    class SemaphoreHolder : IDisposable
 | 
			
		||||
    {
 | 
			
		||||
        private readonly Vk _api;
 | 
			
		||||
        private readonly Device _device;
 | 
			
		||||
        private VkSemaphore _semaphore;
 | 
			
		||||
        private int _referenceCount;
 | 
			
		||||
        private bool _disposed;
 | 
			
		||||
 | 
			
		||||
        public unsafe SemaphoreHolder(Vk api, Device device)
 | 
			
		||||
        {
 | 
			
		||||
            _api = api;
 | 
			
		||||
            _device = device;
 | 
			
		||||
 | 
			
		||||
            var semaphoreCreateInfo = new SemaphoreCreateInfo
 | 
			
		||||
            {
 | 
			
		||||
                SType = StructureType.SemaphoreCreateInfo,
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            api.CreateSemaphore(device, in semaphoreCreateInfo, null, out _semaphore).ThrowOnError();
 | 
			
		||||
 | 
			
		||||
            _referenceCount = 1;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public VkSemaphore GetUnsafe()
 | 
			
		||||
        {
 | 
			
		||||
            return _semaphore;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public VkSemaphore Get()
 | 
			
		||||
        {
 | 
			
		||||
            Interlocked.Increment(ref _referenceCount);
 | 
			
		||||
            return _semaphore;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public unsafe void Put()
 | 
			
		||||
        {
 | 
			
		||||
            if (Interlocked.Decrement(ref _referenceCount) == 0)
 | 
			
		||||
            {
 | 
			
		||||
                _api.DestroySemaphore(_device, _semaphore, null);
 | 
			
		||||
                _semaphore = default;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void Dispose()
 | 
			
		||||
        {
 | 
			
		||||
            if (!_disposed)
 | 
			
		||||
            {
 | 
			
		||||
                Put();
 | 
			
		||||
                _disposed = true;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user