[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