From a664574ecbddb643dd12fb9815f4c4526f59f9ff Mon Sep 17 00:00:00 2001
From: Tony Wasserka <NeoBrainX@gmail.com>
Date: Fri, 19 Dec 2014 19:58:21 +0100
Subject: [PATCH] Pica/VertexShader: Be robust against invalid inputs.

More specifically, this also fixes crashes by Citra trying to load a src2 register even if the current instruction does not use that.
---
 src/video_core/vertex_shader.cpp | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/src/video_core/vertex_shader.cpp b/src/video_core/vertex_shader.cpp
index 5ca30ba53..345f3c3fe 100644
--- a/src/video_core/vertex_shader.cpp
+++ b/src/video_core/vertex_shader.cpp
@@ -99,6 +99,10 @@ struct VertexShaderState {
 };
 
 static void ProcessShaderCode(VertexShaderState& state) {
+
+    // Placeholder for invalid inputs
+    static float24 dummy_vec4_float24[4];
+
     while (true) {
         if (!state.call_stack.empty()) {
             if (state.program_counter - shader_memory.data() == state.call_stack.top().final_address) {
@@ -132,6 +136,9 @@ static void ProcessShaderCode(VertexShaderState& state) {
 
             case RegisterType::FloatUniform:
                 return &shader_uniforms.f[source_reg.GetIndex()].x;
+
+            default:
+                return dummy_vec4_float24;
             }
         };
 
@@ -182,9 +189,9 @@ static void ProcessShaderCode(VertexShaderState& state) {
             }
 
             float24* dest = (instr.common.dest < 0x08) ? state.output_register_table[4*instr.common.dest.GetIndex()]
-                        : (instr.common.dest < 0x10) ? nullptr
+                        : (instr.common.dest < 0x10) ? dummy_vec4_float24
                         : (instr.common.dest < 0x20) ? &state.temporary_registers[instr.common.dest.GetIndex()][0]
-                        : nullptr;
+                        : dummy_vec4_float24;
 
             state.debug.max_opdesc_id = std::max<u32>(state.debug.max_opdesc_id, 1+instr.common.operand_desc_id);