 34037701c7
			
		
	
	
		34037701c7
		
			
		
	
	
	
	
		
			
			* Initial implementation of NvMap/NvHostCtrl * More work on NvHostCtrl * Refactoring of nvservices, move GPU Vmm, make Vmm per-process, refactor most gpu devices, move Gpu to Core, fix CbBind * Implement GetGpuTime, support CancelSynchronization, fix issue on InsertWaitingMutex, proper double buffering support (again, not working properly for commercial games, only hb) * Try to fix perf regression reading/writing textures, moved syncpts and events to a UserCtx class, delete global state when the process exits, other minor tweaks * Remove now unused code, add comment about probably wrong result codes
		
			
				
	
	
		
			57 lines
		
	
	
		
			No EOL
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			57 lines
		
	
	
		
			No EOL
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| namespace Ryujinx.Core.Gpu
 | |
| {
 | |
|     class BlockLinearSwizzle : ISwizzle
 | |
|     {
 | |
|         private int BhShift;
 | |
|         private int BppShift;
 | |
|         private int BhMask;
 | |
| 
 | |
|         private int XShift;
 | |
|         private int GobStride;
 | |
| 
 | |
|         public BlockLinearSwizzle(int Width, int Bpp, int BlockHeight = 16)
 | |
|         {
 | |
|             BhMask = (BlockHeight * 8) - 1;
 | |
| 
 | |
|             BhShift  = CountLsbZeros(BlockHeight * 8);
 | |
|             BppShift = CountLsbZeros(Bpp);
 | |
| 
 | |
|             int WidthInGobs = Width * Bpp / 64;
 | |
| 
 | |
|             GobStride = 512 * BlockHeight * WidthInGobs;
 | |
| 
 | |
|             XShift = CountLsbZeros(512 * BlockHeight);
 | |
|         }
 | |
| 
 | |
|         private int CountLsbZeros(int Value)
 | |
|         {
 | |
|             int Count = 0;
 | |
| 
 | |
|             while (((Value >> Count) & 1) == 0)
 | |
|             {
 | |
|                 Count++;
 | |
|             }
 | |
| 
 | |
|             return Count;
 | |
|         }
 | |
| 
 | |
|         public int GetSwizzleOffset(int X, int Y)
 | |
|         {
 | |
|             X <<= BppShift;
 | |
| 
 | |
|             int Position = (Y >> BhShift) * GobStride;
 | |
| 
 | |
|             Position += (X >> 6) << XShift;
 | |
| 
 | |
|             Position += ((Y & BhMask) >> 3) << 9;
 | |
| 
 | |
|             Position += ((X & 0x3f) >> 5) << 8;
 | |
|             Position += ((Y & 0x07) >> 1) << 6;
 | |
|             Position += ((X & 0x1f) >> 4) << 5;
 | |
|             Position += ((Y & 0x01) >> 0) << 4;
 | |
|             Position += ((X & 0x0f) >> 0) << 0;
 | |
| 
 | |
|             return Position;
 | |
|         }
 | |
|     }
 | |
| } |