Skip to content

Commit

Permalink
vk: silence sync validation woes around image clearing
Browse files Browse the repository at this point in the history
Prior to this change `R_VkImageClear()` functtion was causing SYNC-HAZARD-WRITE-AFTER-READ error, thinking that clearing `[dest]` image is not synchronized with blit during the previous frame. However, there's an explicit semaphore sync with the previous frame, and as such it seems this validation complaint is baseless.

I'd make a simple repro and submit it to validation repo, but who am i kidding, i have like 10 minutes left to do anything today, and i likely won't be able to get back to this in several days.
  • Loading branch information
w23 committed May 31, 2024
1 parent 243ef25 commit ddbad5e
Show file tree
Hide file tree
Showing 4 changed files with 6 additions and 6 deletions.
6 changes: 3 additions & 3 deletions ref/vk/vk_image.c
Original file line number Diff line number Diff line change
Expand Up @@ -150,11 +150,11 @@ void R_VkImageDestroy(r_vk_image_t *img) {
*img = (r_vk_image_t){0};
}

void R_VkImageClear(VkCommandBuffer cmdbuf, VkImage image) {
void R_VkImageClear(VkCommandBuffer cmdbuf, VkImage image, VkAccessFlags src_access, VkPipelineStageFlags from_stage) {
const VkImageMemoryBarrier image_barriers[] = { {
.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
.image = image,
.srcAccessMask = 0,
.srcAccessMask = src_access,
.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT,
.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED,
.newLayout = VK_IMAGE_LAYOUT_GENERAL,
Expand All @@ -168,7 +168,7 @@ void R_VkImageClear(VkCommandBuffer cmdbuf, VkImage image) {

const VkClearColorValue clear_value = {0};

vkCmdPipelineBarrier(cmdbuf, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0,
vkCmdPipelineBarrier(cmdbuf, from_stage, VK_PIPELINE_STAGE_TRANSFER_BIT, 0,
0, NULL, 0, NULL, COUNTOF(image_barriers), image_barriers);

vkCmdClearColorImage(cmdbuf, image, VK_IMAGE_LAYOUT_GENERAL, &clear_value, 1, &image_barriers->subresourceRange);
Expand Down
2 changes: 1 addition & 1 deletion ref/vk/vk_image.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ typedef struct {
r_vk_image_t R_VkImageCreate(const r_vk_image_create_t *create);
void R_VkImageDestroy(r_vk_image_t *img);

void R_VkImageClear(VkCommandBuffer cmdbuf, VkImage image);
void R_VkImageClear(VkCommandBuffer cmdbuf, VkImage image, VkAccessFlags src_access, VkPipelineStageFlags from_stage);

typedef struct {
VkPipelineStageFlags in_stage;
Expand Down
2 changes: 1 addition & 1 deletion ref/vk/vk_resources.c
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ void R_VkResourcesFrameBeginStateChangeFIXME(VkCommandBuffer cmdbuf, qboolean di
if (discontinuity || res->resource.write.pipelines == 0) {
// TODO is there a better way? Can image be cleared w/o explicit clear op?
DEBUG("discontinuity: %s", res->name);
R_VkImageClear( cmdbuf, res->image.image );
R_VkImageClear( cmdbuf, res->image.image, 0, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT );
res->resource.write.pipelines = VK_PIPELINE_STAGE_TRANSFER_BIT;
res->resource.write.image_layout = VK_IMAGE_LAYOUT_GENERAL;
res->resource.write.access_mask = VK_ACCESS_TRANSFER_WRITE_BIT;
Expand Down
2 changes: 1 addition & 1 deletion ref/vk/vk_rtx.c
Original file line number Diff line number Diff line change
Expand Up @@ -574,7 +574,7 @@ void VK_RayFrameEnd(const vk_ray_frame_render_args_t* args)
},
};

R_VkImageClear( cmdbuf, g_rtx.mainpipe_out->image.image );
R_VkImageClear( cmdbuf, g_rtx.mainpipe_out->image.image, VK_ACCESS_TRANSFER_READ_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT );
R_VkImageBlit( cmdbuf, &blit_args );
} else {
const perform_tracing_args_t trace_args = {
Expand Down

0 comments on commit ddbad5e

Please sign in to comment.