diff options
author | Hans-Kristian Arntzen <post@arntzen-software.no> | 2022-09-15 17:42:29 +0300 |
---|---|---|
committer | Hans-Kristian Arntzen <post@arntzen-software.no> | 2022-09-17 00:00:21 +0300 |
commit | a31d7a03b19f62f35523be756eef085a589095a1 (patch) | |
tree | 9ea1e523a675b325fefe43073900d1259f3846c4 | |
parent | 9f56051898cecc4da6aeb1ad6914aa2cc3e09ebf (diff) |
vkd3d: Only skip initial layout transition if single subresource.
write_full_subresource may allow us to transition from UNDEFINED so that
we can skip the initial layout transition, but not in the scenario where
the resource has multiple subresources.
Signed-off-by: Hans-Kristian Arntzen <post@arntzen-software.no>
-rw-r--r-- | libs/vkd3d/command.c | 20 | ||||
-rw-r--r-- | libs/vkd3d/vkd3d_private.h | 1 |
2 files changed, 17 insertions, 4 deletions
diff --git a/libs/vkd3d/command.c b/libs/vkd3d/command.c index 1c5b771b..6d016cff 100644 --- a/libs/vkd3d/command.c +++ b/libs/vkd3d/command.c @@ -6723,6 +6723,9 @@ static bool d3d12_command_list_init_copy_texture_region(struct d3d12_command_lis out->writes_full_subresource = d3d12_image_copy_writes_full_subresource(dst_resource, &out->copy.buffer_image.imageExtent, &out->copy.buffer_image.imageSubresource); out->batch_type = VKD3D_BATCH_TYPE_COPY_BUFFER_TO_IMAGE; + + out->writes_full_resource = + out->writes_full_subresource && d3d12_resource_get_sub_resource_count(dst_resource) == 1; } else if (src->Type == D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX && dst->Type == D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX) { @@ -6753,6 +6756,9 @@ static bool d3d12_command_list_init_copy_texture_region(struct d3d12_command_lis &out->copy.image.extent, &out->copy.image.dstSubresource); out->batch_type = VKD3D_BATCH_TYPE_COPY_IMAGE; + + out->writes_full_resource = + out->writes_full_subresource && d3d12_resource_get_sub_resource_count(dst_resource) == 1; } else { @@ -6791,7 +6797,7 @@ static void d3d12_command_list_before_copy_texture_region(struct d3d12_command_l } else if (info->batch_type == VKD3D_BATCH_TYPE_COPY_BUFFER_TO_IMAGE) { - d3d12_command_list_track_resource_usage(list, dst_resource, !info->writes_full_subresource); + d3d12_command_list_track_resource_usage(list, dst_resource, !info->writes_full_resource); d3d12_command_list_transition_image_layout(list, batch, dst_resource->res.vk_image, &info->copy.buffer_image.imageSubresource, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, @@ -6800,7 +6806,7 @@ static void d3d12_command_list_before_copy_texture_region(struct d3d12_command_l } else if (info->batch_type == VKD3D_BATCH_TYPE_COPY_IMAGE) { - d3d12_command_list_track_resource_usage(list, dst_resource, !info->writes_full_subresource); + d3d12_command_list_track_resource_usage(list, dst_resource, !info->writes_full_resource); } } @@ -7236,6 +7242,7 @@ static void d3d12_command_list_resolve_subresource(struct d3d12_command_list *li VkResolveImageInfo2KHR resolve_info; const struct d3d12_device *device; bool writes_full_subresource; + bool writes_full_resource; unsigned int i; if (mode != D3D12_RESOLVE_MODE_AVERAGE) @@ -7291,7 +7298,9 @@ static void d3d12_command_list_resolve_subresource(struct d3d12_command_list *li writes_full_subresource = d3d12_image_copy_writes_full_subresource(dst_resource, &resolve->extent, &resolve->dstSubresource); - d3d12_command_list_track_resource_usage(list, dst_resource, !writes_full_subresource); + writes_full_resource = writes_full_subresource && d3d12_resource_get_sub_resource_count(dst_resource) == 1; + + d3d12_command_list_track_resource_usage(list, dst_resource, !writes_full_resource); d3d12_command_list_track_resource_usage(list, src_resource, true); vk_image_barriers[0].srcAccessMask = 0; @@ -10829,6 +10838,7 @@ static void STDMETHODCALLTYPE d3d12_command_list_ResolveSubresourceRegion(d3d12_ bool writes_full_subresource; bool overlapping_subresource; VkImageCopy2KHR image_copy; + bool writes_full_resource; overlapping_subresource = dst_resource == src_resource && dst_sub_resource_idx == src_sub_resource_idx; @@ -10841,8 +10851,10 @@ static void STDMETHODCALLTYPE d3d12_command_list_ResolveSubresourceRegion(d3d12_ d3d12_image_copy_writes_full_subresource(dst_resource, &extent, &dst_subresource); + writes_full_resource = writes_full_subresource && d3d12_resource_get_sub_resource_count(dst_resource) == 1; + d3d12_command_list_track_resource_usage(list, src_resource, true); - d3d12_command_list_track_resource_usage(list, dst_resource, !writes_full_subresource); + d3d12_command_list_track_resource_usage(list, dst_resource, !writes_full_resource); image_copy.sType = VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR; image_copy.pNext = NULL; diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h index b2417436..d22b5c7c 100644 --- a/libs/vkd3d/vkd3d_private.h +++ b/libs/vkd3d/vkd3d_private.h @@ -2235,6 +2235,7 @@ struct vkd3d_image_copy_info } copy; /* TODO: split d3d12_command_list_copy_image too, so this can be a local variable of before_copy_texture_region. */ bool writes_full_subresource; + bool writes_full_resource; VkImageLayout src_layout; VkImageLayout dst_layout; }; |