Skip to content

Commit 1c832e1

Browse files
Merge branch 'main' into avplayer-improvements
2 parents f851734 + 0c6f2b4 commit 1c832e1

File tree

8 files changed

+116
-117
lines changed

8 files changed

+116
-117
lines changed

src/video_core/amdgpu/liverpool.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1423,6 +1423,10 @@ struct Liverpool {
14231423
return num_samples;
14241424
}
14251425

1426+
bool IsClipDisabled() const {
1427+
return clipper_control.clip_disable || primitive_type == PrimitiveType::RectList;
1428+
}
1429+
14261430
void SetDefaults();
14271431
};
14281432

src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp

Lines changed: 11 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,6 @@ GraphicsPipeline::GraphicsPipeline(
105105
.frontFace = key.front_face == Liverpool::FrontFace::Clockwise
106106
? vk::FrontFace::eClockwise
107107
: vk::FrontFace::eCounterClockwise,
108-
.depthBiasEnable = key.depth_bias_enable,
109108
.lineWidth = 1.0f,
110109
};
111110

@@ -123,18 +122,20 @@ GraphicsPipeline::GraphicsPipeline(
123122
.pNext = instance.IsDepthClipControlSupported() ? &clip_control : nullptr,
124123
};
125124

126-
boost::container::static_vector<vk::DynamicState, 14> dynamic_states = {
127-
vk::DynamicState::eViewportWithCountEXT,
128-
vk::DynamicState::eScissorWithCountEXT,
129-
vk::DynamicState::eBlendConstants,
130-
vk::DynamicState::eDepthBounds,
131-
vk::DynamicState::eDepthBias,
132-
vk::DynamicState::eStencilReference,
133-
vk::DynamicState::eStencilCompareMask,
134-
vk::DynamicState::eStencilWriteMask,
125+
boost::container::static_vector<vk::DynamicState, 17> dynamic_states = {
126+
vk::DynamicState::eViewportWithCountEXT, vk::DynamicState::eScissorWithCountEXT,
127+
vk::DynamicState::eBlendConstants, vk::DynamicState::eDepthTestEnableEXT,
128+
vk::DynamicState::eDepthWriteEnableEXT, vk::DynamicState::eDepthCompareOpEXT,
129+
vk::DynamicState::eDepthBiasEnableEXT, vk::DynamicState::eDepthBias,
130+
vk::DynamicState::eStencilTestEnableEXT, vk::DynamicState::eStencilReference,
131+
vk::DynamicState::eStencilCompareMask, vk::DynamicState::eStencilWriteMask,
135132
vk::DynamicState::eStencilOpEXT,
136133
};
137134

135+
if (instance.IsDepthBoundsSupported()) {
136+
dynamic_states.push_back(vk::DynamicState::eDepthBoundsTestEnableEXT);
137+
dynamic_states.push_back(vk::DynamicState::eDepthBounds);
138+
}
138139
if (instance.IsDynamicColorWriteMaskSupported()) {
139140
dynamic_states.push_back(vk::DynamicState::eColorWriteMaskEXT);
140141
}
@@ -149,14 +150,6 @@ GraphicsPipeline::GraphicsPipeline(
149150
.pDynamicStates = dynamic_states.data(),
150151
};
151152

152-
const vk::PipelineDepthStencilStateCreateInfo depth_info = {
153-
.depthTestEnable = key.depth_test_enable,
154-
.depthWriteEnable = key.depth_write_enable,
155-
.depthCompareOp = key.depth_compare_op,
156-
.depthBoundsTestEnable = key.depth_bounds_test_enable,
157-
.stencilTestEnable = key.stencil_test_enable,
158-
};
159-
160153
boost::container::static_vector<vk::PipelineShaderStageCreateInfo, MaxShaderStages>
161154
shader_stages;
162155
auto stage = u32(Shader::LogicalStage::Vertex);
@@ -292,7 +285,6 @@ GraphicsPipeline::GraphicsPipeline(
292285
.pViewportState = &viewport_info,
293286
.pRasterizationState = &raster_state,
294287
.pMultisampleState = &multisampling,
295-
.pDepthStencilState = &depth_info,
296288
.pColorBlendState = &color_blending,
297289
.pDynamicState = &dynamic_info,
298290
.layout = *pipeline_layout,

src/video_core/renderer_vulkan/vk_graphics_pipeline.h

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -39,18 +39,6 @@ struct GraphicsPipelineKey {
3939
vk::Format depth_format;
4040
vk::Format stencil_format;
4141

42-
struct {
43-
bool clip_disable : 1;
44-
bool depth_test_enable : 1;
45-
bool depth_write_enable : 1;
46-
bool depth_bounds_test_enable : 1;
47-
bool depth_bias_enable : 1;
48-
bool stencil_test_enable : 1;
49-
// Must be named to be zero-initialized.
50-
u8 _unused : 2;
51-
};
52-
vk::CompareOp depth_compare_op;
53-
5442
u32 num_samples;
5543
u32 mrt_mask;
5644
AmdGpu::PrimitiveType prim_type;
@@ -94,10 +82,6 @@ class GraphicsPipeline : public Pipeline {
9482
return key.mrt_mask;
9583
}
9684

97-
auto IsClipDisabled() const {
98-
return key.clip_disable;
99-
}
100-
10185
[[nodiscard]] bool IsPrimitiveListTopology() const {
10286
return key.prim_type == AmdGpu::PrimitiveType::PointList ||
10387
key.prim_type == AmdGpu::PrimitiveType::LineList ||

src/video_core/renderer_vulkan/vk_instance.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,7 @@ bool Instance::CreateDevice() {
247247
add_extension(VK_EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_EXTENSION_NAME);
248248
add_extension(VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME);
249249
add_extension(VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME);
250+
add_extension(VK_EXT_EXTENDED_DYNAMIC_STATE_2_EXTENSION_NAME);
250251
add_extension(VK_EXT_TOOLING_INFO_EXTENSION_NAME);
251252
const bool maintenance4 = add_extension(VK_KHR_MAINTENANCE_4_EXTENSION_NAME);
252253

@@ -380,6 +381,9 @@ bool Instance::CreateDevice() {
380381
vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT{
381382
.extendedDynamicState = true,
382383
},
384+
vk::PhysicalDeviceExtendedDynamicState2FeaturesEXT{
385+
.extendedDynamicState2 = true,
386+
},
383387
vk::PhysicalDeviceMaintenance4FeaturesKHR{
384388
.maintenance4 = true,
385389
},

src/video_core/renderer_vulkan/vk_instance.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,11 @@ class Instance {
8484
return features.samplerAnisotropy;
8585
}
8686

87+
/// Returns true if depth bounds testing is supported
88+
bool IsDepthBoundsSupported() const {
89+
return features.depthBounds;
90+
}
91+
8792
/// Returns true when VK_EXT_custom_border_color is supported
8893
bool IsCustomBorderColorSupported() const {
8994
return custom_border_color;

src/video_core/renderer_vulkan/vk_pipeline_cache.cpp

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ const Shader::RuntimeInfo& PipelineCache::BuildRuntimeInfo(Stage stage, LogicalS
123123
info.vs_info.emulate_depth_negative_one_to_one =
124124
!instance.IsDepthClipControlSupported() &&
125125
regs.clipper_control.clip_space == Liverpool::ClipSpace::MinusWToW;
126-
info.vs_info.clip_disable = graphics_key.clip_disable;
126+
info.vs_info.clip_disable = regs.IsClipDisabled();
127127
if (l_stage == LogicalStage::TessellationEval) {
128128
info.vs_info.tess_type = regs.tess_config.type;
129129
info.vs_info.tess_topology = regs.tess_config.topology;
@@ -267,16 +267,6 @@ bool PipelineCache::RefreshGraphicsKey() {
267267
auto& regs = liverpool->regs;
268268
auto& key = graphics_key;
269269

270-
key.clip_disable =
271-
regs.clipper_control.clip_disable || regs.primitive_type == AmdGpu::PrimitiveType::RectList;
272-
key.depth_test_enable = regs.depth_control.depth_enable;
273-
key.depth_write_enable =
274-
regs.depth_control.depth_write_enable && !regs.depth_render_control.depth_clear_enable;
275-
key.depth_bounds_test_enable = regs.depth_control.depth_bounds_enable;
276-
key.depth_bias_enable = regs.polygon_control.NeedsBias();
277-
key.depth_compare_op = LiverpoolToVK::CompareOp(regs.depth_control.depth_func);
278-
key.stencil_test_enable = regs.depth_control.stencil_enable;
279-
280270
const auto depth_format = instance.GetSupportedFormat(
281271
LiverpoolToVK::DepthFormat(regs.depth_buffer.z_info.format,
282272
regs.depth_buffer.stencil_info.format),
@@ -285,13 +275,11 @@ bool PipelineCache::RefreshGraphicsKey() {
285275
key.depth_format = depth_format;
286276
} else {
287277
key.depth_format = vk::Format::eUndefined;
288-
key.depth_test_enable = false;
289278
}
290279
if (regs.depth_buffer.StencilValid()) {
291280
key.stencil_format = depth_format;
292281
} else {
293282
key.stencil_format = vk::Format::eUndefined;
294-
key.stencil_test_enable = false;
295283
}
296284

297285
key.prim_type = regs.primitive_type;

src/video_core/renderer_vulkan/vk_rasterizer.cpp

Lines changed: 89 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -947,81 +947,18 @@ void Rasterizer::UnmapMemory(VAddr addr, u64 size) {
947947
}
948948

949949
void Rasterizer::UpdateDynamicState(const GraphicsPipeline& pipeline) {
950-
UpdateViewportScissorState(pipeline);
950+
UpdateViewportScissorState();
951+
UpdateDepthStencilState();
951952

952-
auto& regs = liverpool->regs;
953+
const auto& regs = liverpool->regs;
953954
const auto cmdbuf = scheduler.CommandBuffer();
954955
cmdbuf.setBlendConstants(&regs.blend_constants.red);
955-
956956
if (instance.IsDynamicColorWriteMaskSupported()) {
957957
cmdbuf.setColorWriteMaskEXT(0, pipeline.GetWriteMasks());
958958
}
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-
}
1022959
}
1023960

1024-
void Rasterizer::UpdateViewportScissorState(const GraphicsPipeline& pipeline) {
961+
void Rasterizer::UpdateViewportScissorState() {
1025962
const auto& regs = liverpool->regs;
1026963

1027964
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) {
10721009

10731010
const auto zoffset = vp_ctl.zoffset_enable ? vp.zoffset : 0.f;
10741011
const auto zscale = vp_ctl.zscale_enable ? vp.zscale : 1.f;
1075-
if (pipeline.IsClipDisabled()) {
1012+
if (regs.IsClipDisabled()) {
10761013
// In case if clipping is disabled we patch the shader to convert vertex position
10771014
// from screen space coordinates to NDC by defining a render space as full hardware
10781015
// window range [0..16383, 0..16383] and setting the viewport to its size.
@@ -1139,6 +1076,90 @@ void Rasterizer::UpdateViewportScissorState(const GraphicsPipeline& pipeline) {
11391076
cmdbuf.setScissorWithCountEXT(scissors);
11401077
}
11411078

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+
11421163
void Rasterizer::ScopeMarkerBegin(const std::string_view& str, bool from_guest) {
11431164
if ((from_guest && !Config::getVkGuestMarkersEnabled()) ||
11441165
(!from_guest && !Config::getVkHostMarkersEnabled())) {

src/video_core/renderer_vulkan/vk_rasterizer.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,8 @@ class Rasterizer {
7676
void EliminateFastClear();
7777

7878
void UpdateDynamicState(const GraphicsPipeline& pipeline);
79-
void UpdateViewportScissorState(const GraphicsPipeline& pipeline);
79+
void UpdateViewportScissorState();
80+
void UpdateDepthStencilState();
8081

8182
bool FilterDraw();
8283

0 commit comments

Comments
 (0)