[PATCH vkd3d v4 3/4] vkd3d: Factor ReadFrom/WriteToSubresource data copy.

Rémi Bernon rbernon at codeweavers.com
Wed Oct 2 10:35:01 CDT 2019


Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
 libs/vkd3d/resource.c | 70 ++++++++++++++++++++++++-------------------
 1 file changed, 39 insertions(+), 31 deletions(-)

diff --git a/libs/vkd3d/resource.c b/libs/vkd3d/resource.c
index dd66f175..14fbf775 100644
--- a/libs/vkd3d/resource.c
+++ b/libs/vkd3d/resource.c
@@ -1322,6 +1322,31 @@ static D3D12_GPU_VIRTUAL_ADDRESS STDMETHODCALLTYPE d3d12_resource_GetGPUVirtualA
     return resource->gpu_address;
 }
 
+static void d3d12_resource_copy_subresource_data(void *dst_data, const void *src_data,
+        UINT dst_slice_pitch, UINT dst_row_pitch, UINT src_slice_pitch, UINT src_row_pitch,
+        const D3D12_BOX *box, const struct vkd3d_format *format)
+{
+    unsigned int y, z;
+    size_t size;
+    BYTE *dst;
+    const BYTE *src;
+
+    assert(box);
+    assert(format);
+    size = (box->right - box->left) / format->block_width * format->byte_count * format->block_byte_count;
+    for (z = box->front; z < box->back; ++z)
+    {
+        dst = (uint8_t *)dst_data + (z - box->front) * dst_slice_pitch;
+        src = (uint8_t *)src_data + (z - box->front) * src_slice_pitch;
+        for (y = box->top; y < box->bottom; y += format->block_height)
+        {
+            memcpy(dst, src, size);
+            dst += dst_row_pitch;
+            src += src_row_pitch;
+        }
+    }
+}
+
 static HRESULT STDMETHODCALLTYPE d3d12_resource_WriteToSubresource(ID3D12Resource *iface,
         UINT dst_sub_resource, const D3D12_BOX *dst_box, const void *src_data,
         UINT src_row_pitch, UINT src_slice_pitch)
@@ -1332,11 +1357,8 @@ static HRESULT STDMETHODCALLTYPE d3d12_resource_WriteToSubresource(ID3D12Resourc
     const struct vkd3d_format *format;
     VkSubresourceLayout vk_layout;
     struct d3d12_device *device;
-    BYTE *dst_data, *dst;
-    BYTE const *src;
-    unsigned int y, z;
+    BYTE *dst_data;
     D3D12_BOX box;
-    size_t size;
     HRESULT hr;
 
     TRACE("iface %p, src_data %p, src_row_pitch %u, src_slice_pitch %u, "
@@ -1393,18 +1415,12 @@ static HRESULT STDMETHODCALLTYPE d3d12_resource_WriteToSubresource(ID3D12Resourc
 
     dst_data += vk_layout.offset;
     dst_data += box.left / format->block_width * format->byte_count * format->block_byte_count;
-    size = (box.right - box.left) / format->block_width * format->byte_count * format->block_byte_count;
-    for (z = box.front; z < box.back; ++z)
-    {
-        src = (uint8_t *)src_data + (z - box.front) * src_slice_pitch;
-        dst = dst_data + z * vk_layout.depthPitch + box.top / format->block_height * vk_layout.rowPitch;
-        for (y = box.top; y < box.bottom; y += format->block_height)
-        {
-            memcpy(dst, src, size);
-            src += src_row_pitch;
-            dst += vk_layout.rowPitch;
-        }
-    }
+    dst_data += box.top / format->block_height * vk_layout.rowPitch;
+    dst_data += box.front * vk_layout.depthPitch;
+
+    d3d12_resource_copy_subresource_data(dst_data, src_data,
+            vk_layout.depthPitch, vk_layout.rowPitch, src_slice_pitch, src_row_pitch,
+            &box, format);
 
     d3d12_heap_unmap(resource->heap, resource);
 
@@ -1421,10 +1437,8 @@ static HRESULT STDMETHODCALLTYPE d3d12_resource_ReadFromSubresource(ID3D12Resour
     const struct vkd3d_format *format;
     VkSubresourceLayout vk_layout;
     struct d3d12_device *device;
-    BYTE *src_data, *src, *dst;
-    unsigned int y, z;
+    BYTE *src_data;
     D3D12_BOX box;
-    size_t size;
     HRESULT hr;
 
     TRACE("iface %p, dst_data %p, dst_row_pitch %u, dst_slice_pitch %u, "
@@ -1481,18 +1495,12 @@ static HRESULT STDMETHODCALLTYPE d3d12_resource_ReadFromSubresource(ID3D12Resour
 
     src_data += vk_layout.offset;
     src_data += box.left / format->block_width * format->byte_count * format->block_byte_count;
-    size = (box.right - box.left) / format->block_width * format->byte_count * format->block_byte_count;
-    for (z = box.front; z < box.back; ++z)
-    {
-        dst = (uint8_t *)dst_data + (z - box.front) * dst_slice_pitch;
-        src = src_data + z * vk_layout.depthPitch + box.top / format->block_height * vk_layout.rowPitch;
-        for (y = box.top; y < box.bottom; y += format->block_height)
-        {
-            memcpy(dst, src, size);
-            dst += dst_row_pitch;
-            src += vk_layout.rowPitch;
-        }
-    }
+    src_data += box.top / format->block_height * vk_layout.rowPitch;
+    src_data += box.front * vk_layout.depthPitch;
+
+    d3d12_resource_copy_subresource_data(dst_data, src_data,
+            dst_slice_pitch, dst_row_pitch, vk_layout.depthPitch, vk_layout.rowPitch,
+            &box, format);
 
     d3d12_heap_unmap(resource->heap, resource);
 
-- 
2.23.0




More information about the wine-devel mailing list