summaryrefslogtreecommitdiff
path: root/src/video_core/rasterizer.cpp
diff options
context:
space:
mode:
authorGravatar bunnei2015-01-27 14:56:13 -0500
committerGravatar bunnei2015-01-27 14:56:13 -0500
commit9f93367aa0954007c21ae91831ed5c2ee45f94ba (patch)
tree6033ef7dc8357d8425a075565f4357abf69cde2f /src/video_core/rasterizer.cpp
parentMerge pull request #508 from lioncash/dyn (diff)
parentRasterizer: Implemented alpha testing. (diff)
downloadyuzu-9f93367aa0954007c21ae91831ed5c2ee45f94ba.tar.gz
yuzu-9f93367aa0954007c21ae91831ed5c2ee45f94ba.tar.xz
yuzu-9f93367aa0954007c21ae91831ed5c2ee45f94ba.zip
Merge pull request #507 from bunnei/alpha-testing
Alpha testing
Diffstat (limited to 'src/video_core/rasterizer.cpp')
-rw-r--r--src/video_core/rasterizer.cpp45
1 files changed, 41 insertions, 4 deletions
diff --git a/src/video_core/rasterizer.cpp b/src/video_core/rasterizer.cpp
index 219a1bbb7..15715c43d 100644
--- a/src/video_core/rasterizer.cpp
+++ b/src/video_core/rasterizer.cpp
@@ -431,6 +431,47 @@ void ProcessTriangle(const VertexShader::OutputVertex& v0,
431 combiner_output = Math::MakeVec(color_output, alpha_output); 431 combiner_output = Math::MakeVec(color_output, alpha_output);
432 } 432 }
433 433
434 if (registers.output_merger.alpha_test.enable) {
435 bool pass = false;
436
437 switch (registers.output_merger.alpha_test.func) {
438 case registers.output_merger.Never:
439 pass = false;
440 break;
441
442 case registers.output_merger.Always:
443 pass = true;
444 break;
445
446 case registers.output_merger.Equal:
447 pass = combiner_output.a() == registers.output_merger.alpha_test.ref;
448 break;
449
450 case registers.output_merger.NotEqual:
451 pass = combiner_output.a() != registers.output_merger.alpha_test.ref;
452 break;
453
454 case registers.output_merger.LessThan:
455 pass = combiner_output.a() < registers.output_merger.alpha_test.ref;
456 break;
457
458 case registers.output_merger.LessThanOrEqual:
459 pass = combiner_output.a() <= registers.output_merger.alpha_test.ref;
460 break;
461
462 case registers.output_merger.GreaterThan:
463 pass = combiner_output.a() > registers.output_merger.alpha_test.ref;
464 break;
465
466 case registers.output_merger.GreaterThanOrEqual:
467 pass = combiner_output.a() >= registers.output_merger.alpha_test.ref;
468 break;
469 }
470
471 if (!pass)
472 continue;
473 }
474
434 // TODO: Does depth indeed only get written even if depth testing is enabled? 475 // TODO: Does depth indeed only get written even if depth testing is enabled?
435 if (registers.output_merger.depth_test_enable) { 476 if (registers.output_merger.depth_test_enable) {
436 u16 z = (u16)(-(v0.screenpos[2].ToFloat32() * w0 + 477 u16 z = (u16)(-(v0.screenpos[2].ToFloat32() * w0 +
@@ -472,10 +513,6 @@ void ProcessTriangle(const VertexShader::OutputVertex& v0,
472 case registers.output_merger.GreaterThanOrEqual: 513 case registers.output_merger.GreaterThanOrEqual:
473 pass = z >= ref_z; 514 pass = z >= ref_z;
474 break; 515 break;
475
476 default:
477 LOG_ERROR(HW_GPU, "Unknown depth test function %x", registers.output_merger.depth_test_func.Value());
478 break;
479 } 516 }
480 517
481 if (!pass) 518 if (!pass)