[PATCH vkd3d v2 1/5] vkd3d: Use helper functions for null resource initialisation.
Conor McCarthy
cmccarthy at codeweavers.com
Wed Dec 11 22:38:30 CST 2019
Signed-off-by: Conor McCarthy <cmccarthy at 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 */
--
2.24.0
More information about the wine-devel
mailing list