diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/shader_recompiler/backend/glsl/emit_context.cpp | 3 | ||||
| -rw-r--r-- | src/shader_recompiler/backend/glsl/emit_glsl.cpp | 12 | ||||
| -rw-r--r-- | src/shader_recompiler/backend/glsl/var_alloc.cpp | 34 |
3 files changed, 25 insertions, 24 deletions
diff --git a/src/shader_recompiler/backend/glsl/emit_context.cpp b/src/shader_recompiler/backend/glsl/emit_context.cpp index 01403ca17..2375b7a06 100644 --- a/src/shader_recompiler/backend/glsl/emit_context.cpp +++ b/src/shader_recompiler/backend/glsl/emit_context.cpp | |||
| @@ -150,7 +150,7 @@ void SetupOutPerVertex(Stage stage, const Info& info, std::string& header) { | |||
| 150 | if (info.stores_clip_distance) { | 150 | if (info.stores_clip_distance) { |
| 151 | header += "float gl_ClipDistance[];"; | 151 | header += "float gl_ClipDistance[];"; |
| 152 | } | 152 | } |
| 153 | header += "};"; | 153 | header += "};\n"; |
| 154 | } | 154 | } |
| 155 | } // namespace | 155 | } // namespace |
| 156 | 156 | ||
| @@ -223,6 +223,7 @@ EmitContext::EmitContext(IR::Program& program, Bindings& bindings, const Profile | |||
| 223 | header += declaration; | 223 | header += declaration; |
| 224 | } | 224 | } |
| 225 | } | 225 | } |
| 226 | header += "\n"; | ||
| 226 | DefineConstantBuffers(bindings); | 227 | DefineConstantBuffers(bindings); |
| 227 | DefineStorageBuffers(bindings); | 228 | DefineStorageBuffers(bindings); |
| 228 | SetupImages(bindings); | 229 | SetupImages(bindings); |
diff --git a/src/shader_recompiler/backend/glsl/emit_glsl.cpp b/src/shader_recompiler/backend/glsl/emit_glsl.cpp index f467d978c..bfc42e1b4 100644 --- a/src/shader_recompiler/backend/glsl/emit_glsl.cpp +++ b/src/shader_recompiler/backend/glsl/emit_glsl.cpp | |||
| @@ -180,13 +180,15 @@ void DefineVariables(const EmitContext& ctx, std::string& header) { | |||
| 180 | const auto type{static_cast<GlslVarType>(i)}; | 180 | const auto type{static_cast<GlslVarType>(i)}; |
| 181 | const auto& tracker{ctx.var_alloc.GetUseTracker(type)}; | 181 | const auto& tracker{ctx.var_alloc.GetUseTracker(type)}; |
| 182 | const auto type_name{ctx.var_alloc.GetGlslType(type)}; | 182 | const auto type_name{ctx.var_alloc.GetGlslType(type)}; |
| 183 | const auto precise{ | ||
| 184 | (type == GlslVarType::PrecF32 || type == GlslVarType::PrecF64) ? "precise " : ""}; | ||
| 183 | // Temps/return types that are never used are stored at index 0 | 185 | // Temps/return types that are never used are stored at index 0 |
| 184 | if (tracker.uses_temp) { | 186 | if (tracker.uses_temp) { |
| 185 | header += fmt::format("{}{}={}(0);", type_name, ctx.var_alloc.Representation(0, type), | 187 | header += fmt::format("{}{} {}={}(0);", precise, type_name, |
| 186 | type_name); | 188 | ctx.var_alloc.Representation(0, type), type_name); |
| 187 | } | 189 | } |
| 188 | for (u32 index = 1; index <= tracker.num_used; ++index) { | 190 | for (u32 index = 1; index <= tracker.num_used; ++index) { |
| 189 | header += fmt::format("{}{}={}(0);", type_name, | 191 | header += fmt::format("{}{} {}={}(0);", precise, type_name, |
| 190 | ctx.var_alloc.Representation(index, type), type_name); | 192 | ctx.var_alloc.Representation(index, type), type_name); |
| 191 | } | 193 | } |
| 192 | } | 194 | } |
| @@ -198,7 +200,7 @@ std::string EmitGLSL(const Profile& profile, const RuntimeInfo& runtime_info, IR | |||
| 198 | EmitContext ctx{program, bindings, profile, runtime_info}; | 200 | EmitContext ctx{program, bindings, profile, runtime_info}; |
| 199 | Precolor(program); | 201 | Precolor(program); |
| 200 | EmitCode(ctx, program); | 202 | EmitCode(ctx, program); |
| 201 | const std::string version{fmt::format("#version 450{}\n", GlslVersionSpecifier(ctx))}; | 203 | const std::string version{fmt::format("#version 460{}\n", GlslVersionSpecifier(ctx))}; |
| 202 | ctx.header.insert(0, version); | 204 | ctx.header.insert(0, version); |
| 203 | if (program.local_memory_size > 0) { | 205 | if (program.local_memory_size > 0) { |
| 204 | ctx.header += fmt::format("uint lmem[{}];", program.local_memory_size / 4); | 206 | ctx.header += fmt::format("uint lmem[{}];", program.local_memory_size / 4); |
| @@ -206,7 +208,7 @@ std::string EmitGLSL(const Profile& profile, const RuntimeInfo& runtime_info, IR | |||
| 206 | if (program.shared_memory_size > 0) { | 208 | if (program.shared_memory_size > 0) { |
| 207 | ctx.header += fmt::format("shared uint smem[{}];", program.shared_memory_size / 4); | 209 | ctx.header += fmt::format("shared uint smem[{}];", program.shared_memory_size / 4); |
| 208 | } | 210 | } |
| 209 | ctx.header += "void main(){\n"; | 211 | ctx.header += "\nvoid main(){\n"; |
| 210 | if (program.stage == Stage::VertexA || program.stage == Stage::VertexB) { | 212 | if (program.stage == Stage::VertexA || program.stage == Stage::VertexB) { |
| 211 | ctx.header += "gl_Position = vec4(0.0f, 0.0f, 0.0f, 1.0f);"; | 213 | ctx.header += "gl_Position = vec4(0.0f, 0.0f, 0.0f, 1.0f);"; |
| 212 | // TODO: Properly resolve attribute issues | 214 | // TODO: Properly resolve attribute issues |
diff --git a/src/shader_recompiler/backend/glsl/var_alloc.cpp b/src/shader_recompiler/backend/glsl/var_alloc.cpp index 2ecdec7f2..1ab64add4 100644 --- a/src/shader_recompiler/backend/glsl/var_alloc.cpp +++ b/src/shader_recompiler/backend/glsl/var_alloc.cpp | |||
| @@ -202,37 +202,35 @@ GlslVarType VarAlloc::RegType(IR::Type type) const { | |||
| 202 | std::string VarAlloc::GetGlslType(GlslVarType type) const { | 202 | std::string VarAlloc::GetGlslType(GlslVarType type) const { |
| 203 | switch (type) { | 203 | switch (type) { |
| 204 | case GlslVarType::U1: | 204 | case GlslVarType::U1: |
| 205 | return "bool "; | 205 | return "bool"; |
| 206 | case GlslVarType::F16x2: | 206 | case GlslVarType::F16x2: |
| 207 | return "f16vec2 "; | 207 | return "f16vec2"; |
| 208 | case GlslVarType::U32: | 208 | case GlslVarType::U32: |
| 209 | return "uint "; | 209 | return "uint"; |
| 210 | case GlslVarType::S32: | 210 | case GlslVarType::S32: |
| 211 | return "int "; | 211 | return "int"; |
| 212 | case GlslVarType::F32: | 212 | case GlslVarType::F32: |
| 213 | return "float "; | 213 | case GlslVarType::PrecF32: |
| 214 | return "float"; | ||
| 214 | case GlslVarType::S64: | 215 | case GlslVarType::S64: |
| 215 | return "int64_t "; | 216 | return "int64_t"; |
| 216 | case GlslVarType::U64: | 217 | case GlslVarType::U64: |
| 217 | return "uint64_t "; | 218 | return "uint64_t"; |
| 218 | case GlslVarType::F64: | 219 | case GlslVarType::F64: |
| 219 | return "double "; | 220 | case GlslVarType::PrecF64: |
| 221 | return "double"; | ||
| 220 | case GlslVarType::U32x2: | 222 | case GlslVarType::U32x2: |
| 221 | return "uvec2 "; | 223 | return "uvec2"; |
| 222 | case GlslVarType::F32x2: | 224 | case GlslVarType::F32x2: |
| 223 | return "vec2 "; | 225 | return "vec2"; |
| 224 | case GlslVarType::U32x3: | 226 | case GlslVarType::U32x3: |
| 225 | return "uvec3 "; | 227 | return "uvec3"; |
| 226 | case GlslVarType::F32x3: | 228 | case GlslVarType::F32x3: |
| 227 | return "vec3 "; | 229 | return "vec3"; |
| 228 | case GlslVarType::U32x4: | 230 | case GlslVarType::U32x4: |
| 229 | return "uvec4 "; | 231 | return "uvec4"; |
| 230 | case GlslVarType::F32x4: | 232 | case GlslVarType::F32x4: |
| 231 | return "vec4 "; | 233 | return "vec4"; |
| 232 | case GlslVarType::PrecF32: | ||
| 233 | return "precise float "; | ||
| 234 | case GlslVarType::PrecF64: | ||
| 235 | return "precise double "; | ||
| 236 | case GlslVarType::Void: | 234 | case GlslVarType::Void: |
| 237 | return ""; | 235 | return ""; |
| 238 | default: | 236 | default: |