From: Jesse Natalie Date: Wed, 3 May 2023 19:46:17 +0000 (-0700) Subject: dzn: Support separate depth/stencil resolves via blits X-Git-Tag: upstream/23.3.3~9145 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=7d34fe04e4f4e9ad5c49afbfaad2b463832f0ae6;p=platform%2Fupstream%2Fmesa.git dzn: Support separate depth/stencil resolves via blits In theory, ResolveSubresourceRegion should be able to resolve just the depth or just the stencil. In practice, WARP had bugs, which means that was never tested, so just do it via blits. Part-of: --- diff --git a/src/microsoft/vulkan/dzn_cmd_buffer.c b/src/microsoft/vulkan/dzn_cmd_buffer.c index d5e8934..1366193 100644 --- a/src/microsoft/vulkan/dzn_cmd_buffer.c +++ b/src/microsoft/vulkan/dzn_cmd_buffer.c @@ -4563,7 +4563,8 @@ dzn_cmd_buffer_resolve_rendering_attachment_via_blit(struct dzn_cmd_buffer *cmdb static void dzn_cmd_buffer_resolve_rendering_attachment(struct dzn_cmd_buffer *cmdbuf, const struct dzn_rendering_attachment *att, - VkImageAspectFlagBits aspect) + VkImageAspectFlagBits aspect, + bool force_blit_resolve) { struct dzn_image_view *src = att->iview; struct dzn_image_view *dst = att->resolve.iview; @@ -4602,7 +4603,8 @@ dzn_cmd_buffer_resolve_rendering_attachment(struct dzn_cmd_buffer *cmdbuf, dst_range.layerCount = 1; } - if (att->resolve.mode == VK_RESOLVE_MODE_SAMPLE_ZERO_BIT || + if (force_blit_resolve || + att->resolve.mode == VK_RESOLVE_MODE_SAMPLE_ZERO_BIT || /* D3D resolve API can't go from (e.g.) D32S8X24 to D32 */ src->vk.view_format != dst->vk.view_format || (att->resolve.mode != VK_RESOLVE_MODE_AVERAGE_BIT && @@ -4923,15 +4925,20 @@ dzn_CmdEndRendering(VkCommandBuffer commandBuffer) for (uint32_t i = 0; i < cmdbuf->state.render.attachments.color_count; i++) { dzn_cmd_buffer_resolve_rendering_attachment(cmdbuf, &cmdbuf->state.render.attachments.colors[i], - VK_IMAGE_ASPECT_COLOR_BIT); + VK_IMAGE_ASPECT_COLOR_BIT, false); } + bool separate_stencil_resolve = + cmdbuf->state.render.attachments.depth.resolve.mode != + cmdbuf->state.render.attachments.stencil.resolve.mode; dzn_cmd_buffer_resolve_rendering_attachment(cmdbuf, &cmdbuf->state.render.attachments.depth, - VK_IMAGE_ASPECT_DEPTH_BIT); + VK_IMAGE_ASPECT_DEPTH_BIT, + separate_stencil_resolve); dzn_cmd_buffer_resolve_rendering_attachment(cmdbuf, &cmdbuf->state.render.attachments.stencil, - VK_IMAGE_ASPECT_STENCIL_BIT); + VK_IMAGE_ASPECT_STENCIL_BIT, + separate_stencil_resolve); } memset(&cmdbuf->state.render, 0, sizeof(cmdbuf->state.render)); diff --git a/src/microsoft/vulkan/dzn_device.c b/src/microsoft/vulkan/dzn_device.c index 7eaa544..7e0d4b5 100644 --- a/src/microsoft/vulkan/dzn_device.c +++ b/src/microsoft/vulkan/dzn_device.c @@ -1869,8 +1869,8 @@ dzn_GetPhysicalDeviceProperties2(VkPhysicalDevice physicalDevice, .supportedDepthResolveModes = VK_RESOLVE_MODE_SAMPLE_ZERO_BIT | VK_RESOLVE_MODE_AVERAGE_BIT | VK_RESOLVE_MODE_MIN_BIT | VK_RESOLVE_MODE_MAX_BIT, .supportedStencilResolveModes = VK_RESOLVE_MODE_SAMPLE_ZERO_BIT | VK_RESOLVE_MODE_MIN_BIT | VK_RESOLVE_MODE_MAX_BIT, - .independentResolveNone = false, - .independentResolve = false, + .independentResolveNone = true, + .independentResolve = true, .filterMinmaxSingleComponentFormats = false, .filterMinmaxImageComponentMapping = false, .maxTimelineSemaphoreValueDifference = UINT64_MAX,