summaryrefslogtreecommitdiff
path: root/src/video_core/rasterizer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/video_core/rasterizer.cpp')
-rw-r--r--src/video_core/rasterizer.cpp25
1 files changed, 25 insertions, 0 deletions
diff --git a/src/video_core/rasterizer.cpp b/src/video_core/rasterizer.cpp
index 9cad5f9b6..eacca82e5 100644
--- a/src/video_core/rasterizer.cpp
+++ b/src/video_core/rasterizer.cpp
@@ -419,6 +419,25 @@ static void ProcessTriangleInternal(const VertexShader::OutputVertex& v0,
419 return result.Cast<u8>(); 419 return result.Cast<u8>();
420 } 420 }
421 421
422 case Operation::MultiplyThenAdd:
423 {
424 auto result = (input[0] * input[1] + 255 * input[2].Cast<int>()) / 255;
425 result.r() = std::min(255, result.r());
426 result.g() = std::min(255, result.g());
427 result.b() = std::min(255, result.b());
428 return result.Cast<u8>();
429 }
430
431 case Operation::AddThenMultiply:
432 {
433 auto result = input[0] + input[1];
434 result.r() = std::min(255, result.r());
435 result.g() = std::min(255, result.g());
436 result.b() = std::min(255, result.b());
437 result = (result * input[2].Cast<int>()) / 255;
438 return result.Cast<u8>();
439 }
440
422 default: 441 default:
423 LOG_ERROR(HW_GPU, "Unknown color combiner operation %d\n", (int)op); 442 LOG_ERROR(HW_GPU, "Unknown color combiner operation %d\n", (int)op);
424 UNIMPLEMENTED(); 443 UNIMPLEMENTED();
@@ -443,6 +462,12 @@ static void ProcessTriangleInternal(const VertexShader::OutputVertex& v0,
443 case Operation::Subtract: 462 case Operation::Subtract:
444 return std::max(0, (int)input[0] - (int)input[1]); 463 return std::max(0, (int)input[0] - (int)input[1]);
445 464
465 case Operation::MultiplyThenAdd:
466 return std::min(255, (input[0] * input[1] + 255 * input[2]) / 255);
467
468 case Operation::AddThenMultiply:
469 return (std::min(255, (input[0] + input[1])) * input[2]) / 255;
470
446 default: 471 default:
447 LOG_ERROR(HW_GPU, "Unknown alpha combiner operation %d\n", (int)op); 472 LOG_ERROR(HW_GPU, "Unknown alpha combiner operation %d\n", (int)op);
448 UNIMPLEMENTED(); 473 UNIMPLEMENTED();