diff --git a/libs/vkd3d/command.c b/libs/vkd3d/command.c
index e5649a9e29d1b48cb112f5b407542dbac6ed2ec1..32d420d655fa8c31dfeb9de763ce0a72b74dbbbd 100644
--- a/libs/vkd3d/command.c
+++ b/libs/vkd3d/command.c
@@ -1935,7 +1935,7 @@ static void d3d12_command_list_update_descriptor_table(struct d3d12_command_list
         return;
     }
 
-    descriptor = (struct d3d12_desc *)(intptr_t)base_descriptor.ptr;
+    descriptor = d3d12_desc_from_gpu_handle(base_descriptor);
 
     d3d12_command_list_prepare_descriptors(list, bind_point);
 
@@ -1948,8 +1948,7 @@ static void d3d12_command_list_update_descriptor_table(struct d3d12_command_list
 
         if (range->offset != D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND)
         {
-            descriptor = (struct d3d12_desc *)(intptr_t)base_descriptor.ptr;
-            descriptor += range->offset;
+            descriptor = d3d12_desc_from_gpu_handle(base_descriptor) + range->offset;
         }
 
         for (j = 0; j < range->descriptor_count; ++j, ++descriptor)
diff --git a/libs/vkd3d/device.c b/libs/vkd3d/device.c
index 79647de7dcaf591dde0ec03380504dc91740b16a..a599a7a337dd319cc6b9e283a279c39ec27944b3 100644
--- a/libs/vkd3d/device.c
+++ b/libs/vkd3d/device.c
@@ -1290,7 +1290,8 @@ static void STDMETHODCALLTYPE d3d12_device_CopyDescriptors(ID3D12Device *iface,
 {
     struct d3d12_device *device = impl_from_ID3D12Device(iface);
     unsigned int dst_range_idx, dst_idx, src_range_idx, src_idx;
-    struct d3d12_desc *dst, *src;
+    const struct d3d12_desc *src;
+    struct d3d12_desc *dst;
 
     TRACE("iface %p, dst_descriptor_range_count %u, dst_descriptor_range_offsets %p, "
             "dst_descriptor_range_sizes %p, src_descriptor_range_count %u, "
@@ -1308,16 +1309,16 @@ static void STDMETHODCALLTYPE d3d12_device_CopyDescriptors(ID3D12Device *iface,
     }
 
     dst_range_idx = dst_idx = 0;
-    dst = (struct d3d12_desc *)dst_descriptor_range_offsets[0].ptr;
+    dst = d3d12_desc_from_cpu_handle(dst_descriptor_range_offsets[0]);
     for (src_range_idx = 0; src_range_idx < src_descriptor_range_count; ++src_range_idx)
     {
-        src = (struct d3d12_desc *)src_descriptor_range_offsets[src_range_idx].ptr;
+        src = d3d12_desc_from_cpu_handle(src_descriptor_range_offsets[src_range_idx]);
         for (src_idx = 0; src_idx < src_descriptor_range_sizes[src_range_idx]; ++src_idx)
         {
             if (dst_idx >= dst_descriptor_range_sizes[dst_range_idx])
             {
                 ++dst_range_idx;
-                dst = (struct d3d12_desc *)dst_descriptor_range_offsets[dst_range_idx].ptr;
+                dst = d3d12_desc_from_cpu_handle(dst_descriptor_range_offsets[dst_range_idx]);
                 dst_idx = 0;
             }
 
diff --git a/libs/vkd3d/resource.c b/libs/vkd3d/resource.c
index b419e5bb2f60b3979443a9d86046c4c35a29ed8f..22f62a565e2ad433f8a73acc706af0f2bd1a95b4 100644
--- a/libs/vkd3d/resource.c
+++ b/libs/vkd3d/resource.c
@@ -826,7 +826,7 @@ static void d3d12_desc_destroy(struct d3d12_desc *descriptor,
     memset(descriptor, 0, sizeof(*descriptor));
 }
 
-void d3d12_desc_copy(struct d3d12_desc *dst, struct d3d12_desc *src,
+void d3d12_desc_copy(struct d3d12_desc *dst, const struct d3d12_desc *src,
         struct d3d12_device *device)
 {
     d3d12_desc_destroy(dst, device);
diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h
index 496c9f4a5cf784cb0449c931bdb1d4ab3cb3111e..676bb9cc4924d57cc656e99459738c19a79d00e7 100644
--- a/libs/vkd3d/vkd3d_private.h
+++ b/libs/vkd3d/vkd3d_private.h
@@ -211,7 +211,17 @@ struct d3d12_desc
     } u;
 };
 
-void d3d12_desc_copy(struct d3d12_desc *dst, struct d3d12_desc *src,
+static inline struct d3d12_desc *d3d12_desc_from_cpu_handle(D3D12_CPU_DESCRIPTOR_HANDLE cpu_handle)
+{
+    return (struct d3d12_desc *)cpu_handle.ptr;
+}
+
+static inline struct d3d12_desc *d3d12_desc_from_gpu_handle(D3D12_GPU_DESCRIPTOR_HANDLE gpu_handle)
+{
+    return (struct d3d12_desc *)(intptr_t)gpu_handle.ptr;
+}
+
+void d3d12_desc_copy(struct d3d12_desc *dst, const struct d3d12_desc *src,
         struct d3d12_device *device) DECLSPEC_HIDDEN;
 void d3d12_desc_create_cbv(struct d3d12_desc *descriptor,
         struct d3d12_device *device, const D3D12_CONSTANT_BUFFER_VIEW_DESC *desc) DECLSPEC_HIDDEN;