[vlc-commits] direct3d11: separate the fields to initialize the swapchain

Steve Lhomme git at videolan.org
Tue Apr 30 16:24:10 CEST 2019


vlc | branch: master | Steve Lhomme <robux4 at ycbcr.xyz> | Thu Apr 18 13:28:30 2019 +0200| [b21fef0699629b124620f06a79bdd71309524406] | committer: Steve Lhomme

direct3d11: separate the fields to initialize the swapchain

In external rendering these fields should never be used.

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=b21fef0699629b124620f06a79bdd71309524406
---

 modules/video_output/win32/direct3d11.c | 88 +++++++++++++++++++--------------
 1 file changed, 50 insertions(+), 38 deletions(-)

diff --git a/modules/video_output/win32/direct3d11.c b/modules/video_output/win32/direct3d11.c
index 18a1e43115..72ad84ba74 100644
--- a/modules/video_output/win32/direct3d11.c
+++ b/modules/video_output/win32/direct3d11.c
@@ -87,6 +87,16 @@ vlc_module_begin ()
     set_callbacks(Open, Close)
 vlc_module_end ()
 
+struct d3d11_local_swapchain
+{
+    vlc_object_t           *obj;
+
+    IDXGISwapChain1        *dxgiswapChain;   /* DXGI 1.2 swap chain */
+    IDXGISwapChain4        *dxgiswapChain4;  /* DXGI 1.5 for HDR metadata */
+
+    ID3D11RenderTargetView *swapchainTargetView[D3D11_MAX_RENDER_TARGET];
+};
+
 struct vout_display_sys_t
 {
     vout_display_sys_win32_t sys;       /* only use if sys.event is not NULL */
@@ -98,8 +108,6 @@ struct vout_display_sys_t
     display_info_t           display;
 
     d3d11_handle_t           hd3d;
-    IDXGISwapChain1          *dxgiswapChain;   /* DXGI 1.2 swap chain */
-    IDXGISwapChain4          *dxgiswapChain4;  /* DXGI 1.5 for HDR */
     d3d11_device_t           d3d_dev;
     d3d_quad_t               picQuad;
 
@@ -108,7 +116,7 @@ struct vout_display_sys_t
     picture_sys_t            stagingSys;
     picture_pool_t           *pool; /* hardware decoding pool */
 
-    ID3D11RenderTargetView   *swapchainTargetView[D3D11_MAX_RENDER_TARGET];
+    struct d3d11_local_swapchain internal_swapchain; /* TODO do not access fields directly */
 
     d3d_vshader_t            projectionVShader;
     d3d_vshader_t            flatVShader;
@@ -203,9 +211,9 @@ static bool Resize(void *opaque, unsigned i_width, unsigned i_height)
 
     D3D11_TEXTURE2D_DESC dsc = { 0 };
 
-    if (sys->swapchainTargetView[0]) {
+    if (sys->internal_swapchain.swapchainTargetView[0]) {
         ID3D11Resource *res = NULL;
-        ID3D11RenderTargetView_GetResource(sys->swapchainTargetView[0], &res);
+        ID3D11RenderTargetView_GetResource(sys->internal_swapchain.swapchainTargetView[0], &res);
         if (res)
         {
             ID3D11Texture2D_GetDesc((ID3D11Texture2D*) res, &dsc);
@@ -216,37 +224,37 @@ static bool Resize(void *opaque, unsigned i_width, unsigned i_height)
     if (dsc.Width == i_width && dsc.Height == i_height)
         return true; /* nothing changed */
 
-    for (size_t i=0; i < ARRAY_SIZE(sys->swapchainTargetView); i++)
+    for (size_t i=0; i < ARRAY_SIZE(sys->internal_swapchain.swapchainTargetView); i++)
     {
-        if (sys->swapchainTargetView[i]) {
-            ID3D11RenderTargetView_Release(sys->swapchainTargetView[i]);
-            sys->swapchainTargetView[i] = NULL;
+        if (sys->internal_swapchain.swapchainTargetView[i]) {
+            ID3D11RenderTargetView_Release(sys->internal_swapchain.swapchainTargetView[i]);
+            sys->internal_swapchain.swapchainTargetView[i] = NULL;
         }
     }
 
     /* TODO detect is the size is the same as the output and switch to fullscreen mode */
-    hr = IDXGISwapChain_ResizeBuffers(sys->dxgiswapChain, 0, i_width, i_height,
+    hr = IDXGISwapChain_ResizeBuffers(sys->internal_swapchain.dxgiswapChain, 0, i_width, i_height,
         DXGI_FORMAT_UNKNOWN, 0);
     if (FAILED(hr)) {
        msg_Err(vd, "Failed to resize the backbuffer. (hr=0x%lX)", hr);
        return false;
     }
 
-    hr = IDXGISwapChain_GetBuffer(sys->dxgiswapChain, 0, &IID_ID3D11Texture2D, (LPVOID *)&pBackBuffer);
+    hr = IDXGISwapChain_GetBuffer(sys->internal_swapchain.dxgiswapChain, 0, &IID_ID3D11Texture2D, (LPVOID *)&pBackBuffer);
     if (FAILED(hr)) {
        msg_Err(vd, "Could not get the backbuffer for the Swapchain. (hr=0x%lX)", hr);
        return false;
     }
 
     hr = D3D11_CreateRenderTargets( &sys->d3d_dev, (ID3D11Resource *)pBackBuffer,
-                                    sys->display.pixelFormat, sys->swapchainTargetView );
+                                    sys->display.pixelFormat, sys->internal_swapchain.swapchainTargetView );
     ID3D11Texture2D_Release(pBackBuffer);
     if (FAILED(hr)) {
         msg_Err(vd, "Failed to create the target view. (hr=0x%lX)", hr);
         return false;
     }
 
-    D3D11_ClearRenderTargets( &sys->d3d_dev, sys->display.pixelFormat, sys->swapchainTargetView );
+    D3D11_ClearRenderTargets( &sys->d3d_dev, sys->display.pixelFormat, sys->internal_swapchain.swapchainTargetView );
 
     return true;
 }
@@ -256,7 +264,7 @@ static bool StartRendering(void *opaque)
     vout_display_t *vd = opaque;
     vout_display_sys_t *sys = vd->sys;
 
-    D3D11_ClearRenderTargets( &sys->d3d_dev, sys->display.pixelFormat, sys->swapchainTargetView );
+    D3D11_ClearRenderTargets( &sys->d3d_dev, sys->display.pixelFormat, sys->internal_swapchain.swapchainTargetView );
     return true;
 }
 
@@ -267,7 +275,7 @@ static void Swap(void *opaque)
 
     DXGI_PRESENT_PARAMETERS presentParams = { 0 };
 
-    HRESULT hr = IDXGISwapChain1_Present1(sys->dxgiswapChain, 0, 0, &presentParams);
+    HRESULT hr = IDXGISwapChain1_Present1(sys->internal_swapchain.dxgiswapChain, 0, 0, &presentParams);
     if (hr == DXGI_ERROR_DEVICE_REMOVED || hr == DXGI_ERROR_DEVICE_RESET)
     {
         /* TODO device lost */
@@ -349,13 +357,13 @@ static int SetupWindowedOutput(vout_display_t *vd)
     }
 
     hr = IDXGIFactory2_CreateSwapChainForHwnd(dxgifactory, (IUnknown *)sys->d3d_dev.d3ddevice,
-                                              sys->sys.hvideownd, &scd, NULL, NULL, &sys->dxgiswapChain);
+                                              sys->sys.hvideownd, &scd, NULL, NULL, &sys->internal_swapchain.dxgiswapChain);
     if (hr == DXGI_ERROR_INVALID_CALL && scd.Format == DXGI_FORMAT_R10G10B10A2_UNORM)
     {
         msg_Warn(vd, "10 bits swapchain failed, try 8 bits");
         scd.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
         hr = IDXGIFactory2_CreateSwapChainForHwnd(dxgifactory, (IUnknown *)sys->d3d_dev.d3ddevice,
-                                                  sys->sys.hvideownd, &scd, NULL, NULL, &sys->dxgiswapChain);
+                                                  sys->sys.hvideownd, &scd, NULL, NULL, &sys->internal_swapchain.dxgiswapChain);
     }
     IDXGIFactory2_Release(dxgifactory);
     if (FAILED(hr)) {
@@ -363,7 +371,7 @@ static int SetupWindowedOutput(vout_display_t *vd)
        return VLC_EGENERIC;
     }
 
-    IDXGISwapChain_QueryInterface( sys->dxgiswapChain, &IID_IDXGISwapChain4, (void **)&sys->dxgiswapChain4);
+    IDXGISwapChain_QueryInterface( sys->internal_swapchain.dxgiswapChain, &IID_IDXGISwapChain4, (void **)&sys->internal_swapchain.dxgiswapChain4);
     return VLC_SUCCESS;
 }
 #endif /* !VLC_WINSTORE_APP */
@@ -379,8 +387,8 @@ static int SetupWindowLessOutput(vout_display_t *vd)
     if (!dxgiswapChain)
         return VLC_EGENERIC;
 
-    sys->dxgiswapChain = dxgiswapChain;
-    IDXGISwapChain_AddRef(sys->dxgiswapChain);
+    sys->internal_swapchain.dxgiswapChain = dxgiswapChain;
+    IDXGISwapChain_AddRef(sys->internal_swapchain.dxgiswapChain);
 
     if (FAILED(IDXGISwapChain1_GetDesc(dxgiswapChain, &scd)))
         return VLC_EGENERIC;
@@ -431,6 +439,7 @@ static int Open(vout_display_t *vd, const vout_display_cfg_t *cfg,
     bool uses_external_callbacks = true;
     if (!sys->swapCb || !sys->starRenderCb || !sys->endRenderCb || !sys->resizeCb)
     {
+        sys->internal_swapchain.obj = VLC_OBJECT(vd);
         sys->outside_opaque = vd;
         sys->swapCb       = Swap;
         sys->starRenderCb = StartRendering;
@@ -818,7 +827,7 @@ static void PreparePicture(vout_display_t *vd, picture_t *picture, subpicture_t
     {
         D3D11_UpdateQuadLuminanceScale(vd, &sys->d3d_dev, &sys->picQuad, GetFormatLuminance(VLC_OBJECT(vd), &picture->format) / (float)sys->display.luminance_peak);
 
-        if (sys->dxgiswapChain4)
+        if (sys->internal_swapchain.dxgiswapChain4)
         {
             DXGI_HDR_METADATA_HDR10 hdr10 = {0};
             hdr10.GreenPrimary[0] = picture->format.mastering.primaries[0];
@@ -833,7 +842,7 @@ static void PreparePicture(vout_display_t *vd, picture_t *picture, subpicture_t
             hdr10.MaxMasteringLuminance = picture->format.mastering.max_luminance;
             hdr10.MaxContentLightLevel = picture->format.lighting.MaxCLL;
             hdr10.MaxFrameAverageLightLevel = picture->format.lighting.MaxFALL;
-            IDXGISwapChain4_SetHDRMetaData(sys->dxgiswapChain4, DXGI_HDR_METADATA_TYPE_HDR10, sizeof(hdr10), &hdr10);
+            IDXGISwapChain4_SetHDRMetaData(sys->internal_swapchain.dxgiswapChain4, DXGI_HDR_METADATA_TYPE_HDR10, sizeof(hdr10), &hdr10);
         }
     }
 
@@ -847,7 +856,8 @@ static void PreparePicture(vout_display_t *vd, picture_t *picture, subpicture_t
     }
     D3D11_RenderQuad(&sys->d3d_dev, &sys->picQuad,
                      vd->source.projection_mode == PROJECTION_MODE_RECTANGULAR ? &sys->flatVShader : &sys->projectionVShader,
-                     renderSrc, sys->swapchainTargetView);
+                     renderSrc,
+                     sys->internal_swapchain.swapchainTargetView); /* NULL with external rendering */
 
     if (subpicture) {
         // draw the additional vertices
@@ -856,7 +866,8 @@ static void PreparePicture(vout_display_t *vd, picture_t *picture, subpicture_t
             {
                 d3d_quad_t *quad = (d3d_quad_t *) sys->d3dregions[i]->p_sys;
                 D3D11_RenderQuad(&sys->d3d_dev, quad, &sys->flatVShader,
-                                 quad->picSys.renderSrc, sys->swapchainTargetView);
+                                 quad->picSys.renderSrc,
+                                 sys->internal_swapchain.swapchainTargetView); /* NULL with external rendering */
             }
         }
     }
@@ -887,10 +898,10 @@ static void Prepare(vout_display_t *vd, picture_t *picture,
     uint32_t i_width;
     uint32_t i_height;
     UINT dataSize = sizeof(i_width);
-    HRESULT hr = IDXGISwapChain_GetPrivateData(sys->dxgiswapChain, &GUID_SWAPCHAIN_WIDTH, &dataSize, &i_width);
+    HRESULT hr = IDXGISwapChain_GetPrivateData(sys->internal_swapchain.dxgiswapChain, &GUID_SWAPCHAIN_WIDTH, &dataSize, &i_width);
     if (SUCCEEDED(hr)) {
         dataSize = sizeof(i_height);
-        hr = IDXGISwapChain_GetPrivateData(sys->dxgiswapChain, &GUID_SWAPCHAIN_HEIGHT, &dataSize, &i_height);
+        hr = IDXGISwapChain_GetPrivateData(sys->internal_swapchain.dxgiswapChain, &GUID_SWAPCHAIN_HEIGHT, &dataSize, &i_height);
         if (SUCCEEDED(hr)) {
             if (i_width != sys->area.vdcfg.display.width || i_height != sys->area.vdcfg.display.height)
             {
@@ -988,7 +999,7 @@ static void D3D11SetColorSpace(vout_display_t *vd)
     if (sys->sys.event == NULL) /* TODO support external colourspace handling */
         goto done;
 
-    hr = IDXGISwapChain_QueryInterface( sys->dxgiswapChain, &IID_IDXGISwapChain3, (void **)&dxgiswapChain3);
+    hr = IDXGISwapChain_QueryInterface( sys->internal_swapchain.dxgiswapChain, &IID_IDXGISwapChain3, (void **)&dxgiswapChain3);
     if (FAILED(hr)) {
         msg_Warn(vd, "could not get a IDXGISwapChain3");
         goto done;
@@ -1033,7 +1044,7 @@ static void D3D11SetColorSpace(vout_display_t *vd)
 #ifdef HAVE_DXGI1_6_H
     IDXGIOutput *dxgiOutput = NULL;
 
-    if (SUCCEEDED(IDXGISwapChain_GetContainingOutput( sys->dxgiswapChain, &dxgiOutput )))
+    if (SUCCEEDED(IDXGISwapChain_GetContainingOutput( sys->internal_swapchain.dxgiswapChain, &dxgiOutput )))
     {
         IDXGIOutput6 *dxgiOutput6 = NULL;
         if (SUCCEEDED(IDXGIOutput_QueryInterface( dxgiOutput, &IID_IDXGIOutput6, (void **)&dxgiOutput6 )))
@@ -1312,15 +1323,16 @@ static void Direct3D11Close(vout_display_t *vd)
     vout_display_sys_t *sys = vd->sys;
 
     Direct3D11DestroyResources(vd);
-    if (sys->dxgiswapChain4)
+
+    if (sys->internal_swapchain.dxgiswapChain4)
     {
-        IDXGISwapChain_Release(sys->dxgiswapChain4);
-        sys->dxgiswapChain4 = NULL;
+        IDXGISwapChain4_Release(sys->internal_swapchain.dxgiswapChain4);
+        sys->internal_swapchain.dxgiswapChain4 = NULL;
     }
-    if (sys->dxgiswapChain)
+    if (sys->internal_swapchain.dxgiswapChain)
     {
-        IDXGISwapChain_Release(sys->dxgiswapChain);
-        sys->dxgiswapChain = NULL;
+        IDXGISwapChain_Release(sys->internal_swapchain.dxgiswapChain);
+        sys->internal_swapchain.dxgiswapChain = NULL;
     }
 
     D3D11_ReleaseDevice( &sys->d3d_dev );
@@ -1607,11 +1619,11 @@ static void Direct3D11DestroyResources(vout_display_t *vd)
     D3D11_ReleaseVertexShader(&sys->projectionVShader);
 
     D3D11_ReleasePixelShader(&sys->regionQuad);
-    for (size_t i=0; i < ARRAY_SIZE(sys->swapchainTargetView); i++)
+    for (size_t i=0; i < ARRAY_SIZE(sys->internal_swapchain.swapchainTargetView); i++)
     {
-        if (sys->swapchainTargetView[i]) {
-            ID3D11RenderTargetView_Release(sys->swapchainTargetView[i]);
-            sys->swapchainTargetView[i] = NULL;
+        if (sys->internal_swapchain.swapchainTargetView[i]) {
+            ID3D11RenderTargetView_Release(sys->internal_swapchain.swapchainTargetView[i]);
+            sys->internal_swapchain.swapchainTargetView[i] = NULL;
         }
     }
     if (sys->prepareWait)



More information about the vlc-commits mailing list