Vulkan: Skip draws when patches topology is used without a tessellation shader (#6508)
This commit is contained in:
parent
66b1d59c66
commit
791bf22109
3 changed files with 14 additions and 0 deletions
|
@ -981,6 +981,7 @@ namespace Ryujinx.Graphics.Vulkan
|
||||||
_bindingBarriersDirty = true;
|
_bindingBarriersDirty = true;
|
||||||
|
|
||||||
_newState.PipelineLayout = internalProgram.PipelineLayout;
|
_newState.PipelineLayout = internalProgram.PipelineLayout;
|
||||||
|
_newState.HasTessellationControlShader = internalProgram.HasTessellationControlShader;
|
||||||
_newState.StagesCount = (uint)stages.Length;
|
_newState.StagesCount = (uint)stages.Length;
|
||||||
|
|
||||||
stages.CopyTo(_newState.Stages.AsSpan()[..stages.Length]);
|
stages.CopyTo(_newState.Stages.AsSpan()[..stages.Length]);
|
||||||
|
|
|
@ -311,6 +311,7 @@ namespace Ryujinx.Graphics.Vulkan
|
||||||
set => Internal.Id9 = (Internal.Id9 & 0xFFFFFFFFFFFFFFBF) | ((value ? 1UL : 0UL) << 6);
|
set => Internal.Id9 = (Internal.Id9 & 0xFFFFFFFFFFFFFFBF) | ((value ? 1UL : 0UL) << 6);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool HasTessellationControlShader;
|
||||||
public NativeArray<PipelineShaderStageCreateInfo> Stages;
|
public NativeArray<PipelineShaderStageCreateInfo> Stages;
|
||||||
public PipelineLayout PipelineLayout;
|
public PipelineLayout PipelineLayout;
|
||||||
public SpecData SpecializationData;
|
public SpecData SpecializationData;
|
||||||
|
@ -319,6 +320,7 @@ namespace Ryujinx.Graphics.Vulkan
|
||||||
|
|
||||||
public void Initialize()
|
public void Initialize()
|
||||||
{
|
{
|
||||||
|
HasTessellationControlShader = false;
|
||||||
Stages = new NativeArray<PipelineShaderStageCreateInfo>(Constants.MaxShaderStages);
|
Stages = new NativeArray<PipelineShaderStageCreateInfo>(Constants.MaxShaderStages);
|
||||||
|
|
||||||
AdvancedBlendSrcPreMultiplied = true;
|
AdvancedBlendSrcPreMultiplied = true;
|
||||||
|
@ -419,6 +421,15 @@ namespace Ryujinx.Graphics.Vulkan
|
||||||
PVertexBindingDescriptions = pVertexBindingDescriptions,
|
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 primitiveRestartEnable = PrimitiveRestartEnable;
|
||||||
|
|
||||||
bool topologySupportsRestart;
|
bool topologySupportsRestart;
|
||||||
|
|
|
@ -21,6 +21,7 @@ namespace Ryujinx.Graphics.Vulkan
|
||||||
public bool HasMinimalLayout { get; }
|
public bool HasMinimalLayout { get; }
|
||||||
public bool UsePushDescriptors { get; }
|
public bool UsePushDescriptors { get; }
|
||||||
public bool IsCompute { get; }
|
public bool IsCompute { get; }
|
||||||
|
public bool HasTessellationControlShader => (Stages & (1u << 3)) != 0;
|
||||||
|
|
||||||
public uint Stages { get; }
|
public uint Stages { get; }
|
||||||
|
|
||||||
|
@ -461,6 +462,7 @@ namespace Ryujinx.Graphics.Vulkan
|
||||||
stages[i] = _shaders[i].GetInfo();
|
stages[i] = _shaders[i].GetInfo();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pipeline.HasTessellationControlShader = HasTessellationControlShader;
|
||||||
pipeline.StagesCount = (uint)_shaders.Length;
|
pipeline.StagesCount = (uint)_shaders.Length;
|
||||||
pipeline.PipelineLayout = PipelineLayout;
|
pipeline.PipelineLayout = PipelineLayout;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue