diff --git a/src/video_core/amdgpu/liverpool.h b/src/video_core/amdgpu/liverpool.h index b10f986b1..faad09c92 100644 --- a/src/video_core/amdgpu/liverpool.h +++ b/src/video_core/amdgpu/liverpool.h @@ -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; } }; diff --git a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp index 283c85366..e5d8abf2a 100644 --- a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp +++ b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp @@ -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, diff --git a/src/video_core/renderer_vulkan/vk_graphics_pipeline.h b/src/video_core/renderer_vulkan/vk_graphics_pipeline.h index 6134a82db..485f17c04 100644 --- a/src/video_core/renderer_vulkan/vk_graphics_pipeline.h +++ b/src/video_core/renderer_vulkan/vk_graphics_pipeline.h @@ -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: diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp index 24e6e0de3..75ded5887 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp @@ -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;