pipeline_cache: More fixes to depth stencil state

This commit is contained in:
IndecisiveTurtle 2024-09-15 21:18:41 +03:00
commit f01d075dac
4 changed files with 46 additions and 35 deletions

View file

@ -306,11 +306,18 @@ struct Liverpool {
BitField<30, 1, u32> enable_color_writes_on_depth_fail; BitField<30, 1, u32> enable_color_writes_on_depth_fail;
BitField<31, 1, u32> disable_color_writes_on_depth_pass; BitField<31, 1, u32> disable_color_writes_on_depth_pass;
static constexpr u32 Mask() { constexpr u32 DepthState() const {
return decltype(stencil_enable)::mask | decltype(depth_enable)::mask | static constexpr u32 DepthMask =
decltype(depth_write_enable)::mask | decltype(depth_bounds_enable)::mask | decltype(depth_enable)::mask | decltype(depth_write_enable)::mask |
decltype(depth_func)::mask | decltype(backface_enable)::mask | decltype(depth_bounds_enable)::mask | decltype(depth_func)::mask;
return raw & DepthMask;
}
constexpr u32 StencilState() const {
static constexpr u32 StencilMask =
decltype(stencil_enable)::mask | decltype(backface_enable)::mask |
decltype(stencil_ref_func)::mask | decltype(stencil_bf_func)::mask; decltype(stencil_ref_func)::mask | decltype(stencil_bf_func)::mask;
return raw & StencilMask;
} }
}; };

View file

@ -153,33 +153,33 @@ GraphicsPipeline::GraphicsPipeline(const Instance& instance_, Scheduler& schedul
}; };
const vk::PipelineDepthStencilStateCreateInfo depth_info = { const vk::PipelineDepthStencilStateCreateInfo depth_info = {
.depthTestEnable = key.depth.depth_enable, .depthTestEnable = key.depth_stencil.depth_enable,
.depthWriteEnable = key.depth.depth_write_enable, .depthWriteEnable = key.depth_stencil.depth_write_enable,
.depthCompareOp = LiverpoolToVK::CompareOp(key.depth.depth_func), .depthCompareOp = LiverpoolToVK::CompareOp(key.depth_stencil.depth_func),
.depthBoundsTestEnable = key.depth.depth_bounds_enable, .depthBoundsTestEnable = key.depth_stencil.depth_bounds_enable,
.stencilTestEnable = key.depth.stencil_enable, .stencilTestEnable = key.depth_stencil.stencil_enable,
.front{ .front{
.failOp = LiverpoolToVK::StencilOp(key.stencil.stencil_fail_front), .failOp = LiverpoolToVK::StencilOp(key.stencil.stencil_fail_front),
.passOp = LiverpoolToVK::StencilOp(key.stencil.stencil_zpass_front), .passOp = LiverpoolToVK::StencilOp(key.stencil.stencil_zpass_front),
.depthFailOp = LiverpoolToVK::StencilOp(key.stencil.stencil_zfail_front), .depthFailOp = LiverpoolToVK::StencilOp(key.stencil.stencil_zfail_front),
.compareOp = LiverpoolToVK::CompareOp(key.depth.stencil_ref_func), .compareOp = LiverpoolToVK::CompareOp(key.depth_stencil.stencil_ref_func),
.compareMask = key.stencil_ref_front.stencil_mask, .compareMask = key.stencil_ref_front.stencil_mask,
.writeMask = key.stencil_ref_front.stencil_write_mask, .writeMask = key.stencil_ref_front.stencil_write_mask,
.reference = key.stencil_ref_front.stencil_test_val, .reference = key.stencil_ref_front.stencil_test_val,
}, },
.back{ .back{
.failOp = LiverpoolToVK::StencilOp(key.depth.backface_enable .failOp = LiverpoolToVK::StencilOp(key.depth_stencil.backface_enable
? key.stencil.stencil_fail_back.Value() ? key.stencil.stencil_fail_back.Value()
: key.stencil.stencil_fail_front.Value()), : key.stencil.stencil_fail_front.Value()),
.passOp = LiverpoolToVK::StencilOp(key.depth.backface_enable .passOp = LiverpoolToVK::StencilOp(key.depth_stencil.backface_enable
? key.stencil.stencil_zpass_back.Value() ? key.stencil.stencil_zpass_back.Value()
: key.stencil.stencil_zpass_front.Value()), : key.stencil.stencil_zpass_front.Value()),
.depthFailOp = LiverpoolToVK::StencilOp(key.depth.backface_enable .depthFailOp = LiverpoolToVK::StencilOp(key.depth_stencil.backface_enable
? key.stencil.stencil_zfail_back.Value() ? key.stencil.stencil_zfail_back.Value()
: key.stencil.stencil_zfail_front.Value()), : key.stencil.stencil_zfail_front.Value()),
.compareOp = LiverpoolToVK::CompareOp(key.depth.backface_enable .compareOp = LiverpoolToVK::CompareOp(key.depth_stencil.backface_enable
? key.depth.stencil_bf_func.Value() ? key.depth_stencil.stencil_bf_func.Value()
: key.depth.stencil_ref_func.Value()), : key.depth_stencil.stencil_ref_func.Value()),
.compareMask = key.stencil_ref_back.stencil_mask, .compareMask = key.stencil_ref_back.stencil_mask,
.writeMask = key.stencil_ref_back.stencil_write_mask, .writeMask = key.stencil_ref_back.stencil_write_mask,
.reference = key.stencil_ref_back.stencil_test_val, .reference = key.stencil_ref_back.stencil_test_val,

View file

@ -30,7 +30,7 @@ struct GraphicsPipelineKey {
vk::Format depth_format; vk::Format depth_format;
vk::Format stencil_format; vk::Format stencil_format;
Liverpool::DepthControl depth; Liverpool::DepthControl depth_stencil;
float depth_bounds_min; float depth_bounds_min;
float depth_bounds_max; float depth_bounds_max;
float depth_bias_const_factor; float depth_bias_const_factor;
@ -91,7 +91,7 @@ public:
} }
bool IsDepthEnabled() const { bool IsDepthEnabled() const {
return key.depth.depth_enable.Value(); return key.depth_stencil.depth_enable.Value();
} }
private: private:

View file

@ -208,14 +208,16 @@ bool PipelineCache::RefreshGraphicsKey() {
if (depth_enable) { if (depth_enable) {
const bool depth_write = regs.depth_control.depth_write_enable.Value() && const bool depth_write = regs.depth_control.depth_write_enable.Value() &&
!regs.depth_render_control.depth_clear_enable; !regs.depth_render_control.depth_clear_enable;
key.depth.depth_write_enable.Assign(depth_write); key.depth_stencil.raw |= regs.depth_control.DepthState();
key.depth = regs.depth_control; key.depth_stencil.depth_write_enable.Assign(depth_write);
key.depth.raw &= Liverpool::DepthControl::Mask(); if (key.depth_stencil.depth_bounds_enable) {
key.depth_bounds_min = regs.depth_bounds_min; key.depth_bounds_min = regs.depth_bounds_min;
key.depth_bounds_max = regs.depth_bounds_max; key.depth_bounds_max = regs.depth_bounds_max;
}
key.depth_bias_enable = regs.polygon_control.enable_polygon_offset_back || key.depth_bias_enable = regs.polygon_control.enable_polygon_offset_back ||
regs.polygon_control.enable_polygon_offset_front || regs.polygon_control.enable_polygon_offset_front ||
regs.polygon_control.enable_polygon_offset_para; regs.polygon_control.enable_polygon_offset_para;
if (key.depth_bias_enable) {
if (regs.polygon_control.enable_polygon_offset_front) { if (regs.polygon_control.enable_polygon_offset_front) {
key.depth_bias_const_factor = regs.poly_offset.front_offset; key.depth_bias_const_factor = regs.poly_offset.front_offset;
key.depth_bias_slope_factor = regs.poly_offset.front_scale; key.depth_bias_slope_factor = regs.poly_offset.front_scale;
@ -224,6 +226,7 @@ bool PipelineCache::RefreshGraphicsKey() {
key.depth_bias_slope_factor = regs.poly_offset.back_scale; key.depth_bias_slope_factor = regs.poly_offset.back_scale;
} }
key.depth_bias_clamp = regs.poly_offset.depth_bias; key.depth_bias_clamp = regs.poly_offset.depth_bias;
}
const auto ds_format = LiverpoolToVK::DepthFormat(db.z_info.format, db.stencil_info.format); const auto ds_format = LiverpoolToVK::DepthFormat(db.z_info.format, db.stencil_info.format);
@ -232,14 +235,15 @@ bool PipelineCache::RefreshGraphicsKey() {
} else { } else {
key.depth_format = vk::Format::eUndefined; key.depth_format = vk::Format::eUndefined;
} }
if (key.depth.depth_enable) { if (regs.depth_control.depth_enable) {
key.depth.depth_enable.Assign(key.depth_format != vk::Format::eUndefined); key.depth_stencil.depth_enable.Assign(key.depth_format != vk::Format::eUndefined);
} }
} }
const bool stencil_enable = const bool stencil_enable =
regs.depth_control.stencil_enable && regs.depth_control.stencil_enable &&
db.stencil_info.format != Liverpool::DepthBuffer::StencilFormat::Invalid; db.stencil_info.format != Liverpool::DepthBuffer::StencilFormat::Invalid;
if (stencil_enable) { if (stencil_enable) {
key.depth_stencil.raw |= regs.depth_control.StencilState();
key.stencil = regs.stencil_control; key.stencil = regs.stencil_control;
key.stencil.raw &= Liverpool::StencilControl::Mask(); key.stencil.raw &= Liverpool::StencilControl::Mask();
key.stencil_ref_front = regs.stencil_ref_front; key.stencil_ref_front = regs.stencil_ref_front;
@ -250,8 +254,8 @@ bool PipelineCache::RefreshGraphicsKey() {
} else { } else {
key.stencil_format = vk::Format::eUndefined; key.stencil_format = vk::Format::eUndefined;
} }
if (key.depth.stencil_enable) { if (regs.depth_control.stencil_enable) {
key.depth.stencil_enable.Assign(key.stencil_format != vk::Format::eUndefined); key.depth_stencil.stencil_enable.Assign(key.stencil_format != vk::Format::eUndefined);
} }
} }
key.prim_type = regs.primitive_type; key.prim_type = regs.primitive_type;