From: "Rémi Bernon" Subject: [PATCH vkd3d v4 3/4] vkd3d: Factor ReadFrom/WriteToSubresource data copy. Message-Id: <20191002153502.11037-3-rbernon@codeweavers.com> Date: Wed, 2 Oct 2019 17:35:01 +0200 In-Reply-To: <20191002153502.11037-1-rbernon@codeweavers.com> References: <20191002153502.11037-1-rbernon@codeweavers.com> Signed-off-by: Rémi Bernon --- 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