 cda659955c
			
		
	
	
		cda659955c
		
			
		
	
	
	
	
		
			
			* Initial test for texture sync * WIP new texture flushing setup * Improve rules for incompatible overlaps Fixes a lot of issues with Unreal Engine games. Still a few minor issues (some caused by dma fast path?) Needs docs and cleanup. * Cleanup, improvements Improve rules for fast DMA * Small tweak to group together flushes of overlapping handles. * Fixes, flush overlapping texture data for ASTC and BC4/5 compressed textures. Fixes the new Life is Strange game. * Flush overlaps before init data, fix 3d texture size/overlap stuff * Fix 3D Textures, faster single layer flush Note: nosy people can no longer merge this with Vulkan. (unless they are nosy enough to implement the new backend methods) * Remove unused method * Minor cleanup * More cleanup * Use the More Fun and Hopefully No Driver Bugs method for getting compressed tex too This one's for metro * Address feedback, ASTC+ETC to FormatClass * Change offset to use Span slice rather than IntPtr Add * Fix this too
		
			
				
	
	
		
			58 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			58 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using Ryujinx.Memory;
 | |
| using Ryujinx.Memory.Range;
 | |
| using System;
 | |
| 
 | |
| namespace Ryujinx.Graphics.Gpu.Memory
 | |
| {
 | |
|     /// <summary>
 | |
|     /// A writable block that targets a given MultiRange within a PhysicalMemory instance.
 | |
|     /// </summary>
 | |
|     internal class MultiRangeWritableBlock : IWritableBlock
 | |
|     {
 | |
|         private readonly MultiRange _range;
 | |
|         private readonly PhysicalMemory _physicalMemory;
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Creates a new MultiRangeWritableBlock.
 | |
|         /// </summary>
 | |
|         /// <param name="range">The MultiRange to write to</param>
 | |
|         /// <param name="physicalMemory">The PhysicalMemory the given MultiRange addresses</param>
 | |
|         public MultiRangeWritableBlock(MultiRange range, PhysicalMemory physicalMemory)
 | |
|         {
 | |
|             _range = range;
 | |
|             _physicalMemory = physicalMemory;
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Write data to the MultiRange.
 | |
|         /// </summary>
 | |
|         /// <param name="va">Offset address</param>
 | |
|         /// <param name="data">Data to write</param>
 | |
|         /// <exception cref="ArgumentException">Throw when a non-zero offset is given</exception>
 | |
|         public void Write(ulong va, ReadOnlySpan<byte> data)
 | |
|         {
 | |
|             if (va != 0)
 | |
|             {
 | |
|                 throw new ArgumentException($"{nameof(va)} cannot be non-zero for {nameof(MultiRangeWritableBlock)}.");
 | |
|             }
 | |
| 
 | |
|             _physicalMemory.Write(_range, data);
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Write data to the MultiRange, without tracking.
 | |
|         /// </summary>
 | |
|         /// <param name="va">Offset address</param>
 | |
|         /// <param name="data">Data to write</param>
 | |
|         /// <exception cref="ArgumentException">Throw when a non-zero offset is given</exception>
 | |
|         public void WriteUntracked(ulong va, ReadOnlySpan<byte> data)
 | |
|         {
 | |
|             if (va != 0)
 | |
|             {
 | |
|                 throw new ArgumentException($"{nameof(va)} cannot be non-zero for {nameof(MultiRangeWritableBlock)}.");
 | |
|             }
 | |
| 
 | |
|             _physicalMemory.WriteUntracked(_range, data);
 | |
|         }
 | |
|     }
 | |
| }
 |