glsl: Fix Cbuf getters for F32 type
This commit is contained in:
		| @@ -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, | void GetCbuf(EmitContext& ctx, std::string_view ret, const IR::Value& binding, | ||||||
|              u32 num_bits, std::string_view cast = {}, bool component_indexing_bug = false, |              const IR::Value& offset, u32 num_bits, std::string_view cast = {}, | ||||||
|              std::string_view bit_offset = {}) { |              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, | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user