Mesa (main): dzn: Support dynamic depth testing parameters properly
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Wed Jun 15 00:33:47 UTC 2022
Module: Mesa
Branch: main
Commit: 7d9afb93cc8a9d8afe120f2d71224cf8bd914f11
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=7d9afb93cc8a9d8afe120f2d71224cf8bd914f11
Author: Boris Brezillon <boris.brezillon at collabora.com>
Date: Fri Jun 10 15:57:56 2022 +0200
dzn: Support dynamic depth testing parameters properly
Now that we have support for pipeline variants, we can take the dynamic
depth testing parameters into account and create a new pipeline state
using those dynamic parameters.
Reviewed-by: Jesse Natalie <jenatali at microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16971>
---
src/microsoft/vulkan/dzn_cmd_buffer.c | 36 +++++++++++++----
src/microsoft/vulkan/dzn_device.c | 2 +-
src/microsoft/vulkan/dzn_pipeline.c | 75 ++++++++++++++++++++++++++++++++++-
src/microsoft/vulkan/dzn_private.h | 13 ++++++
4 files changed, 115 insertions(+), 11 deletions(-)
diff --git a/src/microsoft/vulkan/dzn_cmd_buffer.c b/src/microsoft/vulkan/dzn_cmd_buffer.c
index 037bdcd5bd2..30df302a85d 100644
--- a/src/microsoft/vulkan/dzn_cmd_buffer.c
+++ b/src/microsoft/vulkan/dzn_cmd_buffer.c
@@ -4462,7 +4462,12 @@ dzn_CmdSetDepthBias(VkCommandBuffer commandBuffer,
float depthBiasClamp,
float depthBiasSlopeFactor)
{
- dzn_stub();
+ VK_FROM_HANDLE(dzn_cmd_buffer, cmdbuf, commandBuffer);
+
+ cmdbuf->state.pipeline_variant.depth_bias.constant_factor = depthBiasConstantFactor;
+ cmdbuf->state.pipeline_variant.depth_bias.clamp = depthBiasClamp;
+ cmdbuf->state.pipeline_variant.depth_bias.slope_factor = depthBiasSlopeFactor;
+ cmdbuf->state.bindpoint[VK_PIPELINE_BIND_POINT_GRAPHICS].dirty |= DZN_CMD_BINDPOINT_DIRTY_PIPELINE;
}
VKAPI_ATTR void VKAPI_CALL
@@ -4482,10 +4487,15 @@ dzn_CmdSetDepthBounds(VkCommandBuffer commandBuffer,
float maxDepthBounds)
{
VK_FROM_HANDLE(dzn_cmd_buffer, cmdbuf, commandBuffer);
+ struct dzn_device *device = container_of(cmdbuf->vk.base.device, struct dzn_device, vk);
+ struct dzn_physical_device *pdev =
+ container_of(device->vk.physical, struct dzn_physical_device, vk);
- cmdbuf->state.zsa.depth_bounds.min = minDepthBounds;
- cmdbuf->state.zsa.depth_bounds.max = maxDepthBounds;
- cmdbuf->state.dirty |= DZN_CMD_DIRTY_DEPTH_BOUNDS;
+ if (pdev->options2.DepthBoundsTestSupported) {
+ cmdbuf->state.zsa.depth_bounds.min = minDepthBounds;
+ cmdbuf->state.zsa.depth_bounds.max = maxDepthBounds;
+ cmdbuf->state.dirty |= DZN_CMD_DIRTY_DEPTH_BOUNDS;
+ }
}
VKAPI_ATTR void VKAPI_CALL
@@ -4495,13 +4505,18 @@ dzn_CmdSetStencilCompareMask(VkCommandBuffer commandBuffer,
{
VK_FROM_HANDLE(dzn_cmd_buffer, cmdbuf, commandBuffer);
- if (faceMask & VK_STENCIL_FACE_FRONT_BIT)
+ if (faceMask & VK_STENCIL_FACE_FRONT_BIT) {
cmdbuf->state.zsa.stencil_test.front.compare_mask = compareMask;
+ cmdbuf->state.pipeline_variant.stencil_test.front.compare_mask = compareMask;
+ }
- if (faceMask & VK_STENCIL_FACE_BACK_BIT)
+ if (faceMask & VK_STENCIL_FACE_BACK_BIT) {
cmdbuf->state.zsa.stencil_test.back.compare_mask = compareMask;
+ cmdbuf->state.pipeline_variant.stencil_test.back.compare_mask = compareMask;
+ }
cmdbuf->state.dirty |= DZN_CMD_DIRTY_STENCIL_COMPARE_MASK;
+ cmdbuf->state.bindpoint[VK_PIPELINE_BIND_POINT_GRAPHICS].dirty |= DZN_CMD_BINDPOINT_DIRTY_PIPELINE;
}
VKAPI_ATTR void VKAPI_CALL
@@ -4511,13 +4526,18 @@ dzn_CmdSetStencilWriteMask(VkCommandBuffer commandBuffer,
{
VK_FROM_HANDLE(dzn_cmd_buffer, cmdbuf, commandBuffer);
- if (faceMask & VK_STENCIL_FACE_FRONT_BIT)
+ if (faceMask & VK_STENCIL_FACE_FRONT_BIT) {
cmdbuf->state.zsa.stencil_test.front.write_mask = writeMask;
+ cmdbuf->state.pipeline_variant.stencil_test.front.write_mask = writeMask;
+ }
- if (faceMask & VK_STENCIL_FACE_BACK_BIT)
+ if (faceMask & VK_STENCIL_FACE_BACK_BIT) {
cmdbuf->state.zsa.stencil_test.back.write_mask = writeMask;
+ cmdbuf->state.pipeline_variant.stencil_test.back.write_mask = writeMask;
+ }
cmdbuf->state.dirty |= DZN_CMD_DIRTY_STENCIL_WRITE_MASK;
+ cmdbuf->state.bindpoint[VK_PIPELINE_BIND_POINT_GRAPHICS].dirty |= DZN_CMD_BINDPOINT_DIRTY_PIPELINE;
}
VKAPI_ATTR void VKAPI_CALL
diff --git a/src/microsoft/vulkan/dzn_device.c b/src/microsoft/vulkan/dzn_device.c
index bc5715c4ceb..d9206ed3835 100644
--- a/src/microsoft/vulkan/dzn_device.c
+++ b/src/microsoft/vulkan/dzn_device.c
@@ -1069,7 +1069,7 @@ dzn_GetPhysicalDeviceFeatures2(VkPhysicalDevice physicalDevice,
.multiDrawIndirect = true,
.drawIndirectFirstInstance = true,
.depthClamp = false,
- .depthBiasClamp = false,
+ .depthBiasClamp = true,
.fillModeNonSolid = false,
.depthBounds = dzn_physical_device_supports_depth_bounds(pdev),
.wideLines = false,
diff --git a/src/microsoft/vulkan/dzn_pipeline.c b/src/microsoft/vulkan/dzn_pipeline.c
index b5869c34ffc..7618b380765 100644
--- a/src/microsoft/vulkan/dzn_pipeline.c
+++ b/src/microsoft/vulkan/dzn_pipeline.c
@@ -661,6 +661,8 @@ dzn_graphics_pipeline_translate_rast(struct dzn_graphics_pipeline *pipeline,
}
d3d12_gfx_pipeline_state_stream_new_desc(out, RASTERIZER, D3D12_RASTERIZER_DESC, desc);
+ pipeline->templates.desc_offsets.rast =
+ (uintptr_t)desc - (uintptr_t)out->pPipelineStateSubobjectStream;
desc->DepthClipEnable = !in_rast->depthClampEnable;
desc->FillMode = translate_polygon_mode(in_rast->polygonMode);
desc->CullMode = translate_cull_mode(in_rast->cullMode);
@@ -841,13 +843,18 @@ dzn_graphics_pipeline_translate_zsa(struct dzn_graphics_pipeline *pipeline,
return;
d3d12_gfx_pipeline_state_stream_new_desc(out, DEPTH_STENCIL1, D3D12_DEPTH_STENCIL_DESC1, desc);
+ pipeline->templates.desc_offsets.ds =
+ (uintptr_t)desc - (uintptr_t)out->pPipelineStateSubobjectStream;
- desc->DepthEnable = in_zsa->depthTestEnable;
+ desc->DepthEnable =
+ in_zsa->depthTestEnable || in_zsa->depthBoundsTestEnable;
desc->DepthWriteMask =
in_zsa->depthWriteEnable ?
D3D12_DEPTH_WRITE_MASK_ALL : D3D12_DEPTH_WRITE_MASK_ZERO;
desc->DepthFunc =
- dzn_translate_compare_op(in_zsa->depthCompareOp);
+ in_zsa->depthTestEnable ?
+ dzn_translate_compare_op(in_zsa->depthCompareOp) :
+ D3D12_COMPARISON_FUNC_ALWAYS;
pipeline->zsa.depth_bounds.enable = in_zsa->depthBoundsTestEnable;
pipeline->zsa.depth_bounds.min = in_zsa->minDepthBounds;
pipeline->zsa.depth_bounds.max = in_zsa->maxDepthBounds;
@@ -1155,6 +1162,12 @@ dzn_graphics_pipeline_create(struct dzn_device *device,
case VK_DYNAMIC_STATE_DEPTH_BOUNDS:
pipeline->zsa.depth_bounds.dynamic = true;
break;
+ case VK_DYNAMIC_STATE_DEPTH_BIAS:
+ pipeline->zsa.dynamic_depth_bias = true;
+ ret = dzn_graphics_pipeline_prepare_for_variants(device, pipeline);
+ if (ret)
+ goto out;
+ break;
default: unreachable("Unsupported dynamic state");
}
}
@@ -1266,6 +1279,25 @@ dzn_graphics_pipeline_get_state(struct dzn_graphics_pipeline *pipeline,
if (dzn_graphics_pipeline_get_desc_template(pipeline, ib_strip_cut))
masked_key.ib_strip_cut = key->ib_strip_cut;
+ if (dzn_graphics_pipeline_get_desc_template(pipeline, rast) &&
+ pipeline->zsa.dynamic_depth_bias)
+ masked_key.depth_bias = key->depth_bias;
+
+ const D3D12_DEPTH_STENCIL_DESC1 *ds_templ =
+ dzn_graphics_pipeline_get_desc_template(pipeline, ds);
+ if (ds_templ && ds_templ->StencilEnable) {
+ if (ds_templ->FrontFace.StencilFunc != D3D12_COMPARISON_FUNC_NEVER &&
+ ds_templ->FrontFace.StencilFunc != D3D12_COMPARISON_FUNC_ALWAYS)
+ masked_key.stencil_test.front.compare_mask = key->stencil_test.front.compare_mask;
+ if (ds_templ->BackFace.StencilFunc != D3D12_COMPARISON_FUNC_NEVER &&
+ ds_templ->BackFace.StencilFunc != D3D12_COMPARISON_FUNC_ALWAYS)
+ masked_key.stencil_test.back.compare_mask = key->stencil_test.back.compare_mask;
+ if (pipeline->zsa.stencil_test.dynamic_write_mask) {
+ masked_key.stencil_test.front.write_mask = key->stencil_test.front.write_mask;
+ masked_key.stencil_test.back.write_mask = key->stencil_test.back.write_mask;
+ }
+ }
+
struct dzn_device *device =
container_of(pipeline->base.base.device, struct dzn_device, vk);
struct hash_entry *he =
@@ -1290,6 +1322,45 @@ dzn_graphics_pipeline_get_state(struct dzn_graphics_pipeline *pipeline,
if (ib_strip_cut)
*ib_strip_cut = masked_key.ib_strip_cut;
+ D3D12_RASTERIZER_DESC *rast =
+ dzn_graphics_pipeline_get_desc(pipeline, stream_buf, rast);
+ if (rast && pipeline->zsa.dynamic_depth_bias) {
+ rast->DepthBias = masked_key.depth_bias.constant_factor;
+ rast->DepthBiasClamp = masked_key.depth_bias.clamp;
+ rast->SlopeScaledDepthBias = masked_key.depth_bias.slope_factor;
+ }
+
+ D3D12_DEPTH_STENCIL_DESC1 *ds =
+ dzn_graphics_pipeline_get_desc(pipeline, stream_buf, ds);
+ if (ds && ds->StencilEnable) {
+ if (pipeline->zsa.stencil_test.dynamic_compare_mask) {
+ if (ds->FrontFace.StencilFunc != D3D12_COMPARISON_FUNC_NEVER &&
+ ds->FrontFace.StencilFunc != D3D12_COMPARISON_FUNC_ALWAYS) {
+ ds->StencilReadMask = masked_key.stencil_test.front.compare_mask;
+ }
+
+ if (ds->BackFace.StencilFunc != D3D12_COMPARISON_FUNC_NEVER &&
+ ds->BackFace.StencilFunc != D3D12_COMPARISON_FUNC_ALWAYS) {
+ ds->StencilReadMask = masked_key.stencil_test.back.compare_mask;
+ }
+
+ if (ds->FrontFace.StencilFunc != D3D12_COMPARISON_FUNC_NEVER &&
+ ds->FrontFace.StencilFunc != D3D12_COMPARISON_FUNC_ALWAYS &&
+ ds->BackFace.StencilFunc != D3D12_COMPARISON_FUNC_NEVER &&
+ ds->BackFace.StencilFunc != D3D12_COMPARISON_FUNC_ALWAYS)
+ assert(masked_key.stencil_test.front.compare_mask == masked_key.stencil_test.back.compare_mask);
+ }
+
+ if (pipeline->zsa.stencil_test.dynamic_write_mask) {
+ assert(!masked_key.stencil_test.front.write_mask ||
+ !masked_key.stencil_test.back.write_mask ||
+ masked_key.stencil_test.front.write_mask == masked_key.stencil_test.back.write_mask);
+ ds->StencilWriteMask =
+ masked_key.stencil_test.front.write_mask |
+ masked_key.stencil_test.back.write_mask;
+ }
+ }
+
HRESULT hres = ID3D12Device2_CreatePipelineState(device->dev, &stream_desc,
&IID_ID3D12PipelineState,
&variant->state);
diff --git a/src/microsoft/vulkan/dzn_private.h b/src/microsoft/vulkan/dzn_private.h
index 1093048028e..f2cc40d5b2e 100644
--- a/src/microsoft/vulkan/dzn_private.h
+++ b/src/microsoft/vulkan/dzn_private.h
@@ -458,6 +458,16 @@ struct dzn_rendering_attachment {
struct dzn_graphics_pipeline_variant_key {
D3D12_INDEX_BUFFER_STRIP_CUT_VALUE ib_strip_cut;
+ struct {
+ int constant_factor;
+ float slope_factor;
+ float clamp;
+ } depth_bias;
+ struct {
+ struct {
+ uint32_t ref, compare_mask, write_mask;
+ } front, back;
+ } stencil_test;
};
struct dzn_graphics_pipeline_variant {
@@ -791,6 +801,7 @@ struct dzn_graphics_pipeline {
bool dynamic;
float min, max;
} depth_bounds;
+ bool dynamic_depth_bias;
} zsa;
struct {
@@ -803,6 +814,8 @@ struct dzn_graphics_pipeline {
D3D12_PIPELINE_STATE_STREAM_DESC stream_desc;
struct {
uint32_t ib_strip_cut;
+ uint32_t rast;
+ uint32_t ds;
} desc_offsets;
D3D12_INPUT_ELEMENT_DESC inputs[D3D12_VS_INPUT_REGISTER_COUNT];
struct {
More information about the mesa-commit
mailing list