glsl: Add a more robust fp formatter
This commit is contained in:
		| @@ -146,7 +146,6 @@ void EmitCode(EmitContext& ctx, const IR::Program& program) { | |||||||
| std::string EmitGLSL(const Profile& profile, const RuntimeInfo&, IR::Program& program, | std::string EmitGLSL(const Profile& profile, const RuntimeInfo&, IR::Program& program, | ||||||
|                      Bindings& bindings) { |                      Bindings& bindings) { | ||||||
|     EmitContext ctx{program, bindings, profile}; |     EmitContext ctx{program, bindings, profile}; | ||||||
|     // ctx.SetupBuffers(); |  | ||||||
|     EmitCode(ctx, program); |     EmitCode(ctx, program); | ||||||
|     ctx.code += "}"; |     ctx.code += "}"; | ||||||
|     return ctx.code; |     return ctx.code; | ||||||
|   | |||||||
| @@ -101,12 +101,12 @@ void EmitFPNeg16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] IR::Inst& i | |||||||
|  |  | ||||||
| void EmitFPNeg32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] IR::Inst& inst, | void EmitFPNeg32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] IR::Inst& inst, | ||||||
|                  [[maybe_unused]] std::string_view value) { |                  [[maybe_unused]] std::string_view value) { | ||||||
|     ctx.AddF32("{}=-{};", inst, value); |     ctx.AddF32("{}=-({});", inst, value); | ||||||
| } | } | ||||||
|  |  | ||||||
| void EmitFPNeg64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] IR::Inst& inst, | void EmitFPNeg64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] IR::Inst& inst, | ||||||
|                  [[maybe_unused]] std::string_view value) { |                  [[maybe_unused]] std::string_view value) { | ||||||
|     ctx.AddF64("{}=-{};", inst, value); |     ctx.AddF64("{}=-({});", inst, value); | ||||||
| } | } | ||||||
|  |  | ||||||
| void EmitFPSin([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] IR::Inst& inst, | void EmitFPSin([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] IR::Inst& inst, | ||||||
|   | |||||||
| @@ -31,11 +31,11 @@ void EmitIMul32(EmitContext& ctx, IR::Inst& inst, std::string_view a, std::strin | |||||||
| } | } | ||||||
|  |  | ||||||
| void EmitINeg32(EmitContext& ctx, IR::Inst& inst, std::string_view value) { | void EmitINeg32(EmitContext& ctx, IR::Inst& inst, std::string_view value) { | ||||||
|     ctx.AddU32("{}=-{};", inst, value); |     ctx.AddU32("{}=-({});", inst, value); | ||||||
| } | } | ||||||
|  |  | ||||||
| void EmitINeg64(EmitContext& ctx, IR::Inst& inst, std::string_view value) { | void EmitINeg64(EmitContext& ctx, IR::Inst& inst, std::string_view value) { | ||||||
|     ctx.AddU64("{}=-{};", inst, value); |     ctx.AddU64("{}=-({});", inst, value); | ||||||
| } | } | ||||||
|  |  | ||||||
| void EmitIAbs32(EmitContext& ctx, IR::Inst& inst, std::string_view value) { | void EmitIAbs32(EmitContext& ctx, IR::Inst& inst, std::string_view value) { | ||||||
|   | |||||||
| @@ -10,10 +10,9 @@ | |||||||
| #include "shader_recompiler/backend/glsl/reg_alloc.h" | #include "shader_recompiler/backend/glsl/reg_alloc.h" | ||||||
| #include "shader_recompiler/exception.h" | #include "shader_recompiler/exception.h" | ||||||
| #include "shader_recompiler/frontend/ir/value.h" | #include "shader_recompiler/frontend/ir/value.h" | ||||||
| #pragma optimize("", off) |  | ||||||
| namespace Shader::Backend::GLSL { | namespace Shader::Backend::GLSL { | ||||||
| namespace { | namespace { | ||||||
|  |  | ||||||
| std::string Representation(Id id) { | std::string Representation(Id id) { | ||||||
|     if (id.is_condition_code != 0) { |     if (id.is_condition_code != 0) { | ||||||
|         throw NotImplementedException("Condition code"); |         throw NotImplementedException("Condition code"); | ||||||
| @@ -25,6 +24,13 @@ std::string Representation(Id id) { | |||||||
|     return fmt::format("R{}", index); |     return fmt::format("R{}", index); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | std::string FormatFloat(std::string_view value, IR::Type type) { | ||||||
|  |     const bool needs_dot = value.find_first_of('.') == std::string_view::npos; | ||||||
|  |     const bool needs_suffix = !value.ends_with('f'); | ||||||
|  |     const auto suffix = type == IR::Type::F32 ? "f" : "lf"; | ||||||
|  |     return fmt::format("{}{}{}", value, needs_dot ? "." : "", needs_suffix ? suffix : ""); | ||||||
|  | } | ||||||
|  |  | ||||||
| std::string MakeImm(const IR::Value& value) { | std::string MakeImm(const IR::Value& value) { | ||||||
|     switch (value.Type()) { |     switch (value.Type()) { | ||||||
|     case IR::Type::U1: |     case IR::Type::U1: | ||||||
| @@ -32,11 +38,11 @@ std::string MakeImm(const IR::Value& value) { | |||||||
|     case IR::Type::U32: |     case IR::Type::U32: | ||||||
|         return fmt::format("{}u", value.U32()); |         return fmt::format("{}u", value.U32()); | ||||||
|     case IR::Type::F32: |     case IR::Type::F32: | ||||||
|         return fmt::format("{}f", value.F32()); |         return FormatFloat(fmt::format("{}", value.F32()), IR::Type::F32); | ||||||
|     case IR::Type::U64: |     case IR::Type::U64: | ||||||
|         return fmt::format("{}ul", value.U64()); |         return fmt::format("{}ul", value.U64()); | ||||||
|     case IR::Type::F64: |     case IR::Type::F64: | ||||||
|         return fmt::format("{}lf", value.F64()); |         return FormatFloat(fmt::format("{}", value.F64()), IR::Type::F64); | ||||||
|     default: |     default: | ||||||
|         throw NotImplementedException("Immediate type {}", value.Type()); |         throw NotImplementedException("Immediate type {}", value.Type()); | ||||||
|     } |     } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user