From ce36ad454ecd4707a77916fdb79954c8924b50ee Mon Sep 17 00:00:00 2001
From: Tony Wasserka <NeoBrainX@gmail.com>
Date: Fri, 12 Dec 2014 17:55:43 +0100
Subject: [PATCH] Pica/VertexShader: Support negating src2.

---
 src/video_core/vertex_shader.cpp | 11 +++++++++--
 src/video_core/vertex_shader.h   |  1 -
 2 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/src/video_core/vertex_shader.cpp b/src/video_core/vertex_shader.cpp
index 064a703eb4..c5c5261fea 100644
--- a/src/video_core/vertex_shader.cpp
+++ b/src/video_core/vertex_shader.cpp
@@ -10,10 +10,10 @@
 
 #include <nihstro/shader_bytecode.h>
 
-#include "debug_utils/debug_utils.h"
 
 #include "pica.h"
 #include "vertex_shader.h"
+#include "debug_utils/debug_utils.h"
 
 using nihstro::Instruction;
 using nihstro::RegisterType;
@@ -99,6 +99,7 @@ static void ProcessShaderCode(VertexShaderState& state) {
 
         const SwizzlePattern& swizzle = *(SwizzlePattern*)&swizzle_data[instr.common.operand_desc_id];
         const bool negate_src1 = (swizzle.negate_src1 != 0);
+        const bool negate_src2 = (swizzle.negate_src2 != 0);
 
         float24 src1[4] = {
             src1_[(int)swizzle.GetSelectorSrc1(0)],
@@ -112,12 +113,18 @@ static void ProcessShaderCode(VertexShaderState& state) {
             src1[2] = src1[2] * float24::FromFloat32(-1);
             src1[3] = src1[3] * float24::FromFloat32(-1);
         }
-        const float24 src2[4] = {
+        float24 src2[4] = {
             src2_[(int)swizzle.GetSelectorSrc2(0)],
             src2_[(int)swizzle.GetSelectorSrc2(1)],
             src2_[(int)swizzle.GetSelectorSrc2(2)],
             src2_[(int)swizzle.GetSelectorSrc2(3)],
         };
+        if (negate_src2) {
+            src2[0] = src2[0] * float24::FromFloat32(-1);
+            src2[1] = src2[1] * float24::FromFloat32(-1);
+            src2[2] = src2[2] * float24::FromFloat32(-1);
+            src2[3] = src2[3] * float24::FromFloat32(-1);
+        }
 
         switch (instr.opcode) {
             case Instruction::OpCode::ADD:
diff --git a/src/video_core/vertex_shader.h b/src/video_core/vertex_shader.h
index 1317698082..2f6ff5904e 100644
--- a/src/video_core/vertex_shader.h
+++ b/src/video_core/vertex_shader.h
@@ -66,7 +66,6 @@ struct OutputVertex {
 static_assert(std::is_pod<OutputVertex>::value, "Structure is not POD");
 static_assert(sizeof(OutputVertex) == 32 * sizeof(float), "OutputVertex has invalid size");
 
-
 void SubmitShaderMemoryChange(u32 addr, u32 value);
 void SubmitSwizzleDataChange(u32 addr, u32 value);