From: "Rémi Bernon" Subject: [PATCH vkd3d v4 4/4] vkd3d: Factor ReadFrom/WriteToSubresource validation and mapping. Message-Id: <20191002153502.11037-4-rbernon@codeweavers.com> Date: Wed, 2 Oct 2019 17:35:02 +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 | 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