mirror of
				https://github.com/Ryujinx/Ryujinx.git
				synced 2025-11-04 08:13:41 +00:00 
			
		
		
		
	Allow BGRA images on Vulkan (#5203)
This commit is contained in:
		
							parent
							
								
									c545c59851
								
							
						
					
					
						commit
						8a352df3c6
					
				@ -383,6 +383,7 @@ namespace Ryujinx.Graphics.GAL
 | 
				
			|||||||
                case Format.R10G10B10A2Unorm:
 | 
					                case Format.R10G10B10A2Unorm:
 | 
				
			||||||
                case Format.R10G10B10A2Uint:
 | 
					                case Format.R10G10B10A2Uint:
 | 
				
			||||||
                case Format.R11G11B10Float:
 | 
					                case Format.R11G11B10Float:
 | 
				
			||||||
 | 
					                case Format.B8G8R8A8Unorm:
 | 
				
			||||||
                    return true;
 | 
					                    return true;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -96,8 +96,6 @@ namespace Ryujinx.Graphics.Vulkan.Effects
 | 
				
			|||||||
            {
 | 
					            {
 | 
				
			||||||
                var originalInfo = view.Info;
 | 
					                var originalInfo = view.Info;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                var swapRB = originalInfo.Format.IsBgr() && originalInfo.SwizzleR == SwizzleComponent.Red;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                var info = new TextureCreateInfo(
 | 
					                var info = new TextureCreateInfo(
 | 
				
			||||||
                    width,
 | 
					                    width,
 | 
				
			||||||
                    height,
 | 
					                    height,
 | 
				
			||||||
@ -110,9 +108,9 @@ namespace Ryujinx.Graphics.Vulkan.Effects
 | 
				
			|||||||
                    originalInfo.Format,
 | 
					                    originalInfo.Format,
 | 
				
			||||||
                    originalInfo.DepthStencilMode,
 | 
					                    originalInfo.DepthStencilMode,
 | 
				
			||||||
                    originalInfo.Target,
 | 
					                    originalInfo.Target,
 | 
				
			||||||
                    swapRB ? originalInfo.SwizzleB : originalInfo.SwizzleR,
 | 
					                    originalInfo.SwizzleR,
 | 
				
			||||||
                    originalInfo.SwizzleG,
 | 
					                    originalInfo.SwizzleG,
 | 
				
			||||||
                    swapRB ? originalInfo.SwizzleR : originalInfo.SwizzleB,
 | 
					                    originalInfo.SwizzleB,
 | 
				
			||||||
                    originalInfo.SwizzleA);
 | 
					                    originalInfo.SwizzleA);
 | 
				
			||||||
                _intermediaryTexture?.Dispose();
 | 
					                _intermediaryTexture?.Dispose();
 | 
				
			||||||
                _intermediaryTexture = _renderer.CreateTexture(info, view.ScaleFactor) as TextureView;
 | 
					                _intermediaryTexture = _renderer.CreateTexture(info, view.ScaleFactor) as TextureView;
 | 
				
			||||||
@ -155,7 +153,7 @@ namespace Ryujinx.Graphics.Vulkan.Effects
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            var bufferRanges = new BufferRange(bufferHandle, 0, rangeSize);
 | 
					            var bufferRanges = new BufferRange(bufferHandle, 0, rangeSize);
 | 
				
			||||||
            _pipeline.SetUniformBuffers(stackalloc[] { new BufferAssignment(2, bufferRanges) });
 | 
					            _pipeline.SetUniformBuffers(stackalloc[] { new BufferAssignment(2, bufferRanges) });
 | 
				
			||||||
            _pipeline.SetImage(0, _intermediaryTexture, GAL.Format.R8G8B8A8Unorm);
 | 
					            _pipeline.SetImage(0, _intermediaryTexture, FormatTable.ConvertRgba8SrgbToUnorm(view.Info.Format));
 | 
				
			||||||
            _pipeline.DispatchCompute(dispatchX, dispatchY, 1);
 | 
					            _pipeline.DispatchCompute(dispatchX, dispatchY, 1);
 | 
				
			||||||
            _pipeline.ComputeBarrier();
 | 
					            _pipeline.ComputeBarrier();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -56,28 +56,7 @@ namespace Ryujinx.Graphics.Vulkan.Effects
 | 
				
			|||||||
            if (_texture == null || _texture.Width != view.Width || _texture.Height != view.Height)
 | 
					            if (_texture == null || _texture.Width != view.Width || _texture.Height != view.Height)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                _texture?.Dispose();
 | 
					                _texture?.Dispose();
 | 
				
			||||||
 | 
					                _texture = _renderer.CreateTexture(view.Info, view.ScaleFactor) as TextureView;
 | 
				
			||||||
                var info = view.Info;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                if (view.Info.Format.IsBgr())
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    info = new TextureCreateInfo(info.Width,
 | 
					 | 
				
			||||||
                        info.Height,
 | 
					 | 
				
			||||||
                        info.Depth,
 | 
					 | 
				
			||||||
                        info.Levels,
 | 
					 | 
				
			||||||
                        info.Samples,
 | 
					 | 
				
			||||||
                        info.BlockWidth,
 | 
					 | 
				
			||||||
                        info.BlockHeight,
 | 
					 | 
				
			||||||
                        info.BytesPerPixel,
 | 
					 | 
				
			||||||
                        info.Format,
 | 
					 | 
				
			||||||
                        info.DepthStencilMode,
 | 
					 | 
				
			||||||
                        info.Target,
 | 
					 | 
				
			||||||
                        info.SwizzleB,
 | 
					 | 
				
			||||||
                        info.SwizzleG,
 | 
					 | 
				
			||||||
                        info.SwizzleR,
 | 
					 | 
				
			||||||
                        info.SwizzleA);
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
                _texture = _renderer.CreateTexture(info, view.ScaleFactor) as TextureView;
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            _pipeline.SetCommandBuffer(cbs);
 | 
					            _pipeline.SetCommandBuffer(cbs);
 | 
				
			||||||
@ -96,7 +75,7 @@ namespace Ryujinx.Graphics.Vulkan.Effects
 | 
				
			|||||||
            var dispatchX = BitUtils.DivRoundUp(view.Width, IPostProcessingEffect.LocalGroupSize);
 | 
					            var dispatchX = BitUtils.DivRoundUp(view.Width, IPostProcessingEffect.LocalGroupSize);
 | 
				
			||||||
            var dispatchY = BitUtils.DivRoundUp(view.Height, IPostProcessingEffect.LocalGroupSize);
 | 
					            var dispatchY = BitUtils.DivRoundUp(view.Height, IPostProcessingEffect.LocalGroupSize);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            _pipeline.SetImage(0, _texture, GAL.Format.R8G8B8A8Unorm);
 | 
					            _pipeline.SetImage(0, _texture, FormatTable.ConvertRgba8SrgbToUnorm(view.Info.Format));
 | 
				
			||||||
            _pipeline.DispatchCompute(dispatchX, dispatchY, 1);
 | 
					            _pipeline.DispatchCompute(dispatchX, dispatchY, 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            _renderer.BufferManager.Delete(bufferHandle);
 | 
					            _renderer.BufferManager.Delete(bufferHandle);
 | 
				
			||||||
 | 
				
			|||||||
@ -4,7 +4,6 @@ using Ryujinx.Graphics.Shader;
 | 
				
			|||||||
using Ryujinx.Graphics.Shader.Translation;
 | 
					using Ryujinx.Graphics.Shader.Translation;
 | 
				
			||||||
using Silk.NET.Vulkan;
 | 
					using Silk.NET.Vulkan;
 | 
				
			||||||
using System;
 | 
					using System;
 | 
				
			||||||
using Format = Ryujinx.Graphics.GAL.Format;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace Ryujinx.Graphics.Vulkan.Effects
 | 
					namespace Ryujinx.Graphics.Vulkan.Effects
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@ -149,7 +148,7 @@ namespace Ryujinx.Graphics.Vulkan.Effects
 | 
				
			|||||||
                1,
 | 
					                1,
 | 
				
			||||||
                1,
 | 
					                1,
 | 
				
			||||||
                1,
 | 
					                1,
 | 
				
			||||||
                Format.R8G8Unorm,
 | 
					                GAL.Format.R8G8Unorm,
 | 
				
			||||||
                DepthStencilMode.Depth,
 | 
					                DepthStencilMode.Depth,
 | 
				
			||||||
                Target.Texture2D,
 | 
					                Target.Texture2D,
 | 
				
			||||||
                SwizzleComponent.Red,
 | 
					                SwizzleComponent.Red,
 | 
				
			||||||
@ -165,7 +164,7 @@ namespace Ryujinx.Graphics.Vulkan.Effects
 | 
				
			|||||||
                1,
 | 
					                1,
 | 
				
			||||||
                1,
 | 
					                1,
 | 
				
			||||||
                1,
 | 
					                1,
 | 
				
			||||||
                Format.R8Unorm,
 | 
					                GAL.Format.R8Unorm,
 | 
				
			||||||
                DepthStencilMode.Depth,
 | 
					                DepthStencilMode.Depth,
 | 
				
			||||||
                Target.Texture2D,
 | 
					                Target.Texture2D,
 | 
				
			||||||
                SwizzleComponent.Red,
 | 
					                SwizzleComponent.Red,
 | 
				
			||||||
@ -192,30 +191,9 @@ namespace Ryujinx.Graphics.Vulkan.Effects
 | 
				
			|||||||
                _edgeOutputTexture?.Dispose();
 | 
					                _edgeOutputTexture?.Dispose();
 | 
				
			||||||
                _blendOutputTexture?.Dispose();
 | 
					                _blendOutputTexture?.Dispose();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                var info = view.Info;
 | 
					                _outputTexture = _renderer.CreateTexture(view.Info, view.ScaleFactor) as TextureView;
 | 
				
			||||||
 | 
					                _edgeOutputTexture = _renderer.CreateTexture(view.Info, view.ScaleFactor) as TextureView;
 | 
				
			||||||
                if (view.Info.Format.IsBgr())
 | 
					                _blendOutputTexture = _renderer.CreateTexture(view.Info, view.ScaleFactor) as TextureView;
 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    info = new TextureCreateInfo(info.Width,
 | 
					 | 
				
			||||||
                        info.Height,
 | 
					 | 
				
			||||||
                        info.Depth,
 | 
					 | 
				
			||||||
                        info.Levels,
 | 
					 | 
				
			||||||
                        info.Samples,
 | 
					 | 
				
			||||||
                        info.BlockWidth,
 | 
					 | 
				
			||||||
                        info.BlockHeight,
 | 
					 | 
				
			||||||
                        info.BytesPerPixel,
 | 
					 | 
				
			||||||
                        info.Format,
 | 
					 | 
				
			||||||
                        info.DepthStencilMode,
 | 
					 | 
				
			||||||
                        info.Target,
 | 
					 | 
				
			||||||
                        info.SwizzleB,
 | 
					 | 
				
			||||||
                        info.SwizzleG,
 | 
					 | 
				
			||||||
                        info.SwizzleR,
 | 
					 | 
				
			||||||
                        info.SwizzleA);
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                _outputTexture = _renderer.CreateTexture(info, view.ScaleFactor) as TextureView;
 | 
					 | 
				
			||||||
                _edgeOutputTexture = _renderer.CreateTexture(info, view.ScaleFactor) as TextureView;
 | 
					 | 
				
			||||||
                _blendOutputTexture = _renderer.CreateTexture(info, view.ScaleFactor) as TextureView;
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            _pipeline.SetCommandBuffer(cbs);
 | 
					            _pipeline.SetCommandBuffer(cbs);
 | 
				
			||||||
@ -240,7 +218,7 @@ namespace Ryujinx.Graphics.Vulkan.Effects
 | 
				
			|||||||
            _renderer.BufferManager.SetData(bufferHandle, 0, resolutionBuffer);
 | 
					            _renderer.BufferManager.SetData(bufferHandle, 0, resolutionBuffer);
 | 
				
			||||||
            var bufferRanges = new BufferRange(bufferHandle, 0, rangeSize);
 | 
					            var bufferRanges = new BufferRange(bufferHandle, 0, rangeSize);
 | 
				
			||||||
            _pipeline.SetUniformBuffers(stackalloc[] { new BufferAssignment(2, bufferRanges) });
 | 
					            _pipeline.SetUniformBuffers(stackalloc[] { new BufferAssignment(2, bufferRanges) });
 | 
				
			||||||
            _pipeline.SetImage(0, _edgeOutputTexture, GAL.Format.R8G8B8A8Unorm);
 | 
					            _pipeline.SetImage(0, _edgeOutputTexture, FormatTable.ConvertRgba8SrgbToUnorm(view.Info.Format));
 | 
				
			||||||
            _pipeline.DispatchCompute(dispatchX, dispatchY, 1);
 | 
					            _pipeline.DispatchCompute(dispatchX, dispatchY, 1);
 | 
				
			||||||
            _pipeline.ComputeBarrier();
 | 
					            _pipeline.ComputeBarrier();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -250,7 +228,7 @@ namespace Ryujinx.Graphics.Vulkan.Effects
 | 
				
			|||||||
            _pipeline.SetTextureAndSampler(ShaderStage.Compute, 1, _edgeOutputTexture, _samplerLinear);
 | 
					            _pipeline.SetTextureAndSampler(ShaderStage.Compute, 1, _edgeOutputTexture, _samplerLinear);
 | 
				
			||||||
            _pipeline.SetTextureAndSampler(ShaderStage.Compute, 3, _areaTexture, _samplerLinear);
 | 
					            _pipeline.SetTextureAndSampler(ShaderStage.Compute, 3, _areaTexture, _samplerLinear);
 | 
				
			||||||
            _pipeline.SetTextureAndSampler(ShaderStage.Compute, 4, _searchTexture, _samplerLinear);
 | 
					            _pipeline.SetTextureAndSampler(ShaderStage.Compute, 4, _searchTexture, _samplerLinear);
 | 
				
			||||||
            _pipeline.SetImage(0, _blendOutputTexture, GAL.Format.R8G8B8A8Unorm);
 | 
					            _pipeline.SetImage(0, _blendOutputTexture, FormatTable.ConvertRgba8SrgbToUnorm(view.Info.Format));
 | 
				
			||||||
            _pipeline.DispatchCompute(dispatchX, dispatchY, 1);
 | 
					            _pipeline.DispatchCompute(dispatchX, dispatchY, 1);
 | 
				
			||||||
            _pipeline.ComputeBarrier();
 | 
					            _pipeline.ComputeBarrier();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -259,7 +237,7 @@ namespace Ryujinx.Graphics.Vulkan.Effects
 | 
				
			|||||||
            _pipeline.Specialize(_specConstants);
 | 
					            _pipeline.Specialize(_specConstants);
 | 
				
			||||||
            _pipeline.SetTextureAndSampler(ShaderStage.Compute, 3, _blendOutputTexture, _samplerLinear);
 | 
					            _pipeline.SetTextureAndSampler(ShaderStage.Compute, 3, _blendOutputTexture, _samplerLinear);
 | 
				
			||||||
            _pipeline.SetTextureAndSampler(ShaderStage.Compute, 1, view, _samplerLinear);
 | 
					            _pipeline.SetTextureAndSampler(ShaderStage.Compute, 1, view, _samplerLinear);
 | 
				
			||||||
            _pipeline.SetImage(0, _outputTexture, GAL.Format.R8G8B8A8Unorm);
 | 
					            _pipeline.SetImage(0, _outputTexture, FormatTable.ConvertRgba8SrgbToUnorm(view.Info.Format));
 | 
				
			||||||
            _pipeline.DispatchCompute(dispatchX, dispatchY, 1);
 | 
					            _pipeline.DispatchCompute(dispatchX, dispatchY, 1);
 | 
				
			||||||
            _pipeline.ComputeBarrier();
 | 
					            _pipeline.ComputeBarrier();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -169,6 +169,16 @@ namespace Ryujinx.Graphics.Vulkan
 | 
				
			|||||||
            return _table[(int)format];
 | 
					            return _table[(int)format];
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public static Format ConvertRgba8SrgbToUnorm(Format format)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            return format switch
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                Format.R8G8B8A8Srgb => Format.R8G8B8A8Unorm,
 | 
				
			||||||
 | 
					                Format.B8G8R8A8Srgb => Format.B8G8R8A8Unorm,
 | 
				
			||||||
 | 
					                _ => format
 | 
				
			||||||
 | 
					            };
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public static int GetAttributeFormatSize(VkFormat format)
 | 
					        public static int GetAttributeFormatSize(VkFormat format)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            switch (format)
 | 
					            switch (format)
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user