diff options
| -rw-r--r-- | src/video_core/pica.h | 14 | ||||
| -rw-r--r-- | src/video_core/rasterizer.cpp | 45 |
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) |