mirror of
				https://github.com/ryujinx-mirror/ryujinx.git
				synced 2025-11-04 08:59:04 -06:00 
			
		
		
		
	Add support for sampler sRGB disable (#7312)
This commit is contained in:
		@@ -13,6 +13,11 @@ namespace Ryujinx.Graphics.Gpu.Image
 | 
				
			|||||||
        /// </summary>
 | 
					        /// </summary>
 | 
				
			||||||
        public bool IsDisposed { get; private set; }
 | 
					        public bool IsDisposed { get; private set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// True if the sampler has sRGB conversion enabled, false otherwise.
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        public bool IsSrgb { get; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /// <summary>
 | 
					        /// <summary>
 | 
				
			||||||
        /// Host sampler object.
 | 
					        /// Host sampler object.
 | 
				
			||||||
        /// </summary>
 | 
					        /// </summary>
 | 
				
			||||||
@@ -30,6 +35,8 @@ namespace Ryujinx.Graphics.Gpu.Image
 | 
				
			|||||||
        /// <param name="descriptor">The Maxwell sampler descriptor</param>
 | 
					        /// <param name="descriptor">The Maxwell sampler descriptor</param>
 | 
				
			||||||
        public Sampler(GpuContext context, SamplerDescriptor descriptor)
 | 
					        public Sampler(GpuContext context, SamplerDescriptor descriptor)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
 | 
					            IsSrgb = descriptor.UnpackSrgb();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            MinFilter minFilter = descriptor.UnpackMinFilter();
 | 
					            MinFilter minFilter = descriptor.UnpackMinFilter();
 | 
				
			||||||
            MagFilter magFilter = descriptor.UnpackMagFilter();
 | 
					            MagFilter magFilter = descriptor.UnpackMagFilter();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -113,6 +113,15 @@ namespace Ryujinx.Graphics.Gpu.Image
 | 
				
			|||||||
            return (CompareOp)(((Word0 >> 10) & 7) + 1);
 | 
					            return (CompareOp)(((Word0 >> 10) & 7) + 1);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// Unpacks the sampler sRGB format flag.
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <returns>True if the has sampler is sRGB conversion enabled, false otherwise</returns>
 | 
				
			||||||
 | 
					        public readonly bool UnpackSrgb()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            return (Word0 & (1 << 13)) != 0;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /// <summary>
 | 
					        /// <summary>
 | 
				
			||||||
        /// Unpacks and converts the maximum anisotropy value used for texture anisotropic filtering.
 | 
					        /// Unpacks and converts the maximum anisotropy value used for texture anisotropic filtering.
 | 
				
			||||||
        /// </summary>
 | 
					        /// </summary>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -187,7 +187,9 @@ namespace Ryujinx.Graphics.Gpu.Image
 | 
				
			|||||||
        {
 | 
					        {
 | 
				
			||||||
            (TexturePool texturePool, SamplerPool samplerPool) = GetPools();
 | 
					            (TexturePool texturePool, SamplerPool samplerPool) = GetPools();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            return (texturePool.Get(textureId), samplerPool.Get(samplerId));
 | 
					            Sampler sampler = samplerPool?.Get(samplerId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            return (texturePool.Get(textureId, sampler?.IsSrgb ?? true), sampler);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /// <summary>
 | 
					        /// <summary>
 | 
				
			||||||
@@ -508,12 +510,12 @@ namespace Ryujinx.Graphics.Gpu.Image
 | 
				
			|||||||
                state.TextureHandle = textureId;
 | 
					                state.TextureHandle = textureId;
 | 
				
			||||||
                state.SamplerHandle = samplerId;
 | 
					                state.SamplerHandle = samplerId;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                ref readonly TextureDescriptor descriptor = ref texturePool.GetForBinding(textureId, out Texture texture);
 | 
					                Sampler sampler = samplerPool?.Get(samplerId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                ref readonly TextureDescriptor descriptor = ref texturePool.GetForBinding(textureId, sampler?.IsSrgb ?? true, out Texture texture);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                specStateMatches &= specState.MatchesTexture(stage, index, descriptor);
 | 
					                specStateMatches &= specState.MatchesTexture(stage, index, descriptor);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                Sampler sampler = samplerPool?.Get(samplerId);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                ITexture hostTexture = texture?.GetTargetTexture(bindingInfo.Target);
 | 
					                ITexture hostTexture = texture?.GetTargetTexture(bindingInfo.Target);
 | 
				
			||||||
                ISampler hostSampler = sampler?.GetHostSampler(texture);
 | 
					                ISampler hostSampler = sampler?.GetHostSampler(texture);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -227,6 +227,17 @@ namespace Ryujinx.Graphics.Gpu.Image
 | 
				
			|||||||
        /// <param name="id">ID of the texture. This is effectively a zero-based index</param>
 | 
					        /// <param name="id">ID of the texture. This is effectively a zero-based index</param>
 | 
				
			||||||
        /// <returns>The texture with the given ID</returns>
 | 
					        /// <returns>The texture with the given ID</returns>
 | 
				
			||||||
        public override Texture Get(int id)
 | 
					        public override Texture Get(int id)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            return Get(id, srgbSampler: true);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// Gets the texture with the given ID.
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <param name="id">ID of the texture. This is effectively a zero-based index</param>
 | 
				
			||||||
 | 
					        /// <param name="srgbSampler">Whether the texture is being accessed with a sampler that has sRGB conversion enabled</param>
 | 
				
			||||||
 | 
					        /// <returns>The texture with the given ID</returns>
 | 
				
			||||||
 | 
					        public Texture Get(int id, bool srgbSampler)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            if ((uint)id >= Items.Length)
 | 
					            if ((uint)id >= Items.Length)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
@@ -240,7 +251,7 @@ namespace Ryujinx.Graphics.Gpu.Image
 | 
				
			|||||||
                SynchronizeMemory();
 | 
					                SynchronizeMemory();
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            GetInternal(id, out Texture texture);
 | 
					            GetForBinding(id, srgbSampler, out Texture texture);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            return texture;
 | 
					            return texture;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -252,9 +263,10 @@ namespace Ryujinx.Graphics.Gpu.Image
 | 
				
			|||||||
        /// This method assumes that the pool has been manually synchronized before doing binding.
 | 
					        /// This method assumes that the pool has been manually synchronized before doing binding.
 | 
				
			||||||
        /// </remarks>
 | 
					        /// </remarks>
 | 
				
			||||||
        /// <param name="id">ID of the texture. This is effectively a zero-based index</param>
 | 
					        /// <param name="id">ID of the texture. This is effectively a zero-based index</param>
 | 
				
			||||||
 | 
					        /// <param name="srgbSampler">Whether the texture is being accessed with a sampler that has sRGB conversion enabled</param>
 | 
				
			||||||
        /// <param name="texture">The texture with the given ID</param>
 | 
					        /// <param name="texture">The texture with the given ID</param>
 | 
				
			||||||
        /// <returns>The texture descriptor with the given ID</returns>
 | 
					        /// <returns>The texture descriptor with the given ID</returns>
 | 
				
			||||||
        public ref readonly TextureDescriptor GetForBinding(int id, out Texture texture)
 | 
					        public ref readonly TextureDescriptor GetForBinding(int id, bool srgbSampler, out Texture texture)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            if ((uint)id >= Items.Length)
 | 
					            if ((uint)id >= Items.Length)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
@@ -264,6 +276,18 @@ namespace Ryujinx.Graphics.Gpu.Image
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            // When getting for binding, assume the pool has already been synchronized.
 | 
					            // When getting for binding, assume the pool has already been synchronized.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (!srgbSampler)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                // If the sampler does not have the sRGB bit enabled, then the texture can't use a sRGB format.
 | 
				
			||||||
 | 
					                ref readonly TextureDescriptor tempDescriptor = ref GetDescriptorRef(id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (tempDescriptor.UnpackSrgb() && FormatTable.TryGetTextureFormat(tempDescriptor.UnpackFormat(), isSrgb: false, out FormatInfo formatInfo))
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    // Get a view of the texture with the right format.
 | 
				
			||||||
 | 
					                    return ref GetForBinding(id, formatInfo, out texture);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            return ref GetInternal(id, out texture);
 | 
					            return ref GetInternal(id, out texture);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user