Просмотр исходного кода

glsl: Add a more robust fp formatter

ameerj 5 лет назад
Родитель
Сommit
cdde730219

+ 0 - 1
src/shader_recompiler/backend/glsl/emit_glsl.cpp

@@ -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;

+ 2 - 2
src/shader_recompiler/backend/glsl/emit_glsl_floating_point.cpp

@@ -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,

+ 2 - 2
src/shader_recompiler/backend/glsl/emit_glsl_integer.cpp

@@ -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 - 4
src/shader_recompiler/backend/glsl/reg_alloc.cpp

@@ -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());
     }
     }