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

Merge pull request #767 from Lectem/DOT3_RGB

Yuri Kunde Schlesner 11 лет назад
Родитель
Сommit
04cb7ae601
2 измененных файлов с 13 добавлено и 1 удалено
  1. 1 0
      src/video_core/pica.h
  2. 12 1
      src/video_core/rasterizer.cpp

+ 1 - 0
src/video_core/pica.h

@@ -290,6 +290,7 @@ struct Regs {
             AddSigned       = 3,
             Lerp            = 4,
             Subtract        = 5,
+            Dot3_RGB        = 6,
 
             MultiplyThenAdd = 8,
             AddThenMultiply = 9,

+ 12 - 1
src/video_core/rasterizer.cpp

@@ -641,7 +641,18 @@ static void ProcessTriangleInternal(const VertexShader::OutputVertex& v0,
                         result = (result * input[2].Cast<int>()) / 255;
                         return result.Cast<u8>();
                     }
-
+                    case Operation::Dot3_RGB:
+                    {
+                        // Not fully accurate.
+                        // Worst case scenario seems to yield a +/-3 error
+                        // Some HW results indicate that the per-component computation can't have a higher precision than 1/256,
+                        // while dot3_rgb( (0x80,g0,b0),(0x7F,g1,b1) ) and dot3_rgb( (0x80,g0,b0),(0x80,g1,b1) ) give different results
+                        int result = ((input[0].r() * 2 - 255) * (input[1].r() * 2 - 255) + 128) / 256 +
+                                     ((input[0].g() * 2 - 255) * (input[1].g() * 2 - 255) + 128) / 256 +
+                                     ((input[0].b() * 2 - 255) * (input[1].b() * 2 - 255) + 128) / 256;
+                        result = std::max(0, std::min(255, result));
+                        return { (u8)result, (u8)result, (u8)result };
+                    }
                     default:
                         LOG_ERROR(HW_GPU, "Unknown color combiner operation %d\n", (int)op);
                         UNIMPLEMENTED();