summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/video_core/pica.h14
-rw-r--r--src/video_core/rasterizer.cpp45
2 files changed, 52 insertions, 7 deletions
diff --git a/src/video_core/pica.h b/src/video_core/pica.h
index 15850ba17..a19f4190c 100644
--- a/src/video_core/pica.h
+++ b/src/video_core/pica.h
@@ -310,7 +310,7 @@ struct Regs {
310 }; 310 };
311 311
312 struct { 312 struct {
313 enum DepthFunc : u32 { 313 enum CompareFunc : u32 {
314 Never = 0, 314 Never = 0,
315 Always = 1, 315 Always = 1,
316 Equal = 2, 316 Equal = 2,
@@ -357,11 +357,19 @@ struct Regs {
357 BitField<0, 4, Op> op; 357 BitField<0, 4, Op> op;
358 } logic_op; 358 } logic_op;
359 359
360 INSERT_PADDING_WORDS(0x4); 360 INSERT_PADDING_WORDS(0x1);
361
362 union {
363 BitField< 0, 1, u32> enable;
364 BitField< 4, 3, CompareFunc> func;
365 BitField< 8, 8, u32> ref;
366 } alpha_test;
367
368 INSERT_PADDING_WORDS(0x2);
361 369
362 union { 370 union {
363 BitField< 0, 1, u32> depth_test_enable; 371 BitField< 0, 1, u32> depth_test_enable;
364 BitField< 4, 3, DepthFunc> depth_test_func; 372 BitField< 4, 3, CompareFunc> depth_test_func;
365 BitField<12, 1, u32> depth_write_enable; 373 BitField<12, 1, u32> depth_write_enable;
366 }; 374 };
367 375
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)