mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-05-20 10:24:58 +00:00
52 lines
1.8 KiB
C++
52 lines
1.8 KiB
C++
// 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
|