d3d11memory: Don't clear wrapped texture memory
authorSeungha Yang <seungha@centricular.com>
Fri, 5 May 2023 12:53:44 +0000 (21:53 +0900)
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Sat, 6 May 2023 00:20:18 +0000 (00:20 +0000)
The external texture may hold already rendered scene and therefore
it should not be cleared in alloc method

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4558>

subprojects/gst-plugins-bad/gst-libs/gst/d3d11/gstd3d11memory.cpp

index ccefdc3..a593701 100644 (file)
@@ -1473,6 +1473,7 @@ gst_d3d11_allocator_alloc_internal (GstD3D11Allocator * self,
   GstD3D11Memory *dmem;
   ID3D11RenderTargetView *rtv = nullptr;
   GstD3D11ClearRTVFunc clear_func = nullptr;
+  gboolean is_new_texture = TRUE;
 
   device_handle = gst_d3d11_device_get_device_handle (device);
 
@@ -1482,6 +1483,8 @@ gst_d3d11_allocator_alloc_internal (GstD3D11Allocator * self,
       GST_ERROR_OBJECT (self, "Couldn't create texture");
       return nullptr;
     }
+  } else {
+    is_new_texture = FALSE;
   }
 
   mem =
@@ -1489,6 +1492,10 @@ gst_d3d11_allocator_alloc_internal (GstD3D11Allocator * self,
   if (!mem)
     return nullptr;
 
+  /* Don't clear external texture */
+  if (!is_new_texture)
+    return mem;
+
   /* Clear with YUV black if needed and possible
    * TODO: do this using UAV if RTV is not allowed (e.g., packed YUV formats) */
   if ((desc->BindFlags & D3D11_BIND_RENDER_TARGET) == 0)