[PATCH vkd3d 10/12] libs/vkd3d: Add support for 2D array render target views.

Józef Kucia joseph.kucia at gmail.com
Tue Jun 26 07:41:51 CDT 2018


From: Józef Kucia <jkucia at codeweavers.com>

Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
---
 libs/vkd3d/command.c       | 41 +++++++++++++++++++++++------------------
 libs/vkd3d/resource.c      |  8 ++++++--
 libs/vkd3d/vkd3d_private.h |  2 ++
 3 files changed, 31 insertions(+), 20 deletions(-)

diff --git a/libs/vkd3d/command.c b/libs/vkd3d/command.c
index 82a99fda2511..ee1d3f6e1018 100644
--- a/libs/vkd3d/command.c
+++ b/libs/vkd3d/command.c
@@ -1583,7 +1583,7 @@ static HRESULT STDMETHODCALLTYPE d3d12_command_list_ClearState(ID3D12GraphicsCom
 }
 
 static void d3d12_command_list_get_fb_extent(struct d3d12_command_list *list,
-        uint32_t *width, uint32_t *height)
+        uint32_t *width, uint32_t *height, uint32_t *layer_count)
 {
     struct d3d12_device *device = list->device;
 
@@ -1591,11 +1591,15 @@ static void d3d12_command_list_get_fb_extent(struct d3d12_command_list *list,
     {
         *width = list->fb_width;
         *height = list->fb_height;
+        if (layer_count)
+            *layer_count = list->fb_layer_count;
     }
     else
     {
         *width = device->vk_info.device_limits.maxFramebufferWidth;
         *height = device->vk_info.device_limits.maxFramebufferHeight;
+        if (layer_count)
+            *layer_count = 1;
     }
 }
 
@@ -1620,8 +1624,7 @@ static bool d3d12_command_list_update_current_framebuffer(struct d3d12_command_l
     fb_desc.renderPass = list->state->u.graphics.render_pass;
     fb_desc.attachmentCount = list->state->u.graphics.attachment_count;
     fb_desc.pAttachments = &list->views[start_idx];
-    d3d12_command_list_get_fb_extent(list, &fb_desc.width, &fb_desc.height);
-    fb_desc.layers = 1;
+    d3d12_command_list_get_fb_extent(list, &fb_desc.width, &fb_desc.height, &fb_desc.layers);
     if ((vr = VK_CALL(vkCreateFramebuffer(device->vk_device, &fb_desc, NULL, &vk_framebuffer))) < 0)
     {
         WARN("Failed to create Vulkan framebuffer, vr %d.\n", vr);
@@ -2212,7 +2215,7 @@ static bool d3d12_command_list_begin_render_pass(struct d3d12_command_list *list
     begin_desc.renderArea.offset.x = 0;
     begin_desc.renderArea.offset.y = 0;
     d3d12_command_list_get_fb_extent(list,
-            &begin_desc.renderArea.extent.width, &begin_desc.renderArea.extent.height);
+            &begin_desc.renderArea.extent.width, &begin_desc.renderArea.extent.height, NULL);
     begin_desc.clearValueCount = 0;
     begin_desc.pClearValues = NULL;
     VK_CALL(vkCmdBeginRenderPass(list->vk_command_buffer, &begin_desc, VK_SUBPASS_CONTENTS_INLINE));
@@ -3438,6 +3441,7 @@ static void STDMETHODCALLTYPE d3d12_command_list_OMSetRenderTargets(ID3D12Graphi
 
     list->fb_width = 0;
     list->fb_height = 0;
+    list->fb_layer_count = 0;
     for (i = 0; i < render_target_descriptor_count; ++i)
     {
         if (single_descriptor_handle)
@@ -3448,10 +3452,9 @@ static void STDMETHODCALLTYPE d3d12_command_list_OMSetRenderTargets(ID3D12Graphi
         d3d12_command_list_track_resource_usage(list, rtv_desc->resource);
 
         list->views[i + 1] = rtv_desc->vk_view;
-        if (rtv_desc->width > list->fb_width)
-            list->fb_width = rtv_desc->width;
-        if (rtv_desc->height > list->fb_height)
-            list->fb_height = rtv_desc->height;
+        list->fb_width = max(list->fb_width, rtv_desc->width);
+        list->fb_height = max(list->fb_height, rtv_desc->height);
+        list->fb_layer_count = max(list->fb_layer_count, rtv_desc->layer_count);
     }
 
     if (depth_stencil_descriptor)
@@ -3460,10 +3463,9 @@ static void STDMETHODCALLTYPE d3d12_command_list_OMSetRenderTargets(ID3D12Graphi
 
         d3d12_command_list_track_resource_usage(list, dsv_desc->resource);
 
-        if (dsv_desc->width > list->fb_width)
-            list->fb_width = dsv_desc->width;
-        if (dsv_desc->height > list->fb_height)
-            list->fb_height = dsv_desc->height;
+        list->fb_width = max(list->fb_width, dsv_desc->width);
+        list->fb_height = max(list->fb_height, dsv_desc->height);
+        list->fb_layer_count = max(list->fb_layer_count, 1);
 
         list->views[0] = dsv_desc->vk_view;
     }
@@ -3471,9 +3473,10 @@ static void STDMETHODCALLTYPE d3d12_command_list_OMSetRenderTargets(ID3D12Graphi
     d3d12_command_list_invalidate_current_framebuffer(list);
 }
 
-static void d3d12_command_list_clear(struct d3d12_command_list *list, const struct vkd3d_vk_device_procs *vk_procs,
-        const struct VkAttachmentDescription *attachment_desc, const struct VkAttachmentReference *color_reference,
-        const struct VkAttachmentReference *ds_reference, VkImageView vk_view, size_t width, size_t height,
+static void d3d12_command_list_clear(struct d3d12_command_list *list,
+        const struct vkd3d_vk_device_procs *vk_procs, const struct VkAttachmentDescription *attachment_desc,
+        const struct VkAttachmentReference *color_reference, const struct VkAttachmentReference *ds_reference,
+        VkImageView vk_view, size_t width, size_t height, unsigned int layer_count,
         const union VkClearValue *clear_value, unsigned int rect_count, const D3D12_RECT *rects)
 {
     struct VkSubpassDescription sub_pass_desc;
@@ -3538,7 +3541,7 @@ static void d3d12_command_list_clear(struct d3d12_command_list *list, const stru
     fb_desc.pAttachments = &vk_view;
     fb_desc.width = width;
     fb_desc.height = height;
-    fb_desc.layers = 1;
+    fb_desc.layers = layer_count;
     if ((vr = VK_CALL(vkCreateFramebuffer(list->device->vk_device, &fb_desc, NULL, &vk_framebuffer))) < 0)
     {
         WARN("Failed to create Vulkan framebuffer, vr %d.\n", vr);
@@ -3615,7 +3618,7 @@ static void STDMETHODCALLTYPE d3d12_command_list_ClearDepthStencilView(ID3D12Gra
     ds_reference.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
 
     d3d12_command_list_clear(list, &list->device->vk_procs, &attachment_desc, NULL, &ds_reference,
-            dsv_desc->vk_view, dsv_desc->width, dsv_desc->height, &clear_value, rect_count, rects);
+            dsv_desc->vk_view, dsv_desc->width, dsv_desc->height, 1, &clear_value, rect_count, rects);
 }
 
 static void STDMETHODCALLTYPE d3d12_command_list_ClearRenderTargetView(ID3D12GraphicsCommandList *iface,
@@ -3646,7 +3649,8 @@ static void STDMETHODCALLTYPE d3d12_command_list_ClearRenderTargetView(ID3D12Gra
     color_reference.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
 
     d3d12_command_list_clear(list, &list->device->vk_procs, &attachment_desc, &color_reference, NULL,
-            rtv_desc->vk_view, rtv_desc->width, rtv_desc->height, &clear_value, rect_count, rects);
+            rtv_desc->vk_view, rtv_desc->width, rtv_desc->height, rtv_desc->layer_count,
+            &clear_value, rect_count, rects);
 }
 
 static void STDMETHODCALLTYPE d3d12_command_list_ClearUnorderedAccessViewUint(ID3D12GraphicsCommandList *iface,
@@ -4005,6 +4009,7 @@ static HRESULT d3d12_command_list_init(struct d3d12_command_list *list, struct d
     memset(list->views, 0, sizeof(list->views));
     list->fb_width = 0;
     list->fb_height = 0;
+    list->fb_layer_count = 0;
 
     list->current_framebuffer = VK_NULL_HANDLE;
     list->current_pipeline = VK_NULL_HANDLE;
diff --git a/libs/vkd3d/resource.c b/libs/vkd3d/resource.c
index 2ccb84797514..e45c90083229 100644
--- a/libs/vkd3d/resource.c
+++ b/libs/vkd3d/resource.c
@@ -1534,6 +1534,7 @@ void d3d12_rtv_desc_create_rtv(struct d3d12_rtv_desc *rtv_desc, struct d3d12_dev
         struct d3d12_resource *resource, const D3D12_RENDER_TARGET_VIEW_DESC *desc)
 {
     const struct vkd3d_format *format;
+    VkImageViewType vk_view_type;
     uint32_t miplevel_idx;
 
     d3d12_rtv_desc_destroy(rtv_desc, device);
@@ -1566,13 +1567,16 @@ void d3d12_rtv_desc_create_rtv(struct d3d12_rtv_desc *rtv_desc, struct d3d12_dev
         FIXME("Ignoring plane slice %u.\n", desc->u.Texture2D.PlaneSlice);
 
     miplevel_idx = desc ? desc->u.Texture2D.MipSlice : 0;
-    if (vkd3d_create_texture_view(device, resource, format, VK_IMAGE_VIEW_TYPE_2D,
-            miplevel_idx, 1, 0, 1, false, &rtv_desc->vk_view) < 0)
+    vk_view_type = resource->desc.DepthOrArraySize > 1
+            ? VK_IMAGE_VIEW_TYPE_2D_ARRAY : VK_IMAGE_VIEW_TYPE_2D;
+    if (vkd3d_create_texture_view(device, resource, format, vk_view_type,
+            miplevel_idx, 1, 0, VK_REMAINING_ARRAY_LAYERS, false, &rtv_desc->vk_view) < 0)
         return;
 
     rtv_desc->format = format->vk_format;
     rtv_desc->width = d3d12_resource_desc_get_width(&resource->desc, miplevel_idx);
     rtv_desc->height = d3d12_resource_desc_get_height(&resource->desc, miplevel_idx);
+    rtv_desc->layer_count = resource->desc.DepthOrArraySize;
     rtv_desc->magic = VKD3D_DESCRIPTOR_MAGIC_RTV;
     rtv_desc->resource = resource;
 }
diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h
index 7506471fbe6c..38f0bf38e215 100644
--- a/libs/vkd3d/vkd3d_private.h
+++ b/libs/vkd3d/vkd3d_private.h
@@ -287,6 +287,7 @@ struct d3d12_rtv_desc
     VkFormat format;
     uint64_t width;
     unsigned int height;
+    unsigned int layer_count;
     VkImageView vk_view;
     struct d3d12_resource *resource;
 };
@@ -587,6 +588,7 @@ struct d3d12_command_list
     VkImageView views[D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT + 1];
     unsigned int fb_width;
     unsigned int fb_height;
+    unsigned int fb_layer_count;
 
     VkFramebuffer current_framebuffer;
     VkPipeline current_pipeline;
-- 
2.16.4




More information about the wine-devel mailing list