From f636810c6c4d91dc93ae81a507241fd315f77955 Mon Sep 17 00:00:00 2001 From: riperiperi Date: Sat, 21 May 2022 15:11:36 +0100 Subject: [PATCH] Check for transform feedback query support Sometimes transform feedback is supported without the query type. --- Ryujinx.Graphics.Vulkan/HardwareCapabilities.cs | 3 +++ Ryujinx.Graphics.Vulkan/Queries/BufferedQuery.cs | 2 +- Ryujinx.Graphics.Vulkan/VulkanGraphicsDevice.cs | 16 +++++++++++++++- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/Ryujinx.Graphics.Vulkan/HardwareCapabilities.cs b/Ryujinx.Graphics.Vulkan/HardwareCapabilities.cs index 9d43754bc..efcd96615 100644 --- a/Ryujinx.Graphics.Vulkan/HardwareCapabilities.cs +++ b/Ryujinx.Graphics.Vulkan/HardwareCapabilities.cs @@ -7,6 +7,7 @@ namespace Ryujinx.Graphics.Vulkan public bool SupportsConditionalRendering { get; } public bool SupportsExtendedDynamicState { get; } public bool SupportsTransformFeedback { get; } + public bool SupportsTransformFeedbackQueries { get; } public bool SupportsGeometryShader { get; } public uint MinSubgroupSize { get; } public uint MaxSubgroupSize { get; } @@ -16,6 +17,7 @@ namespace Ryujinx.Graphics.Vulkan bool supportsConditionalRendering, bool supportsExtendedDynamicState, bool supportsTransformFeedback, + bool supportsTransformFeedbackQueries, bool supportsGeometryShader, uint minSubgroupSize, uint maxSubgroupSize, @@ -24,6 +26,7 @@ namespace Ryujinx.Graphics.Vulkan SupportsConditionalRendering = supportsConditionalRendering; SupportsExtendedDynamicState = supportsExtendedDynamicState; SupportsTransformFeedback = supportsTransformFeedback; + SupportsTransformFeedbackQueries = supportsTransformFeedbackQueries; SupportsGeometryShader = supportsGeometryShader; MinSubgroupSize = minSubgroupSize; MaxSubgroupSize = maxSubgroupSize; diff --git a/Ryujinx.Graphics.Vulkan/Queries/BufferedQuery.cs b/Ryujinx.Graphics.Vulkan/Queries/BufferedQuery.cs index 25150f756..1d54b9e10 100644 --- a/Ryujinx.Graphics.Vulkan/Queries/BufferedQuery.cs +++ b/Ryujinx.Graphics.Vulkan/Queries/BufferedQuery.cs @@ -67,7 +67,7 @@ namespace Ryujinx.Graphics.Vulkan.Queries return type switch { CounterType.SamplesPassed => true, - CounterType.TransformFeedbackPrimitivesWritten => gd.Capabilities.SupportsTransformFeedback, + CounterType.TransformFeedbackPrimitivesWritten => gd.Capabilities.SupportsTransformFeedbackQueries, CounterType.PrimitivesGenerated => gd.Capabilities.SupportsGeometryShader, _ => false }; diff --git a/Ryujinx.Graphics.Vulkan/VulkanGraphicsDevice.cs b/Ryujinx.Graphics.Vulkan/VulkanGraphicsDevice.cs index c61ef6aca..2e715fdf7 100644 --- a/Ryujinx.Graphics.Vulkan/VulkanGraphicsDevice.cs +++ b/Ryujinx.Graphics.Vulkan/VulkanGraphicsDevice.cs @@ -180,12 +180,26 @@ namespace Ryujinx.Graphics.Vulkan properties2.PNext = &propertiesSubgroupSizeControl; } + bool supportsTransformFeedback = supportedExtensions.Contains(ExtTransformFeedback.ExtensionName); + + PhysicalDeviceTransformFeedbackPropertiesEXT propertiesTransformFeedback = new PhysicalDeviceTransformFeedbackPropertiesEXT() + { + SType = StructureType.PhysicalDeviceTransformFeedbackPropertiesExt + }; + + if (supportsTransformFeedback) + { + propertiesTransformFeedback.PNext = properties2.PNext; + properties2.PNext = &propertiesTransformFeedback; + } + Api.GetPhysicalDeviceProperties2(_physicalDevice, &properties2); Capabilities = new HardwareCapabilities( supportedExtensions.Contains(ExtConditionalRendering.ExtensionName), supportedExtensions.Contains(ExtExtendedDynamicState.ExtensionName), - supportedExtensions.Contains(ExtTransformFeedback.ExtensionName), + supportsTransformFeedback, + propertiesTransformFeedback.TransformFeedbackQueries, supportedFeatures.GeometryShader, propertiesSubgroupSizeControl.MinSubgroupSize, propertiesSubgroupSizeControl.MaxSubgroupSize,