aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Graphics.Vulkan/PipelineState.cs
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2024-04-06 13:25:51 -0300
committerGitHub <noreply@github.com>2024-04-06 13:25:51 -0300
commit791bf22109b90eca79fe1bf934074809661a6c86 (patch)
tree1356f92bfbeecea55748b2cb18809665aaf2ce6b /src/Ryujinx.Graphics.Vulkan/PipelineState.cs
parent66b1d59c666b425a8451e1a4fe981e3311be08fb (diff)
Vulkan: Skip draws when patches topology is used without a tessellation shader (#6508)
Diffstat (limited to 'src/Ryujinx.Graphics.Vulkan/PipelineState.cs')
-rw-r--r--src/Ryujinx.Graphics.Vulkan/PipelineState.cs11
1 files changed, 11 insertions, 0 deletions
diff --git a/src/Ryujinx.Graphics.Vulkan/PipelineState.cs b/src/Ryujinx.Graphics.Vulkan/PipelineState.cs
index 25fd7168..49c12b37 100644
--- a/src/Ryujinx.Graphics.Vulkan/PipelineState.cs
+++ b/src/Ryujinx.Graphics.Vulkan/PipelineState.cs
@@ -311,6 +311,7 @@ namespace Ryujinx.Graphics.Vulkan
set => Internal.Id9 = (Internal.Id9 & 0xFFFFFFFFFFFFFFBF) | ((value ? 1UL : 0UL) << 6);
}
+ public bool HasTessellationControlShader;
public NativeArray<PipelineShaderStageCreateInfo> Stages;
public PipelineLayout PipelineLayout;
public SpecData SpecializationData;
@@ -319,6 +320,7 @@ namespace Ryujinx.Graphics.Vulkan
public void Initialize()
{
+ HasTessellationControlShader = false;
Stages = new NativeArray<PipelineShaderStageCreateInfo>(Constants.MaxShaderStages);
AdvancedBlendSrcPreMultiplied = true;
@@ -419,6 +421,15 @@ namespace Ryujinx.Graphics.Vulkan
PVertexBindingDescriptions = pVertexBindingDescriptions,
};
+ // Using patches topology without a tessellation shader is invalid.
+ // If we find such a case, return null pipeline to skip the draw.
+ if (Topology == PrimitiveTopology.PatchList && !HasTessellationControlShader)
+ {
+ program.AddGraphicsPipeline(ref Internal, null);
+
+ return null;
+ }
+
bool primitiveRestartEnable = PrimitiveRestartEnable;
bool topologySupportsRestart;