From: Conor McCarthy Subject: [PATCH vkd3d 1/5] vkd3d: Use helper functions for null resource initialisation. Message-Id: <20191210145708.24068-2-cmccarthy@codeweavers.com> Date: Wed, 11 Dec 2019 00:57:04 +1000 In-Reply-To: <20191210145708.24068-1-cmccarthy@codeweavers.com> References: <20191210145708.24068-1-cmccarthy@codeweavers.com> Signed-off-by: Conor McCarthy --- libs/vkd3d/resource.c | 237 ++++++++++++++++++++++++------------------ 1 file changed, 136 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,72 @@ 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) +{ + const bool use_sparse_resources = device->vk_info.sparse_properties.residencyNonResidentStrict; + 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 = 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 */ -- 2.24.0