Просмотр исходного кода

Pica/TextureEnvironment: Add support for the MAD-like texture combiners and clean up texture environment logic.

Tony Wasserka 11 лет назад
Родитель
Сommit
04cd06d5c2
2 измененных файлов с 28 добавлено и 0 удалено
  1. 3 0
      src/video_core/pica.h
  2. 25 0
      src/video_core/rasterizer.cpp

+ 3 - 0
src/video_core/pica.h

@@ -266,6 +266,9 @@ struct Regs {
             AddSigned       = 3,
             AddSigned       = 3,
             Lerp            = 4,
             Lerp            = 4,
             Subtract        = 5,
             Subtract        = 5,
+
+            MultiplyThenAdd = 8,
+            AddThenMultiply = 9,
         };
         };
 
 
         union {
         union {

+ 25 - 0
src/video_core/rasterizer.cpp

@@ -419,6 +419,25 @@ static void ProcessTriangleInternal(const VertexShader::OutputVertex& v0,
                         return result.Cast<u8>();
                         return result.Cast<u8>();
                     }
                     }
 
 
+                    case Operation::MultiplyThenAdd:
+                    {
+                        auto result = (input[0] * input[1] + 255 * input[2].Cast<int>()) / 255;
+                        result.r() = std::min(255, result.r());
+                        result.g() = std::min(255, result.g());
+                        result.b() = std::min(255, result.b());
+                        return result.Cast<u8>();
+                    }
+
+                    case Operation::AddThenMultiply:
+                    {
+                        auto result = input[0] + input[1];
+                        result.r() = std::min(255, result.r());
+                        result.g() = std::min(255, result.g());
+                        result.b() = std::min(255, result.b());
+                        result = (result * input[2].Cast<int>()) / 255;
+                        return result.Cast<u8>();
+                    }
+
                     default:
                     default:
                         LOG_ERROR(HW_GPU, "Unknown color combiner operation %d\n", (int)op);
                         LOG_ERROR(HW_GPU, "Unknown color combiner operation %d\n", (int)op);
                         UNIMPLEMENTED();
                         UNIMPLEMENTED();
@@ -443,6 +462,12 @@ static void ProcessTriangleInternal(const VertexShader::OutputVertex& v0,
                     case Operation::Subtract:
                     case Operation::Subtract:
                         return std::max(0, (int)input[0] - (int)input[1]);
                         return std::max(0, (int)input[0] - (int)input[1]);
 
 
+                    case Operation::MultiplyThenAdd:
+                        return std::min(255, (input[0] * input[1] + 255 * input[2]) / 255);
+
+                    case Operation::AddThenMultiply:
+                        return (std::min(255, (input[0] + input[1])) * input[2]) / 255;
+
                     default:
                     default:
                         LOG_ERROR(HW_GPU, "Unknown alpha combiner operation %d\n", (int)op);
                         LOG_ERROR(HW_GPU, "Unknown alpha combiner operation %d\n", (int)op);
                         UNIMPLEMENTED();
                         UNIMPLEMENTED();