mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-08-04 16:32:39 +00:00
handle en/addr separately
This commit is contained in:
parent
ceeca3d718
commit
dcf659735e
@ -59,12 +59,22 @@ void Translator::EmitPrologue() {
|
||||
// inputs it can be more For now assume that this isn't the case.
|
||||
dst_vreg = IR::VectorReg::V2;
|
||||
for (u32 i = 0; i < 4; i++) {
|
||||
if (True(runtime_info.fs_info.en_flags & Shader::PsInputEnableFlags(1 << i))) {
|
||||
ir.SetVectorReg(dst_vreg++, ir.GetAttribute(IR::Attribute::FragCoord, i));
|
||||
if (True(runtime_info.fs_info.addr_flags & Shader::PsInputFlags(1 << i))) {
|
||||
if (True(runtime_info.fs_info.en_flags & Shader::PsInputFlags(1 << i))) {
|
||||
ir.SetVectorReg(dst_vreg, ir.GetAttribute(IR::Attribute::FragCoord, i));
|
||||
} else {
|
||||
ir.SetVectorReg(dst_vreg, ir.Imm32(0.0f));
|
||||
}
|
||||
++dst_vreg;
|
||||
}
|
||||
}
|
||||
if (True(runtime_info.fs_info.en_flags & Shader::PsInputEnableFlags::FrontFacing)) {
|
||||
ir.SetVectorReg(dst_vreg++, ir.GetAttributeU32(IR::Attribute::IsFrontFace));
|
||||
if (True(runtime_info.fs_info.addr_flags & Shader::PsInputFlags::FrontFacing)) {
|
||||
if (True(runtime_info.fs_info.en_flags & Shader::PsInputFlags::FrontFacing)) {
|
||||
ir.SetVectorReg(dst_vreg, ir.GetAttributeU32(IR::Attribute::IsFrontFace));
|
||||
} else {
|
||||
ir.SetVectorReg(dst_vreg, ir.Imm32(0));
|
||||
}
|
||||
++dst_vreg;
|
||||
}
|
||||
break;
|
||||
case Stage::Compute:
|
||||
|
@ -96,7 +96,7 @@ enum class MrtSwizzle : u8 {
|
||||
};
|
||||
static constexpr u32 MaxColorBuffers = 8;
|
||||
|
||||
enum class PsInputEnableFlags : u8 {
|
||||
enum class PsInputFlags : u8 {
|
||||
None = 0,
|
||||
PosX = 1 << 0,
|
||||
PosY = 1 << 1,
|
||||
@ -104,7 +104,7 @@ enum class PsInputEnableFlags : u8 {
|
||||
PosW = 1 << 3,
|
||||
FrontFacing = 1 << 4,
|
||||
};
|
||||
DECLARE_ENUM_FLAG_OPERATORS(PsInputEnableFlags)
|
||||
DECLARE_ENUM_FLAG_OPERATORS(PsInputFlags)
|
||||
|
||||
struct FragmentRuntimeInfo {
|
||||
struct PsInput {
|
||||
@ -115,7 +115,8 @@ struct FragmentRuntimeInfo {
|
||||
|
||||
auto operator<=>(const PsInput&) const noexcept = default;
|
||||
};
|
||||
PsInputEnableFlags en_flags;
|
||||
PsInputFlags en_flags;
|
||||
PsInputFlags addr_flags;
|
||||
u32 num_inputs;
|
||||
std::array<PsInput, 32> inputs;
|
||||
struct PsColorBuffer {
|
||||
@ -128,7 +129,8 @@ struct FragmentRuntimeInfo {
|
||||
|
||||
bool operator==(const FragmentRuntimeInfo& other) const noexcept {
|
||||
return std::ranges::equal(color_buffers, other.color_buffers) &&
|
||||
en_flags == other.en_flags && num_inputs == other.num_inputs &&
|
||||
en_flags == other.en_flags && addr_flags == other.addr_flags &&
|
||||
num_inputs == other.num_inputs &&
|
||||
std::ranges::equal(inputs.begin(), inputs.begin() + num_inputs, other.inputs.begin(),
|
||||
other.inputs.begin() + num_inputs);
|
||||
}
|
||||
|
@ -124,21 +124,27 @@ Shader::RuntimeInfo PipelineCache::BuildRuntimeInfo(Shader::Stage stage) {
|
||||
case Shader::Stage::Fragment: {
|
||||
BuildCommon(regs.ps_program);
|
||||
info.fs_info.en_flags =
|
||||
((regs.ps_input_addr.pos_x_float_ena && regs.ps_input_ena.pos_x_float_ena)
|
||||
? Shader::PsInputEnableFlags::PosX
|
||||
: Shader::PsInputEnableFlags::None) |
|
||||
((regs.ps_input_addr.pos_y_float_ena && regs.ps_input_ena.pos_y_float_ena)
|
||||
? Shader::PsInputEnableFlags::PosY
|
||||
: Shader::PsInputEnableFlags::None) |
|
||||
((regs.ps_input_addr.pos_z_float_ena && regs.ps_input_ena.pos_z_float_ena)
|
||||
? Shader::PsInputEnableFlags::PosZ
|
||||
: Shader::PsInputEnableFlags::None) |
|
||||
((regs.ps_input_addr.pos_w_float_ena && regs.ps_input_ena.pos_w_float_ena)
|
||||
? Shader::PsInputEnableFlags::PosW
|
||||
: Shader::PsInputEnableFlags::None) |
|
||||
((regs.ps_input_addr.front_face_ena && regs.ps_input_ena.front_face_ena)
|
||||
? Shader::PsInputEnableFlags::FrontFacing
|
||||
: Shader::PsInputEnableFlags::None);
|
||||
(regs.ps_input_ena.pos_x_float_ena ? Shader::PsInputFlags::PosX
|
||||
: Shader::PsInputFlags::None) |
|
||||
(regs.ps_input_ena.pos_y_float_ena ? Shader::PsInputFlags::PosY
|
||||
: Shader::PsInputFlags::None) |
|
||||
(regs.ps_input_ena.pos_z_float_ena ? Shader::PsInputFlags::PosZ
|
||||
: Shader::PsInputFlags::None) |
|
||||
(regs.ps_input_ena.pos_w_float_ena ? Shader::PsInputFlags::PosW
|
||||
: Shader::PsInputFlags::None) |
|
||||
(regs.ps_input_ena.front_face_ena ? Shader::PsInputFlags::FrontFacing
|
||||
: Shader::PsInputFlags::None);
|
||||
info.fs_info.addr_flags =
|
||||
(regs.ps_input_addr.pos_x_float_ena ? Shader::PsInputFlags::PosX
|
||||
: Shader::PsInputFlags::None) |
|
||||
(regs.ps_input_addr.pos_y_float_ena ? Shader::PsInputFlags::PosY
|
||||
: Shader::PsInputFlags::None) |
|
||||
(regs.ps_input_addr.pos_z_float_ena ? Shader::PsInputFlags::PosZ
|
||||
: Shader::PsInputFlags::None) |
|
||||
(regs.ps_input_addr.pos_w_float_ena ? Shader::PsInputFlags::PosW
|
||||
: Shader::PsInputFlags::None) |
|
||||
(regs.ps_input_addr.front_face_ena ? Shader::PsInputFlags::FrontFacing
|
||||
: Shader::PsInputFlags::None);
|
||||
const auto& ps_inputs = regs.ps_inputs;
|
||||
info.fs_info.num_inputs = regs.num_interp;
|
||||
for (u32 i = 0; i < regs.num_interp; i++) {
|
||||
|
Loading…
Reference in New Issue
Block a user