mirror of
				https://github.com/Ryujinx/Ryujinx.git
				synced 2025-11-04 08:53:43 +00:00 
			
		
		
		
	Vulkan: Skip draws when patches topology is used without a tessellation shader (#6508)
This commit is contained in:
		
							parent
							
								
									66b1d59c66
								
							
						
					
					
						commit
						791bf22109
					
				@ -981,6 +981,7 @@ namespace Ryujinx.Graphics.Vulkan
 | 
			
		||||
            _bindingBarriersDirty = true;
 | 
			
		||||
 | 
			
		||||
            _newState.PipelineLayout = internalProgram.PipelineLayout;
 | 
			
		||||
            _newState.HasTessellationControlShader = internalProgram.HasTessellationControlShader;
 | 
			
		||||
            _newState.StagesCount = (uint)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);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        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;
 | 
			
		||||
 | 
			
		||||
@ -21,6 +21,7 @@ namespace Ryujinx.Graphics.Vulkan
 | 
			
		||||
        public bool HasMinimalLayout { get; }
 | 
			
		||||
        public bool UsePushDescriptors { get; }
 | 
			
		||||
        public bool IsCompute { get; }
 | 
			
		||||
        public bool HasTessellationControlShader => (Stages & (1u << 3)) != 0;
 | 
			
		||||
 | 
			
		||||
        public uint Stages { get; }
 | 
			
		||||
 | 
			
		||||
@ -461,6 +462,7 @@ namespace Ryujinx.Graphics.Vulkan
 | 
			
		||||
                stages[i] = _shaders[i].GetInfo();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            pipeline.HasTessellationControlShader = HasTessellationControlShader;
 | 
			
		||||
            pipeline.StagesCount = (uint)_shaders.Length;
 | 
			
		||||
            pipeline.PipelineLayout = PipelineLayout;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user