[PATCH vkd3d] vkd3d: Return the standard D3D12 resource alignment instead the Vulkan requirement.
Conor McCarthy
cmccarthy at codeweavers.com
Fri Jun 4 09:30:12 CDT 2021
Some apps, e.g. WoW, ignore a non-standard alignment and use the expected one.
Signed-off-by: Conor McCarthy <cmccarthy at codeweavers.com>
---
libs/vkd3d/device.c | 15 ++++++++++++---
libs/vkd3d/resource.c | 6 ++++++
2 files changed, 18 insertions(+), 3 deletions(-)
diff --git a/libs/vkd3d/device.c b/libs/vkd3d/device.c
index a63fc92b..941e6d04 100644
--- a/libs/vkd3d/device.c
+++ b/libs/vkd3d/device.c
@@ -3221,7 +3221,7 @@ static D3D12_RESOURCE_ALLOCATION_INFO * STDMETHODCALLTYPE d3d12_device_GetResour
if (desc->Dimension == D3D12_RESOURCE_DIMENSION_BUFFER)
{
- info->SizeInBytes = desc->Width;
+ info->SizeInBytes = align(desc->Width, D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT);
info->Alignment = D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT;
}
else
@@ -3235,9 +3235,18 @@ static D3D12_RESOURCE_ALLOCATION_INFO * STDMETHODCALLTYPE d3d12_device_GetResour
requested_alignment = desc->Alignment
? desc->Alignment : D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT;
info->Alignment = max(info->Alignment, requested_alignment);
- }
- info->SizeInBytes = align(info->SizeInBytes, info->Alignment);
+ info->SizeInBytes = align(info->SizeInBytes, info->Alignment);
+
+ /* Pad by the maximum heap offset increase which may be needed to align an offset
+ * supplied by the calling application to a higher Vulkan requirement. This allows
+ * us to return the standard D3D12 alignment and adjust resource placement later. */
+ if(info->Alignment > requested_alignment)
+ {
+ info->SizeInBytes += info->Alignment - requested_alignment;
+ info->Alignment = requested_alignment;
+ }
+ }
TRACE("Size %#"PRIx64", alignment %#"PRIx64".\n", info->SizeInBytes, info->Alignment);
diff --git a/libs/vkd3d/resource.c b/libs/vkd3d/resource.c
index a9d4d464..f3ddc9cb 100644
--- a/libs/vkd3d/resource.c
+++ b/libs/vkd3d/resource.c
@@ -1901,9 +1901,15 @@ static HRESULT vkd3d_bind_heap_memory(struct d3d12_device *device,
VkResult vr;
if (d3d12_resource_is_buffer(resource))
+ {
VK_CALL(vkGetBufferMemoryRequirements(vk_device, resource->u.vk_buffer, &requirements));
+ }
else
+ {
VK_CALL(vkGetImageMemoryRequirements(vk_device, resource->u.vk_image, &requirements));
+ /* Padding in d3d12_device_GetResourceAllocationInfo() leaves room to align the offset. */
+ heap_offset = align(heap_offset, requirements.alignment);
+ }
if (heap_offset % requirements.alignment)
{
--
2.31.1
More information about the wine-devel
mailing list