mirror of
				https://git.tardis.systems/mirrors/yuzu
				synced 2025-10-31 10:44:49 +01:00 
			
		
		
		
	vk_graphics_pipeline: Implement line width
This commit is contained in:
		
							parent
							
								
									5b2b0634a1
								
							
						
					
					
						commit
						57a8921e01
					
				| @ -705,11 +705,12 @@ void GraphicsPipeline::MakePipeline(VkRenderPass render_pass) { | ||||
|         .pAttachments = cb_attachments.data(), | ||||
|         .blendConstants = {}, | ||||
|     }; | ||||
|     static_vector<VkDynamicState, 18> dynamic_states{ | ||||
|     static_vector<VkDynamicState, 19> dynamic_states{ | ||||
|         VK_DYNAMIC_STATE_VIEWPORT,           VK_DYNAMIC_STATE_SCISSOR, | ||||
|         VK_DYNAMIC_STATE_DEPTH_BIAS,         VK_DYNAMIC_STATE_BLEND_CONSTANTS, | ||||
|         VK_DYNAMIC_STATE_DEPTH_BOUNDS,       VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK, | ||||
|         VK_DYNAMIC_STATE_STENCIL_WRITE_MASK, VK_DYNAMIC_STATE_STENCIL_REFERENCE, | ||||
|         VK_DYNAMIC_STATE_LINE_WIDTH, | ||||
|     }; | ||||
|     if (key.state.extended_dynamic_state) { | ||||
|         static constexpr std::array extended{ | ||||
|  | ||||
| @ -541,6 +541,7 @@ void RasterizerVulkan::UpdateDynamicStates() { | ||||
|     UpdateBlendConstants(regs); | ||||
|     UpdateDepthBounds(regs); | ||||
|     UpdateStencilFaces(regs); | ||||
|     UpdateLineWidth(regs); | ||||
|     if (device.IsExtExtendedDynamicStateSupported()) { | ||||
|         UpdateCullMode(regs); | ||||
|         UpdateDepthBoundsTestEnable(regs); | ||||
| @ -676,6 +677,14 @@ void RasterizerVulkan::UpdateStencilFaces(Tegra::Engines::Maxwell3D::Regs& regs) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void RasterizerVulkan::UpdateLineWidth(Tegra::Engines::Maxwell3D::Regs& regs) { | ||||
|     if (!state_tracker.TouchLineWidth()) { | ||||
|         return; | ||||
|     } | ||||
|     const float width = regs.line_smooth_enable ? regs.line_width_smooth : regs.line_width_aliased; | ||||
|     scheduler.Record([width](vk::CommandBuffer cmdbuf) { cmdbuf.SetLineWidth(width); }); | ||||
| } | ||||
| 
 | ||||
| void RasterizerVulkan::UpdateCullMode(Tegra::Engines::Maxwell3D::Regs& regs) { | ||||
|     if (!state_tracker.TouchCullMode()) { | ||||
|         return; | ||||
|  | ||||
| @ -125,6 +125,7 @@ private: | ||||
|     void UpdateBlendConstants(Tegra::Engines::Maxwell3D::Regs& regs); | ||||
|     void UpdateDepthBounds(Tegra::Engines::Maxwell3D::Regs& regs); | ||||
|     void UpdateStencilFaces(Tegra::Engines::Maxwell3D::Regs& regs); | ||||
|     void UpdateLineWidth(Tegra::Engines::Maxwell3D::Regs& regs); | ||||
| 
 | ||||
|     void UpdateCullMode(Tegra::Engines::Maxwell3D::Regs& regs); | ||||
|     void UpdateDepthBoundsTestEnable(Tegra::Engines::Maxwell3D::Regs& regs); | ||||
|  | ||||
| @ -29,10 +29,10 @@ using Flags = Maxwell3D::DirtyState::Flags; | ||||
| 
 | ||||
| Flags MakeInvalidationFlags() { | ||||
|     static constexpr int INVALIDATION_FLAGS[]{ | ||||
|         Viewports,       Scissors,          DepthBias,      BlendConstants, | ||||
|         DepthBounds,     StencilProperties, CullMode,       DepthBoundsEnable, | ||||
|         DepthTestEnable, DepthWriteEnable,  DepthCompareOp, FrontFace, | ||||
|         StencilOp,       StencilTestEnable, VertexBuffers,  VertexInput, | ||||
|         Viewports,         Scissors,       DepthBias, BlendConstants,    DepthBounds, | ||||
|         StencilProperties, LineWidth,      CullMode,  DepthBoundsEnable, DepthTestEnable, | ||||
|         DepthWriteEnable,  DepthCompareOp, FrontFace, StencilOp,         StencilTestEnable, | ||||
|         VertexBuffers,     VertexInput, | ||||
|     }; | ||||
|     Flags flags{}; | ||||
|     for (const int flag : INVALIDATION_FLAGS) { | ||||
| @ -86,6 +86,11 @@ void SetupDirtyStencilProperties(Tables& tables) { | ||||
|     table[OFF(stencil_back_func_mask)] = StencilProperties; | ||||
| } | ||||
| 
 | ||||
| void SetupDirtyLineWidth(Tables& tables) { | ||||
|     tables[0][OFF(line_width_smooth)] = LineWidth; | ||||
|     tables[0][OFF(line_width_aliased)] = LineWidth; | ||||
| } | ||||
| 
 | ||||
| void SetupDirtyCullMode(Tables& tables) { | ||||
|     auto& table = tables[0]; | ||||
|     table[OFF(cull_face)] = CullMode; | ||||
| @ -180,6 +185,7 @@ StateTracker::StateTracker(Tegra::GPU& gpu) | ||||
|     SetupDirtyBlendConstants(tables); | ||||
|     SetupDirtyDepthBounds(tables); | ||||
|     SetupDirtyStencilProperties(tables); | ||||
|     SetupDirtyLineWidth(tables); | ||||
|     SetupDirtyCullMode(tables); | ||||
|     SetupDirtyDepthBoundsEnable(tables); | ||||
|     SetupDirtyDepthTestEnable(tables); | ||||
|  | ||||
| @ -31,6 +31,7 @@ enum : u8 { | ||||
|     BlendConstants, | ||||
|     DepthBounds, | ||||
|     StencilProperties, | ||||
|     LineWidth, | ||||
| 
 | ||||
|     CullMode, | ||||
|     DepthBoundsEnable, | ||||
| @ -44,7 +45,7 @@ enum : u8 { | ||||
|     Blending, | ||||
|     ViewportSwizzles, | ||||
| 
 | ||||
|     Last | ||||
|     Last, | ||||
| }; | ||||
| static_assert(Last <= std::numeric_limits<u8>::max()); | ||||
| 
 | ||||
| @ -93,6 +94,10 @@ public: | ||||
|         return Exchange(Dirty::StencilProperties, false); | ||||
|     } | ||||
| 
 | ||||
|     bool TouchLineWidth() const { | ||||
|         return Exchange(Dirty::LineWidth, false); | ||||
|     } | ||||
| 
 | ||||
|     bool TouchCullMode() { | ||||
|         return Exchange(Dirty::CullMode, false); | ||||
|     } | ||||
|  | ||||
| @ -227,7 +227,7 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR | ||||
|             .depthBiasClamp = true, | ||||
|             .fillModeNonSolid = true, | ||||
|             .depthBounds = is_depth_bounds_supported, | ||||
|             .wideLines = false, | ||||
|             .wideLines = true, | ||||
|             .largePoints = true, | ||||
|             .alphaToOne = false, | ||||
|             .multiViewport = true, | ||||
| @ -703,7 +703,6 @@ void Device::CheckSuitability(bool requires_swapchain) const { | ||||
|     const std::array feature_report{ | ||||
|         std::make_pair(features.robustBufferAccess, "robustBufferAccess"), | ||||
|         std::make_pair(features.vertexPipelineStoresAndAtomics, "vertexPipelineStoresAndAtomics"), | ||||
|         std::make_pair(features.robustBufferAccess, "robustBufferAccess"), | ||||
|         std::make_pair(features.imageCubeArray, "imageCubeArray"), | ||||
|         std::make_pair(features.independentBlend, "independentBlend"), | ||||
|         std::make_pair(features.depthClamp, "depthClamp"), | ||||
| @ -712,6 +711,7 @@ void Device::CheckSuitability(bool requires_swapchain) const { | ||||
|         std::make_pair(features.multiViewport, "multiViewport"), | ||||
|         std::make_pair(features.depthBiasClamp, "depthBiasClamp"), | ||||
|         std::make_pair(features.fillModeNonSolid, "fillModeNonSolid"), | ||||
|         std::make_pair(features.wideLines, "wideLines"), | ||||
|         std::make_pair(features.geometryShader, "geometryShader"), | ||||
|         std::make_pair(features.tessellationShader, "tessellationShader"), | ||||
|         std::make_pair(features.sampleRateShading, "sampleRateShading"), | ||||
|  | ||||
| @ -121,6 +121,7 @@ void Load(VkDevice device, DeviceDispatch& dld) noexcept { | ||||
|     X(vkCmdSetDepthTestEnableEXT); | ||||
|     X(vkCmdSetDepthWriteEnableEXT); | ||||
|     X(vkCmdSetFrontFaceEXT); | ||||
|     X(vkCmdSetLineWidth); | ||||
|     X(vkCmdSetPrimitiveTopologyEXT); | ||||
|     X(vkCmdSetStencilOpEXT); | ||||
|     X(vkCmdSetStencilTestEnableEXT); | ||||
|  | ||||
| @ -231,6 +231,7 @@ struct DeviceDispatch : InstanceDispatch { | ||||
|     PFN_vkCmdSetDepthWriteEnableEXT vkCmdSetDepthWriteEnableEXT{}; | ||||
|     PFN_vkCmdSetEvent vkCmdSetEvent{}; | ||||
|     PFN_vkCmdSetFrontFaceEXT vkCmdSetFrontFaceEXT{}; | ||||
|     PFN_vkCmdSetLineWidth vkCmdSetLineWidth{}; | ||||
|     PFN_vkCmdSetPrimitiveTopologyEXT vkCmdSetPrimitiveTopologyEXT{}; | ||||
|     PFN_vkCmdSetScissor vkCmdSetScissor{}; | ||||
|     PFN_vkCmdSetStencilCompareMask vkCmdSetStencilCompareMask{}; | ||||
| @ -1198,6 +1199,10 @@ public: | ||||
|         dld->vkCmdSetFrontFaceEXT(handle, front_face); | ||||
|     } | ||||
| 
 | ||||
|     void SetLineWidth(float line_width) const noexcept { | ||||
|         dld->vkCmdSetLineWidth(handle, line_width); | ||||
|     } | ||||
| 
 | ||||
|     void SetPrimitiveTopologyEXT(VkPrimitiveTopology primitive_topology) const noexcept { | ||||
|         dld->vkCmdSetPrimitiveTopologyEXT(handle, primitive_topology); | ||||
|     } | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user