From: Conor McCarthy cmccarthy@codeweavers.com
--- libs/vkd3d/command.c | 5 +++-- libs/vkd3d/device.c | 1 + libs/vkd3d/resource.c | 4 ++++ libs/vkd3d/vkd3d_private.h | 1 + tests/d3d12.c | 4 ++-- 5 files changed, 11 insertions(+), 4 deletions(-)
diff --git a/libs/vkd3d/command.c b/libs/vkd3d/command.c index a70d1b01f..38934a5d6 100644 --- a/libs/vkd3d/command.c +++ b/libs/vkd3d/command.c @@ -6654,6 +6654,7 @@ static void d3d12_command_queue_update_tile_mappings(struct d3d12_command_queue D3D12_TILE_MAPPING_FLAGS flags) { bool null_binding, aliased_binding, skip_binding, have_unsupported_aliasing; + bool can_alias = command_queue->device->vk_info.sparse_residency_aliased; unsigned int memory_offset, memory_tile_count, tiles_used, subresource; VkDeviceMemory vk_memory = heap ? heap->vk_memory : VK_NULL_HANDLE; struct vkd3d_resource_tile_coordinate base_coordinate; @@ -6729,7 +6730,7 @@ static void d3d12_command_queue_update_tile_mappings(struct d3d12_command_queue null_binding = !!(cur_flags & D3D12_TILE_RANGE_FLAG_NULL); skip_binding = !!(cur_flags & D3D12_TILE_RANGE_FLAG_SKIP); aliased_binding = !!(cur_flags & D3D12_TILE_RANGE_FLAG_REUSE_SINGLE_TILE); - if (aliased_binding && !(null_binding || skip_binding)) + if (aliased_binding && !(null_binding || skip_binding) && !can_alias) { have_unsupported_aliasing = true; skip_binding = true; @@ -6773,7 +6774,7 @@ static void d3d12_command_queue_update_tile_mappings(struct d3d12_command_queue vkd3d_mutex_unlock(&heap->mutex);
if (have_unsupported_aliasing) - FIXME("Aliased bindings are not implemented.\n"); + FIXME("Aliased bindings are not supported by the device.\n");
vkd3d_queue_release(command_queue->vkd3d_queue); } diff --git a/libs/vkd3d/device.c b/libs/vkd3d/device.c index b1eba634f..3c54632ca 100644 --- a/libs/vkd3d/device.c +++ b/libs/vkd3d/device.c @@ -1465,6 +1465,7 @@ static HRESULT vkd3d_init_device_caps(struct d3d12_device *device, vulkan_info->device_limits = physical_device_info->properties2.properties.limits; vulkan_info->sparse_properties = physical_device_info->properties2.properties.sparseProperties; vulkan_info->sparse_residency_3d = features->sparseResidencyImage3D; + vulkan_info->sparse_residency_aliased = features->sparseResidencyAliased; vulkan_info->rasterization_stream = physical_device_info->xfb_properties.transformFeedbackRasterizationStreamSelect; vulkan_info->transform_feedback_queries = physical_device_info->xfb_properties.transformFeedbackQueries; vulkan_info->uav_read_without_format = features->shaderStorageImageReadWithoutFormat; diff --git a/libs/vkd3d/resource.c b/libs/vkd3d/resource.c index bfdc67a2d..fc5c30242 100644 --- a/libs/vkd3d/resource.c +++ b/libs/vkd3d/resource.c @@ -667,6 +667,8 @@ HRESULT vkd3d_create_buffer(struct d3d12_device *device, buffer_info.flags |= VK_BUFFER_CREATE_SPARSE_BINDING_BIT; if (device->vk_info.sparse_properties.residencyNonResidentStrict) buffer_info.flags |= VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT; + if (device->vk_info.sparse_residency_aliased) + buffer_info.flags |= VK_BUFFER_CREATE_SPARSE_ALIASED_BIT; }
buffer_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT @@ -828,6 +830,8 @@ static HRESULT vkd3d_create_image(struct d3d12_device *device, image_info.flags |= VK_IMAGE_CREATE_SPARSE_BINDING_BIT; if (device->vk_info.sparse_properties.residencyNonResidentStrict) image_info.flags |= VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT; + if (device->vk_info.sparse_residency_aliased) + image_info.flags |= VK_IMAGE_CREATE_SPARSE_ALIASED_BIT; }
image_info.imageType = vk_image_type_from_d3d12_resource_dimension(desc->Dimension); diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h index dfc49e866..53aa1d102 100644 --- a/libs/vkd3d/vkd3d_private.h +++ b/libs/vkd3d/vkd3d_private.h @@ -151,6 +151,7 @@ struct vkd3d_vulkan_info
VkPhysicalDeviceSparseProperties sparse_properties; bool sparse_residency_3d; + bool sparse_residency_aliased;
VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT texel_buffer_alignment_properties;
diff --git a/tests/d3d12.c b/tests/d3d12.c index b30615b4b..0b9cadf74 100644 --- a/tests/d3d12.c +++ b/tests/d3d12.c @@ -37163,7 +37163,7 @@ static void test_update_tile_mappings(void) for (i = 0; i < ARRAY_SIZE(buffer_region_tiles); i++) { set_box(&box, i, 0, 0, i + 1, 1, 1); - todo_if((i >= region_offsets[0].X && i < region_offsets[0].X + region_sizes[0].NumTiles) || (i >= 24 && i <= 26)) + todo_if(i >= region_offsets[0].X && i < region_offsets[0].X + region_sizes[0].NumTiles) check_readback_data_uint(&rb.rb, &box, buffer_region_tiles[i], 0); }
@@ -37368,7 +37368,7 @@ static void test_update_tile_mappings(void) for (i = 0; i < j; i++) { set_box(&box, i, 0, 0, i + 1, 1, 1); - todo_if(i == 6 || i == 7 || i == 9 || i == 11 || i == 16) + todo_if(i == 7 || i == 11 || i == 16) check_readback_data_uint(&rb.rb, &box, texture_region_tiles[i], 0); }