pipeline_cache: More fixes to depth stencil state

This commit is contained in:
IndecisiveTurtle 2024-09-15 21:18:41 +03:00
parent 38a7098de3
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<31, 1, u32> disable_color_writes_on_depth_pass;
static constexpr u32 Mask() {
return decltype(stencil_enable)::mask | decltype(depth_enable)::mask |
decltype(depth_write_enable)::mask | decltype(depth_bounds_enable)::mask |
decltype(depth_func)::mask | decltype(backface_enable)::mask |
decltype(stencil_ref_func)::mask | decltype(stencil_bf_func)::mask;
constexpr u32 DepthState() const {
static constexpr u32 DepthMask =
decltype(depth_enable)::mask | decltype(depth_write_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;
return raw & StencilMask;
}
};

View file

@ -153,33 +153,33 @@ GraphicsPipeline::GraphicsPipeline(const Instance& instance_, Scheduler& schedul
};
const vk::PipelineDepthStencilStateCreateInfo depth_info = {
.depthTestEnable = key.depth.depth_enable,
.depthWriteEnable = key.depth.depth_write_enable,
.depthCompareOp = LiverpoolToVK::CompareOp(key.depth.depth_func),
.depthBoundsTestEnable = key.depth.depth_bounds_enable,
.stencilTestEnable = key.depth.stencil_enable,
.depthTestEnable = key.depth_stencil.depth_enable,
.depthWriteEnable = key.depth_stencil.depth_write_enable,
.depthCompareOp = LiverpoolToVK::CompareOp(key.depth_stencil.depth_func),
.depthBoundsTestEnable = key.depth_stencil.depth_bounds_enable,
.stencilTestEnable = key.depth_stencil.stencil_enable,
.front{
.failOp = LiverpoolToVK::StencilOp(key.stencil.stencil_fail_front),
.passOp = LiverpoolToVK::StencilOp(key.stencil.stencil_zpass_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,
.writeMask = key.stencil_ref_front.stencil_write_mask,
.reference = key.stencil_ref_front.stencil_test_val,
},
.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_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_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_front.Value()),
.compareOp = LiverpoolToVK::CompareOp(key.depth.backface_enable
? key.depth.stencil_bf_func.Value()
: key.depth.stencil_ref_func.Value()),
.compareOp = LiverpoolToVK::CompareOp(key.depth_stencil.backface_enable
? key.depth_stencil.stencil_bf_func.Value()
: key.depth_stencil.stencil_ref_func.Value()),
.compareMask = key.stencil_ref_back.stencil_mask,
.writeMask = key.stencil_ref_back.stencil_write_mask,
.reference = key.stencil_ref_back.stencil_test_val,

View file

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

View file

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