mirror of
https://git.suyu.dev/suyu/suyu.git
synced 2024-11-25 22:57:22 +00:00
Address PR feedback from Rein
This commit is contained in:
parent
9014861858
commit
1dbf71ceb3
5 changed files with 31 additions and 40 deletions
|
@ -61,8 +61,9 @@ void FixedPipelineState::Fill(const Maxwell& regs, bool has_extended_dynamic_sta
|
||||||
topology.Assign(regs.draw.topology);
|
topology.Assign(regs.draw.topology);
|
||||||
|
|
||||||
alpha_raw = 0;
|
alpha_raw = 0;
|
||||||
alpha_test_enabled.Assign(regs.alpha_test_enabled);
|
const auto test_func =
|
||||||
alpha_test_func.Assign(PackComparisonOp(regs.alpha_test_func));
|
regs.alpha_test_enabled == 1 ? regs.alpha_test_func : Maxwell::ComparisonOp::Always;
|
||||||
|
alpha_test_func.Assign(PackComparisonOp(test_func));
|
||||||
std::memcpy(&alpha_test_ref, ®s.alpha_test_ref, sizeof(u32)); // TODO: C++20 std::bit_cast
|
std::memcpy(&alpha_test_ref, ®s.alpha_test_ref, sizeof(u32)); // TODO: C++20 std::bit_cast
|
||||||
|
|
||||||
std::memcpy(&point_size, ®s.point_size, sizeof(point_size)); // TODO: C++20 std::bit_cast
|
std::memcpy(&point_size, ®s.point_size, sizeof(point_size)); // TODO: C++20 std::bit_cast
|
||||||
|
|
|
@ -188,11 +188,10 @@ struct FixedPipelineState {
|
||||||
BitField<24, 4, Maxwell::PrimitiveTopology> topology;
|
BitField<24, 4, Maxwell::PrimitiveTopology> topology;
|
||||||
};
|
};
|
||||||
|
|
||||||
u32 alpha_test_ref; /// < Alpha test reference
|
u32 alpha_test_ref; ///< Alpha test reference value
|
||||||
union {
|
union {
|
||||||
u32 alpha_raw;
|
u32 alpha_raw;
|
||||||
BitField<0, 3, u32> alpha_test_func;
|
BitField<0, 3, u32> alpha_test_func;
|
||||||
BitField<3, 1, u32> alpha_test_enabled;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
u32 point_size;
|
u32 point_size;
|
||||||
|
|
|
@ -345,12 +345,10 @@ VKPipelineCache::DecompileShaders(const FixedPipelineState& fixed_state) {
|
||||||
specialization.ndc_minus_one_to_one = fixed_state.ndc_minus_one_to_one;
|
specialization.ndc_minus_one_to_one = fixed_state.ndc_minus_one_to_one;
|
||||||
|
|
||||||
// Alpha test
|
// Alpha test
|
||||||
if (fixed_state.alpha_test_enabled == 1) {
|
specialization.alpha_test_func =
|
||||||
specialization.alpha_test_enabled = true;
|
FixedPipelineState::UnpackComparisonOp(fixed_state.alpha_test_func.Value());
|
||||||
specialization.alpha_test_func = static_cast<u8>(fixed_state.alpha_test_func);
|
|
||||||
// memcpy from u32 to float TODO: C++20 std::bit_cast
|
// memcpy from u32 to float TODO: C++20 std::bit_cast
|
||||||
std::memcpy(&specialization.alpha_test_ref, &fixed_state.alpha_test_ref, sizeof(float));
|
std::memcpy(&specialization.alpha_test_ref, &fixed_state.alpha_test_ref, sizeof(float));
|
||||||
}
|
|
||||||
|
|
||||||
SPIRVProgram program;
|
SPIRVProgram program;
|
||||||
std::vector<VkDescriptorSetLayoutBinding> bindings;
|
std::vector<VkDescriptorSetLayoutBinding> bindings;
|
||||||
|
|
|
@ -2075,48 +2075,42 @@ private:
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
void AlphaTest(const Id& pointer) {
|
void AlphaTest(Id pointer) {
|
||||||
const Id true_label = OpLabel();
|
const Id true_label = OpLabel();
|
||||||
const Id skip_label = OpLabel();
|
const Id skip_label = OpLabel();
|
||||||
|
const Id alpha_reference = Constant(t_float, specialization.alpha_test_ref);
|
||||||
|
const Id alpha_value = OpLoad(t_float, pointer);
|
||||||
Id condition;
|
Id condition;
|
||||||
|
using Compare = Maxwell::ComparisonOp;
|
||||||
switch (specialization.alpha_test_func) {
|
switch (specialization.alpha_test_func) {
|
||||||
case VK_COMPARE_OP_NEVER:
|
case Compare::NeverOld:
|
||||||
condition = Constant(t_float, false); // Never true
|
condition = v_false; // Never true
|
||||||
break;
|
break;
|
||||||
case VK_COMPARE_OP_LESS:
|
case Compare::LessOld:
|
||||||
condition = OpFOrdLessThan(t_bool, Constant(t_float, specialization.alpha_test_ref),
|
condition = OpFOrdLessThan(t_bool, alpha_reference, alpha_value);
|
||||||
OpLoad(t_float, pointer));
|
|
||||||
break;
|
break;
|
||||||
case VK_COMPARE_OP_EQUAL:
|
case Compare::EqualOld:
|
||||||
condition = OpFOrdEqual(t_bool, Constant(t_float, specialization.alpha_test_ref),
|
condition = OpFOrdEqual(t_bool, alpha_reference, alpha_value);
|
||||||
OpLoad(t_float, pointer));
|
|
||||||
break;
|
break;
|
||||||
case VK_COMPARE_OP_LESS_OR_EQUAL:
|
case Compare::LessEqualOld:
|
||||||
condition = OpFOrdLessThanEqual(
|
condition = OpFOrdLessThanEqual(t_bool, alpha_reference, alpha_value);
|
||||||
t_bool, Constant(t_float, specialization.alpha_test_ref), OpLoad(t_float, pointer));
|
|
||||||
break;
|
break;
|
||||||
case VK_COMPARE_OP_GREATER:
|
case Compare::GreaterOld:
|
||||||
// Note: requires "Equal" to properly work for ssbu. perhaps a precision issue
|
// Note: requires "Equal" to properly work for ssbu. perhaps a precision issue
|
||||||
condition = OpFOrdGreaterThanEqual(
|
condition = OpFOrdGreaterThanEqual(t_bool, alpha_reference, alpha_value);
|
||||||
t_bool, Constant(t_float, specialization.alpha_test_ref), OpLoad(t_float, pointer));
|
|
||||||
break;
|
break;
|
||||||
case VK_COMPARE_OP_NOT_EQUAL:
|
case Compare::NotEqualOld:
|
||||||
// Note: not accurate when tested against a unit test
|
// Note: not accurate when tested against a unit test
|
||||||
// TODO: confirm if used by games
|
// TODO: confirm if used by games
|
||||||
condition = OpFOrdNotEqual(t_bool, Constant(t_float, specialization.alpha_test_ref),
|
condition = OpFOrdNotEqual(t_bool, alpha_reference, alpha_value);
|
||||||
OpLoad(t_float, pointer));
|
|
||||||
break;
|
break;
|
||||||
case VK_COMPARE_OP_GREATER_OR_EQUAL:
|
case Compare::GreaterEqualOld:
|
||||||
condition = OpFOrdGreaterThanEqual(
|
condition = OpFOrdGreaterThanEqual(t_bool, alpha_reference, alpha_value);
|
||||||
t_bool, Constant(t_float, specialization.alpha_test_ref), OpLoad(t_float, pointer));
|
|
||||||
break;
|
|
||||||
case VK_COMPARE_OP_ALWAYS:
|
|
||||||
condition = Constant(t_bool, true); // Always true
|
|
||||||
break;
|
break;
|
||||||
|
case Compare::AlwaysOld:
|
||||||
|
return;
|
||||||
default:
|
default:
|
||||||
LOG_WARNING(Render_Vulkan, "Unimplemented alpha test function");
|
UNREACHABLE();
|
||||||
condition = Constant(t_bool, true); // Always true
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
OpBranchConditional(condition, true_label, skip_label);
|
OpBranchConditional(condition, true_label, skip_label);
|
||||||
AddLabel(true_label);
|
AddLabel(true_label);
|
||||||
|
@ -2157,7 +2151,7 @@ private:
|
||||||
}
|
}
|
||||||
const Id pointer = AccessElement(t_out_float, frag_colors[rt], component);
|
const Id pointer = AccessElement(t_out_float, frag_colors[rt], component);
|
||||||
OpStore(pointer, SafeGetRegister(current_reg));
|
OpStore(pointer, SafeGetRegister(current_reg));
|
||||||
if (specialization.alpha_test_enabled && component == 3) {
|
if (rt == 0 && component == 3) {
|
||||||
AlphaTest(pointer);
|
AlphaTest(pointer);
|
||||||
}
|
}
|
||||||
++current_reg;
|
++current_reg;
|
||||||
|
|
|
@ -95,9 +95,8 @@ struct Specialization final {
|
||||||
std::bitset<Maxwell::NumVertexAttributes> enabled_attributes;
|
std::bitset<Maxwell::NumVertexAttributes> enabled_attributes;
|
||||||
std::array<Maxwell::VertexAttribute::Type, Maxwell::NumVertexAttributes> attribute_types{};
|
std::array<Maxwell::VertexAttribute::Type, Maxwell::NumVertexAttributes> attribute_types{};
|
||||||
bool ndc_minus_one_to_one{};
|
bool ndc_minus_one_to_one{};
|
||||||
bool alpha_test_enabled{};
|
|
||||||
float alpha_test_ref{};
|
float alpha_test_ref{};
|
||||||
u8 alpha_test_func{};
|
Maxwell::ComparisonOp alpha_test_func{};
|
||||||
};
|
};
|
||||||
// Old gcc versions don't consider this trivially copyable.
|
// Old gcc versions don't consider this trivially copyable.
|
||||||
// static_assert(std::is_trivially_copyable_v<Specialization>);
|
// static_assert(std::is_trivially_copyable_v<Specialization>);
|
||||||
|
|
Loading…
Reference in a new issue