mirror of
https://github.com/KytyPS5/KytyPS5.git
synced 2026-10-20 02:47:02 +02:00
graphics: make depth bounds dynamic to reuse pipelines
Co-authored-by: TheCruZ <thecruzwtf@gmail.com>
This commit is contained in:
@@ -15678,6 +15678,12 @@ public:
|
||||
cmd.setDepthTestEnable(depth.depth_test_enable);
|
||||
cmd.setDepthWriteEnable(depth.depth_write_enable);
|
||||
cmd.setDepthCompareOp(depth.depth_compare_op);
|
||||
#if !defined(__APPLE__)
|
||||
cmd.setDepthBoundsTestEnable(depth.depth_bounds_test_enable);
|
||||
if (depth.depth_bounds_test_enable) {
|
||||
cmd.setDepthBounds(registers.GetDepthBoundsMin(), registers.GetDepthBoundsMax());
|
||||
}
|
||||
#endif
|
||||
cmd.setDepthBiasEnable(false);
|
||||
cmd.setStencilTestEnable(depth.stencil_test_enable);
|
||||
if (depth.stencil_test_enable) {
|
||||
@@ -15734,6 +15740,26 @@ public:
|
||||
"depth feedback lost a prior write or the read-only draw changed depth");
|
||||
}
|
||||
}
|
||||
depth.depth_test_enable = false;
|
||||
for (uint32_t pass = 0; pass < 3; pass++) {
|
||||
depth.depth_bounds_test_enable = pass != 2;
|
||||
registers.SetDepthBoundsMin(pass == 0 ? 0.5f : 0.625f);
|
||||
registers.SetDepthBoundsMax(pass == 0 ? 0.5625f : 0.6875f);
|
||||
Require(name, "dynamic depth bounds pipeline reuse",
|
||||
pipeline(true, 2, 2).pipeline == filled.pipeline,
|
||||
"changing depth bounds or their enable state created another pipeline");
|
||||
draw(filled);
|
||||
const auto bounded_pixels = read_color();
|
||||
for (size_t index = 0; index < stored_depth.size(); index++) {
|
||||
const auto z = std::bit_cast<float>(stored_depth[index]);
|
||||
const bool passes = !depth.depth_bounds_test_enable ||
|
||||
(z >= registers.GetDepthBoundsMin() &&
|
||||
z <= registers.GetDepthBoundsMax());
|
||||
Require(name, "dynamic stored-depth bounds",
|
||||
bounded_pixels[index * 4] == (passes ? stored_depth[index] : 0u),
|
||||
"depth bounds did not filter stored depth independently of the depth test");
|
||||
}
|
||||
}
|
||||
} else {
|
||||
auto &wireframe = pipeline(true, 1, 1);
|
||||
Require(name, "pipeline cache", filled.pipeline != wireframe.pipeline &&
|
||||
@@ -17935,6 +17961,7 @@ private:
|
||||
"vertex layer output is not supported");
|
||||
m_rasterization_supported = available_features.fillModeNonSolid &&
|
||||
available_features.tessellationShader &&
|
||||
available_features.depthBounds &&
|
||||
available_depth_clip.depthClipEnable &&
|
||||
available_clip_control.depthClipControl &&
|
||||
available_color_write.colorWriteEnable &&
|
||||
@@ -18017,6 +18044,7 @@ private:
|
||||
device_features.shaderFloat64 = available_features.shaderFloat64;
|
||||
device_features.fillModeNonSolid = m_rasterization_supported;
|
||||
device_features.tessellationShader = m_rasterization_supported;
|
||||
device_features.depthBounds = m_rasterization_supported;
|
||||
device_info.pEnabledFeatures = &device_features;
|
||||
std::vector<const char *> device_extensions{
|
||||
VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME,
|
||||
|
||||
Reference in New Issue
Block a user