mirror of
				https://github.com/ryujinx-mirror/ryujinx.git
				synced 2025-11-04 08:59:04 -06:00 
			
		
		
		
	Resolve some Vulkan validation errors (#6915)
* Fix some validation errors * Whitespace correction * Resolve some runtime validation errors. * Whitespace * Properly fix usage realted validation error by setting Extended Usage image creation flag. * Only if supported * Remove checking extension for features that are core functionality of Vulkan 1.2
This commit is contained in:
		@@ -103,12 +103,19 @@ namespace Ryujinx.Graphics.Vulkan
 | 
			
		||||
                usage |= BufferUsageFlags.IndirectBufferBit;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            var externalMemoryBuffer = new ExternalMemoryBufferCreateInfo
 | 
			
		||||
            {
 | 
			
		||||
                SType = StructureType.ExternalMemoryBufferCreateInfo,
 | 
			
		||||
                HandleTypes = ExternalMemoryHandleTypeFlags.HostAllocationBitExt,
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            var bufferCreateInfo = new BufferCreateInfo
 | 
			
		||||
            {
 | 
			
		||||
                SType = StructureType.BufferCreateInfo,
 | 
			
		||||
                Size = (ulong)size,
 | 
			
		||||
                Usage = usage,
 | 
			
		||||
                SharingMode = SharingMode.Exclusive,
 | 
			
		||||
                PNext = &externalMemoryBuffer,
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            gd.Api.CreateBuffer(_device, in bufferCreateInfo, null, out var buffer).ThrowOnError();
 | 
			
		||||
 
 | 
			
		||||
@@ -80,7 +80,7 @@ namespace Ryujinx.Graphics.Vulkan
 | 
			
		||||
 | 
			
		||||
            var usage = GetImageUsage(info.Format, info.Target, gd.Capabilities.SupportsShaderStorageImageMultisample);
 | 
			
		||||
 | 
			
		||||
            var flags = ImageCreateFlags.CreateMutableFormatBit;
 | 
			
		||||
            var flags = ImageCreateFlags.CreateMutableFormatBit | ImageCreateFlags.CreateExtendedUsageBit;
 | 
			
		||||
 | 
			
		||||
            // This flag causes mipmapped texture arrays to break on AMD GCN, so for that copy dependencies are forced for aliasing as cube.
 | 
			
		||||
            bool isCube = info.Target == Target.Cubemap || info.Target == Target.CubemapArray;
 | 
			
		||||
 
 | 
			
		||||
@@ -100,7 +100,7 @@ namespace Ryujinx.Graphics.Vulkan
 | 
			
		||||
 | 
			
		||||
            unsafe Auto<DisposableImageView> CreateImageView(ComponentMapping cm, ImageSubresourceRange sr, ImageViewType viewType, ImageUsageFlags usageFlags)
 | 
			
		||||
            {
 | 
			
		||||
                var usage = new ImageViewUsageCreateInfo
 | 
			
		||||
                var imageViewUsage = new ImageViewUsageCreateInfo
 | 
			
		||||
                {
 | 
			
		||||
                    SType = StructureType.ImageViewUsageCreateInfo,
 | 
			
		||||
                    Usage = usageFlags,
 | 
			
		||||
@@ -114,7 +114,7 @@ namespace Ryujinx.Graphics.Vulkan
 | 
			
		||||
                    Format = format,
 | 
			
		||||
                    Components = cm,
 | 
			
		||||
                    SubresourceRange = sr,
 | 
			
		||||
                    PNext = &usage,
 | 
			
		||||
                    PNext = &imageViewUsage,
 | 
			
		||||
                };
 | 
			
		||||
 | 
			
		||||
                gd.Api.CreateImageView(device, imageCreateInfo, null, out var imageView).ThrowOnError();
 | 
			
		||||
@@ -123,7 +123,7 @@ namespace Ryujinx.Graphics.Vulkan
 | 
			
		||||
 | 
			
		||||
            ImageUsageFlags shaderUsage = ImageUsageFlags.SampledBit;
 | 
			
		||||
 | 
			
		||||
            if (info.Format.IsImageCompatible())
 | 
			
		||||
            if (info.Format.IsImageCompatible() && (_gd.Capabilities.SupportsShaderStorageImageMultisample || !info.Target.IsMultisample()))
 | 
			
		||||
            {
 | 
			
		||||
                shaderUsage |= ImageUsageFlags.StorageBit;
 | 
			
		||||
            }
 | 
			
		||||
@@ -154,7 +154,7 @@ namespace Ryujinx.Graphics.Vulkan
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    subresourceRange = new ImageSubresourceRange(aspectFlags, (uint)firstLevel, levels, (uint)firstLayer, (uint)info.Depth);
 | 
			
		||||
                    subresourceRange = new ImageSubresourceRange(aspectFlags, (uint)firstLevel, 1, (uint)firstLayer, (uint)info.Depth);
 | 
			
		||||
 | 
			
		||||
                    _imageView2dArray = CreateImageView(identityComponentMapping, subresourceRange, ImageViewType.Type2DArray, usage);
 | 
			
		||||
                }
 | 
			
		||||
 
 | 
			
		||||
@@ -42,6 +42,8 @@ namespace Ryujinx.Graphics.Vulkan
 | 
			
		||||
            "VK_EXT_depth_clip_control",
 | 
			
		||||
            "VK_KHR_portability_subset", // As per spec, we should enable this if present.
 | 
			
		||||
            "VK_EXT_4444_formats",
 | 
			
		||||
            "VK_KHR_8bit_storage",
 | 
			
		||||
            "VK_KHR_maintenance2",
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        private static readonly string[] _requiredExtensions = {
 | 
			
		||||
@@ -355,6 +357,14 @@ namespace Ryujinx.Graphics.Vulkan
 | 
			
		||||
                features2.PNext = &supportedFeaturesDepthClipControl;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            PhysicalDeviceVulkan12Features supportedPhysicalDeviceVulkan12Features = new()
 | 
			
		||||
            {
 | 
			
		||||
                SType = StructureType.PhysicalDeviceVulkan12Features,
 | 
			
		||||
                PNext = features2.PNext,
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            features2.PNext = &supportedPhysicalDeviceVulkan12Features;
 | 
			
		||||
 | 
			
		||||
            api.GetPhysicalDeviceFeatures2(physicalDevice.PhysicalDevice, &features2);
 | 
			
		||||
 | 
			
		||||
            var supportedFeatures = features2.Features;
 | 
			
		||||
@@ -382,6 +392,7 @@ namespace Ryujinx.Graphics.Vulkan
 | 
			
		||||
                TessellationShader = supportedFeatures.TessellationShader,
 | 
			
		||||
                VertexPipelineStoresAndAtomics = supportedFeatures.VertexPipelineStoresAndAtomics,
 | 
			
		||||
                RobustBufferAccess = useRobustBufferAccess,
 | 
			
		||||
                SampleRateShading = supportedFeatures.SampleRateShading,
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            void* pExtendedFeatures = null;
 | 
			
		||||
@@ -451,9 +462,11 @@ namespace Ryujinx.Graphics.Vulkan
 | 
			
		||||
            {
 | 
			
		||||
                SType = StructureType.PhysicalDeviceVulkan12Features,
 | 
			
		||||
                PNext = pExtendedFeatures,
 | 
			
		||||
                DescriptorIndexing = physicalDevice.IsDeviceExtensionPresent("VK_EXT_descriptor_indexing"),
 | 
			
		||||
                DrawIndirectCount = physicalDevice.IsDeviceExtensionPresent(KhrDrawIndirectCount.ExtensionName),
 | 
			
		||||
                UniformBufferStandardLayout = physicalDevice.IsDeviceExtensionPresent("VK_KHR_uniform_buffer_standard_layout"),
 | 
			
		||||
                DescriptorIndexing = supportedPhysicalDeviceVulkan12Features.DescriptorIndexing,
 | 
			
		||||
                DrawIndirectCount = supportedPhysicalDeviceVulkan12Features.DrawIndirectCount,
 | 
			
		||||
                UniformBufferStandardLayout = supportedPhysicalDeviceVulkan12Features.UniformBufferStandardLayout,
 | 
			
		||||
                UniformAndStorageBuffer8BitAccess = supportedPhysicalDeviceVulkan12Features.UniformAndStorageBuffer8BitAccess,
 | 
			
		||||
                StorageBuffer8BitAccess = supportedPhysicalDeviceVulkan12Features.StorageBuffer8BitAccess,
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            pExtendedFeatures = &featuresVk12;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user