@@ -947,81 +947,18 @@ void Rasterizer::UnmapMemory(VAddr addr, u64 size) {
947
947
}
948
948
949
949
void Rasterizer::UpdateDynamicState (const GraphicsPipeline& pipeline) {
950
- UpdateViewportScissorState (pipeline);
950
+ UpdateViewportScissorState ();
951
+ UpdateDepthStencilState ();
951
952
952
- auto & regs = liverpool->regs ;
953
+ const auto & regs = liverpool->regs ;
953
954
const auto cmdbuf = scheduler.CommandBuffer ();
954
955
cmdbuf.setBlendConstants (®s.blend_constants .red );
955
-
956
956
if (instance.IsDynamicColorWriteMaskSupported ()) {
957
957
cmdbuf.setColorWriteMaskEXT (0 , pipeline.GetWriteMasks ());
958
958
}
959
- if (regs.depth_control .depth_bounds_enable ) {
960
- cmdbuf.setDepthBounds (regs.depth_bounds_min , regs.depth_bounds_max );
961
- }
962
- if (regs.polygon_control .enable_polygon_offset_front ) {
963
- cmdbuf.setDepthBias (regs.poly_offset .front_offset , regs.poly_offset .depth_bias ,
964
- regs.poly_offset .front_scale / 16 .f );
965
- } else if (regs.polygon_control .enable_polygon_offset_back ) {
966
- cmdbuf.setDepthBias (regs.poly_offset .back_offset , regs.poly_offset .depth_bias ,
967
- regs.poly_offset .back_scale / 16 .f );
968
- }
969
-
970
- if (regs.depth_control .stencil_enable ) {
971
- const auto front_fail_op =
972
- LiverpoolToVK::StencilOp (regs.stencil_control .stencil_fail_front );
973
- const auto front_pass_op =
974
- LiverpoolToVK::StencilOp (regs.stencil_control .stencil_zpass_front );
975
- const auto front_depth_fail_op =
976
- LiverpoolToVK::StencilOp (regs.stencil_control .stencil_zfail_front );
977
- const auto front_compare_op = LiverpoolToVK::CompareOp (regs.depth_control .stencil_ref_func );
978
- if (regs.depth_control .backface_enable ) {
979
- const auto back_fail_op =
980
- LiverpoolToVK::StencilOp (regs.stencil_control .stencil_fail_back );
981
- const auto back_pass_op =
982
- LiverpoolToVK::StencilOp (regs.stencil_control .stencil_zpass_back );
983
- const auto back_depth_fail_op =
984
- LiverpoolToVK::StencilOp (regs.stencil_control .stencil_zfail_back );
985
- const auto back_compare_op =
986
- LiverpoolToVK::CompareOp (regs.depth_control .stencil_bf_func );
987
- cmdbuf.setStencilOpEXT (vk::StencilFaceFlagBits::eFront, front_fail_op, front_pass_op,
988
- front_depth_fail_op, front_compare_op);
989
- cmdbuf.setStencilOpEXT (vk::StencilFaceFlagBits::eBack, back_fail_op, back_pass_op,
990
- back_depth_fail_op, back_compare_op);
991
- } else {
992
- cmdbuf.setStencilOpEXT (vk::StencilFaceFlagBits::eFrontAndBack, front_fail_op,
993
- front_pass_op, front_depth_fail_op, front_compare_op);
994
- }
995
-
996
- const auto front = regs.stencil_ref_front ;
997
- const auto back = regs.stencil_ref_back ;
998
- if (front.stencil_test_val == back.stencil_test_val ) {
999
- cmdbuf.setStencilReference (vk::StencilFaceFlagBits::eFrontAndBack,
1000
- front.stencil_test_val );
1001
- } else {
1002
- cmdbuf.setStencilReference (vk::StencilFaceFlagBits::eFront, front.stencil_test_val );
1003
- cmdbuf.setStencilReference (vk::StencilFaceFlagBits::eBack, back.stencil_test_val );
1004
- }
1005
-
1006
- if (front.stencil_write_mask == back.stencil_write_mask ) {
1007
- cmdbuf.setStencilWriteMask (vk::StencilFaceFlagBits::eFrontAndBack,
1008
- front.stencil_write_mask );
1009
- } else {
1010
- cmdbuf.setStencilWriteMask (vk::StencilFaceFlagBits::eFront, front.stencil_write_mask );
1011
- cmdbuf.setStencilWriteMask (vk::StencilFaceFlagBits::eBack, back.stencil_write_mask );
1012
- }
1013
-
1014
- if (front.stencil_mask == back.stencil_mask ) {
1015
- cmdbuf.setStencilCompareMask (vk::StencilFaceFlagBits::eFrontAndBack,
1016
- front.stencil_mask );
1017
- } else {
1018
- cmdbuf.setStencilCompareMask (vk::StencilFaceFlagBits::eFront, front.stencil_mask );
1019
- cmdbuf.setStencilCompareMask (vk::StencilFaceFlagBits::eBack, back.stencil_mask );
1020
- }
1021
- }
1022
959
}
1023
960
1024
- void Rasterizer::UpdateViewportScissorState (const GraphicsPipeline& pipeline ) {
961
+ void Rasterizer::UpdateViewportScissorState () {
1025
962
const auto & regs = liverpool->regs ;
1026
963
1027
964
const auto combined_scissor_value_tl = [](s16 scr, s16 win, s16 gen, s16 win_offset) {
@@ -1072,7 +1009,7 @@ void Rasterizer::UpdateViewportScissorState(const GraphicsPipeline& pipeline) {
1072
1009
1073
1010
const auto zoffset = vp_ctl.zoffset_enable ? vp.zoffset : 0 .f ;
1074
1011
const auto zscale = vp_ctl.zscale_enable ? vp.zscale : 1 .f ;
1075
- if (pipeline .IsClipDisabled ()) {
1012
+ if (regs .IsClipDisabled ()) {
1076
1013
// In case if clipping is disabled we patch the shader to convert vertex position
1077
1014
// from screen space coordinates to NDC by defining a render space as full hardware
1078
1015
// window range [0..16383, 0..16383] and setting the viewport to its size.
@@ -1139,6 +1076,90 @@ void Rasterizer::UpdateViewportScissorState(const GraphicsPipeline& pipeline) {
1139
1076
cmdbuf.setScissorWithCountEXT (scissors);
1140
1077
}
1141
1078
1079
+ void Rasterizer::UpdateDepthStencilState () {
1080
+ auto & regs = liverpool->regs ;
1081
+ const auto cmdbuf = scheduler.CommandBuffer ();
1082
+
1083
+ bool depth_test = regs.depth_control .depth_enable && regs.depth_buffer .DepthValid ();
1084
+ cmdbuf.setDepthTestEnableEXT (depth_test);
1085
+ cmdbuf.setDepthWriteEnableEXT (regs.depth_control .depth_write_enable &&
1086
+ !regs.depth_render_control .depth_clear_enable );
1087
+ if (depth_test) {
1088
+ cmdbuf.setDepthCompareOpEXT (LiverpoolToVK::CompareOp (regs.depth_control .depth_func ));
1089
+ }
1090
+
1091
+ if (instance.IsDepthBoundsSupported ()) {
1092
+ cmdbuf.setDepthBoundsTestEnableEXT (regs.depth_control .depth_bounds_enable );
1093
+ if (regs.depth_control .depth_bounds_enable ) {
1094
+ cmdbuf.setDepthBounds (regs.depth_bounds_min , regs.depth_bounds_max );
1095
+ }
1096
+ }
1097
+
1098
+ cmdbuf.setDepthBiasEnableEXT (regs.polygon_control .NeedsBias ());
1099
+ if (regs.polygon_control .enable_polygon_offset_front ) {
1100
+ cmdbuf.setDepthBias (regs.poly_offset .front_offset , regs.poly_offset .depth_bias ,
1101
+ regs.poly_offset .front_scale / 16 .f );
1102
+ } else if (regs.polygon_control .enable_polygon_offset_back ) {
1103
+ cmdbuf.setDepthBias (regs.poly_offset .back_offset , regs.poly_offset .depth_bias ,
1104
+ regs.poly_offset .back_scale / 16 .f );
1105
+ }
1106
+
1107
+ cmdbuf.setStencilTestEnableEXT (regs.depth_control .stencil_enable &&
1108
+ regs.depth_buffer .StencilValid ());
1109
+ if (regs.depth_control .stencil_enable ) {
1110
+ const auto front_fail_op =
1111
+ LiverpoolToVK::StencilOp (regs.stencil_control .stencil_fail_front );
1112
+ const auto front_pass_op =
1113
+ LiverpoolToVK::StencilOp (regs.stencil_control .stencil_zpass_front );
1114
+ const auto front_depth_fail_op =
1115
+ LiverpoolToVK::StencilOp (regs.stencil_control .stencil_zfail_front );
1116
+ const auto front_compare_op = LiverpoolToVK::CompareOp (regs.depth_control .stencil_ref_func );
1117
+ if (regs.depth_control .backface_enable ) {
1118
+ const auto back_fail_op =
1119
+ LiverpoolToVK::StencilOp (regs.stencil_control .stencil_fail_back );
1120
+ const auto back_pass_op =
1121
+ LiverpoolToVK::StencilOp (regs.stencil_control .stencil_zpass_back );
1122
+ const auto back_depth_fail_op =
1123
+ LiverpoolToVK::StencilOp (regs.stencil_control .stencil_zfail_back );
1124
+ const auto back_compare_op =
1125
+ LiverpoolToVK::CompareOp (regs.depth_control .stencil_bf_func );
1126
+ cmdbuf.setStencilOpEXT (vk::StencilFaceFlagBits::eFront, front_fail_op, front_pass_op,
1127
+ front_depth_fail_op, front_compare_op);
1128
+ cmdbuf.setStencilOpEXT (vk::StencilFaceFlagBits::eBack, back_fail_op, back_pass_op,
1129
+ back_depth_fail_op, back_compare_op);
1130
+ } else {
1131
+ cmdbuf.setStencilOpEXT (vk::StencilFaceFlagBits::eFrontAndBack, front_fail_op,
1132
+ front_pass_op, front_depth_fail_op, front_compare_op);
1133
+ }
1134
+
1135
+ const auto front = regs.stencil_ref_front ;
1136
+ const auto back = regs.stencil_ref_back ;
1137
+ if (front.stencil_test_val == back.stencil_test_val ) {
1138
+ cmdbuf.setStencilReference (vk::StencilFaceFlagBits::eFrontAndBack,
1139
+ front.stencil_test_val );
1140
+ } else {
1141
+ cmdbuf.setStencilReference (vk::StencilFaceFlagBits::eFront, front.stencil_test_val );
1142
+ cmdbuf.setStencilReference (vk::StencilFaceFlagBits::eBack, back.stencil_test_val );
1143
+ }
1144
+
1145
+ if (front.stencil_write_mask == back.stencil_write_mask ) {
1146
+ cmdbuf.setStencilWriteMask (vk::StencilFaceFlagBits::eFrontAndBack,
1147
+ front.stencil_write_mask );
1148
+ } else {
1149
+ cmdbuf.setStencilWriteMask (vk::StencilFaceFlagBits::eFront, front.stencil_write_mask );
1150
+ cmdbuf.setStencilWriteMask (vk::StencilFaceFlagBits::eBack, back.stencil_write_mask );
1151
+ }
1152
+
1153
+ if (front.stencil_mask == back.stencil_mask ) {
1154
+ cmdbuf.setStencilCompareMask (vk::StencilFaceFlagBits::eFrontAndBack,
1155
+ front.stencil_mask );
1156
+ } else {
1157
+ cmdbuf.setStencilCompareMask (vk::StencilFaceFlagBits::eFront, front.stencil_mask );
1158
+ cmdbuf.setStencilCompareMask (vk::StencilFaceFlagBits::eBack, back.stencil_mask );
1159
+ }
1160
+ }
1161
+ }
1162
+
1142
1163
void Rasterizer::ScopeMarkerBegin (const std::string_view& str, bool from_guest) {
1143
1164
if ((from_guest && !Config::getVkGuestMarkersEnabled ()) ||
1144
1165
(!from_guest && !Config::getVkHostMarkersEnabled ())) {
0 commit comments