diff options
| author | 2015-02-22 15:51:12 +0100 | |
|---|---|---|
| committer | 2015-02-22 15:51:12 +0100 | |
| commit | 34f21334ad987bbef5e26846c99f5a12da3116ef (patch) | |
| tree | 8345bd4d36d9e306ecb6ff3405279606c09b7318 | |
| parent | Merge pull request #590 from linkmauve/rename-dolphin (diff) | |
| parent | Pica/VertexShader: Fixed LOOP with more than one iteration. (diff) | |
| download | yuzu-34f21334ad987bbef5e26846c99f5a12da3116ef.tar.gz yuzu-34f21334ad987bbef5e26846c99f5a12da3116ef.tar.xz yuzu-34f21334ad987bbef5e26846c99f5a12da3116ef.zip | |
Merge pull request #593 from Subv/search_problem
Pica/VertexShader: Fixed LOOP with more than one iteration.
| -rw-r--r-- | src/video_core/vertex_shader.cpp | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/src/video_core/vertex_shader.cpp b/src/video_core/vertex_shader.cpp index def868ac7..bc8c0041c 100644 --- a/src/video_core/vertex_shader.cpp +++ b/src/video_core/vertex_shader.cpp | |||
| @@ -90,6 +90,7 @@ struct VertexShaderState { | |||
| 90 | u8 repeat_counter; // How often to repeat until this call stack element is removed | 90 | u8 repeat_counter; // How often to repeat until this call stack element is removed |
| 91 | u8 loop_increment; // Which value to add to the loop counter after an iteration | 91 | u8 loop_increment; // Which value to add to the loop counter after an iteration |
| 92 | // TODO: Should this be a signed value? Does it even matter? | 92 | // TODO: Should this be a signed value? Does it even matter? |
| 93 | u32 loop_address; // The address where we'll return to after each loop iteration | ||
| 93 | }; | 94 | }; |
| 94 | 95 | ||
| 95 | // TODO: Is there a maximal size for this? | 96 | // TODO: Is there a maximal size for this? |
| @@ -115,6 +116,8 @@ static void ProcessShaderCode(VertexShaderState& state) { | |||
| 115 | if (top.repeat_counter-- == 0) { | 116 | if (top.repeat_counter-- == 0) { |
| 116 | state.program_counter = &shader_memory[top.return_address]; | 117 | state.program_counter = &shader_memory[top.return_address]; |
| 117 | state.call_stack.pop(); | 118 | state.call_stack.pop(); |
| 119 | } else { | ||
| 120 | state.program_counter = &shader_memory[top.loop_address]; | ||
| 118 | } | 121 | } |
| 119 | 122 | ||
| 120 | // TODO: Is "trying again" accurate to hardware? | 123 | // TODO: Is "trying again" accurate to hardware? |
| @@ -129,7 +132,7 @@ static void ProcessShaderCode(VertexShaderState& state) { | |||
| 129 | static auto call = [](VertexShaderState& state, u32 offset, u32 num_instructions, | 132 | static auto call = [](VertexShaderState& state, u32 offset, u32 num_instructions, |
| 130 | u32 return_offset, u8 repeat_count, u8 loop_increment) { | 133 | u32 return_offset, u8 repeat_count, u8 loop_increment) { |
| 131 | state.program_counter = &shader_memory[offset] - 1; // -1 to make sure when incrementing the PC we end up at the correct offset | 134 | state.program_counter = &shader_memory[offset] - 1; // -1 to make sure when incrementing the PC we end up at the correct offset |
| 132 | state.call_stack.push({ offset + num_instructions, return_offset, repeat_count, loop_increment }); | 135 | state.call_stack.push({ offset + num_instructions, return_offset, repeat_count, loop_increment, offset }); |
| 133 | }; | 136 | }; |
| 134 | u32 binary_offset = state.program_counter - shader_memory.data(); | 137 | u32 binary_offset = state.program_counter - shader_memory.data(); |
| 135 | 138 | ||