vkd3d: Properly align d3d12_command_list allocations.

UBSAN found a bug here since we store RTV descriptors inline, the
compiler can assume the pointer is 64 byte aligned.

Signed-off-by: Hans-Kristian Arntzen <post@arntzen-software.no>
This commit is contained in:
Hans-Kristian Arntzen 2022-01-26 11:49:14 +01:00
parent 1da9ad900c
commit 49d0eb37e3
1 changed files with 5 additions and 3 deletions

View File

@ -3992,7 +3992,7 @@ ULONG STDMETHODCALLTYPE d3d12_command_list_Release(d3d12_command_list_iface *ifa
vkd3d_free(list->active_queries); vkd3d_free(list->active_queries);
vkd3d_free(list->pending_queries); vkd3d_free(list->pending_queries);
vkd3d_free(list->dsv_resource_tracking); vkd3d_free(list->dsv_resource_tracking);
vkd3d_free(list); vkd3d_free_aligned(list);
d3d12_device_release(device); d3d12_device_release(device);
} }
@ -9990,12 +9990,14 @@ HRESULT d3d12_command_list_create(struct d3d12_device *device,
debug_ignored_node_mask(node_mask); debug_ignored_node_mask(node_mask);
if (!(object = vkd3d_malloc(sizeof(*object)))) /* We store RTV descriptors by value, which we align to 64 bytes, so d3d12_command_list inherits this requirement.
* Otherwise ubsan complains. */
if (!(object = vkd3d_malloc_aligned(sizeof(*object), D3D12_DESC_ALIGNMENT)))
return E_OUTOFMEMORY; return E_OUTOFMEMORY;
if (FAILED(hr = d3d12_command_list_init(object, device, type))) if (FAILED(hr = d3d12_command_list_init(object, device, type)))
{ {
vkd3d_free(object); vkd3d_free_aligned(object);
return hr; return hr;
} }