summaryrefslogtreecommitdiff
path: root/src/video_core/rasterizer.cpp
diff options
context:
space:
mode:
authorGravatar bunnei2015-01-26 21:10:09 -0500
committerGravatar bunnei2015-01-27 14:39:17 -0500
commitb2c55bf772f2436db04357c2689302b98d9f0b26 (patch)
tree6033ef7dc8357d8425a075565f4357abf69cde2f /src/video_core/rasterizer.cpp
parentMerge pull request #508 from lioncash/dyn (diff)
downloadyuzu-b2c55bf772f2436db04357c2689302b98d9f0b26.tar.gz
yuzu-b2c55bf772f2436db04357c2689302b98d9f0b26.tar.xz
yuzu-b2c55bf772f2436db04357c2689302b98d9f0b26.zip
Rasterizer: Implemented 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)