mirror of
				https://github.com/ryujinx-mirror/ryujinx.git
				synced 2025-11-04 03:29:01 -06:00 
			
		
		
		
	Fix same textures with unmapped start being considered different (#7141)
* Fix same textures with unmapped start being considered different * Consolidate IsInvalid check * InvalidAddress const * Fix typo Co-authored-by: riperiperi <rhy3756547@hotmail.com> --------- Co-authored-by: riperiperi <rhy3756547@hotmail.com>
This commit is contained in:
		@@ -4,6 +4,22 @@ namespace Ryujinx.Memory.Range
 | 
				
			|||||||
    {
 | 
					    {
 | 
				
			||||||
        MultiRange Range { get; }
 | 
					        MultiRange Range { get; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ulong BaseAddress => Range.GetSubRange(0).Address;
 | 
					        ulong BaseAddress
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            get
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                for (int index = 0; index < Range.Count; index++)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    MemoryRange subRange = Range.GetSubRange(index);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    if (!MemoryRange.IsInvalid(ref subRange))
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        return subRange.Address;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                return MemoryRange.InvalidAddress;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,6 +5,11 @@ namespace Ryujinx.Memory.Range
 | 
				
			|||||||
    /// </summary>
 | 
					    /// </summary>
 | 
				
			||||||
    public readonly record struct MemoryRange
 | 
					    public readonly record struct MemoryRange
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// Special address value used to indicate than an address is invalid.
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        internal const ulong InvalidAddress = ulong.MaxValue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /// <summary>
 | 
					        /// <summary>
 | 
				
			||||||
        /// An empty memory range, with a null address and zero size.
 | 
					        /// An empty memory range, with a null address and zero size.
 | 
				
			||||||
        /// </summary>
 | 
					        /// </summary>
 | 
				
			||||||
@@ -58,13 +63,24 @@ namespace Ryujinx.Memory.Range
 | 
				
			|||||||
            return thisAddress < otherEndAddress && otherAddress < thisEndAddress;
 | 
					            return thisAddress < otherEndAddress && otherAddress < thisEndAddress;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// Checks if a given sub-range of memory is invalid.
 | 
				
			||||||
 | 
					        /// Those are used to represent unmapped memory regions (holes in the region mapping).
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <param name="subRange">Memory range to check</param>
 | 
				
			||||||
 | 
					        /// <returns>True if the memory range is considered invalid, false otherwise</returns>
 | 
				
			||||||
 | 
					        internal static bool IsInvalid(ref MemoryRange subRange)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            return subRange.Address == InvalidAddress;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /// <summary>
 | 
					        /// <summary>
 | 
				
			||||||
        /// Returns a string summary of the memory range.
 | 
					        /// Returns a string summary of the memory range.
 | 
				
			||||||
        /// </summary>
 | 
					        /// </summary>
 | 
				
			||||||
        /// <returns>A string summary of the memory range</returns>
 | 
					        /// <returns>A string summary of the memory range</returns>
 | 
				
			||||||
        public override string ToString()
 | 
					        public override string ToString()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            if (Address == ulong.MaxValue)
 | 
					            if (Address == InvalidAddress)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                return $"[Unmapped 0x{Size:X}]";
 | 
					                return $"[Unmapped 0x{Size:X}]";
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -30,7 +30,7 @@ namespace Ryujinx.Memory.Range
 | 
				
			|||||||
            {
 | 
					            {
 | 
				
			||||||
                var subrange = range.GetSubRange(i);
 | 
					                var subrange = range.GetSubRange(i);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                if (IsInvalid(ref subrange))
 | 
					                if (MemoryRange.IsInvalid(ref subrange))
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    continue;
 | 
					                    continue;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -56,7 +56,7 @@ namespace Ryujinx.Memory.Range
 | 
				
			|||||||
            {
 | 
					            {
 | 
				
			||||||
                var subrange = range.GetSubRange(i);
 | 
					                var subrange = range.GetSubRange(i);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                if (IsInvalid(ref subrange))
 | 
					                if (MemoryRange.IsInvalid(ref subrange))
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    continue;
 | 
					                    continue;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -99,7 +99,7 @@ namespace Ryujinx.Memory.Range
 | 
				
			|||||||
            {
 | 
					            {
 | 
				
			||||||
                var subrange = range.GetSubRange(i);
 | 
					                var subrange = range.GetSubRange(i);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                if (IsInvalid(ref subrange))
 | 
					                if (MemoryRange.IsInvalid(ref subrange))
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    continue;
 | 
					                    continue;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -142,17 +142,6 @@ namespace Ryujinx.Memory.Range
 | 
				
			|||||||
            return overlapCount;
 | 
					            return overlapCount;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /// <summary>
 | 
					 | 
				
			||||||
        /// Checks if a given sub-range of memory is invalid.
 | 
					 | 
				
			||||||
        /// Those are used to represent unmapped memory regions (holes in the region mapping).
 | 
					 | 
				
			||||||
        /// </summary>
 | 
					 | 
				
			||||||
        /// <param name="subRange">Memory range to checl</param>
 | 
					 | 
				
			||||||
        /// <returns>True if the memory range is considered invalid, false otherwise</returns>
 | 
					 | 
				
			||||||
        private static bool IsInvalid(ref MemoryRange subRange)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            return subRange.Address == ulong.MaxValue;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        /// <summary>
 | 
					        /// <summary>
 | 
				
			||||||
        /// Gets all items on the list starting at the specified memory address.
 | 
					        /// Gets all items on the list starting at the specified memory address.
 | 
				
			||||||
        /// </summary>
 | 
					        /// </summary>
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user