mirror of
https://github.com/KytyPS5/KytyPS5.git
synced 2026-10-20 10:56:58 +02:00
graphics: make depth bounds dynamic to reuse pipelines
Co-authored-by: TheCruZ <thecruzwtf@gmail.com>
This commit is contained in:
@@ -315,8 +315,6 @@ void RenderExecutor::ResolveRenderDepthTarget(CommandBuffer& buffer, RenderDepth
|
|||||||
r.depth_compare_op = static_cast<vk::CompareOp>(dc.zfunc);
|
r.depth_compare_op = static_cast<vk::CompareOp>(dc.zfunc);
|
||||||
|
|
||||||
r.depth_bounds_test_enable = dc.depth_bounds_enable;
|
r.depth_bounds_test_enable = dc.depth_bounds_enable;
|
||||||
r.depth_min_bounds = hw.GetDepthBoundsMin();
|
|
||||||
r.depth_max_bounds = hw.GetDepthBoundsMax();
|
|
||||||
|
|
||||||
r.stencil_clear_enable =
|
r.stencil_clear_enable =
|
||||||
has_stencil && rc.stencil_clear_enable && !z.depth_view.stencil_write_disable;
|
has_stencil && rc.stencil_clear_enable && !z.depth_view.stencil_write_disable;
|
||||||
|
|||||||
@@ -29,8 +29,6 @@ struct RenderDepthInfo {
|
|||||||
bool depth_write_enable = false;
|
bool depth_write_enable = false;
|
||||||
vk::CompareOp depth_compare_op = vk::CompareOp::eNever;
|
vk::CompareOp depth_compare_op = vk::CompareOp::eNever;
|
||||||
bool depth_bounds_test_enable = false;
|
bool depth_bounds_test_enable = false;
|
||||||
float depth_min_bounds = 0.0f;
|
|
||||||
float depth_max_bounds = 0.0f;
|
|
||||||
bool stencil_clear_enable = false;
|
bool stencil_clear_enable = false;
|
||||||
uint8_t stencil_clear_value = 0;
|
uint8_t stencil_clear_value = 0;
|
||||||
bool stencil_test_enable = false;
|
bool stencil_test_enable = false;
|
||||||
|
|||||||
@@ -831,9 +831,6 @@ PipelineCache::Pipeline& PipelineCache::GetGraphicsPipeline(
|
|||||||
if (static_params.sample_shading_enable && !m_graphics.sample_rate_shading_enabled) {
|
if (static_params.sample_shading_enable && !m_graphics.sample_rate_shading_enabled) {
|
||||||
EXIT("Pipeline: sample-rate shading is required but unsupported by the host\n");
|
EXIT("Pipeline: sample-rate shading is required but unsupported by the host\n");
|
||||||
}
|
}
|
||||||
static_params.depth_bounds_test_enable = depth.depth_bounds_test_enable;
|
|
||||||
static_params.depth_min_bounds = depth.depth_min_bounds;
|
|
||||||
static_params.depth_max_bounds = depth.depth_max_bounds;
|
|
||||||
const bool rect_list = Prospero::IsRectList(command.GetUserConfig().GetPrimType());
|
const bool rect_list = Prospero::IsRectList(command.GetUserConfig().GetPrimType());
|
||||||
static_params.cull_back = !rect_list && mc.cull_back;
|
static_params.cull_back = !rect_list && mc.cull_back;
|
||||||
static_params.cull_front = !rect_list && mc.cull_front;
|
static_params.cull_front = !rect_list && mc.cull_front;
|
||||||
|
|||||||
@@ -38,9 +38,6 @@ struct PipelineStaticParameters {
|
|||||||
bool primitive_restart_enable = false;
|
bool primitive_restart_enable = false;
|
||||||
uint32_t samples = 1;
|
uint32_t samples = 1;
|
||||||
bool sample_shading_enable = false;
|
bool sample_shading_enable = false;
|
||||||
bool depth_bounds_test_enable = false;
|
|
||||||
float depth_min_bounds = 0.0f;
|
|
||||||
float depth_max_bounds = 0.0f;
|
|
||||||
uint32_t color_mask[RENDER_COLOR_ATTACHMENTS_MAX] = {};
|
uint32_t color_mask[RENDER_COLOR_ATTACHMENTS_MAX] = {};
|
||||||
bool cull_front = false;
|
bool cull_front = false;
|
||||||
bool cull_back = false;
|
bool cull_back = false;
|
||||||
@@ -64,7 +61,7 @@ struct PipelineStaticParameters {
|
|||||||
static_assert(std::is_trivially_copyable_v<PipelineStaticParameters>);
|
static_assert(std::is_trivially_copyable_v<PipelineStaticParameters>);
|
||||||
static_assert(std::is_standard_layout_v<PipelineStaticParameters>);
|
static_assert(std::is_standard_layout_v<PipelineStaticParameters>);
|
||||||
static_assert(alignof(PipelineStaticParameters) == 1);
|
static_assert(alignof(PipelineStaticParameters) == 1);
|
||||||
static_assert(sizeof(PipelineStaticParameters) == 125);
|
static_assert(sizeof(PipelineStaticParameters) == 116);
|
||||||
|
|
||||||
struct PipelineRenderingState {
|
struct PipelineRenderingState {
|
||||||
std::array<vk::Format, RENDER_COLOR_ATTACHMENTS_MAX> color_formats {};
|
std::array<vk::Format, RENDER_COLOR_ATTACHMENTS_MAX> color_formats {};
|
||||||
|
|||||||
@@ -471,14 +471,6 @@ void CreatePipelineInternal(GraphicContext& graphics, PipelineCache::Pipeline& p
|
|||||||
EXIT_NOT_IMPLEMENTED(pipeline.pipeline_layout == nullptr);
|
EXIT_NOT_IMPLEMENTED(pipeline.pipeline_layout == nullptr);
|
||||||
|
|
||||||
vk::PipelineDepthStencilStateCreateInfo depth_stencil_info {};
|
vk::PipelineDepthStencilStateCreateInfo depth_stencil_info {};
|
||||||
depth_stencil_info.depthBoundsTestEnable =
|
|
||||||
#if defined(__APPLE__)
|
|
||||||
VK_FALSE; // MoltenVK lacks the depthBounds feature; depth-bounds testing is disabled
|
|
||||||
#else
|
|
||||||
(static_params.depth_bounds_test_enable ? VK_TRUE : VK_FALSE);
|
|
||||||
#endif
|
|
||||||
depth_stencil_info.minDepthBounds = static_params.depth_min_bounds;
|
|
||||||
depth_stencil_info.maxDepthBounds = static_params.depth_max_bounds;
|
|
||||||
|
|
||||||
std::vector<vk::DynamicState> dynamic_states {
|
std::vector<vk::DynamicState> dynamic_states {
|
||||||
vk::DynamicState::eViewportWithCount,
|
vk::DynamicState::eViewportWithCount,
|
||||||
@@ -497,6 +489,8 @@ void CreatePipelineInternal(GraphicContext& graphics, PipelineCache::Pipeline& p
|
|||||||
vk::DynamicState::eBlendConstants,
|
vk::DynamicState::eBlendConstants,
|
||||||
};
|
};
|
||||||
#if !defined(__APPLE__)
|
#if !defined(__APPLE__)
|
||||||
|
dynamic_states.push_back(vk::DynamicState::eDepthBoundsTestEnable);
|
||||||
|
dynamic_states.push_back(vk::DynamicState::eDepthBounds);
|
||||||
if (rendering.color_count != 0) {
|
if (rendering.color_count != 0) {
|
||||||
dynamic_states.push_back(vk::DynamicState::eColorWriteEnableEXT);
|
dynamic_states.push_back(vk::DynamicState::eColorWriteEnableEXT);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -379,6 +379,12 @@ static void SetGraphicsDynamicParams(const CommandBuffer& buffer, vk::CommandBuf
|
|||||||
vk_buffer.setDepthTestEnable(depth.depth_test_enable ? VK_TRUE : VK_FALSE);
|
vk_buffer.setDepthTestEnable(depth.depth_test_enable ? VK_TRUE : VK_FALSE);
|
||||||
vk_buffer.setDepthWriteEnable(depth.depth_write_enable ? VK_TRUE : VK_FALSE);
|
vk_buffer.setDepthWriteEnable(depth.depth_write_enable ? VK_TRUE : VK_FALSE);
|
||||||
vk_buffer.setDepthCompareOp(depth.depth_compare_op);
|
vk_buffer.setDepthCompareOp(depth.depth_compare_op);
|
||||||
|
#if !defined(__APPLE__)
|
||||||
|
vk_buffer.setDepthBoundsTestEnable(depth.depth_bounds_test_enable ? VK_TRUE : VK_FALSE);
|
||||||
|
if (depth.depth_bounds_test_enable) {
|
||||||
|
vk_buffer.setDepthBounds(ctx.GetDepthBoundsMin(), ctx.GetDepthBoundsMax());
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
const auto& mode = ctx.GetModeControl();
|
const auto& mode = ctx.GetModeControl();
|
||||||
const auto& poly_offset = ctx.GetPolyOffset();
|
const auto& poly_offset = ctx.GetPolyOffset();
|
||||||
|
|||||||
@@ -15678,6 +15678,12 @@ public:
|
|||||||
cmd.setDepthTestEnable(depth.depth_test_enable);
|
cmd.setDepthTestEnable(depth.depth_test_enable);
|
||||||
cmd.setDepthWriteEnable(depth.depth_write_enable);
|
cmd.setDepthWriteEnable(depth.depth_write_enable);
|
||||||
cmd.setDepthCompareOp(depth.depth_compare_op);
|
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.setDepthBiasEnable(false);
|
||||||
cmd.setStencilTestEnable(depth.stencil_test_enable);
|
cmd.setStencilTestEnable(depth.stencil_test_enable);
|
||||||
if (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 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 {
|
} else {
|
||||||
auto &wireframe = pipeline(true, 1, 1);
|
auto &wireframe = pipeline(true, 1, 1);
|
||||||
Require(name, "pipeline cache", filled.pipeline != wireframe.pipeline &&
|
Require(name, "pipeline cache", filled.pipeline != wireframe.pipeline &&
|
||||||
@@ -17935,6 +17961,7 @@ private:
|
|||||||
"vertex layer output is not supported");
|
"vertex layer output is not supported");
|
||||||
m_rasterization_supported = available_features.fillModeNonSolid &&
|
m_rasterization_supported = available_features.fillModeNonSolid &&
|
||||||
available_features.tessellationShader &&
|
available_features.tessellationShader &&
|
||||||
|
available_features.depthBounds &&
|
||||||
available_depth_clip.depthClipEnable &&
|
available_depth_clip.depthClipEnable &&
|
||||||
available_clip_control.depthClipControl &&
|
available_clip_control.depthClipControl &&
|
||||||
available_color_write.colorWriteEnable &&
|
available_color_write.colorWriteEnable &&
|
||||||
@@ -18017,6 +18044,7 @@ private:
|
|||||||
device_features.shaderFloat64 = available_features.shaderFloat64;
|
device_features.shaderFloat64 = available_features.shaderFloat64;
|
||||||
device_features.fillModeNonSolid = m_rasterization_supported;
|
device_features.fillModeNonSolid = m_rasterization_supported;
|
||||||
device_features.tessellationShader = m_rasterization_supported;
|
device_features.tessellationShader = m_rasterization_supported;
|
||||||
|
device_features.depthBounds = m_rasterization_supported;
|
||||||
device_info.pEnabledFeatures = &device_features;
|
device_info.pEnabledFeatures = &device_features;
|
||||||
std::vector<const char *> device_extensions{
|
std::vector<const char *> device_extensions{
|
||||||
VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME,
|
VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME,
|
||||||
|
|||||||
Reference in New Issue
Block a user