mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-07-22 18:15:14 +00:00
54 lines
1.7 KiB
C++
54 lines
1.7 KiB
C++
// SPDX-FileCopyrightText: Copyright 2025 shadPS4 Emulator Project
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
#pragma once
|
|
|
|
#include "shader_recompiler/ir/ir_emitter.h"
|
|
#include "shader_recompiler/runtime_info.h"
|
|
|
|
namespace Shader::IR {
|
|
|
|
/// Maps special position export to builtin attribute stores
|
|
inline void ExportPosition(IREmitter& ir, const auto& stage, Attribute attribute, u32 comp,
|
|
const IR::F32& value) {
|
|
if (attribute == Attribute::Position0) {
|
|
ir.SetAttribute(attribute, value, comp);
|
|
return;
|
|
}
|
|
const u32 index = u32(attribute) - u32(Attribute::Position1);
|
|
const auto output = stage.outputs[index][comp];
|
|
switch (output) {
|
|
case Output::ClipDist0:
|
|
case Output::ClipDist1:
|
|
case Output::ClipDist2:
|
|
case Output::ClipDist3:
|
|
case Output::ClipDist4:
|
|
case Output::ClipDist5:
|
|
case Output::ClipDist6:
|
|
case Output::ClipDist7: {
|
|
const u32 index = u32(output) - u32(Output::ClipDist0);
|
|
ir.SetAttribute(IR::Attribute::ClipDistance, value, index);
|
|
break;
|
|
}
|
|
case Output::CullDist0:
|
|
case Output::CullDist1:
|
|
case Output::CullDist2:
|
|
case Output::CullDist3:
|
|
case Output::CullDist4:
|
|
case Output::CullDist5:
|
|
case Output::CullDist6:
|
|
case Output::CullDist7: {
|
|
const u32 index = u32(output) - u32(Output::CullDist0);
|
|
ir.SetAttribute(IR::Attribute::CullDistance, value, index);
|
|
break;
|
|
}
|
|
case Output::GsMrtIndex:
|
|
ir.SetAttribute(IR::Attribute::RenderTargetId, value);
|
|
break;
|
|
default:
|
|
UNREACHABLE_MSG("Unhandled output {} on attribute {}", u32(output), u32(attribute));
|
|
}
|
|
}
|
|
|
|
} // namespace Shader::IR
|