[PATCH vkd3d v4 4/4] vkd3d: Factor ReadFrom/WriteToSubresource validation and mapping.

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


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

diff --git a/libs/vkd3d/resource.c b/libs/vkd3d/resource.c
index 14fbf775..764adff3 100644
--- a/libs/vkd3d/resource.c
+++ b/libs/vkd3d/resource.c
@@ -1347,24 +1347,15 @@ static void d3d12_resource_copy_subresource_data(void *dst_data, const void *src
     }
 }
 
-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)
+static HRESULT d3d12_resource_map_subresource_data(struct d3d12_resource *resource,
+        unsigned int sub_resource_idx, const struct vkd3d_format *format,
+        VkSubresourceLayout *vk_layout, void **data)
 {
-    struct d3d12_resource *resource = impl_from_ID3D12Resource(iface);
+    struct d3d12_device *device;
     const struct vkd3d_vk_device_procs *vk_procs;
     VkImageSubresource vk_sub_resource;
-    const struct vkd3d_format *format;
-    VkSubresourceLayout vk_layout;
-    struct d3d12_device *device;
-    BYTE *dst_data;
-    D3D12_BOX box;
     HRESULT hr;
 
-    TRACE("iface %p, src_data %p, src_row_pitch %u, src_slice_pitch %u, "
-            "dst_sub_resource %u, dst_box %s.\n",
-            iface, src_data, src_row_pitch, src_slice_pitch, dst_sub_resource, debug_d3d12_box(dst_box));
-
     if (d3d12_resource_is_buffer(resource))
     {
         WARN("Buffers are not supported.\n");
@@ -1374,24 +1365,17 @@ static HRESULT STDMETHODCALLTYPE d3d12_resource_WriteToSubresource(ID3D12Resourc
     device = resource->device;
     vk_procs = &device->vk_procs;
 
-    if (!(format = vkd3d_format_from_d3d12_resource_desc(device, &resource->desc, 0)))
-    {
-        ERR("Invalid DXGI format %#x.\n", resource->desc.Format);
-        return E_INVALIDARG;
-    }
+    assert(format);
     if (format->vk_aspect_mask != VK_IMAGE_ASPECT_COLOR_BIT)
     {
         FIXME("Not supported for format %#x.\n", format->dxgi_format);
         return E_NOTIMPL;
     }
 
-    vk_sub_resource.arrayLayer = dst_sub_resource / resource->desc.MipLevels;
-    vk_sub_resource.mipLevel = dst_sub_resource % resource->desc.MipLevels;
+    vk_sub_resource.arrayLayer = sub_resource_idx / resource->desc.MipLevels;
+    vk_sub_resource.mipLevel = sub_resource_idx % resource->desc.MipLevels;
     vk_sub_resource.aspectMask = format->vk_aspect_mask;
 
-    if ((hr = d3d12_resource_validate_box_or_default(resource, dst_sub_resource, dst_box, &box)))
-        return SUCCEEDED(hr) ? S_OK : hr;
-
     if (!d3d12_resource_is_cpu_accessible(resource))
     {
         FIXME_ONCE("Not implemented for this resource type.\n");
@@ -1403,16 +1387,48 @@ static HRESULT STDMETHODCALLTYPE d3d12_resource_WriteToSubresource(ID3D12Resourc
         return E_NOTIMPL;
     }
 
-    VK_CALL(vkGetImageSubresourceLayout(device->vk_device, resource->u.vk_image, &vk_sub_resource, &vk_layout));
+    assert(vk_layout);
+    VK_CALL(vkGetImageSubresourceLayout(device->vk_device, resource->u.vk_image, &vk_sub_resource, vk_layout));
     TRACE("Offset %#"PRIx64", size %#"PRIx64", row pitch %#"PRIx64", depth pitch %#"PRIx64".\n",
-            vk_layout.offset, vk_layout.size, vk_layout.rowPitch, vk_layout.depthPitch);
+            vk_layout->offset, vk_layout->size, vk_layout->rowPitch, vk_layout->depthPitch);
 
-    if (FAILED(hr = d3d12_heap_map(resource->heap, resource->heap_offset, resource, (void **)&dst_data)))
+    assert(data);
+    if (FAILED(hr = d3d12_heap_map(resource->heap, resource->heap_offset, resource, data)))
     {
         WARN("Failed to map resource %p, hr %#x.\n", resource, hr);
         return hr;
     }
 
+    return S_OK;
+}
+
+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)
+{
+    struct d3d12_resource *resource = impl_from_ID3D12Resource(iface);
+    const struct vkd3d_format *format;
+    VkSubresourceLayout vk_layout;
+    BYTE *dst_data;
+    D3D12_BOX box;
+    HRESULT hr;
+
+    TRACE("iface %p, src_data %p, src_row_pitch %u, src_slice_pitch %u, "
+            "dst_sub_resource %u, dst_box %s.\n",
+            iface, src_data, src_row_pitch, src_slice_pitch, dst_sub_resource, debug_d3d12_box(dst_box));
+
+    if (!(format = vkd3d_format_from_d3d12_resource_desc(resource->device, &resource->desc, 0)))
+    {
+        ERR("Invalid DXGI format %#x.\n", resource->desc.Format);
+        return E_INVALIDARG;
+    }
+
+    if ((hr = d3d12_resource_validate_box_or_default(resource, dst_sub_resource, dst_box, &box)))
+        return SUCCEEDED(hr) ? S_OK : hr;
+
+    if (FAILED(hr = d3d12_resource_map_subresource_data(resource, dst_sub_resource, format, &vk_layout, (void**)&dst_data)))
+        return hr;
+
     dst_data += vk_layout.offset;
     dst_data += box.left / format->block_width * format->byte_count * format->block_byte_count;
     dst_data += box.top / format->block_height * vk_layout.rowPitch;
@@ -1432,11 +1448,8 @@ static HRESULT STDMETHODCALLTYPE d3d12_resource_ReadFromSubresource(ID3D12Resour
         UINT src_sub_resource, const D3D12_BOX *src_box)
 {
     struct d3d12_resource *resource = impl_from_ID3D12Resource(iface);
-    const struct vkd3d_vk_device_procs *vk_procs;
-    VkImageSubresource vk_sub_resource;
     const struct vkd3d_format *format;
     VkSubresourceLayout vk_layout;
-    struct d3d12_device *device;
     BYTE *src_data;
     D3D12_BOX box;
     HRESULT hr;
@@ -1445,53 +1458,17 @@ static HRESULT STDMETHODCALLTYPE d3d12_resource_ReadFromSubresource(ID3D12Resour
             "src_sub_resource %u, src_box %s.\n",
             iface, dst_data, dst_row_pitch, dst_slice_pitch, src_sub_resource, debug_d3d12_box(src_box));
 
-    if (d3d12_resource_is_buffer(resource))
-    {
-        WARN("Buffers are not supported.\n");
-        return E_INVALIDARG;
-    }
-
-    device = resource->device;
-    vk_procs = &device->vk_procs;
-
-    if (!(format = vkd3d_format_from_d3d12_resource_desc(device, &resource->desc, 0)))
+    if (!(format = vkd3d_format_from_d3d12_resource_desc(resource->device, &resource->desc, 0)))
     {
         ERR("Invalid DXGI format %#x.\n", resource->desc.Format);
         return E_INVALIDARG;
     }
-    if (format->vk_aspect_mask != VK_IMAGE_ASPECT_COLOR_BIT)
-    {
-        FIXME("Not supported for format %#x.\n", format->dxgi_format);
-        return E_NOTIMPL;
-    }
-
-    vk_sub_resource.arrayLayer = src_sub_resource / resource->desc.MipLevels;
-    vk_sub_resource.mipLevel = src_sub_resource % resource->desc.MipLevels;
-    vk_sub_resource.aspectMask = format->vk_aspect_mask;
 
     if ((hr = d3d12_resource_validate_box_or_default(resource, src_sub_resource, src_box, &box)))
         return SUCCEEDED(hr) ? S_OK : hr;
 
-    if (!d3d12_resource_is_cpu_accessible(resource))
-    {
-        FIXME_ONCE("Not implemented for this resource type.\n");
-        return E_NOTIMPL;
-    }
-    if (!(resource->flags & VKD3D_RESOURCE_LINEAR_TILING))
-    {
-        FIXME_ONCE("Not implemented for image tiling other than VK_IMAGE_TILING_LINEAR.\n");
-        return E_NOTIMPL;
-    }
-
-    VK_CALL(vkGetImageSubresourceLayout(device->vk_device, resource->u.vk_image, &vk_sub_resource, &vk_layout));
-    TRACE("Offset %#"PRIx64", size %#"PRIx64", row pitch %#"PRIx64", depth pitch %#"PRIx64".\n",
-            vk_layout.offset, vk_layout.size, vk_layout.rowPitch, vk_layout.depthPitch);
-
-    if (FAILED(hr = d3d12_heap_map(resource->heap, resource->heap_offset, resource, (void **)&src_data)))
-    {
-        WARN("Failed to map resource %p, hr %#x.\n", resource, hr);
+    if (FAILED(hr = d3d12_resource_map_subresource_data(resource, src_sub_resource, format, &vk_layout, (void**)&src_data)))
         return hr;
-    }
 
     src_data += vk_layout.offset;
     src_data += box.left / format->block_width * format->byte_count * format->block_byte_count;
-- 
2.23.0




More information about the wine-devel mailing list