summaryrefslogtreecommitdiff
path: root/src/shader_recompiler/backend
diff options
context:
space:
mode:
Diffstat (limited to 'src/shader_recompiler/backend')
-rw-r--r--src/shader_recompiler/backend/glsl/emit_glsl.cpp8
-rw-r--r--src/shader_recompiler/backend/glsl/emit_glsl_atomic.cpp12
-rw-r--r--src/shader_recompiler/backend/glsl/emit_glsl_composite.cpp3
-rw-r--r--src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp18
-rw-r--r--src/shader_recompiler/backend/glsl/emit_glsl_integer.cpp1
-rw-r--r--src/shader_recompiler/backend/glsl/emit_glsl_shared_memory.cpp1
-rw-r--r--src/shader_recompiler/backend/glsl/emit_glsl_warp.cpp2
-rw-r--r--src/shader_recompiler/backend/glsl/var_alloc.cpp3
8 files changed, 20 insertions, 28 deletions
diff --git a/src/shader_recompiler/backend/glsl/emit_glsl.cpp b/src/shader_recompiler/backend/glsl/emit_glsl.cpp
index 6d64913bb..9f8cf659f 100644
--- a/src/shader_recompiler/backend/glsl/emit_glsl.cpp
+++ b/src/shader_recompiler/backend/glsl/emit_glsl.cpp
@@ -156,8 +156,7 @@ void EmitCode(EmitContext& ctx, const IR::Program& program) {
156 ctx.Add("for(;;){{"); 156 ctx.Add("for(;;){{");
157 break; 157 break;
158 case IR::AbstractSyntaxNode::Type::Repeat: 158 case IR::AbstractSyntaxNode::Type::Repeat:
159 ctx.Add("if({}){{continue;}}else{{break;}}}}", 159 ctx.Add("if(!{}){{break;}}}}", ctx.var_alloc.Consume(node.data.repeat.cond));
160 ctx.var_alloc.Consume(node.data.repeat.cond));
161 break; 160 break;
162 default: 161 default:
163 throw NotImplementedException("AbstractSyntaxNode Type {}", node.type); 162 throw NotImplementedException("AbstractSyntaxNode Type {}", node.type);
@@ -166,7 +165,7 @@ void EmitCode(EmitContext& ctx, const IR::Program& program) {
166} 165}
167 166
168std::string GlslVersionSpecifier(const EmitContext& ctx) { 167std::string GlslVersionSpecifier(const EmitContext& ctx) {
169 if (ctx.uses_y_direction || ctx.info.stores_legacy_varyings) { 168 if (ctx.uses_y_direction || ctx.info.stores_legacy_varyings || ctx.info.loads_legacy_varyings) {
170 return " compatibility"; 169 return " compatibility";
171 } 170 }
172 return ""; 171 return "";
@@ -187,7 +186,8 @@ void DefineVariables(const EmitContext& ctx, std::string& header) {
187 const auto type{static_cast<GlslVarType>(i)}; 186 const auto type{static_cast<GlslVarType>(i)};
188 const auto& tracker{ctx.var_alloc.GetUseTracker(type)}; 187 const auto& tracker{ctx.var_alloc.GetUseTracker(type)};
189 const auto type_name{ctx.var_alloc.GetGlslType(type)}; 188 const auto type_name{ctx.var_alloc.GetGlslType(type)};
190 const auto precise{IsPreciseType(type) ? "precise " : ""}; 189 const bool has_precise_bug{ctx.stage == Stage::Fragment && ctx.profile.has_gl_precise_bug};
190 const auto precise{!has_precise_bug && IsPreciseType(type) ? "precise " : ""};
191 // Temps/return types that are never used are stored at index 0 191 // Temps/return types that are never used are stored at index 0
192 if (tracker.uses_temp) { 192 if (tracker.uses_temp) {
193 header += fmt::format("{}{} t{}={}(0);", precise, type_name, 193 header += fmt::format("{}{} t{}={}(0);", precise, type_name,
diff --git a/src/shader_recompiler/backend/glsl/emit_glsl_atomic.cpp b/src/shader_recompiler/backend/glsl/emit_glsl_atomic.cpp
index 9152ace98..772acc5a4 100644
--- a/src/shader_recompiler/backend/glsl/emit_glsl_atomic.cpp
+++ b/src/shader_recompiler/backend/glsl/emit_glsl_atomic.cpp
@@ -98,7 +98,7 @@ void EmitSharedAtomicExchange32(EmitContext& ctx, IR::Inst& inst, std::string_vi
98 98
99void EmitSharedAtomicExchange64(EmitContext& ctx, IR::Inst& inst, std::string_view pointer_offset, 99void EmitSharedAtomicExchange64(EmitContext& ctx, IR::Inst& inst, std::string_view pointer_offset,
100 std::string_view value) { 100 std::string_view value) {
101 LOG_WARNING(Shader_GLSL, "Int64 Atomics not supported, fallback to non-atomic"); 101 LOG_WARNING(Shader_GLSL, "Int64 atomics not supported, fallback to non-atomic");
102 ctx.AddU64("{}=packUint2x32(uvec2(smem[{}>>2],smem[({}+4)>>2]));", inst, pointer_offset, 102 ctx.AddU64("{}=packUint2x32(uvec2(smem[{}>>2],smem[({}+4)>>2]));", inst, pointer_offset,
103 pointer_offset); 103 pointer_offset);
104 ctx.Add("smem[{}>>2]=unpackUint2x32({}).x;smem[({}+4)>>2]=unpackUint2x32({}).y;", 104 ctx.Add("smem[{}>>2]=unpackUint2x32({}).x;smem[({}+4)>>2]=unpackUint2x32({}).y;",
@@ -171,7 +171,7 @@ void EmitStorageAtomicExchange32(EmitContext& ctx, IR::Inst& inst, const IR::Val
171 171
172void EmitStorageAtomicIAdd64(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding, 172void EmitStorageAtomicIAdd64(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding,
173 const IR::Value& offset, std::string_view value) { 173 const IR::Value& offset, std::string_view value) {
174 LOG_WARNING(Shader_GLSL, "Int64 Atomics not supported, fallback to non-atomic"); 174 LOG_WARNING(Shader_GLSL, "Int64 atomics not supported, fallback to non-atomic");
175 ctx.AddU64("{}=packUint2x32(uvec2({}_ssbo{}[{}>>2],{}_ssbo{}[({}>>2)+1]));", inst, 175 ctx.AddU64("{}=packUint2x32(uvec2({}_ssbo{}[{}>>2],{}_ssbo{}[({}>>2)+1]));", inst,
176 ctx.stage_name, binding.U32(), ctx.var_alloc.Consume(offset), ctx.stage_name, 176 ctx.stage_name, binding.U32(), ctx.var_alloc.Consume(offset), ctx.stage_name,
177 binding.U32(), ctx.var_alloc.Consume(offset)); 177 binding.U32(), ctx.var_alloc.Consume(offset));
@@ -182,7 +182,7 @@ void EmitStorageAtomicIAdd64(EmitContext& ctx, IR::Inst& inst, const IR::Value&
182 182
183void EmitStorageAtomicSMin64(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding, 183void EmitStorageAtomicSMin64(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding,
184 const IR::Value& offset, std::string_view value) { 184 const IR::Value& offset, std::string_view value) {
185 LOG_WARNING(Shader_GLSL, "Int64 Atomics not supported, fallback to non-atomic"); 185 LOG_WARNING(Shader_GLSL, "Int64 atomics not supported, fallback to non-atomic");
186 ctx.AddU64("{}=packInt2x32(ivec2({}_ssbo{}[{}>>2],{}_ssbo{}[({}>>2)+1]));", inst, 186 ctx.AddU64("{}=packInt2x32(ivec2({}_ssbo{}[{}>>2],{}_ssbo{}[({}>>2)+1]));", inst,
187 ctx.stage_name, binding.U32(), ctx.var_alloc.Consume(offset), ctx.stage_name, 187 ctx.stage_name, binding.U32(), ctx.var_alloc.Consume(offset), ctx.stage_name,
188 binding.U32(), ctx.var_alloc.Consume(offset)); 188 binding.U32(), ctx.var_alloc.Consume(offset));
@@ -195,7 +195,7 @@ void EmitStorageAtomicSMin64(EmitContext& ctx, IR::Inst& inst, const IR::Value&
195 195
196void EmitStorageAtomicUMin64(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding, 196void EmitStorageAtomicUMin64(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding,
197 const IR::Value& offset, std::string_view value) { 197 const IR::Value& offset, std::string_view value) {
198 LOG_WARNING(Shader_GLSL, "Int64 Atomics not supported, fallback to non-atomic"); 198 LOG_WARNING(Shader_GLSL, "Int64 atomics not supported, fallback to non-atomic");
199 ctx.AddU64("{}=packUint2x32(uvec2({}_ssbo{}[{}>>2],{}_ssbo{}[({}>>2)+1]));", inst, 199 ctx.AddU64("{}=packUint2x32(uvec2({}_ssbo{}[{}>>2],{}_ssbo{}[({}>>2)+1]));", inst,
200 ctx.stage_name, binding.U32(), ctx.var_alloc.Consume(offset), ctx.stage_name, 200 ctx.stage_name, binding.U32(), ctx.var_alloc.Consume(offset), ctx.stage_name,
201 binding.U32(), ctx.var_alloc.Consume(offset)); 201 binding.U32(), ctx.var_alloc.Consume(offset));
@@ -207,7 +207,7 @@ void EmitStorageAtomicUMin64(EmitContext& ctx, IR::Inst& inst, const IR::Value&
207 207
208void EmitStorageAtomicSMax64(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding, 208void EmitStorageAtomicSMax64(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding,
209 const IR::Value& offset, std::string_view value) { 209 const IR::Value& offset, std::string_view value) {
210 LOG_WARNING(Shader_GLSL, "Int64 Atomics not supported, fallback to non-atomic"); 210 LOG_WARNING(Shader_GLSL, "Int64 atomics not supported, fallback to non-atomic");
211 ctx.AddU64("{}=packInt2x32(ivec2({}_ssbo{}[{}>>2],{}_ssbo{}[({}>>2)+1]));", inst, 211 ctx.AddU64("{}=packInt2x32(ivec2({}_ssbo{}[{}>>2],{}_ssbo{}[({}>>2)+1]));", inst,
212 ctx.stage_name, binding.U32(), ctx.var_alloc.Consume(offset), ctx.stage_name, 212 ctx.stage_name, binding.U32(), ctx.var_alloc.Consume(offset), ctx.stage_name,
213 binding.U32(), ctx.var_alloc.Consume(offset)); 213 binding.U32(), ctx.var_alloc.Consume(offset));
@@ -220,7 +220,7 @@ void EmitStorageAtomicSMax64(EmitContext& ctx, IR::Inst& inst, const IR::Value&
220 220
221void EmitStorageAtomicUMax64(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding, 221void EmitStorageAtomicUMax64(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding,
222 const IR::Value& offset, std::string_view value) { 222 const IR::Value& offset, std::string_view value) {
223 LOG_WARNING(Shader_GLSL, "Int64 Atomics not supported, fallback to non-atomic"); 223 LOG_WARNING(Shader_GLSL, "Int64 atomics not supported, fallback to non-atomic");
224 ctx.AddU64("{}=packUint2x32(uvec2({}_ssbo{}[{}>>2],{}_ssbo{}[({}>>2)+1]));", inst, 224 ctx.AddU64("{}=packUint2x32(uvec2({}_ssbo{}[{}>>2],{}_ssbo{}[({}>>2)+1]));", inst,
225 ctx.stage_name, binding.U32(), ctx.var_alloc.Consume(offset), ctx.stage_name, 225 ctx.stage_name, binding.U32(), ctx.var_alloc.Consume(offset), ctx.stage_name,
226 binding.U32(), ctx.var_alloc.Consume(offset)); 226 binding.U32(), ctx.var_alloc.Consume(offset));
diff --git a/src/shader_recompiler/backend/glsl/emit_glsl_composite.cpp b/src/shader_recompiler/backend/glsl/emit_glsl_composite.cpp
index 7421ce97d..49a66e3ec 100644
--- a/src/shader_recompiler/backend/glsl/emit_glsl_composite.cpp
+++ b/src/shader_recompiler/backend/glsl/emit_glsl_composite.cpp
@@ -17,8 +17,7 @@ void CompositeInsert(EmitContext& ctx, std::string_view result, std::string_view
17 // The result is aliased with the composite 17 // The result is aliased with the composite
18 ctx.Add("{}.{}={};", composite, SWIZZLE[index], object); 18 ctx.Add("{}.{}={};", composite, SWIZZLE[index], object);
19 } else { 19 } else {
20 ctx.Add("{}={};", result, composite); 20 ctx.Add("{}={};{}.{}={};", result, composite, result, SWIZZLE[index], object);
21 ctx.Add("{}.{}={};", result, SWIZZLE[index], object);
22 } 21 }
23} 22}
24} // Anonymous namespace 23} // Anonymous namespace
diff --git a/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp b/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp
index 0d1e5ed7f..edeecc26e 100644
--- a/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp
+++ b/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp
@@ -30,7 +30,7 @@ std::string InputVertexIndex(EmitContext& ctx, std::string_view vertex) {
30 return IsInputArray(ctx.stage) ? fmt::format("[{}]", vertex) : ""; 30 return IsInputArray(ctx.stage) ? fmt::format("[{}]", vertex) : "";
31} 31}
32 32
33std::string OutputVertexIndex(EmitContext& ctx) { 33std::string_view OutputVertexIndex(EmitContext& ctx) {
34 return ctx.stage == Stage::TessellationControl ? "[gl_InvocationID]" : ""; 34 return ctx.stage == Stage::TessellationControl ? "[gl_InvocationID]" : "";
35} 35}
36 36
@@ -40,7 +40,7 @@ void GetCbuf(EmitContext& ctx, std::string_view ret, const IR::Value& binding,
40 const bool is_immediate{offset.IsImmediate()}; 40 const bool is_immediate{offset.IsImmediate()};
41 if (is_immediate) { 41 if (is_immediate) {
42 const s32 signed_offset{static_cast<s32>(offset.U32())}; 42 const s32 signed_offset{static_cast<s32>(offset.U32())};
43 static constexpr u32 cbuf_size{4096 * 16}; 43 static constexpr u32 cbuf_size{0x10000};
44 if (signed_offset < 0 || offset.U32() > cbuf_size) { 44 if (signed_offset < 0 || offset.U32() > cbuf_size) {
45 LOG_WARNING(Shader_GLSL, "Immediate constant buffer offset is out of bounds"); 45 LOG_WARNING(Shader_GLSL, "Immediate constant buffer offset is out of bounds");
46 ctx.Add("{}=0u;", ret); 46 ctx.Add("{}=0u;", ret);
@@ -140,7 +140,7 @@ void EmitGetCbufU32x2(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding
140 const IR::Value& offset) { 140 const IR::Value& offset) {
141 const auto cbuf{fmt::format("{}_cbuf{}", ctx.stage_name, binding.U32())}; 141 const auto cbuf{fmt::format("{}_cbuf{}", ctx.stage_name, binding.U32())};
142 if (offset.IsImmediate()) { 142 if (offset.IsImmediate()) {
143 static constexpr u32 cbuf_size{4096 * 16}; 143 static constexpr u32 cbuf_size{0x10000};
144 const u32 u32_offset{offset.U32()}; 144 const u32 u32_offset{offset.U32()};
145 const s32 signed_offset{static_cast<s32>(offset.U32())}; 145 const s32 signed_offset{static_cast<s32>(offset.U32())};
146 if (signed_offset < 0 || u32_offset > cbuf_size) { 146 if (signed_offset < 0 || u32_offset > cbuf_size) {
@@ -308,21 +308,13 @@ void EmitSetAttribute(EmitContext& ctx, IR::Attribute attr, std::string_view val
308 case IR::Attribute::ColorFrontDiffuseG: 308 case IR::Attribute::ColorFrontDiffuseG:
309 case IR::Attribute::ColorFrontDiffuseB: 309 case IR::Attribute::ColorFrontDiffuseB:
310 case IR::Attribute::ColorFrontDiffuseA: 310 case IR::Attribute::ColorFrontDiffuseA:
311 if (ctx.stage == Stage::Fragment) { 311 ctx.Add("gl_FrontColor.{}={};", swizzle, value);
312 ctx.Add("gl_Color.{}={};", swizzle, value);
313 } else {
314 ctx.Add("gl_FrontColor.{}={};", swizzle, value);
315 }
316 break; 312 break;
317 case IR::Attribute::ColorFrontSpecularR: 313 case IR::Attribute::ColorFrontSpecularR:
318 case IR::Attribute::ColorFrontSpecularG: 314 case IR::Attribute::ColorFrontSpecularG:
319 case IR::Attribute::ColorFrontSpecularB: 315 case IR::Attribute::ColorFrontSpecularB:
320 case IR::Attribute::ColorFrontSpecularA: 316 case IR::Attribute::ColorFrontSpecularA:
321 if (ctx.stage == Stage::Fragment) { 317 ctx.Add("gl_FrontSecondaryColor.{}={};", swizzle, value);
322 ctx.Add("gl_SecondaryColor.{}={};", swizzle, value);
323 } else {
324 ctx.Add("gl_FrontSecondaryColor.{}={};", swizzle, value);
325 }
326 break; 318 break;
327 case IR::Attribute::ColorBackDiffuseR: 319 case IR::Attribute::ColorBackDiffuseR:
328 case IR::Attribute::ColorBackDiffuseG: 320 case IR::Attribute::ColorBackDiffuseG:
diff --git a/src/shader_recompiler/backend/glsl/emit_glsl_integer.cpp b/src/shader_recompiler/backend/glsl/emit_glsl_integer.cpp
index 7a2f79d10..983e6d95d 100644
--- a/src/shader_recompiler/backend/glsl/emit_glsl_integer.cpp
+++ b/src/shader_recompiler/backend/glsl/emit_glsl_integer.cpp
@@ -28,6 +28,7 @@ void SetSignFlag(EmitContext& ctx, IR::Inst& inst, std::string_view result) {
28 sign->Invalidate(); 28 sign->Invalidate();
29} 29}
30} // Anonymous namespace 30} // Anonymous namespace
31
31void EmitIAdd32(EmitContext& ctx, IR::Inst& inst, std::string_view a, std::string_view b) { 32void EmitIAdd32(EmitContext& ctx, IR::Inst& inst, std::string_view a, std::string_view b) {
32 const auto result{ctx.var_alloc.Define(inst, GlslVarType::U32)}; 33 const auto result{ctx.var_alloc.Define(inst, GlslVarType::U32)};
33 if (IR::Inst* const carry{inst.GetAssociatedPseudoOperation(IR::Opcode::GetCarryFromOp)}) { 34 if (IR::Inst* const carry{inst.GetAssociatedPseudoOperation(IR::Opcode::GetCarryFromOp)}) {
diff --git a/src/shader_recompiler/backend/glsl/emit_glsl_shared_memory.cpp b/src/shader_recompiler/backend/glsl/emit_glsl_shared_memory.cpp
index 8a13bf617..518b78f06 100644
--- a/src/shader_recompiler/backend/glsl/emit_glsl_shared_memory.cpp
+++ b/src/shader_recompiler/backend/glsl/emit_glsl_shared_memory.cpp
@@ -20,6 +20,7 @@ void SharedWriteCas(EmitContext& ctx, std::string_view offset, std::string_view
20 ctx.Add(cas_loop, smem, smem, smem, value, bit_offset, num_bits); 20 ctx.Add(cas_loop, smem, smem, smem, value, bit_offset, num_bits);
21} 21}
22} // Anonymous namespace 22} // Anonymous namespace
23
23void EmitLoadSharedU8(EmitContext& ctx, IR::Inst& inst, std::string_view offset) { 24void EmitLoadSharedU8(EmitContext& ctx, IR::Inst& inst, std::string_view offset) {
24 ctx.AddU32("{}=bitfieldExtract(smem[{}>>2],int({}%4)*8,8);", inst, offset, offset); 25 ctx.AddU32("{}=bitfieldExtract(smem[{}>>2],int({}%4)*8,8);", inst, offset, offset);
25} 26}
diff --git a/src/shader_recompiler/backend/glsl/emit_glsl_warp.cpp b/src/shader_recompiler/backend/glsl/emit_glsl_warp.cpp
index 7047928fd..4d418cbbc 100644
--- a/src/shader_recompiler/backend/glsl/emit_glsl_warp.cpp
+++ b/src/shader_recompiler/backend/glsl/emit_glsl_warp.cpp
@@ -43,7 +43,7 @@ void UseShuffleNv(EmitContext& ctx, IR::Inst& inst, std::string_view shfl_op,
43 ctx.AddU32("{}={}({},{},{},shfl_in_bounds);", inst, shfl_op, value, index, width); 43 ctx.AddU32("{}={}({},{},{},shfl_in_bounds);", inst, shfl_op, value, index, width);
44 SetInBoundsFlag(ctx, inst); 44 SetInBoundsFlag(ctx, inst);
45} 45}
46} // namespace 46} // Anonymous namespace
47 47
48void EmitLaneId(EmitContext& ctx, IR::Inst& inst) { 48void EmitLaneId(EmitContext& ctx, IR::Inst& inst) {
49 ctx.AddU32("{}=gl_SubGroupInvocationARB&31u;", inst); 49 ctx.AddU32("{}=gl_SubGroupInvocationARB&31u;", inst);
diff --git a/src/shader_recompiler/backend/glsl/var_alloc.cpp b/src/shader_recompiler/backend/glsl/var_alloc.cpp
index cbf56491c..194f926ca 100644
--- a/src/shader_recompiler/backend/glsl/var_alloc.cpp
+++ b/src/shader_recompiler/backend/glsl/var_alloc.cpp
@@ -177,8 +177,7 @@ Id VarAlloc::Alloc(GlslVarType type) {
177 177
178void VarAlloc::Free(Id id) { 178void VarAlloc::Free(Id id) {
179 if (id.is_valid == 0) { 179 if (id.is_valid == 0) {
180 // throw LogicError("Freeing invalid variable"); 180 throw LogicError("Freeing invalid variable");
181 return;
182 } 181 }
183 auto& use_tracker{GetUseTracker(id.type)}; 182 auto& use_tracker{GetUseTracker(id.type)};
184 use_tracker.var_use[id.index] = false; 183 use_tracker.var_use[id.index] = false;