summaryrefslogtreecommitdiff
path: root/src/video_core/shader
diff options
context:
space:
mode:
Diffstat (limited to 'src/video_core/shader')
-rw-r--r--src/video_core/shader/decode.cpp6
-rw-r--r--src/video_core/shader/shader_ir.cpp4
-rw-r--r--src/video_core/shader/shader_ir.h3
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;
22using Tegra::Shader::PredOperation; 22using Tegra::Shader::PredOperation;
23using Tegra::Shader::Register; 23using Tegra::Shader::Register;
24 24
25ShaderIR::ShaderIR(const ProgramCode& program_code, u32 main_offset) 25ShaderIR::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
66class ShaderIR final { 66class ShaderIR final {
67public: 67public:
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{};