diff options
| author | 2018-05-31 22:57:32 -0400 | |
|---|---|---|
| committer | 2018-05-31 22:57:32 -0400 | |
| commit | 4c727d0ba82012436dfd4eb1572db5e0882b2766 (patch) | |
| tree | 16eda7a1a5c5b6a2d39d6d089d33489a2eaaf18f /src | |
| parent | Merge pull request #488 from Subv/thread_masks (diff) | |
| download | yuzu-4c727d0ba82012436dfd4eb1572db5e0882b2766.tar.gz yuzu-4c727d0ba82012436dfd4eb1572db5e0882b2766.tar.xz yuzu-4c727d0ba82012436dfd4eb1572db5e0882b2766.zip | |
gl_shader_decompiler: Support multi-destination for TEXS.
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/engines/shader_bytecode.h | 5 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_shader_decompiler.cpp | 20 |
2 files changed, 23 insertions, 2 deletions
diff --git a/src/video_core/engines/shader_bytecode.h b/src/video_core/engines/shader_bytecode.h index f32a17057..79adcc535 100644 --- a/src/video_core/engines/shader_bytecode.h +++ b/src/video_core/engines/shader_bytecode.h | |||
| @@ -261,6 +261,11 @@ union Instruction { | |||
| 261 | BitField<50, 1, u64> saturate_a; | 261 | BitField<50, 1, u64> saturate_a; |
| 262 | } conversion; | 262 | } conversion; |
| 263 | 263 | ||
| 264 | union { | ||
| 265 | // TODO(bunnei): This is just a guess, needs to be verified | ||
| 266 | BitField<52, 1, u64> enable_g_component; | ||
| 267 | } texs; | ||
| 268 | |||
| 264 | BitField<61, 1, u64> is_b_imm; | 269 | BitField<61, 1, u64> is_b_imm; |
| 265 | BitField<60, 1, u64> is_b_gpr; | 270 | BitField<60, 1, u64> is_b_gpr; |
| 266 | BitField<59, 1, u64> is_c_gpr; | 271 | BitField<59, 1, u64> is_c_gpr; |
diff --git a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp index 68efe74b8..f6a60c920 100644 --- a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp +++ b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp | |||
| @@ -903,9 +903,25 @@ private: | |||
| 903 | ++shader.scope; | 903 | ++shader.scope; |
| 904 | shader.AddLine(coord); | 904 | shader.AddLine(coord); |
| 905 | const std::string texture = "texture(" + sampler + ", coords)"; | 905 | const std::string texture = "texture(" + sampler + ", coords)"; |
| 906 | for (unsigned elem = 0; elem < instr.attribute.fmt20.size; ++elem) { | 906 | |
| 907 | regs.SetRegisterToFloat(instr.gpr0, elem, texture, 1, 4, false, elem); | 907 | // TEXS has two destination registers. RG goes into gpr0+0 and gpr0+1, and BA goes |
| 908 | // into gpr28+0 and gpr28+1 | ||
| 909 | size_t offset{}; | ||
| 910 | for (const auto& dest : {instr.gpr0.Value(), instr.gpr28.Value()}) { | ||
| 911 | for (unsigned elem = 0; elem < 2; ++elem) { | ||
| 912 | if (dest + elem >= Register::ZeroIndex) { | ||
| 913 | // Skip invalid register values | ||
| 914 | break; | ||
| 915 | } | ||
| 916 | regs.SetRegisterToFloat(dest, elem + offset, texture, 1, 4, false, elem); | ||
| 917 | if (!instr.texs.enable_g_component) { | ||
| 918 | // Skip the second component | ||
| 919 | break; | ||
| 920 | } | ||
| 921 | } | ||
| 922 | offset += 2; | ||
| 908 | } | 923 | } |
| 924 | |||
| 909 | --shader.scope; | 925 | --shader.scope; |
| 910 | shader.AddLine("}"); | 926 | shader.AddLine("}"); |
| 911 | break; | 927 | break; |