diff options
Diffstat (limited to 'src/video_core/shader')
| -rw-r--r-- | src/video_core/shader/decode.cpp | 6 | ||||
| -rw-r--r-- | src/video_core/shader/shader_ir.cpp | 4 | ||||
| -rw-r--r-- | src/video_core/shader/shader_ir.h | 3 |
3 files changed, 7 insertions, 6 deletions
diff --git a/src/video_core/shader/decode.cpp b/src/video_core/shader/decode.cpp index 65029d35e..09f55bd21 100644 --- a/src/video_core/shader/decode.cpp +++ b/src/video_core/shader/decode.cpp | |||
| @@ -39,7 +39,7 @@ void ShaderIR::Decode() { | |||
| 39 | std::memcpy(&header, program_code.data(), sizeof(Tegra::Shader::Header)); | 39 | std::memcpy(&header, program_code.data(), sizeof(Tegra::Shader::Header)); |
| 40 | 40 | ||
| 41 | ShaderCharacteristics shader_info{}; | 41 | ShaderCharacteristics shader_info{}; |
| 42 | bool can_proceed = ScanFlow(program_code, MAX_PROGRAM_LENGTH, main_offset, shader_info); | 42 | bool can_proceed = ScanFlow(program_code, program_code.size(), main_offset, shader_info); |
| 43 | if (can_proceed) { | 43 | if (can_proceed) { |
| 44 | coverage_begin = shader_info.start; | 44 | coverage_begin = shader_info.start; |
| 45 | coverage_end = shader_info.end; | 45 | coverage_end = shader_info.end; |
| @@ -52,12 +52,12 @@ void ShaderIR::Decode() { | |||
| 52 | } | 52 | } |
| 53 | return; | 53 | return; |
| 54 | } | 54 | } |
| 55 | LOG_CRITICAL(HW_GPU, "Flow Analysis failed, falling back to brute force compiling"); | 55 | LOG_WARNING(HW_GPU, "Flow Analysis failed, falling back to brute force compiling"); |
| 56 | 56 | ||
| 57 | // Now we need to deal with an undecompilable shader. We need to brute force | 57 | // Now we need to deal with an undecompilable shader. We need to brute force |
| 58 | // a shader that captures every position. | 58 | // a shader that captures every position. |
| 59 | coverage_begin = shader_info.start; | 59 | coverage_begin = shader_info.start; |
| 60 | const u32 shader_end = static_cast<u32>(MAX_PROGRAM_LENGTH); | 60 | const u32 shader_end = static_cast<u32>(program_size / sizeof(u64)); |
| 61 | coverage_end = shader_end; | 61 | coverage_end = shader_end; |
| 62 | for (u32 label = main_offset; label < shader_end; label++) { | 62 | for (u32 label = main_offset; label < shader_end; label++) { |
| 63 | basic_blocks.insert({label, DecodeRange(label, label + 1)}); | 63 | basic_blocks.insert({label, DecodeRange(label, label + 1)}); |
diff --git a/src/video_core/shader/shader_ir.cpp b/src/video_core/shader/shader_ir.cpp index 11b545cca..5994bfc4e 100644 --- a/src/video_core/shader/shader_ir.cpp +++ b/src/video_core/shader/shader_ir.cpp | |||
| @@ -22,8 +22,8 @@ using Tegra::Shader::PredCondition; | |||
| 22 | using Tegra::Shader::PredOperation; | 22 | using Tegra::Shader::PredOperation; |
| 23 | using Tegra::Shader::Register; | 23 | using Tegra::Shader::Register; |
| 24 | 24 | ||
| 25 | ShaderIR::ShaderIR(const ProgramCode& program_code, u32 main_offset) | 25 | ShaderIR::ShaderIR(const ProgramCode& program_code, u32 main_offset, const std::size_t size) |
| 26 | : program_code{program_code}, main_offset{main_offset} { | 26 | : program_code{program_code}, main_offset{main_offset}, program_size{size} { |
| 27 | Decode(); | 27 | Decode(); |
| 28 | } | 28 | } |
| 29 | 29 | ||
diff --git a/src/video_core/shader/shader_ir.h b/src/video_core/shader/shader_ir.h index e71462e02..a67d4f390 100644 --- a/src/video_core/shader/shader_ir.h +++ b/src/video_core/shader/shader_ir.h | |||
| @@ -65,7 +65,7 @@ struct GlobalMemoryUsage { | |||
| 65 | 65 | ||
| 66 | class ShaderIR final { | 66 | class ShaderIR final { |
| 67 | public: | 67 | public: |
| 68 | explicit ShaderIR(const ProgramCode& program_code, u32 main_offset); | 68 | explicit ShaderIR(const ProgramCode& program_code, u32 main_offset, std::size_t size); |
| 69 | ~ShaderIR(); | 69 | ~ShaderIR(); |
| 70 | 70 | ||
| 71 | const std::map<u32, NodeBlock>& GetBasicBlocks() const { | 71 | const std::map<u32, NodeBlock>& GetBasicBlocks() const { |
| @@ -316,6 +316,7 @@ private: | |||
| 316 | 316 | ||
| 317 | const ProgramCode& program_code; | 317 | const ProgramCode& program_code; |
| 318 | const u32 main_offset; | 318 | const u32 main_offset; |
| 319 | const std::size_t program_size; | ||
| 319 | 320 | ||
| 320 | u32 coverage_begin{}; | 321 | u32 coverage_begin{}; |
| 321 | u32 coverage_end{}; | 322 | u32 coverage_end{}; |