Procházet zdrojové kódy

glsl: Fix Cbuf getters for F32 type

ameerj před 5 roky
rodič
revize
427a2596a1

+ 15 - 12
src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp

@@ -34,16 +34,16 @@ std::string OutputVertexIndex(EmitContext& ctx) {
     return ctx.stage == Stage::TessellationControl ? "[gl_InvocationID]" : "";
     return ctx.stage == Stage::TessellationControl ? "[gl_InvocationID]" : "";
 }
 }
 
 
-void GetCbuf(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding, const IR::Value& offset,
-             u32 num_bits, std::string_view cast = {}, bool component_indexing_bug = false,
-             std::string_view bit_offset = {}) {
+void GetCbuf(EmitContext& ctx, std::string_view ret, const IR::Value& binding,
+             const IR::Value& offset, u32 num_bits, std::string_view cast = {},
+             bool component_indexing_bug = false, std::string_view bit_offset = {}) {
     const bool is_immediate{offset.IsImmediate()};
     const bool is_immediate{offset.IsImmediate()};
     if (is_immediate) {
     if (is_immediate) {
         const s32 signed_offset{static_cast<s32>(offset.U32())};
         const s32 signed_offset{static_cast<s32>(offset.U32())};
         static constexpr u32 cbuf_size{4096 * 16};
         static constexpr u32 cbuf_size{4096 * 16};
         if (signed_offset < 0 || offset.U32() > cbuf_size) {
         if (signed_offset < 0 || offset.U32() > cbuf_size) {
             // LOG_WARNING(..., "Immediate constant buffer offset is out of bounds");
             // LOG_WARNING(..., "Immediate constant buffer offset is out of bounds");
-            ctx.AddU32("{}=0u;", inst);
+            ctx.Add("{}=0u;", ret);
             return;
             return;
         }
         }
     }
     }
@@ -60,10 +60,9 @@ void GetCbuf(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding, const I
                                                         bit_offset, num_bits)};
                                                         bit_offset, num_bits)};
     if (!component_indexing_bug) {
     if (!component_indexing_bug) {
         const auto result{fmt::format(extraction, swizzle)};
         const auto result{fmt::format(extraction, swizzle)};
-        ctx.AddU32("{}={};", inst, result);
+        ctx.Add("{}={};", ret, result);
         return;
         return;
     }
     }
-    const auto ret{ctx.var_alloc.Define(inst, GlslVarType::U32)};
     const auto cbuf_offset{fmt::format("{}>>2", offset_var)};
     const auto cbuf_offset{fmt::format("{}>>2", offset_var)};
     for (u32 i = 0; i < 4; ++i) {
     for (u32 i = 0; i < 4; ++i) {
         const auto swizzle_string{fmt::format(".{}", "xyzw"[i])};
         const auto swizzle_string{fmt::format(".{}", "xyzw"[i])};
@@ -74,26 +73,28 @@ void GetCbuf(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding, const I
 
 
 void GetCbuf8(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding, const IR::Value& offset,
 void GetCbuf8(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding, const IR::Value& offset,
               std::string_view cast) {
               std::string_view cast) {
+    const auto ret{ctx.var_alloc.Define(inst, GlslVarType::U32)};
     if (offset.IsImmediate()) {
     if (offset.IsImmediate()) {
         const auto bit_offset{fmt::format("{}", (offset.U32() % 4) * 8)};
         const auto bit_offset{fmt::format("{}", (offset.U32() % 4) * 8)};
-        GetCbuf(ctx, inst, binding, offset, 8, cast, false, bit_offset);
+        GetCbuf(ctx, ret, binding, offset, 8, cast, false, bit_offset);
     } else {
     } else {
         const auto offset_var{ctx.var_alloc.Consume(offset)};
         const auto offset_var{ctx.var_alloc.Consume(offset)};
         const auto bit_offset{fmt::format("({}%4)*8", offset_var)};
         const auto bit_offset{fmt::format("({}%4)*8", offset_var)};
-        GetCbuf(ctx, inst, binding, offset, 8, cast, ctx.profile.has_gl_component_indexing_bug,
+        GetCbuf(ctx, ret, binding, offset, 8, cast, ctx.profile.has_gl_component_indexing_bug,
                 bit_offset);
                 bit_offset);
     }
     }
 }
 }
 
 
 void GetCbuf16(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding, const IR::Value& offset,
 void GetCbuf16(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding, const IR::Value& offset,
                std::string_view cast) {
                std::string_view cast) {
+    const auto ret{ctx.var_alloc.Define(inst, GlslVarType::U32)};
     if (offset.IsImmediate()) {
     if (offset.IsImmediate()) {
         const auto bit_offset{fmt::format("{}", ((offset.U32() / 2) % 2) * 16)};
         const auto bit_offset{fmt::format("{}", ((offset.U32() / 2) % 2) * 16)};
-        GetCbuf(ctx, inst, binding, offset, 16, cast, false, bit_offset);
+        GetCbuf(ctx, ret, binding, offset, 16, cast, false, bit_offset);
     } else {
     } else {
         const auto offset_var{ctx.var_alloc.Consume(offset)};
         const auto offset_var{ctx.var_alloc.Consume(offset)};
         const auto bit_offset{fmt::format("(({}>>1)%2)*16", offset_var)};
         const auto bit_offset{fmt::format("(({}>>1)%2)*16", offset_var)};
-        GetCbuf(ctx, inst, binding, offset, 16, cast, ctx.profile.has_gl_component_indexing_bug,
+        GetCbuf(ctx, ret, binding, offset, 16, cast, ctx.profile.has_gl_component_indexing_bug,
                 bit_offset);
                 bit_offset);
     }
     }
 }
 }
@@ -121,12 +122,14 @@ void EmitGetCbufS16(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding,
 
 
 void EmitGetCbufU32(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding,
 void EmitGetCbufU32(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding,
                     const IR::Value& offset) {
                     const IR::Value& offset) {
-    GetCbuf(ctx, inst, binding, offset, 32, "ftou");
+    const auto ret{ctx.var_alloc.Define(inst, GlslVarType::U32)};
+    GetCbuf(ctx, ret, binding, offset, 32, "ftou");
 }
 }
 
 
 void EmitGetCbufF32(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding,
 void EmitGetCbufF32(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding,
                     const IR::Value& offset) {
                     const IR::Value& offset) {
-    GetCbuf(ctx, inst, binding, offset, 32);
+    const auto ret{ctx.var_alloc.Define(inst, GlslVarType::F32)};
+    GetCbuf(ctx, ret, binding, offset, 32);
 }
 }
 
 
 void EmitGetCbufU32x2(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding,
 void EmitGetCbufU32x2(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding,