diff options
| author | JPikachu <jpikachu.eden@gmail.com> | 2025-04-21 03:04:31 +0100 |
|---|---|---|
| committer | swurl <swurl@swurl.xyz> | 2025-04-21 13:34:24 -0400 |
| commit | fc1a3b63101f0b88b8cb0536e68942e1ae0fd6f5 (patch) | |
| tree | 0c6d46eadbbca4e3b61dfa8b836792d7ad08f9d2 /src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp | |
| parent | 609f5e48e053740087100ddbc0199602cb230f5a (diff) | |
shader compiler: Ensure all clip distances are initialized when used
Thank you to Ryujinx (riperiperi specifically) for the pointer towards clip distances
Huge thanks to crueter for finding where the code works and Camille for giving pointers along the way.
Diffstat (limited to 'src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp')
| -rw-r--r-- | src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp index be65db7657..d52ec296ed 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp @@ -53,6 +53,15 @@ std::optional<OutAttr> OutputAttrPointer(EmitContext& ctx, IR::Attribute attr) { return OutputAccessChain(ctx, ctx.output_f32, info.id, index_id); } } + + for (u32 i = 0; i < ctx.profile.max_user_clip_distances; ++i) { + if (!clip_distance_written.test(i)) { + const Id idx = ctx.Const(i); + const Id element = OutputAccessChain(ctx, ctx.output_f32, ctx.clip_distances, idx); + ctx.OpStore(element, ctx.Const(0.0f)); + } + } + switch (attr) { case IR::Attribute::PointSize: return ctx.output_point_size; @@ -421,6 +430,14 @@ void EmitSetAttribute(EmitContext& ctx, IR::Attribute attr, Id value, [[maybe_un if (Sirit::ValidId(output->type)) { value = ctx.OpBitcast(output->type, value); } + + static constexpr IR::Attribute cd0 = IR::Attribute::ClipDistance0; + static constexpr IR::Attribute cd7 = IR::Attribute::ClipDistance7; + + if (attr >= cd0 && attr <= cd7) { + const u32 idx = (u32) attr - (u32) cd0; + clip_distance_written.set(idx); + } ctx.OpStore(output->pointer, value); } |
