[PATCH] vkd3d: Store a copy of Vulkan view object handles in descriptors.

Conor McCarthy cmccarthy at codeweavers.com
Fri Nov 1 00:45:25 CDT 2019


In vk_write_descriptor_set_from_d3d12_desc() this avoids memory reads
from the view object on the heap which often cause cache misses. It is
a relatively simple (but hacky) change for a 0.5% frame rate increase
in SotTR.

Signed-off-by: Conor McCarthy <cmccarthy at codeweavers.com>
---
 libs/vkd3d/command.c       | 10 ++++------
 libs/vkd3d/resource.c      | 38 ++++++++++++++++++++++++--------------
 libs/vkd3d/vkd3d_private.h |  7 ++++++-
 3 files changed, 34 insertions(+), 21 deletions(-)

diff --git a/libs/vkd3d/command.c b/libs/vkd3d/command.c
index 0532ec0..69d1baa 100644
--- a/libs/vkd3d/command.c
+++ b/libs/vkd3d/command.c
@@ -2548,8 +2548,6 @@ static bool vk_write_descriptor_set_from_d3d12_desc(VkWriteDescriptorSet *vk_des
         uint32_t descriptor_range_magic, VkDescriptorSet vk_descriptor_set,
         uint32_t vk_binding, unsigned int index)
 {
-    const struct vkd3d_view *view = descriptor->u.view;
-
     if (descriptor->magic != descriptor_range_magic)
         return false;
 
@@ -2582,12 +2580,12 @@ static bool vk_write_descriptor_set_from_d3d12_desc(VkWriteDescriptorSet *vk_des
             if (descriptor->vk_descriptor_type == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER
                     || descriptor->vk_descriptor_type == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER)
             {
-                vk_descriptor_write->pTexelBufferView = &view->u.vk_buffer_view;
+                vk_descriptor_write->pTexelBufferView = (const VkBufferView *)&descriptor->u.v.vk_view;
             }
             else
             {
                 vk_image_info->sampler = VK_NULL_HANDLE;
-                vk_image_info->imageView = view->u.vk_image_view;
+                vk_image_info->imageView = descriptor->u.v.vk_view;
                 vk_image_info->imageLayout = descriptor->magic == VKD3D_DESCRIPTOR_MAGIC_SRV
                         ? VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL : VK_IMAGE_LAYOUT_GENERAL;
 
@@ -2596,7 +2594,7 @@ static bool vk_write_descriptor_set_from_d3d12_desc(VkWriteDescriptorSet *vk_des
             break;
 
         case VKD3D_DESCRIPTOR_MAGIC_SAMPLER:
-            vk_image_info->sampler = view->u.vk_sampler;
+            vk_image_info->sampler = descriptor->u.v.vk_view;
             vk_image_info->imageView = VK_NULL_HANDLE;
             vk_image_info->imageLayout = VK_IMAGE_LAYOUT_UNDEFINED;
 
@@ -2649,7 +2647,7 @@ static void d3d12_command_list_update_descriptor_table(struct d3d12_command_list
                     && register_idx < ARRAY_SIZE(bindings->vk_uav_counter_views))
             {
                 VkBufferView vk_counter_view = descriptor->magic == VKD3D_DESCRIPTOR_MAGIC_UAV
-                        ? descriptor->u.view->vk_counter_view : VK_NULL_HANDLE;
+                        ? descriptor->u.v.vk_counter_view : VK_NULL_HANDLE;
                 if (bindings->vk_uav_counter_views[register_idx] != vk_counter_view)
                     bindings->uav_counter_dirty_mask |= 1u << register_idx;
                 bindings->vk_uav_counter_views[register_idx] = vk_counter_view;
diff --git a/libs/vkd3d/resource.c b/libs/vkd3d/resource.c
index d6e999e..5627aef 100644
--- a/libs/vkd3d/resource.c
+++ b/libs/vkd3d/resource.c
@@ -2044,7 +2044,7 @@ void d3d12_desc_write_atomic(struct d3d12_desc *dst, const struct d3d12_desc *sr
     struct d3d12_desc destroy_desc;
     pthread_mutex_t *mutex;
 
-    destroy_desc.u.view = NULL;
+    destroy_desc.u.v.view = NULL;
 
     mutex = d3d12_device_get_descriptor_mutex(device, dst);
     pthread_mutex_lock(mutex);
@@ -2053,7 +2053,7 @@ void d3d12_desc_write_atomic(struct d3d12_desc *dst, const struct d3d12_desc *sr
     if ((dst->magic == VKD3D_DESCRIPTOR_MAGIC_SRV
             || dst->magic == VKD3D_DESCRIPTOR_MAGIC_UAV
             || dst->magic == VKD3D_DESCRIPTOR_MAGIC_SAMPLER)
-            && !InterlockedDecrement(&dst->u.view->refcount))
+            && !InterlockedDecrement(&dst->u.v.view->refcount))
         destroy_desc = *dst;
 
     *dst = *src;
@@ -2061,8 +2061,8 @@ void d3d12_desc_write_atomic(struct d3d12_desc *dst, const struct d3d12_desc *sr
     pthread_mutex_unlock(mutex);
 
     /* Destroy the view after unlocking to reduce wait time. */
-    if (destroy_desc.u.view)
-        vkd3d_view_destroy_descriptor(destroy_desc.u.view, &destroy_desc, device);
+    if (destroy_desc.u.v.view)
+        vkd3d_view_destroy_descriptor(destroy_desc.u.v.view, &destroy_desc, device);
 }
 
 static void d3d12_desc_destroy(struct d3d12_desc *descriptor, struct d3d12_device *device)
@@ -2089,7 +2089,7 @@ void d3d12_desc_copy(struct d3d12_desc *dst, const struct d3d12_desc *src,
             || src->magic == VKD3D_DESCRIPTOR_MAGIC_UAV
             || src->magic == VKD3D_DESCRIPTOR_MAGIC_SAMPLER)
     {
-        vkd3d_view_incref(src->u.view);
+        vkd3d_view_incref(src->u.v.view);
     }
 
     tmp = *src;
@@ -2527,7 +2527,8 @@ static void vkd3d_create_null_srv(struct d3d12_desc *descriptor,
             {
                 descriptor->magic = VKD3D_DESCRIPTOR_MAGIC_SRV;
                 descriptor->vk_descriptor_type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
-                descriptor->u.view = view;
+                descriptor->u.v.view = view;
+                descriptor->u.v.vk_view = view->u.vk_buffer_view;
             }
             return;
 
@@ -2563,7 +2564,8 @@ static void vkd3d_create_null_srv(struct d3d12_desc *descriptor,
 
     descriptor->magic = VKD3D_DESCRIPTOR_MAGIC_SRV;
     descriptor->vk_descriptor_type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
-    descriptor->u.view = view;
+    descriptor->u.v.view = view;
+    descriptor->u.v.vk_view = view->u.vk_image_view;
 }
 
 static void vkd3d_create_buffer_srv(struct d3d12_desc *descriptor,
@@ -2593,7 +2595,8 @@ static void vkd3d_create_buffer_srv(struct d3d12_desc *descriptor,
 
     descriptor->magic = VKD3D_DESCRIPTOR_MAGIC_SRV;
     descriptor->vk_descriptor_type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
-    descriptor->u.view = view;
+    descriptor->u.v.view = view;
+    descriptor->u.v.vk_view = view->u.vk_buffer_view;
 }
 
 void d3d12_desc_create_srv(struct d3d12_desc *descriptor,
@@ -2697,7 +2700,8 @@ void d3d12_desc_create_srv(struct d3d12_desc *descriptor,
 
     descriptor->magic = VKD3D_DESCRIPTOR_MAGIC_SRV;
     descriptor->vk_descriptor_type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
-    descriptor->u.view = view;
+    descriptor->u.v.view = view;
+    descriptor->u.v.vk_view = view->u.vk_image_view;
 }
 
 static unsigned int vkd3d_view_flags_from_d3d12_buffer_uav_flags(D3D12_BUFFER_UAV_FLAGS flags)
@@ -2734,7 +2738,8 @@ static void vkd3d_create_null_uav(struct d3d12_desc *descriptor,
             {
                 descriptor->magic = VKD3D_DESCRIPTOR_MAGIC_UAV;
                 descriptor->vk_descriptor_type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
-                descriptor->u.view = view;
+                descriptor->u.v.view = view;
+                descriptor->u.v.vk_view = view->u.vk_buffer_view;
             }
             return;
 
@@ -2770,7 +2775,8 @@ static void vkd3d_create_null_uav(struct d3d12_desc *descriptor,
 
     descriptor->magic = VKD3D_DESCRIPTOR_MAGIC_UAV;
     descriptor->vk_descriptor_type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
-    descriptor->u.view = view;
+    descriptor->u.v.view = view;
+    descriptor->u.v.vk_view = view->u.vk_image_view;
 }
 
 static void vkd3d_create_buffer_uav(struct d3d12_desc *descriptor, struct d3d12_device *device,
@@ -2803,7 +2809,8 @@ static void vkd3d_create_buffer_uav(struct d3d12_desc *descriptor, struct d3d12_
 
     descriptor->magic = VKD3D_DESCRIPTOR_MAGIC_UAV;
     descriptor->vk_descriptor_type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
-    descriptor->u.view = view;
+    descriptor->u.v.view = view;
+    descriptor->u.v.vk_view = view->u.vk_buffer_view;
 
     if (counter_resource)
     {
@@ -2820,6 +2827,7 @@ static void vkd3d_create_buffer_uav(struct d3d12_desc *descriptor, struct d3d12_
             view->vk_counter_view = VK_NULL_HANDLE;
             d3d12_desc_destroy(descriptor, device);
         }
+        descriptor->u.v.vk_counter_view = view->vk_counter_view;
     }
 
     /* FIXME: Clears are implemented only for R32_UINT buffer UAVs. */
@@ -2883,7 +2891,8 @@ static void vkd3d_create_texture_uav(struct d3d12_desc *descriptor,
 
     descriptor->magic = VKD3D_DESCRIPTOR_MAGIC_UAV;
     descriptor->vk_descriptor_type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
-    descriptor->u.view = view;
+    descriptor->u.v.view = view;
+    descriptor->u.v.vk_view = view->u.vk_image_view;
 
     descriptor->uav.texture.vk_aspect_mask = vkd3d_desc.format->vk_aspect_mask;
     descriptor->uav.texture.miplevel_idx = vkd3d_desc.miplevel_idx;
@@ -3046,7 +3055,8 @@ void d3d12_desc_create_sampler(struct d3d12_desc *sampler,
 
     sampler->magic = VKD3D_DESCRIPTOR_MAGIC_SAMPLER;
     sampler->vk_descriptor_type = VK_DESCRIPTOR_TYPE_SAMPLER;
-    sampler->u.view = view;
+    sampler->u.v.view = view;
+    sampler->u.v.vk_view = view->u.vk_sampler;
 }
 
 HRESULT vkd3d_create_static_sampler(struct d3d12_device *device,
diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h
index 2d62fda..0f2d916 100644
--- a/libs/vkd3d/vkd3d_private.h
+++ b/libs/vkd3d/vkd3d_private.h
@@ -480,7 +480,12 @@ struct d3d12_desc
     union
     {
         VkDescriptorBufferInfo vk_cbv_info;
-        struct vkd3d_view *view;
+        struct
+        {
+            struct vkd3d_view *view;
+            void *vk_view;
+            VkBufferView vk_counter_view;
+        } v;
     } u;
 
     union
-- 
2.23.0




More information about the wine-devel mailing list