vk_rasterizer: Pass Maxwell registers to dynamic updates
This commit is contained in:
		| @@ -726,13 +726,13 @@ void RasterizerVulkan::SetupImageTransitions( | ||||
| } | ||||
|  | ||||
| void RasterizerVulkan::UpdateDynamicStates() { | ||||
|     auto& gpu = system.GPU().Maxwell3D(); | ||||
|     UpdateViewportsState(gpu); | ||||
|     UpdateScissorsState(gpu); | ||||
|     UpdateDepthBias(gpu); | ||||
|     UpdateBlendConstants(gpu); | ||||
|     UpdateDepthBounds(gpu); | ||||
|     UpdateStencilFaces(gpu); | ||||
|     auto& regs = system.GPU().Maxwell3D().regs; | ||||
|     UpdateViewportsState(regs); | ||||
|     UpdateScissorsState(regs); | ||||
|     UpdateDepthBias(regs); | ||||
|     UpdateBlendConstants(regs); | ||||
|     UpdateDepthBounds(regs); | ||||
|     UpdateStencilFaces(regs); | ||||
| } | ||||
|  | ||||
| void RasterizerVulkan::SetupVertexArrays(FixedPipelineState::VertexInput& vertex_input, | ||||
| @@ -978,11 +978,10 @@ void RasterizerVulkan::SetupImage(const Tegra::Texture::TICEntry& tic, const Ima | ||||
|     image_views.push_back(ImageView{std::move(view), image_layout}); | ||||
| } | ||||
|  | ||||
| void RasterizerVulkan::UpdateViewportsState(Tegra::Engines::Maxwell3D& gpu) { | ||||
| void RasterizerVulkan::UpdateViewportsState(Tegra::Engines::Maxwell3D::Regs& regs) { | ||||
|     if (!state_tracker.TouchViewports()) { | ||||
|         return; | ||||
|     } | ||||
|     const auto& regs = gpu.regs; | ||||
|     const std::array viewports{ | ||||
|         GetViewportState(device, regs, 0),  GetViewportState(device, regs, 1), | ||||
|         GetViewportState(device, regs, 2),  GetViewportState(device, regs, 3), | ||||
| @@ -997,11 +996,10 @@ void RasterizerVulkan::UpdateViewportsState(Tegra::Engines::Maxwell3D& gpu) { | ||||
|     }); | ||||
| } | ||||
|  | ||||
| void RasterizerVulkan::UpdateScissorsState(Tegra::Engines::Maxwell3D& gpu) { | ||||
| void RasterizerVulkan::UpdateScissorsState(Tegra::Engines::Maxwell3D::Regs& regs) { | ||||
|     if (!state_tracker.TouchScissors()) { | ||||
|         return; | ||||
|     } | ||||
|     const auto& regs = gpu.regs; | ||||
|     const std::array scissors = { | ||||
|         GetScissorState(regs, 0),  GetScissorState(regs, 1),  GetScissorState(regs, 2), | ||||
|         GetScissorState(regs, 3),  GetScissorState(regs, 4),  GetScissorState(regs, 5), | ||||
| @@ -1014,42 +1012,39 @@ void RasterizerVulkan::UpdateScissorsState(Tegra::Engines::Maxwell3D& gpu) { | ||||
|     }); | ||||
| } | ||||
|  | ||||
| void RasterizerVulkan::UpdateDepthBias(Tegra::Engines::Maxwell3D& gpu) { | ||||
| void RasterizerVulkan::UpdateDepthBias(Tegra::Engines::Maxwell3D::Regs& regs) { | ||||
|     if (!state_tracker.TouchDepthBias()) { | ||||
|         return; | ||||
|     } | ||||
|     const auto& regs = gpu.regs; | ||||
|     scheduler.Record([constant = regs.polygon_offset_units, clamp = regs.polygon_offset_clamp, | ||||
|                       factor = regs.polygon_offset_factor](auto cmdbuf, auto& dld) { | ||||
|         cmdbuf.setDepthBias(constant, clamp, factor / 2.0f, dld); | ||||
|     }); | ||||
| } | ||||
|  | ||||
| void RasterizerVulkan::UpdateBlendConstants(Tegra::Engines::Maxwell3D& gpu) { | ||||
| void RasterizerVulkan::UpdateBlendConstants(Tegra::Engines::Maxwell3D::Regs& regs) { | ||||
|     if (!state_tracker.TouchBlendConstants()) { | ||||
|         return; | ||||
|     } | ||||
|     const std::array blend_color = {gpu.regs.blend_color.r, gpu.regs.blend_color.g, | ||||
|                                     gpu.regs.blend_color.b, gpu.regs.blend_color.a}; | ||||
|     const std::array blend_color = {regs.blend_color.r, regs.blend_color.g, regs.blend_color.b, | ||||
|                                     regs.blend_color.a}; | ||||
|     scheduler.Record([blend_color](auto cmdbuf, auto& dld) { | ||||
|         cmdbuf.setBlendConstants(blend_color.data(), dld); | ||||
|     }); | ||||
| } | ||||
|  | ||||
| void RasterizerVulkan::UpdateDepthBounds(Tegra::Engines::Maxwell3D& gpu) { | ||||
| void RasterizerVulkan::UpdateDepthBounds(Tegra::Engines::Maxwell3D::Regs& regs) { | ||||
|     if (!state_tracker.TouchDepthBounds()) { | ||||
|         return; | ||||
|     } | ||||
|     const auto& regs = gpu.regs; | ||||
|     scheduler.Record([min = regs.depth_bounds[0], max = regs.depth_bounds[1]]( | ||||
|                          auto cmdbuf, auto& dld) { cmdbuf.setDepthBounds(min, max, dld); }); | ||||
| } | ||||
|  | ||||
| void RasterizerVulkan::UpdateStencilFaces(Tegra::Engines::Maxwell3D& gpu) { | ||||
| void RasterizerVulkan::UpdateStencilFaces(Tegra::Engines::Maxwell3D::Regs& regs) { | ||||
|     if (!state_tracker.TouchStencilProperties()) { | ||||
|         return; | ||||
|     } | ||||
|     const auto& regs = gpu.regs; | ||||
|     if (regs.stencil_two_side_enable) { | ||||
|         // Separate values per face | ||||
|         scheduler.Record( | ||||
|   | ||||
| @@ -217,12 +217,12 @@ private: | ||||
|  | ||||
|     void SetupImage(const Tegra::Texture::TICEntry& tic, const ImageEntry& entry); | ||||
|  | ||||
|     void UpdateViewportsState(Tegra::Engines::Maxwell3D& gpu); | ||||
|     void UpdateScissorsState(Tegra::Engines::Maxwell3D& gpu); | ||||
|     void UpdateDepthBias(Tegra::Engines::Maxwell3D& gpu); | ||||
|     void UpdateBlendConstants(Tegra::Engines::Maxwell3D& gpu); | ||||
|     void UpdateDepthBounds(Tegra::Engines::Maxwell3D& gpu); | ||||
|     void UpdateStencilFaces(Tegra::Engines::Maxwell3D& gpu); | ||||
|     void UpdateViewportsState(Tegra::Engines::Maxwell3D::Regs& regs); | ||||
|     void UpdateScissorsState(Tegra::Engines::Maxwell3D::Regs& regs); | ||||
|     void UpdateDepthBias(Tegra::Engines::Maxwell3D::Regs& regs); | ||||
|     void UpdateBlendConstants(Tegra::Engines::Maxwell3D::Regs& regs); | ||||
|     void UpdateDepthBounds(Tegra::Engines::Maxwell3D::Regs& regs); | ||||
|     void UpdateStencilFaces(Tegra::Engines::Maxwell3D::Regs& regs); | ||||
|  | ||||
|     std::size_t CalculateGraphicsStreamBufferSize(bool is_indexed) const; | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user