summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Fernando Sahmkow2022-12-07 00:28:35 +0100
committerGravatar Fernando Sahmkow2023-01-01 16:43:58 -0500
commit581a7d785bb4936c92d320f17d3d824e244eee5a (patch)
treef378a4075f924ad9b5a775195e0b32e5ca032c7a
parentRasterizerMemory: Add filtering for flushing/invalidation operations. (diff)
downloadyuzu-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.cpp14
-rw-r--r--src/video_core/rasterizer_interface.h4
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.cpp15
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.h1
-rw-r--r--src/video_core/renderer_vulkan/vk_rasterizer.cpp28
-rw-r--r--src/video_core/renderer_vulkan/vk_rasterizer.h1
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
20namespace Tegra::Engines { 19namespace Tegra::Engines {
21 20
22using VideoCore::QueryType; 21using VideoCore::QueryType;
@@ -538,13 +537,17 @@ void Maxwell3D::ProcessQueryGet() {
538void Maxwell3D::ProcessQueryCondition() { 537void 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
587void Maxwell3D::ProcessCounterReset() { 592void Maxwell3D::ProcessCounterReset() {
@@ -618,7 +623,8 @@ std::optional<u64> Maxwell3D::GetQueryResult() {
618} 623}
619 624
620void Maxwell3D::ProcessCBBind(size_t stage_index) { 625void 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
528bool 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
528bool RasterizerOpenGL::AccelerateSurfaceCopy(const Tegra::Engines::Fermi2D::Surface& src, 543bool 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
603bool 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
603bool RasterizerVulkan::AccelerateSurfaceCopy(const Tegra::Engines::Fermi2D::Surface& src, 618bool 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
1001void RasterizerVulkan::UpdateLogicOpEnable(Tegra::Engines::Maxwell3D::Regs& regs) { 1017void 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;