[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