mirror of
				https://github.com/Ryujinx/Ryujinx.git
				synced 2025-10-25 21:13:55 -07:00 
			
		
		
		
	* Add optimizations related to caller/callee saved registers, thread synchronization and disable tier 0 * Refactoring * Add a config entry to enable or disable the reg load/store opt. * Remove unnecessary register state stores for calls when the callee is know * Rename IoType to VarType * Enable tier 0 while fixing some perf issues related to tier 0 * Small tweak -- Compile before adding to the cache, to avoid lags * Add required config entry
		
			
				
	
	
		
			77 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			77 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using ChocolArm64.State;
 | |
| using System.Collections.Concurrent;
 | |
| using System.Threading;
 | |
| 
 | |
| namespace ChocolArm64.Translation
 | |
| {
 | |
|     class TranslatorQueue
 | |
|     {
 | |
|         private ConcurrentStack<TranslatorQueueItem>[] _translationQueue;
 | |
| 
 | |
|         private ManualResetEvent _queueDataReceivedEvent;
 | |
| 
 | |
|         private bool _signaled;
 | |
| 
 | |
|         public TranslatorQueue()
 | |
|         {
 | |
|             _translationQueue = new ConcurrentStack<TranslatorQueueItem>[(int)TranslationTier.Count];
 | |
| 
 | |
|             for (int prio = 0; prio < _translationQueue.Length; prio++)
 | |
|             {
 | |
|                 _translationQueue[prio] = new ConcurrentStack<TranslatorQueueItem>();
 | |
|             }
 | |
| 
 | |
|             _queueDataReceivedEvent = new ManualResetEvent(false);
 | |
|         }
 | |
| 
 | |
|         public void Enqueue(long position, ExecutionMode mode, TranslationTier tier, bool isComplete)
 | |
|         {
 | |
|             TranslatorQueueItem item = new TranslatorQueueItem(position, mode, tier, isComplete);
 | |
| 
 | |
|             ConcurrentStack<TranslatorQueueItem> queue = _translationQueue[(int)tier];
 | |
| 
 | |
|             queue.Push(item);
 | |
| 
 | |
|             _queueDataReceivedEvent.Set();
 | |
|         }
 | |
| 
 | |
|         public bool TryDequeue(out TranslatorQueueItem item)
 | |
|         {
 | |
|             for (int prio = 0; prio < _translationQueue.Length; prio++)
 | |
|             {
 | |
|                 if (_translationQueue[prio].TryPop(out item))
 | |
|                 {
 | |
|                     return true;
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             item = default(TranslatorQueueItem);
 | |
| 
 | |
|             return false;
 | |
|         }
 | |
| 
 | |
|         public void WaitForItems()
 | |
|         {
 | |
|             _queueDataReceivedEvent.WaitOne();
 | |
| 
 | |
|             lock (_queueDataReceivedEvent)
 | |
|             {
 | |
|                 if (!_signaled)
 | |
|                 {
 | |
|                     _queueDataReceivedEvent.Reset();
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public void ForceSignal()
 | |
|         {
 | |
|             lock (_queueDataReceivedEvent)
 | |
|             {
 | |
|                 _signaled = true;
 | |
| 
 | |
|                 _queueDataReceivedEvent.Set();
 | |
|                 _queueDataReceivedEvent.Close();
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| } |