Mesa (main): dzn: use a null-rtv to handle no-attachment

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Jun 14 15:07:42 UTC 2022


Module: Mesa
Branch: main
Commit: b45f1e24aef19597dbca0be5717da3489a071a86
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=b45f1e24aef19597dbca0be5717da3489a071a86

Author: Erik Faye-Lund <erik.faye-lund at collabora.com>
Date:   Mon Jun 13 17:22:09 2022 +0200

dzn: use a null-rtv to handle no-attachment

This fixes a crash in this test:
dEQP-VK.renderpass2.suballocation.simple.color_unused_omit_blend_state

Fixes: 2d0798440b4 ("dzn: Add support for dynamic rendering")
Reviewed-by: Boris Brezillon <boris.brezillon at collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17027>

---

 src/microsoft/vulkan/dzn_cmd_buffer.c | 28 +++++++++++++++++++++++++++-
 src/microsoft/vulkan/dzn_private.h    |  1 +
 2 files changed, 28 insertions(+), 1 deletion(-)

diff --git a/src/microsoft/vulkan/dzn_cmd_buffer.c b/src/microsoft/vulkan/dzn_cmd_buffer.c
index 8971f0ce385..e53b593eec8 100644
--- a/src/microsoft/vulkan/dzn_cmd_buffer.c
+++ b/src/microsoft/vulkan/dzn_cmd_buffer.c
@@ -231,6 +231,7 @@ dzn_cmd_buffer_reset(struct dzn_cmd_buffer *cmdbuf)
    hash_table_foreach(cmdbuf->rtvs.ht, he)
       vk_free(&cmdbuf->vk.pool->alloc, he->data);
    _mesa_hash_table_clear(cmdbuf->rtvs.ht, NULL);
+   cmdbuf->null_rtv.ptr = 0;
    dzn_descriptor_heap_pool_reset(&cmdbuf->rtvs.pool);
    hash_table_foreach(cmdbuf->dsvs.ht, he)
       vk_free(&cmdbuf->vk.pool->alloc, he->data);
@@ -828,6 +829,29 @@ dzn_cmd_buffer_get_rtv(struct dzn_cmd_buffer *cmdbuf,
    return rtve->handle;
 }
 
+static D3D12_CPU_DESCRIPTOR_HANDLE
+dzn_cmd_buffer_get_null_rtv(struct dzn_cmd_buffer *cmdbuf)
+{
+   struct dzn_device *device = container_of(cmdbuf->vk.base.device, struct dzn_device, vk);
+
+   if (!cmdbuf->null_rtv.ptr) {
+      struct dzn_descriptor_heap *heap;
+      uint32_t slot;
+      dzn_descriptor_heap_pool_alloc_slots(&cmdbuf->rtvs.pool, device, 1, &heap, &slot);
+      cmdbuf->null_rtv = dzn_descriptor_heap_get_cpu_handle(heap, slot);
+
+      D3D12_RENDER_TARGET_VIEW_DESC desc = { 0 };
+      desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
+      desc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2D;
+      desc.Texture2D.MipSlice = 0;
+      desc.Texture2D.PlaneSlice = 0;
+
+      ID3D12Device1_CreateRenderTargetView(device->dev, NULL, &desc, cmdbuf->null_rtv);
+   }
+
+   return cmdbuf->null_rtv;
+}
+
 static VkResult
 dzn_cmd_buffer_alloc_internal_buf(struct dzn_cmd_buffer *cmdbuf,
                                   uint32_t size,
@@ -3450,8 +3474,10 @@ dzn_CmdBeginRendering(VkCommandBuffer commandBuffer,
          att->resolveImageLayout;
       cmdbuf->state.render.attachments.colors[i].store_op = att->storeOp;
 
-      if (!iview)
+      if (!iview) {
+         rt_handles[i] = dzn_cmd_buffer_get_null_rtv(cmdbuf);
          continue;
+      }
 
       struct dzn_image *img = container_of(iview->vk.image, struct dzn_image, vk);
       rt_handles[i] = dzn_cmd_buffer_get_rtv(cmdbuf, img, &iview->rtv_desc);
diff --git a/src/microsoft/vulkan/dzn_private.h b/src/microsoft/vulkan/dzn_private.h
index 7b84d18e95a..098f47563a6 100644
--- a/src/microsoft/vulkan/dzn_private.h
+++ b/src/microsoft/vulkan/dzn_private.h
@@ -544,6 +544,7 @@ struct dzn_cmd_buffer {
    } rtvs, dsvs;
 
    struct dzn_descriptor_heap_pool cbv_srv_uav_pool, sampler_pool;
+   D3D12_CPU_DESCRIPTOR_HANDLE null_rtv;
 
    struct list_head internal_bufs;
 



More information about the mesa-commit mailing list