diff options
Diffstat (limited to 'src/shader_recompiler/backend/glasm')
-rw-r--r-- | src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp b/src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp index 8d2b9d569..decceaaf3 100644 --- a/src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp +++ b/src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp @@ -1,4 +1,5 @@ // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 citron Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include <string_view> @@ -7,6 +8,7 @@ #include "shader_recompiler/backend/glasm/glasm_emit_context.h" #include "shader_recompiler/frontend/ir/value.h" #include "shader_recompiler/profile.h" +#include "shader_recompiler/runtime_info.h" #include "shader_recompiler/shader_info.h" namespace Shader::Backend::GLASM { @@ -403,6 +405,8 @@ void EmitInvocationId(EmitContext& ctx, IR::Inst& inst) { void EmitInvocationInfo(EmitContext& ctx, IR::Inst& inst) { switch (ctx.stage) { case Stage::TessellationControl: + ctx.Add("SHL.U {}.x,primitive.vertexcount,16;", inst); + break; case Stage::TessellationEval: ctx.Add("SHL.U {}.x,primitive.vertexcount,16;", inst); break; @@ -410,7 +414,47 @@ void EmitInvocationInfo(EmitContext& ctx, IR::Inst& inst) { // Return sample mask in upper 16 bits ctx.Add("SHL.U {}.x,fragment.samplemask,16;", inst); break; + case Stage::Geometry: { + // Return vertex count in upper 16 bits based on input topology + // Using a lookup table approach for vertex counts + const std::array<u32, 5> vertex_counts = { + 1, // Points + 2, // Lines + 4, // LinesAdjacency + 3, // Triangles + 6 // TrianglesAdjacency + }; + + // Map the input topology to an index in our lookup table + u32 topology_index = 0; + switch (ctx.runtime_info.input_topology) { + case Shader::InputTopology::Lines: + topology_index = 1; + break; + case Shader::InputTopology::LinesAdjacency: + topology_index = 2; + break; + case Shader::InputTopology::Triangles: + topology_index = 3; + break; + case Shader::InputTopology::TrianglesAdjacency: + topology_index = 4; + break; + case Shader::InputTopology::Points: + default: + topology_index = 0; + break; + } + + // Get the vertex count from the lookup table and shift it + const u32 result = vertex_counts[topology_index] << 16; + ctx.Add("MOV.S {}.x,0x{:x};", inst, result); + break; + } case Stage::Compute: + // Return standard format (0x00ff0000) + ctx.Add("MOV.S {}.x,0x00ff0000;", inst); + break; default: // Return standard format (0x00ff0000) ctx.Add("MOV.S {}.x,0x00ff0000;", inst); |