anv/blorp: Ignore clears for attachments first used as resolve destinations
Otherwise, we'll try to clear it the first time it's used as a draw so if you do some multisampled rendering, resolve to an attachment, and then draw on top of the single-sampled attachment, we might accidentally clear it. Cc: "13.0" <mesa-stable@lists.freedesktop.org>
This commit is contained in:
@@ -1200,15 +1200,6 @@ anv_cmd_buffer_resolve_subpass(struct anv_cmd_buffer *cmd_buffer)
|
|||||||
struct anv_framebuffer *fb = cmd_buffer->state.framebuffer;
|
struct anv_framebuffer *fb = cmd_buffer->state.framebuffer;
|
||||||
struct anv_subpass *subpass = cmd_buffer->state.subpass;
|
struct anv_subpass *subpass = cmd_buffer->state.subpass;
|
||||||
|
|
||||||
/* FINISHME(perf): Skip clears for resolve attachments.
|
|
||||||
*
|
|
||||||
* From the Vulkan 1.0 spec:
|
|
||||||
*
|
|
||||||
* If the first use of an attachment in a render pass is as a resolve
|
|
||||||
* attachment, then the loadOp is effectively ignored as the resolve is
|
|
||||||
* guaranteed to overwrite all pixels in the render area.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (!subpass->has_resolve)
|
if (!subpass->has_resolve)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -1222,6 +1213,17 @@ anv_cmd_buffer_resolve_subpass(struct anv_cmd_buffer *cmd_buffer)
|
|||||||
if (dst_att == VK_ATTACHMENT_UNUSED)
|
if (dst_att == VK_ATTACHMENT_UNUSED)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if (cmd_buffer->state.attachments[dst_att].pending_clear_aspects) {
|
||||||
|
/* From the Vulkan 1.0 spec:
|
||||||
|
*
|
||||||
|
* If the first use of an attachment in a render pass is as a
|
||||||
|
* resolve attachment, then the loadOp is effectively ignored
|
||||||
|
* as the resolve is guaranteed to overwrite all pixels in the
|
||||||
|
* render area.
|
||||||
|
*/
|
||||||
|
cmd_buffer->state.attachments[dst_att].pending_clear_aspects = 0;
|
||||||
|
}
|
||||||
|
|
||||||
struct anv_image_view *src_iview = fb->attachments[src_att];
|
struct anv_image_view *src_iview = fb->attachments[src_att];
|
||||||
struct anv_image_view *dst_iview = fb->attachments[dst_att];
|
struct anv_image_view *dst_iview = fb->attachments[dst_att];
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user