diff options
Diffstat (limited to 'src/shader_recompiler/backend/glsl/var_alloc.cpp')
| -rw-r--r-- | src/shader_recompiler/backend/glsl/var_alloc.cpp | 34 |
1 files changed, 20 insertions, 14 deletions
diff --git a/src/shader_recompiler/backend/glsl/var_alloc.cpp b/src/shader_recompiler/backend/glsl/var_alloc.cpp index 0ae56651e..95e8233e2 100644 --- a/src/shader_recompiler/backend/glsl/var_alloc.cpp +++ b/src/shader_recompiler/backend/glsl/var_alloc.cpp | |||
| @@ -116,8 +116,8 @@ std::string VarAlloc::Define(IR::Inst& inst, GlslVarType type) { | |||
| 116 | id.type.Assign(type); | 116 | id.type.Assign(type); |
| 117 | GetUseTracker(type).uses_temp = true; | 117 | GetUseTracker(type).uses_temp = true; |
| 118 | inst.SetDefinition<Id>(id); | 118 | inst.SetDefinition<Id>(id); |
| 119 | return "t" + Representation(inst.Definition<Id>()); | ||
| 119 | } | 120 | } |
| 120 | return Representation(inst.Definition<Id>()); | ||
| 121 | } | 121 | } |
| 122 | 122 | ||
| 123 | std::string VarAlloc::Define(IR::Inst& inst, IR::Type type) { | 123 | std::string VarAlloc::Define(IR::Inst& inst, IR::Type type) { |
| @@ -156,21 +156,27 @@ std::string VarAlloc::GetGlslType(IR::Type type) const { | |||
| 156 | 156 | ||
| 157 | Id VarAlloc::Alloc(GlslVarType type) { | 157 | Id VarAlloc::Alloc(GlslVarType type) { |
| 158 | auto& use_tracker{GetUseTracker(type)}; | 158 | auto& use_tracker{GetUseTracker(type)}; |
| 159 | if (use_tracker.num_used < NUM_VARS) { | 159 | const auto num_vars{use_tracker.var_use.size()}; |
| 160 | for (size_t var = 1; var < NUM_VARS; ++var) { | 160 | for (size_t var = 0; var < num_vars; ++var) { |
| 161 | if (use_tracker.var_use[var]) { | 161 | if (use_tracker.var_use[var]) { |
| 162 | continue; | 162 | continue; |
| 163 | } | ||
| 164 | use_tracker.num_used = std::max(use_tracker.num_used, var + 1); | ||
| 165 | use_tracker.var_use[var] = true; | ||
| 166 | Id ret{}; | ||
| 167 | ret.is_valid.Assign(1); | ||
| 168 | ret.type.Assign(type); | ||
| 169 | ret.index.Assign(static_cast<u32>(var)); | ||
| 170 | return ret; | ||
| 171 | } | 163 | } |
| 164 | use_tracker.num_used = std::max(use_tracker.num_used, var + 1); | ||
| 165 | use_tracker.var_use[var] = true; | ||
| 166 | Id ret{}; | ||
| 167 | ret.is_valid.Assign(1); | ||
| 168 | ret.type.Assign(type); | ||
| 169 | ret.index.Assign(static_cast<u32>(var)); | ||
| 170 | return ret; | ||
| 172 | } | 171 | } |
| 173 | throw NotImplementedException("Variable spilling"); | 172 | // Allocate a new variable |
| 173 | use_tracker.var_use.push_back(true); | ||
| 174 | Id ret{}; | ||
| 175 | ret.is_valid.Assign(1); | ||
| 176 | ret.type.Assign(type); | ||
| 177 | ret.index.Assign(static_cast<u32>(use_tracker.num_used)); | ||
| 178 | ++use_tracker.num_used; | ||
| 179 | return ret; | ||
| 174 | } | 180 | } |
| 175 | 181 | ||
| 176 | void VarAlloc::Free(Id id) { | 182 | void VarAlloc::Free(Id id) { |