Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/HansKristian-Work/vkd3d-proton.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans-Kristian Arntzen <post@arntzen-software.no>2022-09-15 17:42:29 +0300
committerHans-Kristian Arntzen <post@arntzen-software.no>2022-09-17 00:00:21 +0300
commita31d7a03b19f62f35523be756eef085a589095a1 (patch)
tree9ea1e523a675b325fefe43073900d1259f3846c4
parent9f56051898cecc4da6aeb1ad6914aa2cc3e09ebf (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.c20
-rw-r--r--libs/vkd3d/vkd3d_private.h1
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;
};