handle en/addr separately

This commit is contained in:
Vladislav Mikhalin 2024-12-06 19:55:34 +03:00
parent ceeca3d718
commit dcf659735e
3 changed files with 41 additions and 23 deletions

View File

@ -59,12 +59,22 @@ void Translator::EmitPrologue() {
// inputs it can be more For now assume that this isn't the case. // inputs it can be more For now assume that this isn't the case.
dst_vreg = IR::VectorReg::V2; dst_vreg = IR::VectorReg::V2;
for (u32 i = 0; i < 4; i++) { for (u32 i = 0; i < 4; i++) {
if (True(runtime_info.fs_info.en_flags & Shader::PsInputEnableFlags(1 << i))) { if (True(runtime_info.fs_info.addr_flags & Shader::PsInputFlags(1 << i))) {
ir.SetVectorReg(dst_vreg++, ir.GetAttribute(IR::Attribute::FragCoord, 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)) { if (True(runtime_info.fs_info.addr_flags & Shader::PsInputFlags::FrontFacing)) {
ir.SetVectorReg(dst_vreg++, ir.GetAttributeU32(IR::Attribute::IsFrontFace)); 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; break;
case Stage::Compute: case Stage::Compute:

View File

@ -96,7 +96,7 @@ enum class MrtSwizzle : u8 {
}; };
static constexpr u32 MaxColorBuffers = 8; static constexpr u32 MaxColorBuffers = 8;
enum class PsInputEnableFlags : u8 { enum class PsInputFlags : u8 {
None = 0, None = 0,
PosX = 1 << 0, PosX = 1 << 0,
PosY = 1 << 1, PosY = 1 << 1,
@ -104,7 +104,7 @@ enum class PsInputEnableFlags : u8 {
PosW = 1 << 3, PosW = 1 << 3,
FrontFacing = 1 << 4, FrontFacing = 1 << 4,
}; };
DECLARE_ENUM_FLAG_OPERATORS(PsInputEnableFlags) DECLARE_ENUM_FLAG_OPERATORS(PsInputFlags)
struct FragmentRuntimeInfo { struct FragmentRuntimeInfo {
struct PsInput { struct PsInput {
@ -115,7 +115,8 @@ struct FragmentRuntimeInfo {
auto operator<=>(const PsInput&) const noexcept = default; auto operator<=>(const PsInput&) const noexcept = default;
}; };
PsInputEnableFlags en_flags; PsInputFlags en_flags;
PsInputFlags addr_flags;
u32 num_inputs; u32 num_inputs;
std::array<PsInput, 32> inputs; std::array<PsInput, 32> inputs;
struct PsColorBuffer { struct PsColorBuffer {
@ -128,7 +129,8 @@ struct FragmentRuntimeInfo {
bool operator==(const FragmentRuntimeInfo& other) const noexcept { bool operator==(const FragmentRuntimeInfo& other) const noexcept {
return std::ranges::equal(color_buffers, other.color_buffers) && 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(), std::ranges::equal(inputs.begin(), inputs.begin() + num_inputs, other.inputs.begin(),
other.inputs.begin() + num_inputs); other.inputs.begin() + num_inputs);
} }

View File

@ -124,21 +124,27 @@ Shader::RuntimeInfo PipelineCache::BuildRuntimeInfo(Shader::Stage stage) {
case Shader::Stage::Fragment: { case Shader::Stage::Fragment: {
BuildCommon(regs.ps_program); BuildCommon(regs.ps_program);
info.fs_info.en_flags = info.fs_info.en_flags =
((regs.ps_input_addr.pos_x_float_ena && regs.ps_input_ena.pos_x_float_ena) (regs.ps_input_ena.pos_x_float_ena ? Shader::PsInputFlags::PosX
? Shader::PsInputEnableFlags::PosX : Shader::PsInputFlags::None) |
: Shader::PsInputEnableFlags::None) | (regs.ps_input_ena.pos_y_float_ena ? Shader::PsInputFlags::PosY
((regs.ps_input_addr.pos_y_float_ena && regs.ps_input_ena.pos_y_float_ena) : Shader::PsInputFlags::None) |
? Shader::PsInputEnableFlags::PosY (regs.ps_input_ena.pos_z_float_ena ? Shader::PsInputFlags::PosZ
: Shader::PsInputEnableFlags::None) | : Shader::PsInputFlags::None) |
((regs.ps_input_addr.pos_z_float_ena && regs.ps_input_ena.pos_z_float_ena) (regs.ps_input_ena.pos_w_float_ena ? Shader::PsInputFlags::PosW
? Shader::PsInputEnableFlags::PosZ : Shader::PsInputFlags::None) |
: Shader::PsInputEnableFlags::None) | (regs.ps_input_ena.front_face_ena ? Shader::PsInputFlags::FrontFacing
((regs.ps_input_addr.pos_w_float_ena && regs.ps_input_ena.pos_w_float_ena) : Shader::PsInputFlags::None);
? Shader::PsInputEnableFlags::PosW info.fs_info.addr_flags =
: Shader::PsInputEnableFlags::None) | (regs.ps_input_addr.pos_x_float_ena ? Shader::PsInputFlags::PosX
((regs.ps_input_addr.front_face_ena && regs.ps_input_ena.front_face_ena) : Shader::PsInputFlags::None) |
? Shader::PsInputEnableFlags::FrontFacing (regs.ps_input_addr.pos_y_float_ena ? Shader::PsInputFlags::PosY
: Shader::PsInputEnableFlags::None); : 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; const auto& ps_inputs = regs.ps_inputs;
info.fs_info.num_inputs = regs.num_interp; info.fs_info.num_inputs = regs.num_interp;
for (u32 i = 0; i < regs.num_interp; i++) { for (u32 i = 0; i < regs.num_interp; i++) {