diff options
| author | 2022-12-07 00:28:35 +0100 | |
|---|---|---|
| committer | 2023-01-01 16:43:58 -0500 | |
| commit | 581a7d785bb4936c92d320f17d3d824e244eee5a (patch) | |
| tree | f378a4075f924ad9b5a775195e0b32e5ca032c7a | |
| parent | RasterizerMemory: Add filtering for flushing/invalidation operations. (diff) | |
| download | yuzu-581a7d785bb4936c92d320f17d3d824e244eee5a.tar.gz yuzu-581a7d785bb4936c92d320f17d3d824e244eee5a.tar.xz yuzu-581a7d785bb4936c92d320f17d3d824e244eee5a.zip | |
Rasterizer: Setup skeleton for Host Conditional rendering
| -rw-r--r-- | src/video_core/engines/maxwell_3d.cpp | 14 | ||||
| -rw-r--r-- | src/video_core/rasterizer_interface.h | 4 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.cpp | 15 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.h | 1 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_rasterizer.cpp | 28 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_rasterizer.h | 1 |
6 files changed, 53 insertions, 10 deletions
diff --git a/src/video_core/engines/maxwell_3d.cpp b/src/video_core/engines/maxwell_3d.cpp index d44a5cabf..943a69935 100644 --- a/src/video_core/engines/maxwell_3d.cpp +++ b/src/video_core/engines/maxwell_3d.cpp | |||
| @@ -16,7 +16,6 @@ | |||
| 16 | #include "video_core/rasterizer_interface.h" | 16 | #include "video_core/rasterizer_interface.h" |
| 17 | #include "video_core/textures/texture.h" | 17 | #include "video_core/textures/texture.h" |
| 18 | 18 | ||
| 19 | |||
| 20 | namespace Tegra::Engines { | 19 | namespace Tegra::Engines { |
| 21 | 20 | ||
| 22 | using VideoCore::QueryType; | 21 | using VideoCore::QueryType; |
| @@ -538,13 +537,17 @@ void Maxwell3D::ProcessQueryGet() { | |||
| 538 | void Maxwell3D::ProcessQueryCondition() { | 537 | void Maxwell3D::ProcessQueryCondition() { |
| 539 | const GPUVAddr condition_address{regs.render_enable.Address()}; | 538 | const GPUVAddr condition_address{regs.render_enable.Address()}; |
| 540 | switch (regs.render_enable_override) { | 539 | switch (regs.render_enable_override) { |
| 541 | case Regs::RenderEnable::Override::AlwaysRender: | 540 | case Regs::RenderEnable::Override::AlwaysRender: { |
| 542 | execute_on = true; | 541 | execute_on = true; |
| 543 | break; | 542 | break; |
| 544 | case Regs::RenderEnable::Override::NeverRender: | 543 | case Regs::RenderEnable::Override::NeverRender: |
| 545 | execute_on = false; | 544 | execute_on = false; |
| 546 | break; | 545 | break; |
| 547 | case Regs::RenderEnable::Override::UseRenderEnable: | 546 | case Regs::RenderEnable::Override::UseRenderEnable: { |
| 547 | if (rasterizer->AccelerateConditionalRendering()) { | ||
| 548 | execute_on = true; | ||
| 549 | return; | ||
| 550 | } | ||
| 548 | switch (regs.render_enable.mode) { | 551 | switch (regs.render_enable.mode) { |
| 549 | case Regs::RenderEnable::Mode::True: { | 552 | case Regs::RenderEnable::Mode::True: { |
| 550 | execute_on = true; | 553 | execute_on = true; |
| @@ -582,6 +585,8 @@ void Maxwell3D::ProcessQueryCondition() { | |||
| 582 | } | 585 | } |
| 583 | break; | 586 | break; |
| 584 | } | 587 | } |
| 588 | } | ||
| 589 | } | ||
| 585 | } | 590 | } |
| 586 | 591 | ||
| 587 | void Maxwell3D::ProcessCounterReset() { | 592 | void Maxwell3D::ProcessCounterReset() { |
| @@ -618,7 +623,8 @@ std::optional<u64> Maxwell3D::GetQueryResult() { | |||
| 618 | } | 623 | } |
| 619 | 624 | ||
| 620 | void Maxwell3D::ProcessCBBind(size_t stage_index) { | 625 | void Maxwell3D::ProcessCBBind(size_t stage_index) { |
| 621 | // Bind the buffer currently in CB_ADDRESS to the specified index in the desired shader stage. | 626 | // Bind the buffer currently in CB_ADDRESS to the specified index in the desired shader |
| 627 | // stage. | ||
| 622 | const auto& bind_data = regs.bind_groups[stage_index]; | 628 | const auto& bind_data = regs.bind_groups[stage_index]; |
| 623 | auto& buffer = state.shader_stages[stage_index].const_buffers[bind_data.shader_slot]; | 629 | auto& buffer = state.shader_stages[stage_index].const_buffers[bind_data.shader_slot]; |
| 624 | buffer.enabled = bind_data.valid.Value() != 0; | 630 | buffer.enabled = bind_data.valid.Value() != 0; |
diff --git a/src/video_core/rasterizer_interface.h b/src/video_core/rasterizer_interface.h index 6d8d2b666..f44c7df50 100644 --- a/src/video_core/rasterizer_interface.h +++ b/src/video_core/rasterizer_interface.h | |||
| @@ -127,6 +127,10 @@ public: | |||
| 127 | /// Notify rasterizer that a frame is about to finish | 127 | /// Notify rasterizer that a frame is about to finish |
| 128 | virtual void TickFrame() = 0; | 128 | virtual void TickFrame() = 0; |
| 129 | 129 | ||
| 130 | virtual bool AccelerateConditionalRendering() { | ||
| 131 | return false; | ||
| 132 | } | ||
| 133 | |||
| 130 | /// Attempt to use a faster method to perform a surface copy | 134 | /// Attempt to use a faster method to perform a surface copy |
| 131 | [[nodiscard]] virtual bool AccelerateSurfaceCopy( | 135 | [[nodiscard]] virtual bool AccelerateSurfaceCopy( |
| 132 | const Tegra::Engines::Fermi2D::Surface& src, const Tegra::Engines::Fermi2D::Surface& dst, | 136 | const Tegra::Engines::Fermi2D::Surface& src, const Tegra::Engines::Fermi2D::Surface& dst, |
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index d58dcedea..ed7558073 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp | |||
| @@ -525,6 +525,21 @@ void RasterizerOpenGL::TickFrame() { | |||
| 525 | } | 525 | } |
| 526 | } | 526 | } |
| 527 | 527 | ||
| 528 | bool RasterizerOpenGL::AccelerateConditionalRendering() { | ||
| 529 | if (Settings::IsGPULevelHigh()) { | ||
| 530 | // Reimplement Host conditional rendering. | ||
| 531 | return false; | ||
| 532 | } | ||
| 533 | // Medium / Low Hack: stub any checks on queries writen into the buffer cache. | ||
| 534 | const GPUVAddr condition_address{maxwell3d->regs.render_enable.Address()}; | ||
| 535 | Maxwell::ReportSemaphore::Compare cmp; | ||
| 536 | if (gpu_memory->IsMemoryDirty(condition_address, sizeof(cmp), | ||
| 537 | VideoCommon::CacheType::BufferCache)) { | ||
| 538 | return true; | ||
| 539 | } | ||
| 540 | return false; | ||
| 541 | } | ||
| 542 | |||
| 528 | bool RasterizerOpenGL::AccelerateSurfaceCopy(const Tegra::Engines::Fermi2D::Surface& src, | 543 | bool RasterizerOpenGL::AccelerateSurfaceCopy(const Tegra::Engines::Fermi2D::Surface& src, |
| 529 | const Tegra::Engines::Fermi2D::Surface& dst, | 544 | const Tegra::Engines::Fermi2D::Surface& dst, |
| 530 | const Tegra::Engines::Fermi2D::Config& copy_config) { | 545 | const Tegra::Engines::Fermi2D::Config& copy_config) { |
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.h b/src/video_core/renderer_opengl/gl_rasterizer.h index 94e65d64b..d119c2b66 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.h +++ b/src/video_core/renderer_opengl/gl_rasterizer.h | |||
| @@ -100,6 +100,7 @@ public: | |||
| 100 | void TiledCacheBarrier() override; | 100 | void TiledCacheBarrier() override; |
| 101 | void FlushCommands() override; | 101 | void FlushCommands() override; |
| 102 | void TickFrame() override; | 102 | void TickFrame() override; |
| 103 | bool AccelerateConditionalRendering() override; | ||
| 103 | bool AccelerateSurfaceCopy(const Tegra::Engines::Fermi2D::Surface& src, | 104 | bool AccelerateSurfaceCopy(const Tegra::Engines::Fermi2D::Surface& src, |
| 104 | const Tegra::Engines::Fermi2D::Surface& dst, | 105 | const Tegra::Engines::Fermi2D::Surface& dst, |
| 105 | const Tegra::Engines::Fermi2D::Config& copy_config) override; | 106 | const Tegra::Engines::Fermi2D::Config& copy_config) override; |
diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index 463c49f9c..3ab2defa2 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp | |||
| @@ -600,6 +600,21 @@ void RasterizerVulkan::TickFrame() { | |||
| 600 | } | 600 | } |
| 601 | } | 601 | } |
| 602 | 602 | ||
| 603 | bool RasterizerVulkan::AccelerateConditionalRendering() { | ||
| 604 | if (Settings::IsGPULevelHigh()) { | ||
| 605 | // TODO(Blinkhawk): Reimplement Host conditional rendering. | ||
| 606 | return false; | ||
| 607 | } | ||
| 608 | // Medium / Low Hack: stub any checks on queries writen into the buffer cache. | ||
| 609 | const GPUVAddr condition_address{maxwell3d->regs.render_enable.Address()}; | ||
| 610 | Maxwell::ReportSemaphore::Compare cmp; | ||
| 611 | if (gpu_memory->IsMemoryDirty(condition_address, sizeof(cmp), | ||
| 612 | VideoCommon::CacheType::BufferCache)) { | ||
| 613 | return true; | ||
| 614 | } | ||
| 615 | return false; | ||
| 616 | } | ||
| 617 | |||
| 603 | bool RasterizerVulkan::AccelerateSurfaceCopy(const Tegra::Engines::Fermi2D::Surface& src, | 618 | bool RasterizerVulkan::AccelerateSurfaceCopy(const Tegra::Engines::Fermi2D::Surface& src, |
| 604 | const Tegra::Engines::Fermi2D::Surface& dst, | 619 | const Tegra::Engines::Fermi2D::Surface& dst, |
| 605 | const Tegra::Engines::Fermi2D::Config& copy_config) { | 620 | const Tegra::Engines::Fermi2D::Config& copy_config) { |
| @@ -995,7 +1010,8 @@ void RasterizerVulkan::UpdateDepthBiasEnable(Tegra::Engines::Maxwell3D::Regs& re | |||
| 995 | }; | 1010 | }; |
| 996 | const u32 topology_index = static_cast<u32>(maxwell3d->draw_manager->GetDrawState().topology); | 1011 | const u32 topology_index = static_cast<u32>(maxwell3d->draw_manager->GetDrawState().topology); |
| 997 | const u32 enable = enabled_lut[POLYGON_OFFSET_ENABLE_LUT[topology_index]]; | 1012 | const u32 enable = enabled_lut[POLYGON_OFFSET_ENABLE_LUT[topology_index]]; |
| 998 | scheduler.Record([enable](vk::CommandBuffer cmdbuf) { cmdbuf.SetDepthBiasEnableEXT(enable != 0); }); | 1013 | scheduler.Record( |
| 1014 | [enable](vk::CommandBuffer cmdbuf) { cmdbuf.SetDepthBiasEnableEXT(enable != 0); }); | ||
| 999 | } | 1015 | } |
| 1000 | 1016 | ||
| 1001 | void RasterizerVulkan::UpdateLogicOpEnable(Tegra::Engines::Maxwell3D::Regs& regs) { | 1017 | void RasterizerVulkan::UpdateLogicOpEnable(Tegra::Engines::Maxwell3D::Regs& regs) { |
| @@ -1012,11 +1028,11 @@ void RasterizerVulkan::UpdateDepthClampEnable(Tegra::Engines::Maxwell3D::Regs& r | |||
| 1012 | return; | 1028 | return; |
| 1013 | } | 1029 | } |
| 1014 | bool is_enabled = !(regs.viewport_clip_control.geometry_clip == | 1030 | bool is_enabled = !(regs.viewport_clip_control.geometry_clip == |
| 1015 | Maxwell::ViewportClipControl::GeometryClip::Passthrough || | 1031 | Maxwell::ViewportClipControl::GeometryClip::Passthrough || |
| 1016 | regs.viewport_clip_control.geometry_clip == | 1032 | regs.viewport_clip_control.geometry_clip == |
| 1017 | Maxwell::ViewportClipControl::GeometryClip::FrustumXYZ || | 1033 | Maxwell::ViewportClipControl::GeometryClip::FrustumXYZ || |
| 1018 | regs.viewport_clip_control.geometry_clip == | 1034 | regs.viewport_clip_control.geometry_clip == |
| 1019 | Maxwell::ViewportClipControl::GeometryClip::FrustumZ); | 1035 | Maxwell::ViewportClipControl::GeometryClip::FrustumZ); |
| 1020 | scheduler.Record( | 1036 | scheduler.Record( |
| 1021 | [is_enabled](vk::CommandBuffer cmdbuf) { cmdbuf.SetDepthClampEnableEXT(is_enabled); }); | 1037 | [is_enabled](vk::CommandBuffer cmdbuf) { cmdbuf.SetDepthClampEnableEXT(is_enabled); }); |
| 1022 | } | 1038 | } |
diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.h b/src/video_core/renderer_vulkan/vk_rasterizer.h index 82b28a54a..c06182807 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.h +++ b/src/video_core/renderer_vulkan/vk_rasterizer.h | |||
| @@ -96,6 +96,7 @@ public: | |||
| 96 | void TiledCacheBarrier() override; | 96 | void TiledCacheBarrier() override; |
| 97 | void FlushCommands() override; | 97 | void FlushCommands() override; |
| 98 | void TickFrame() override; | 98 | void TickFrame() override; |
| 99 | bool AccelerateConditionalRendering() override; | ||
| 99 | bool AccelerateSurfaceCopy(const Tegra::Engines::Fermi2D::Surface& src, | 100 | bool AccelerateSurfaceCopy(const Tegra::Engines::Fermi2D::Surface& src, |
| 100 | const Tegra::Engines::Fermi2D::Surface& dst, | 101 | const Tegra::Engines::Fermi2D::Surface& dst, |
| 101 | const Tegra::Engines::Fermi2D::Config& copy_config) override; | 102 | const Tegra::Engines::Fermi2D::Config& copy_config) override; |