From cc6941ed9a41a1efe9e6c8c9f6fe0ae84f56b7d3 Mon Sep 17 00:00:00 2001 From: Seungha Yang Date: Fri, 31 Jan 2025 22:06:53 +0900 Subject: [PATCH] d3d12converter: Fix SRV descriptor heap size Converter was allocating smaller size of descriptor heap than required size when auto-mipgen is enabled Part-of: --- .../gst-libs/gst/d3d12/gstd3d12converter.cpp | 27 ++++++++++--------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/subprojects/gst-plugins-bad/gst-libs/gst/d3d12/gstd3d12converter.cpp b/subprojects/gst-plugins-bad/gst-libs/gst/d3d12/gstd3d12converter.cpp index 3b3384a702..c2f782a328 100644 --- a/subprojects/gst-plugins-bad/gst-libs/gst/d3d12/gstd3d12converter.cpp +++ b/subprojects/gst-plugins-bad/gst-libs/gst/d3d12/gstd3d12converter.cpp @@ -436,6 +436,7 @@ struct _GstD3D12ConverterPrivate D3D12_RESOURCE_DESC mipgen_desc = { }; GstBuffer *mipgen_buf = nullptr; guint auto_mipgen_level = 1; + guint max_srv_desc = 0; std::mutex prop_lock; guint64 fence_val = 0; @@ -993,6 +994,13 @@ gst_d3d12_converter_setup_resource (GstD3D12Converter * self, } } + auto num_srv = ctx->pipeline_data[0].crs->GetNumSrv (); + if (have_lut) + num_srv += 2; + + if (priv->max_srv_desc < num_srv) + priv->max_srv_desc = num_srv; + if (ctx->comm) return ctx; @@ -1015,18 +1023,6 @@ gst_d3d12_converter_setup_resource (GstD3D12Converter * self, comm->sampler_filter = sampler_filter; - if (!priv->srv_heap_pool) { - D3D12_DESCRIPTOR_HEAP_DESC srv_heap_desc = { }; - srv_heap_desc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV; - srv_heap_desc.NumDescriptors = ctx->pipeline_data[0].crs->GetNumSrv (); - if (comm->have_lut) - srv_heap_desc.NumDescriptors += 2; - - srv_heap_desc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE; - - priv->srv_heap_pool = gst_d3d12_desc_heap_pool_new (device, &srv_heap_desc); - } - /* bottom left */ vertex_data[0].position.x = -1.0f; vertex_data[0].position.y = -1.0f; @@ -2304,6 +2300,13 @@ gst_d3d12_converter_new (GstD3D12Device * device, GstD3D12CmdQueue * queue, } } + D3D12_DESCRIPTOR_HEAP_DESC srv_heap_desc = { }; + srv_heap_desc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV; + srv_heap_desc.NumDescriptors = priv->max_srv_desc; + srv_heap_desc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE; + priv->srv_heap_pool = gst_d3d12_desc_heap_pool_new (device_handle, + &srv_heap_desc); + return self; }