summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/video_core/engines/maxwell_3d.cpp68
1 files changed, 39 insertions, 29 deletions
diff --git a/src/video_core/engines/maxwell_3d.cpp b/src/video_core/engines/maxwell_3d.cpp
index 34bbc72cf..fb9b9b94e 100644
--- a/src/video_core/engines/maxwell_3d.cpp
+++ b/src/video_core/engines/maxwell_3d.cpp
@@ -493,41 +493,51 @@ void Maxwell3D::ProcessQueryGet() {
493 493
494void Maxwell3D::ProcessQueryCondition() { 494void Maxwell3D::ProcessQueryCondition() {
495 const GPUVAddr condition_address{regs.render_enable.Address()}; 495 const GPUVAddr condition_address{regs.render_enable.Address()};
496 switch (regs.render_enable.mode) { 496 switch (regs.render_enable_override) {
497 case Regs::RenderEnable::Mode::True: { 497 case Regs::RenderEnable::Override::AlwaysRender:
498 execute_on = true; 498 execute_on = true;
499 break; 499 break;
500 } 500 case Regs::RenderEnable::Override::NeverRender:
501 case Regs::RenderEnable::Mode::False: {
502 execute_on = false; 501 execute_on = false;
503 break; 502 break;
504 } 503 case Regs::RenderEnable::Override::UseRenderEnable:
505 case Regs::RenderEnable::Mode::Conditional: { 504 switch (regs.render_enable.mode) {
506 Regs::ReportSemaphore::Compare cmp; 505 case Regs::RenderEnable::Mode::True: {
507 memory_manager.ReadBlock(condition_address, &cmp, sizeof(cmp)); 506 execute_on = true;
508 execute_on = cmp.initial_sequence != 0U && cmp.initial_mode != 0U; 507 break;
509 break; 508 }
510 } 509 case Regs::RenderEnable::Mode::False: {
511 case Regs::RenderEnable::Mode::IfEqual: { 510 execute_on = false;
512 Regs::ReportSemaphore::Compare cmp; 511 break;
513 memory_manager.ReadBlock(condition_address, &cmp, sizeof(cmp)); 512 }
514 execute_on = 513 case Regs::RenderEnable::Mode::Conditional: {
515 cmp.initial_sequence == cmp.current_sequence && cmp.initial_mode == cmp.current_mode; 514 Regs::ReportSemaphore::Compare cmp;
516 break; 515 memory_manager.ReadBlock(condition_address, &cmp, sizeof(cmp));
517 } 516 execute_on = cmp.initial_sequence != 0U && cmp.initial_mode != 0U;
518 case Regs::RenderEnable::Mode::IfNotEqual: { 517 break;
519 Regs::ReportSemaphore::Compare cmp; 518 }
520 memory_manager.ReadBlock(condition_address, &cmp, sizeof(cmp)); 519 case Regs::RenderEnable::Mode::IfEqual: {
521 execute_on = 520 Regs::ReportSemaphore::Compare cmp;
522 cmp.initial_sequence != cmp.current_sequence || cmp.initial_mode != cmp.current_mode; 521 memory_manager.ReadBlock(condition_address, &cmp, sizeof(cmp));
523 break; 522 execute_on = cmp.initial_sequence == cmp.current_sequence &&
524 } 523 cmp.initial_mode == cmp.current_mode;
525 default: { 524 break;
526 UNIMPLEMENTED_MSG("Uninplemented Condition Mode!"); 525 }
527 execute_on = true; 526 case Regs::RenderEnable::Mode::IfNotEqual: {
527 Regs::ReportSemaphore::Compare cmp;
528 memory_manager.ReadBlock(condition_address, &cmp, sizeof(cmp));
529 execute_on = cmp.initial_sequence != cmp.current_sequence ||
530 cmp.initial_mode != cmp.current_mode;
531 break;
532 }
533 default: {
534 UNIMPLEMENTED_MSG("Uninplemented Condition Mode!");
535 execute_on = true;
536 break;
537 }
538 }
528 break; 539 break;
529 } 540 }
530 }
531} 541}
532 542
533void Maxwell3D::ProcessCounterReset() { 543void Maxwell3D::ProcessCounterReset() {