diff options
| author | ReinUsesLisp <reinuseslisp@airmail.cc> | 2021-06-25 05:21:51 -0300 | 
|---|---|---|
| committer | ameerj <52414509+ameerj@users.noreply.github.com> | 2021-07-22 21:51:39 -0400 | 
| commit | 57a8921e01a90ff5993079dd638a6c48e5781756 (patch) | |
| tree | 90c7c3b044c85f08dd5c2341c87414062be7db17 /src/video_core | |
| parent | 5b2b0634a1e6b9fd30999d052255669cbf9c5ef6 (diff) | |
vk_graphics_pipeline: Implement line width
Diffstat (limited to 'src/video_core')
8 files changed, 36 insertions, 8 deletions
| diff --git a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp index 6d664ed6b..3363a6877 100644 --- a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp +++ b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp @@ -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{ diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index f04c3394c..bb7301c53 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -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; diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.h b/src/video_core/renderer_vulkan/vk_rasterizer.h index c954fa7f8..866827247 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.h +++ b/src/video_core/renderer_vulkan/vk_rasterizer.h @@ -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); diff --git a/src/video_core/renderer_vulkan/vk_state_tracker.cpp b/src/video_core/renderer_vulkan/vk_state_tracker.cpp index 0ebe0473f..e3b7dd61c 100644 --- a/src/video_core/renderer_vulkan/vk_state_tracker.cpp +++ b/src/video_core/renderer_vulkan/vk_state_tracker.cpp @@ -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); diff --git a/src/video_core/renderer_vulkan/vk_state_tracker.h b/src/video_core/renderer_vulkan/vk_state_tracker.h index 1976b7e9b..5f78f6950 100644 --- a/src/video_core/renderer_vulkan/vk_state_tracker.h +++ b/src/video_core/renderer_vulkan/vk_state_tracker.h @@ -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);      } diff --git a/src/video_core/vulkan_common/vulkan_device.cpp b/src/video_core/vulkan_common/vulkan_device.cpp index da4721e6b..912e03c5c 100644 --- a/src/video_core/vulkan_common/vulkan_device.cpp +++ b/src/video_core/vulkan_common/vulkan_device.cpp @@ -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"), diff --git a/src/video_core/vulkan_common/vulkan_wrapper.cpp b/src/video_core/vulkan_common/vulkan_wrapper.cpp index d7e9fac22..bbf0fccae 100644 --- a/src/video_core/vulkan_common/vulkan_wrapper.cpp +++ b/src/video_core/vulkan_common/vulkan_wrapper.cpp @@ -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); diff --git a/src/video_core/vulkan_common/vulkan_wrapper.h b/src/video_core/vulkan_common/vulkan_wrapper.h index d43b606f1..d76bb4324 100644 --- a/src/video_core/vulkan_common/vulkan_wrapper.h +++ b/src/video_core/vulkan_common/vulkan_wrapper.h @@ -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);      } | 
