summaryrefslogtreecommitdiff
path: root/src/shader_recompiler/backend/glsl/var_alloc.cpp
diff options
context:
space:
mode:
authorGravatar ameerj2021-06-07 18:04:01 -0400
committerGravatar ameerj2021-07-22 21:51:37 -0400
commit258106038e921de6863d3e871a82fb7a0c77f10d (patch)
tree31079d1db5089646912fed49b4e075dbaaaa3b25 /src/shader_recompiler/backend/glsl/var_alloc.cpp
parentglsl: Implement barriers (diff)
downloadyuzu-258106038e921de6863d3e871a82fb7a0c77f10d.tar.gz
yuzu-258106038e921de6863d3e871a82fb7a0c77f10d.tar.xz
yuzu-258106038e921de6863d3e871a82fb7a0c77f10d.zip
glsl: Allow dynamic tracking of variable allocation
Diffstat (limited to 'src/shader_recompiler/backend/glsl/var_alloc.cpp')
-rw-r--r--src/shader_recompiler/backend/glsl/var_alloc.cpp34
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
123std::string VarAlloc::Define(IR::Inst& inst, IR::Type type) { 123std::string VarAlloc::Define(IR::Inst& inst, IR::Type type) {
@@ -156,21 +156,27 @@ std::string VarAlloc::GetGlslType(IR::Type type) const {
156 156
157Id VarAlloc::Alloc(GlslVarType type) { 157Id 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
176void VarAlloc::Free(Id id) { 182void VarAlloc::Free(Id id) {