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 4d2337f84..ce1bf86fc 100644 --- a/libs/vkd3d/command.c +++ b/libs/vkd3d/command.c @@ -6875,6 +6875,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; @@ -6950,7 +6951,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; @@ -6994,7 +6995,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 cf8b506fd..4b6575b9c 100644 --- a/libs/vkd3d/device.c +++ b/libs/vkd3d/device.c @@ -1504,6 +1504,7 @@ static HRESULT vkd3d_init_device_caps(struct d3d12_device *device, vulkan_info->sparse_properties = physical_device_info->properties2.properties.sparseProperties; vulkan_info->sparse_binding = features->sparseBinding; 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 78ffa62a5..c1d402a4c 100644 --- a/libs/vkd3d/resource.c +++ b/libs/vkd3d/resource.c @@ -671,6 +671,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 @@ -831,6 +833,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 6d8219f89..3f78fceba 100644 --- a/libs/vkd3d/vkd3d_private.h +++ b/libs/vkd3d/vkd3d_private.h @@ -156,6 +156,7 @@ struct vkd3d_vulkan_info VkPhysicalDeviceSparseProperties sparse_properties; bool sparse_binding; bool sparse_residency_3d; + bool sparse_residency_aliased;
VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT texel_buffer_alignment_properties;
diff --git a/tests/d3d12.c b/tests/d3d12.c index e2c39c73e..a71244791 100644 --- a/tests/d3d12.c +++ b/tests/d3d12.c @@ -38596,7 +38596,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); }
@@ -38801,7 +38801,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); }