An attempt to create a null resource view of an unsupported type leaves the descriptor uninitialised without having any means of indicating that an error occurred. Hitman 2 uses all of these view types.
Conor McCarthy (5): vkd3d: Use helper functions for null resource initialisation. vkd3d: Add 1D null resources. vkd3d: Add 2D multisampled null resources. vkd3d: Add 3D null resources. vkd3d: Add cubic null resource.
libs/vkd3d/resource.c | 363 +++++++++++++++++++++++++++---------- libs/vkd3d/vkd3d_private.h | 15 ++ 2 files changed, 280 insertions(+), 98 deletions(-)
Signed-off-by: Conor McCarthy cmccarthy@codeweavers.com --- v2: Don't use sparse binding for the 1D texture. --- libs/vkd3d/resource.c | 240 ++++++++++++++++++++++++------------------ 1 file changed, 139 insertions(+), 101 deletions(-)
diff --git a/libs/vkd3d/resource.c b/libs/vkd3d/resource.c index f40d986..ab4df8e 100644 --- a/libs/vkd3d/resource.c +++ b/libs/vkd3d/resource.c @@ -3770,12 +3770,72 @@ HRESULT d3d12_query_heap_create(struct d3d12_device *device, const D3D12_QUERY_H return S_OK; }
+static void vkd3d_transition_null_image(VkCommandBuffer vk_command_buffer, VkImage vk_image, + VkImageLayout new_layout, const struct vkd3d_vk_device_procs *vk_procs) +{ + VkImageMemoryBarrier barrier; + + barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; + barrier.pNext = NULL; + barrier.srcAccessMask = 0; + barrier.dstAccessMask = 0; + barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED; + barrier.newLayout = new_layout; + barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + barrier.image = vk_image; + barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + barrier.subresourceRange.baseMipLevel = 0; + barrier.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS; + barrier.subresourceRange.baseArrayLayer = 0; + barrier.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS; + + VK_CALL(vkCmdPipelineBarrier(vk_command_buffer, + VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, 0, + 0, NULL, 0, NULL, 1, &barrier)); +} + +static void vkd3d_clear_null_ua_image(VkCommandBuffer vk_command_buffer, VkImage vk_image, + const struct vkd3d_vk_device_procs *vk_procs) +{ + static const VkClearColorValue clear_color = {{0}}; + VkImageSubresourceRange range; + VkImageMemoryBarrier barrier; + + barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; + barrier.pNext = NULL; + barrier.srcAccessMask = 0; + barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; + barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED; + barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL; + barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + barrier.image = vk_image; + barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + barrier.subresourceRange.baseMipLevel = 0; + barrier.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS; + barrier.subresourceRange.baseArrayLayer = 0; + barrier.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS; + + VK_CALL(vkCmdPipelineBarrier(vk_command_buffer, + VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, + 0, NULL, 0, NULL, 1, &barrier)); + + range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + range.baseMipLevel = 0; + range.levelCount = 1; + range.baseArrayLayer = 0; + range.layerCount = 1; + + VK_CALL(vkCmdClearColorImage(vk_command_buffer, vk_image, + VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range)); +} + static HRESULT vkd3d_init_null_resources_data(struct vkd3d_null_resources *null_resource, struct d3d12_device *device) { const bool use_sparse_resources = device->vk_info.sparse_properties.residencyNonResidentStrict; const struct vkd3d_vk_device_procs *vk_procs = &device->vk_procs; - static const VkClearColorValue clear_color = {{0}}; VkCommandBufferAllocateInfo command_buffer_info; VkCommandPool vk_command_pool = VK_NULL_HANDLE; VkCommandPoolCreateInfo command_pool_info; @@ -3783,8 +3843,6 @@ static HRESULT vkd3d_init_null_resources_data(struct vkd3d_null_resources *null_ VkCommandBufferBeginInfo begin_info; VkCommandBuffer vk_command_buffer; VkFence vk_fence = VK_NULL_HANDLE; - VkImageSubresourceRange range; - VkImageMemoryBarrier barrier; VkFenceCreateInfo fence_info; struct vkd3d_queue *queue; VkSubmitInfo submit_info; @@ -3833,24 +3891,8 @@ static HRESULT vkd3d_init_null_resources_data(struct vkd3d_null_resources *null_ if (use_sparse_resources) { /* transition 2D UAV image */ - barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; - barrier.pNext = NULL; - barrier.srcAccessMask = 0; - barrier.dstAccessMask = 0; - barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED; - barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL; - barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; - barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; - barrier.image = null_resource->vk_2d_storage_image; - barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; - barrier.subresourceRange.baseMipLevel = 0; - barrier.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS; - barrier.subresourceRange.baseArrayLayer = 0; - barrier.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS; - - VK_CALL(vkCmdPipelineBarrier(vk_command_buffer, - VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, 0, - 0, NULL, 0, NULL, 1, &barrier)); + vkd3d_transition_null_image(vk_command_buffer, null_resource->vk_2d_storage_image, + VK_IMAGE_LAYOUT_GENERAL, vk_procs); } else { @@ -3859,54 +3901,12 @@ static HRESULT vkd3d_init_null_resources_data(struct vkd3d_null_resources *null_ null_resource->vk_storage_buffer, 0, VK_WHOLE_SIZE, 0x00000000));
/* clear 2D UAV image */ - barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; - barrier.pNext = NULL; - barrier.srcAccessMask = 0; - barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; - barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED; - barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL; - barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; - barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; - barrier.image = null_resource->vk_2d_storage_image; - barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; - barrier.subresourceRange.baseMipLevel = 0; - barrier.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS; - barrier.subresourceRange.baseArrayLayer = 0; - barrier.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS; - - VK_CALL(vkCmdPipelineBarrier(vk_command_buffer, - VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, - 0, NULL, 0, NULL, 1, &barrier)); - - range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; - range.baseMipLevel = 0; - range.levelCount = 1; - range.baseArrayLayer = 0; - range.layerCount = 1; - - VK_CALL(vkCmdClearColorImage(vk_command_buffer, - null_resource->vk_2d_storage_image, VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range)); + vkd3d_clear_null_ua_image(vk_command_buffer, null_resource->vk_2d_storage_image, vk_procs); }
/* transition 2D SRV image */ - barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; - barrier.pNext = NULL; - barrier.srcAccessMask = 0; - barrier.dstAccessMask = 0; - barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED; - barrier.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; - barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; - barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; - barrier.image = null_resource->vk_2d_image; - barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; - barrier.subresourceRange.baseMipLevel = 0; - barrier.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS; - barrier.subresourceRange.baseArrayLayer = 0; - barrier.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS; - - VK_CALL(vkCmdPipelineBarrier(vk_command_buffer, - VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, 0, - 0, NULL, 0, NULL, 1, &barrier)); + vkd3d_transition_null_image(vk_command_buffer, null_resource->vk_2d_image, + VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, vk_procs);
if ((vr = VK_CALL(vkEndCommandBuffer(vk_command_buffer))) < 0) { @@ -3956,6 +3956,75 @@ done: return hresult_from_vk_result(vr); }
+static HRESULT vkd3d_create_null_sr_texture(struct d3d12_device *device, D3D12_RESOURCE_DIMENSION dimension, + unsigned int array_size, bool is_multisampled, VkImage *vk_image, VkDeviceMemory *vk_memory) +{ + D3D12_HEAP_PROPERTIES heap_properties; + D3D12_RESOURCE_DESC resource_desc; + HRESULT hr; + + memset(&heap_properties, 0, sizeof(heap_properties)); + heap_properties.Type = D3D12_HEAP_TYPE_DEFAULT; + + resource_desc.Dimension = dimension; + resource_desc.Alignment = 0; + resource_desc.Width = 1; + resource_desc.Height = 1; + resource_desc.DepthOrArraySize = array_size; + resource_desc.MipLevels = 1; + resource_desc.Format = VKD3D_NULL_VIEW_FORMAT; + resource_desc.SampleDesc.Count = is_multisampled ? 4 : 1; + resource_desc.SampleDesc.Quality = 0; + resource_desc.Layout = D3D12_TEXTURE_LAYOUT_UNKNOWN; + resource_desc.Flags = is_multisampled ? D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET : D3D12_RESOURCE_FLAG_NONE; + + if (FAILED(hr = vkd3d_create_image(device, &heap_properties, D3D12_HEAP_FLAG_NONE, + &resource_desc, NULL, vk_image))) + return hr; + if (FAILED(hr = vkd3d_allocate_image_memory(device, *vk_image, + &heap_properties, D3D12_HEAP_FLAG_NONE, vk_memory, NULL, NULL))) + return hr; + + return S_OK; +} + +static HRESULT vkd3d_create_null_ua_texture(struct d3d12_device *device, D3D12_RESOURCE_DIMENSION dimension, + VkImage *vk_image, VkDeviceMemory *vk_memory) +{ + bool use_sparse_resources; + D3D12_HEAP_PROPERTIES heap_properties; + D3D12_RESOURCE_DESC resource_desc; + HRESULT hr; + + use_sparse_resources = device->vk_info.sparse_properties.residencyNonResidentStrict + && dimension != D3D12_RESOURCE_DIMENSION_TEXTURE1D; + + memset(&heap_properties, 0, sizeof(heap_properties)); + heap_properties.Type = D3D12_HEAP_TYPE_DEFAULT; + + resource_desc.Dimension = dimension; + resource_desc.Alignment = 0; + resource_desc.Width = 1; + resource_desc.Height = 1; + resource_desc.DepthOrArraySize = 1; + resource_desc.MipLevels = 1; + resource_desc.Format = VKD3D_NULL_VIEW_FORMAT; + resource_desc.SampleDesc.Count = 1; + resource_desc.SampleDesc.Quality = 0; + resource_desc.Layout = use_sparse_resources + ? D3D12_TEXTURE_LAYOUT_64KB_UNDEFINED_SWIZZLE : D3D12_TEXTURE_LAYOUT_UNKNOWN; + resource_desc.Flags = D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS; + + if (FAILED(hr = vkd3d_create_image(device, use_sparse_resources ? NULL : &heap_properties, D3D12_HEAP_FLAG_NONE, + &resource_desc, NULL, vk_image))) + return hr; + if (!use_sparse_resources && FAILED(hr = vkd3d_allocate_image_memory(device, *vk_image, + &heap_properties, D3D12_HEAP_FLAG_NONE, vk_memory, NULL, NULL))) + return hr; + + return S_OK; +} + HRESULT vkd3d_init_null_resources(struct vkd3d_null_resources *null_resources, struct d3d12_device *device) { @@ -4002,44 +4068,13 @@ HRESULT vkd3d_init_null_resources(struct vkd3d_null_resources *null_resources, goto fail;
/* 2D SRV */ - resource_desc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D; - resource_desc.Alignment = 0; - resource_desc.Width = 1; - resource_desc.Height = 1; - resource_desc.DepthOrArraySize = 1; - resource_desc.MipLevels = 1; - resource_desc.Format = VKD3D_NULL_VIEW_FORMAT; - resource_desc.SampleDesc.Count = 1; - resource_desc.SampleDesc.Quality = 0; - resource_desc.Layout = D3D12_TEXTURE_LAYOUT_UNKNOWN; - resource_desc.Flags = D3D12_RESOURCE_FLAG_NONE; - - if (FAILED(hr = vkd3d_create_image(device, &heap_properties, D3D12_HEAP_FLAG_NONE, - &resource_desc, NULL, &null_resources->vk_2d_image))) - goto fail; - if (FAILED(hr = vkd3d_allocate_image_memory(device, null_resources->vk_2d_image, - &heap_properties, D3D12_HEAP_FLAG_NONE, &null_resources->vk_2d_image_memory, NULL, NULL))) + if (FAILED(hr = vkd3d_create_null_sr_texture(device, D3D12_RESOURCE_DIMENSION_TEXTURE2D, 1, false, + &null_resources->vk_2d_image, &null_resources->vk_2d_image_memory))) goto fail;
/* 2D UAV */ - resource_desc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D; - resource_desc.Alignment = 0; - resource_desc.Width = 1; - resource_desc.Height = 1; - resource_desc.DepthOrArraySize = 1; - resource_desc.MipLevels = 1; - resource_desc.Format = VKD3D_NULL_VIEW_FORMAT; - resource_desc.SampleDesc.Count = 1; - resource_desc.SampleDesc.Quality = 0; - resource_desc.Layout = use_sparse_resources - ? D3D12_TEXTURE_LAYOUT_64KB_UNDEFINED_SWIZZLE : D3D12_TEXTURE_LAYOUT_UNKNOWN; - resource_desc.Flags = D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS; - - if (FAILED(hr = vkd3d_create_image(device, use_sparse_resources ? NULL : &heap_properties, D3D12_HEAP_FLAG_NONE, - &resource_desc, NULL, &null_resources->vk_2d_storage_image))) - goto fail; - if (!use_sparse_resources && FAILED(hr = vkd3d_allocate_image_memory(device, null_resources->vk_2d_storage_image, - &heap_properties, D3D12_HEAP_FLAG_NONE, &null_resources->vk_2d_storage_image_memory, NULL, NULL))) + if (FAILED(hr = vkd3d_create_null_ua_texture(device, D3D12_RESOURCE_DIMENSION_TEXTURE2D, + &null_resources->vk_2d_storage_image, &null_resources->vk_2d_storage_image_memory))) goto fail;
/* set Vulkan object names */
Signed-off-by: Conor McCarthy cmccarthy@codeweavers.com --- libs/vkd3d/resource.c | 51 ++++++++++++++++++++++++++++++++++++++ libs/vkd3d/vkd3d_private.h | 6 +++++ 2 files changed, 57 insertions(+)
diff --git a/libs/vkd3d/resource.c b/libs/vkd3d/resource.c index ab4df8e..271b881 100644 --- a/libs/vkd3d/resource.c +++ b/libs/vkd3d/resource.c @@ -2586,6 +2586,15 @@ static void vkd3d_create_null_srv(struct d3d12_desc *descriptor, } return;
+ case D3D12_SRV_DIMENSION_TEXTURE1D: + vk_image = null_resources->vk_1d_image; + vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_1D; + break; + case D3D12_SRV_DIMENSION_TEXTURE1DARRAY: + vk_image = null_resources->vk_1d_image; + vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_1D_ARRAY; + break; + case D3D12_SRV_DIMENSION_TEXTURE2D: vk_image = null_resources->vk_2d_image; vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_2D; @@ -2793,6 +2802,15 @@ static void vkd3d_create_null_uav(struct d3d12_desc *descriptor, } return;
+ case D3D12_UAV_DIMENSION_TEXTURE1D: + vk_image = null_resources->vk_1d_storage_image; + vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_1D; + break; + case D3D12_UAV_DIMENSION_TEXTURE1DARRAY: + vk_image = null_resources->vk_1d_storage_image; + vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_1D_ARRAY; + break; + case D3D12_UAV_DIMENSION_TEXTURE2D: vk_image = null_resources->vk_2d_storage_image; vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_2D; @@ -3890,6 +3908,10 @@ static HRESULT vkd3d_init_null_resources_data(struct vkd3d_null_resources *null_
if (use_sparse_resources) { + /* transition 1D UAV image */ + vkd3d_transition_null_image(vk_command_buffer, null_resource->vk_1d_storage_image, + VK_IMAGE_LAYOUT_GENERAL, vk_procs); + /* transition 2D UAV image */ vkd3d_transition_null_image(vk_command_buffer, null_resource->vk_2d_storage_image, VK_IMAGE_LAYOUT_GENERAL, vk_procs); @@ -3900,10 +3922,17 @@ static HRESULT vkd3d_init_null_resources_data(struct vkd3d_null_resources *null_ VK_CALL(vkCmdFillBuffer(vk_command_buffer, null_resource->vk_storage_buffer, 0, VK_WHOLE_SIZE, 0x00000000));
+ /* clear 1D UAV image */ + vkd3d_clear_null_ua_image(vk_command_buffer, null_resource->vk_1d_storage_image, vk_procs); + /* clear 2D UAV image */ vkd3d_clear_null_ua_image(vk_command_buffer, null_resource->vk_2d_storage_image, vk_procs); }
+ /* transition 1D SRV image */ + vkd3d_transition_null_image(vk_command_buffer, null_resource->vk_1d_image, + VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, vk_procs); + /* transition 2D SRV image */ vkd3d_transition_null_image(vk_command_buffer, null_resource->vk_2d_image, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, vk_procs); @@ -4067,6 +4096,16 @@ HRESULT vkd3d_init_null_resources(struct vkd3d_null_resources *null_resources, &heap_properties, D3D12_HEAP_FLAG_NONE, &null_resources->vk_storage_buffer_memory, NULL, NULL))) goto fail;
+ /* 1D SRV */ + if (FAILED(hr = vkd3d_create_null_sr_texture(device, D3D12_RESOURCE_DIMENSION_TEXTURE1D, 1, false, + &null_resources->vk_1d_image, &null_resources->vk_1d_image_memory))) + goto fail; + + /* 1D UAV */ + if (FAILED(hr = vkd3d_create_null_ua_texture(device, D3D12_RESOURCE_DIMENSION_TEXTURE1D, + &null_resources->vk_1d_storage_image, &null_resources->vk_1d_storage_image_memory))) + goto fail; + /* 2D SRV */ if (FAILED(hr = vkd3d_create_null_sr_texture(device, D3D12_RESOURCE_DIMENSION_TEXTURE2D, 1, false, &null_resources->vk_2d_image, &null_resources->vk_2d_image_memory))) @@ -4084,6 +4123,12 @@ HRESULT vkd3d_init_null_resources(struct vkd3d_null_resources *null_resources, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, "NULL memory"); vkd3d_set_vk_object_name_utf8(device, (uint64_t)null_resources->vk_storage_buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, "NULL UAV buffer"); + vkd3d_set_vk_object_name_utf8(device, (uint64_t)null_resources->vk_1d_image, + VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, "NULL 1D SRV image"); + vkd3d_set_vk_object_name_utf8(device, (uint64_t)null_resources->vk_1d_image_memory, + VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, "NULL 1D SRV memory"); + vkd3d_set_vk_object_name_utf8(device, (uint64_t)null_resources->vk_1d_storage_image, + VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, "NULL 1D UAV image"); vkd3d_set_vk_object_name_utf8(device, (uint64_t)null_resources->vk_2d_image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, "NULL 2D SRV image"); vkd3d_set_vk_object_name_utf8(device, (uint64_t)null_resources->vk_2d_image_memory, @@ -4117,6 +4162,12 @@ void vkd3d_destroy_null_resources(struct vkd3d_null_resources *null_resources, VK_CALL(vkDestroyBuffer(device->vk_device, null_resources->vk_storage_buffer, NULL)); VK_CALL(vkFreeMemory(device->vk_device, null_resources->vk_storage_buffer_memory, NULL));
+ VK_CALL(vkDestroyImage(device->vk_device, null_resources->vk_1d_image, NULL)); + VK_CALL(vkFreeMemory(device->vk_device, null_resources->vk_1d_image_memory, NULL)); + + VK_CALL(vkDestroyImage(device->vk_device, null_resources->vk_1d_storage_image, NULL)); + VK_CALL(vkFreeMemory(device->vk_device, null_resources->vk_1d_storage_image_memory, NULL)); + VK_CALL(vkDestroyImage(device->vk_device, null_resources->vk_2d_image, NULL)); VK_CALL(vkFreeMemory(device->vk_device, null_resources->vk_2d_image_memory, NULL));
diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h index 0c031d2..c23667d 100644 --- a/libs/vkd3d/vkd3d_private.h +++ b/libs/vkd3d/vkd3d_private.h @@ -1057,6 +1057,12 @@ struct vkd3d_null_resources VkBuffer vk_storage_buffer; VkDeviceMemory vk_storage_buffer_memory;
+ VkImage vk_1d_image; + VkDeviceMemory vk_1d_image_memory; + + VkImage vk_1d_storage_image; + VkDeviceMemory vk_1d_storage_image_memory; + VkImage vk_2d_image; VkDeviceMemory vk_2d_image_memory;
Signed-off-by: Conor McCarthy cmccarthy@codeweavers.com --- libs/vkd3d/resource.c | 25 +++++++++++++++++++++++++ libs/vkd3d/vkd3d_private.h | 3 +++ 2 files changed, 28 insertions(+)
diff --git a/libs/vkd3d/resource.c b/libs/vkd3d/resource.c index 271b881..3ca29a2 100644 --- a/libs/vkd3d/resource.c +++ b/libs/vkd3d/resource.c @@ -2604,6 +2604,15 @@ static void vkd3d_create_null_srv(struct d3d12_desc *descriptor, vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_2D_ARRAY; break;
+ case D3D12_SRV_DIMENSION_TEXTURE2DMS: + vk_image = null_resources->vk_2dms_image; + vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_2D; + break; + case D3D12_SRV_DIMENSION_TEXTURE2DMSARRAY: + vk_image = null_resources->vk_2dms_image; + vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_2D_ARRAY; + break; + default: FIXME("Unhandled view dimension %#x.\n", desc->ViewDimension); return; @@ -3937,6 +3946,10 @@ static HRESULT vkd3d_init_null_resources_data(struct vkd3d_null_resources *null_ vkd3d_transition_null_image(vk_command_buffer, null_resource->vk_2d_image, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, vk_procs);
+ /* transition 2DMS SRV image */ + vkd3d_transition_null_image(vk_command_buffer, null_resource->vk_2dms_image, + VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, vk_procs); + if ((vr = VK_CALL(vkEndCommandBuffer(vk_command_buffer))) < 0) { WARN("Failed to end command buffer, vr %d.\n", vr); @@ -4111,6 +4124,11 @@ HRESULT vkd3d_init_null_resources(struct vkd3d_null_resources *null_resources, &null_resources->vk_2d_image, &null_resources->vk_2d_image_memory))) goto fail;
+ /* 2DMS SRV */ + if (FAILED(hr = vkd3d_create_null_sr_texture(device, D3D12_RESOURCE_DIMENSION_TEXTURE2D, 1, true, + &null_resources->vk_2dms_image, &null_resources->vk_2dms_image_memory))) + goto fail; + /* 2D UAV */ if (FAILED(hr = vkd3d_create_null_ua_texture(device, D3D12_RESOURCE_DIMENSION_TEXTURE2D, &null_resources->vk_2d_storage_image, &null_resources->vk_2d_storage_image_memory))) @@ -4133,6 +4151,10 @@ HRESULT vkd3d_init_null_resources(struct vkd3d_null_resources *null_resources, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, "NULL 2D SRV image"); vkd3d_set_vk_object_name_utf8(device, (uint64_t)null_resources->vk_2d_image_memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, "NULL 2D SRV memory"); + vkd3d_set_vk_object_name_utf8(device, (uint64_t)null_resources->vk_2dms_image, + VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, "NULL 2DMS SRV image"); + vkd3d_set_vk_object_name_utf8(device, (uint64_t)null_resources->vk_2dms_image_memory, + VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, "NULL 2DMS SRV memory"); vkd3d_set_vk_object_name_utf8(device, (uint64_t)null_resources->vk_2d_storage_image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, "NULL 2D UAV image"); if (!use_sparse_resources) @@ -4171,6 +4193,9 @@ void vkd3d_destroy_null_resources(struct vkd3d_null_resources *null_resources, VK_CALL(vkDestroyImage(device->vk_device, null_resources->vk_2d_image, NULL)); VK_CALL(vkFreeMemory(device->vk_device, null_resources->vk_2d_image_memory, NULL));
+ VK_CALL(vkDestroyImage(device->vk_device, null_resources->vk_2dms_image, NULL)); + VK_CALL(vkFreeMemory(device->vk_device, null_resources->vk_2dms_image_memory, NULL)); + VK_CALL(vkDestroyImage(device->vk_device, null_resources->vk_2d_storage_image, NULL)); VK_CALL(vkFreeMemory(device->vk_device, null_resources->vk_2d_storage_image_memory, NULL));
diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h index c23667d..58a9ce0 100644 --- a/libs/vkd3d/vkd3d_private.h +++ b/libs/vkd3d/vkd3d_private.h @@ -1068,6 +1068,9 @@ struct vkd3d_null_resources
VkImage vk_2d_storage_image; VkDeviceMemory vk_2d_storage_image_memory; + + VkImage vk_2dms_image; + VkDeviceMemory vk_2dms_image_memory; };
HRESULT vkd3d_init_null_resources(struct vkd3d_null_resources *null_resources,
Signed-off-by: Conor McCarthy cmccarthy@codeweavers.com --- libs/vkd3d/resource.c | 36 ++++++++++++++++++++++++++++++++++++ libs/vkd3d/vkd3d_private.h | 6 ++++++ 2 files changed, 42 insertions(+)
diff --git a/libs/vkd3d/resource.c b/libs/vkd3d/resource.c index 3ca29a2..cd181bc 100644 --- a/libs/vkd3d/resource.c +++ b/libs/vkd3d/resource.c @@ -2613,6 +2613,11 @@ static void vkd3d_create_null_srv(struct d3d12_desc *descriptor, vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_2D_ARRAY; break;
+ case D3D12_SRV_DIMENSION_TEXTURE3D: + vk_image = null_resources->vk_3d_image; + vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_3D; + break; + default: FIXME("Unhandled view dimension %#x.\n", desc->ViewDimension); return; @@ -2829,6 +2834,11 @@ static void vkd3d_create_null_uav(struct d3d12_desc *descriptor, vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_2D_ARRAY; break;
+ case D3D12_UAV_DIMENSION_TEXTURE3D: + vk_image = null_resources->vk_3d_storage_image; + vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_3D; + break; + default: FIXME("Unhandled view dimension %#x.\n", desc->ViewDimension); return; @@ -3950,6 +3960,10 @@ static HRESULT vkd3d_init_null_resources_data(struct vkd3d_null_resources *null_ vkd3d_transition_null_image(vk_command_buffer, null_resource->vk_2dms_image, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, vk_procs);
+ /* transition 3D SRV image */ + vkd3d_transition_null_image(vk_command_buffer, null_resource->vk_3d_image, + VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, vk_procs); + if ((vr = VK_CALL(vkEndCommandBuffer(vk_command_buffer))) < 0) { WARN("Failed to end command buffer, vr %d.\n", vr); @@ -4134,6 +4148,16 @@ HRESULT vkd3d_init_null_resources(struct vkd3d_null_resources *null_resources, &null_resources->vk_2d_storage_image, &null_resources->vk_2d_storage_image_memory))) goto fail;
+ /* 3D SRV */ + if (FAILED(hr = vkd3d_create_null_sr_texture(device, D3D12_RESOURCE_DIMENSION_TEXTURE3D, 1, false, + &null_resources->vk_3d_image, &null_resources->vk_3d_image_memory))) + goto fail; + + /* 3D UAV */ + if (FAILED(hr = vkd3d_create_null_ua_texture(device, D3D12_RESOURCE_DIMENSION_TEXTURE3D, + &null_resources->vk_3d_storage_image, &null_resources->vk_3d_storage_image_memory))) + goto fail; + /* set Vulkan object names */ vkd3d_set_vk_object_name_utf8(device, (uint64_t)null_resources->vk_buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, "NULL buffer"); @@ -4157,6 +4181,12 @@ HRESULT vkd3d_init_null_resources(struct vkd3d_null_resources *null_resources, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, "NULL 2DMS SRV memory"); vkd3d_set_vk_object_name_utf8(device, (uint64_t)null_resources->vk_2d_storage_image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, "NULL 2D UAV image"); + vkd3d_set_vk_object_name_utf8(device, (uint64_t)null_resources->vk_3d_image, + VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, "NULL 3D SRV image"); + vkd3d_set_vk_object_name_utf8(device, (uint64_t)null_resources->vk_3d_image_memory, + VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, "NULL 3D SRV memory"); + vkd3d_set_vk_object_name_utf8(device, (uint64_t)null_resources->vk_3d_storage_image, + VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, "NULL 3D UAV image"); if (!use_sparse_resources) { vkd3d_set_vk_object_name_utf8(device, (uint64_t)null_resources->vk_storage_buffer_memory, @@ -4199,5 +4229,11 @@ void vkd3d_destroy_null_resources(struct vkd3d_null_resources *null_resources, VK_CALL(vkDestroyImage(device->vk_device, null_resources->vk_2d_storage_image, NULL)); VK_CALL(vkFreeMemory(device->vk_device, null_resources->vk_2d_storage_image_memory, NULL));
+ VK_CALL(vkDestroyImage(device->vk_device, null_resources->vk_3d_image, NULL)); + VK_CALL(vkFreeMemory(device->vk_device, null_resources->vk_3d_image_memory, NULL)); + + VK_CALL(vkDestroyImage(device->vk_device, null_resources->vk_3d_storage_image, NULL)); + VK_CALL(vkFreeMemory(device->vk_device, null_resources->vk_3d_storage_image_memory, NULL)); + memset(null_resources, 0, sizeof(*null_resources)); } diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h index 58a9ce0..5b44a49 100644 --- a/libs/vkd3d/vkd3d_private.h +++ b/libs/vkd3d/vkd3d_private.h @@ -1071,6 +1071,12 @@ struct vkd3d_null_resources
VkImage vk_2dms_image; VkDeviceMemory vk_2dms_image_memory; + + VkImage vk_3d_image; + VkDeviceMemory vk_3d_image_memory; + + VkImage vk_3d_storage_image; + VkDeviceMemory vk_3d_storage_image_memory; };
HRESULT vkd3d_init_null_resources(struct vkd3d_null_resources *null_resources,
Signed-off-by: Conor McCarthy cmccarthy@codeweavers.com --- libs/vkd3d/resource.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-)
diff --git a/libs/vkd3d/resource.c b/libs/vkd3d/resource.c index cd181bc..62e8c44 100644 --- a/libs/vkd3d/resource.c +++ b/libs/vkd3d/resource.c @@ -2589,33 +2589,51 @@ static void vkd3d_create_null_srv(struct d3d12_desc *descriptor, case D3D12_SRV_DIMENSION_TEXTURE1D: vk_image = null_resources->vk_1d_image; vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_1D; + vkd3d_desc.layer_count = 1; break; case D3D12_SRV_DIMENSION_TEXTURE1DARRAY: vk_image = null_resources->vk_1d_image; vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_1D_ARRAY; + vkd3d_desc.layer_count = 1; break;
case D3D12_SRV_DIMENSION_TEXTURE2D: vk_image = null_resources->vk_2d_image; vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_2D; + vkd3d_desc.layer_count = 1; break; case D3D12_SRV_DIMENSION_TEXTURE2DARRAY: vk_image = null_resources->vk_2d_image; vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_2D_ARRAY; + vkd3d_desc.layer_count = 1; break;
case D3D12_SRV_DIMENSION_TEXTURE2DMS: vk_image = null_resources->vk_2dms_image; vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_2D; + vkd3d_desc.layer_count = 1; break; case D3D12_SRV_DIMENSION_TEXTURE2DMSARRAY: vk_image = null_resources->vk_2dms_image; vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_2D_ARRAY; + vkd3d_desc.layer_count = 1; break;
case D3D12_SRV_DIMENSION_TEXTURE3D: vk_image = null_resources->vk_3d_image; vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_3D; + vkd3d_desc.layer_count = 1; + break; + + case D3D12_SRV_DIMENSION_TEXTURECUBE: + vk_image = null_resources->vk_2d_image; + vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_CUBE; + vkd3d_desc.layer_count = 6; + break; + case D3D12_SRV_DIMENSION_TEXTURECUBEARRAY: + vk_image = null_resources->vk_2d_image; + vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_CUBE_ARRAY; + vkd3d_desc.layer_count = 6; break;
default: @@ -2629,7 +2647,6 @@ static void vkd3d_create_null_srv(struct d3d12_desc *descriptor, vkd3d_desc.miplevel_idx = 0; vkd3d_desc.miplevel_count = 1; vkd3d_desc.layer_idx = 0; - vkd3d_desc.layer_count = 1; vkd3d_desc.components.r = VK_COMPONENT_SWIZZLE_ZERO; vkd3d_desc.components.g = VK_COMPONENT_SWIZZLE_ZERO; vkd3d_desc.components.b = VK_COMPONENT_SWIZZLE_ZERO; @@ -4134,7 +4151,7 @@ HRESULT vkd3d_init_null_resources(struct vkd3d_null_resources *null_resources, goto fail;
/* 2D SRV */ - if (FAILED(hr = vkd3d_create_null_sr_texture(device, D3D12_RESOURCE_DIMENSION_TEXTURE2D, 1, false, + if (FAILED(hr = vkd3d_create_null_sr_texture(device, D3D12_RESOURCE_DIMENSION_TEXTURE2D, 6, false, &null_resources->vk_2d_image, &null_resources->vk_2d_image_memory))) goto fail;