// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include "shader_recompiler/backend/spirv/emit_spirv_instructions.h" #include "shader_recompiler/backend/spirv/spirv_emit_context.h" namespace Shader::Backend::SPIRV { void EmitPrologue(EmitContext& ctx) { ctx.DefineBufferOffsets(); } void ConvertDepthMode(EmitContext& ctx) { const Id type{ctx.F32[1]}; const Id position{ctx.OpLoad(ctx.F32[4], ctx.output_position)}; const Id z{ctx.OpCompositeExtract(type, position, 2u)}; const Id w{ctx.OpCompositeExtract(type, position, 3u)}; const Id screen_depth{ctx.OpFMul(type, ctx.OpFAdd(type, z, w), ctx.Constant(type, 0.5f))}; const Id vector{ctx.OpCompositeInsert(ctx.F32[4], screen_depth, position, 2u)}; ctx.OpStore(ctx.output_position, vector); } void EmitEpilogue(EmitContext& ctx) { if (ctx.stage == Stage::Vertex && ctx.runtime_info.vs_info.emulate_depth_negative_one_to_one) { ConvertDepthMode(ctx); } } void EmitDiscard(EmitContext& ctx) { ctx.OpDemoteToHelperInvocationEXT(); } void EmitDiscardCond(EmitContext& ctx, Id condition) { const Id kill_label{ctx.OpLabel()}; const Id merge_label{ctx.OpLabel()}; ctx.OpSelectionMerge(merge_label, spv::SelectionControlMask::MaskNone); ctx.OpBranchConditional(condition, kill_label, merge_label); ctx.AddLabel(kill_label); ctx.OpDemoteToHelperInvocationEXT(); ctx.OpBranch(merge_label); ctx.AddLabel(merge_label); } void EmitEmitVertex(EmitContext& ctx, const IR::Value& stream) { throw NotImplementedException("Geometry streams"); } void EmitEndPrimitive(EmitContext& ctx, const IR::Value& stream) { throw NotImplementedException("Geometry streams"); } } // namespace Shader::Backend::SPIRV