[vlc-devel] [PATCH 3/4] direct3d11: decide the main quad dimensions early

Steve Lhomme robux4 at videolabs.io
Tue Aug 1 15:01:22 CEST 2017


We decide once in Direct3D11Open() and keep using that.
The staging texture has the same dimensions.

Might fix #18578
---
 modules/video_output/win32/direct3d11.c | 46 +++++++++++++--------------------
 1 file changed, 18 insertions(+), 28 deletions(-)

diff --git a/modules/video_output/win32/direct3d11.c b/modules/video_output/win32/direct3d11.c
index 6ecad0cb27..6a6ca49674 100644
--- a/modules/video_output/win32/direct3d11.c
+++ b/modules/video_output/win32/direct3d11.c
@@ -673,18 +673,8 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned pool_size)
         pool_size = 1;
 
     video_format_t surface_fmt = vd->fmt;
-    if (is_d3d11_opaque(surface_fmt.i_chroma))
-    {
-        /* worst case scenario we need 128 alignment for HEVC */
-        surface_fmt.i_width  = (surface_fmt.i_width  + 0x7F) & ~0x7F;
-        surface_fmt.i_height = (surface_fmt.i_height + 0x7F) & ~0x7F;
-    }
-    else if ( sys->picQuadConfig->formatTexture != DXGI_FORMAT_R8G8B8A8_UNORM &&
-              sys->picQuadConfig->formatTexture != DXGI_FORMAT_B5G6R5_UNORM )
-    {
-        surface_fmt.i_width  = (surface_fmt.i_width  + 0x01) & ~0x01;
-        surface_fmt.i_height = (surface_fmt.i_height + 0x01) & ~0x01;
-    }
+    surface_fmt.i_width  = sys->picQuad.i_width;
+    surface_fmt.i_height = sys->picQuad.i_height;
 
     if (AllocateTextures(vd, sys->picQuadConfig, &surface_fmt, pool_size, textures,
                          true))
@@ -738,19 +728,9 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned pool_size)
     if (!is_d3d11_opaque(surface_fmt.i_chroma) || sys->legacy_shader)
     {
         /* we need a staging texture */
-        video_format_t staging_fmt = surface_fmt;
-        if ( sys->picQuadConfig->formatTexture != DXGI_FORMAT_R8G8B8A8_UNORM &&
-             sys->picQuadConfig->formatTexture != DXGI_FORMAT_B5G6R5_UNORM )
-        {
-            staging_fmt.i_width  = (staging_fmt.i_width  + 0x01) & ~0x01;
-            staging_fmt.i_height = (staging_fmt.i_height + 0x01) & ~0x01;
-        }
-        if (AllocateTextures(vd, sys->picQuadConfig, &staging_fmt, 1, textures, true))
+        if (AllocateTextures(vd, sys->picQuadConfig, &surface_fmt, 1, textures, true))
             goto error;
 
-        sys->picQuad.i_width    = staging_fmt.i_width;
-        sys->picQuad.i_height   = staging_fmt.i_height;
-
         for (unsigned plane = 0; plane < D3D11_MAX_SHADER_VIEW; plane++)
             sys->stagingSys.texture[plane] = textures[plane];
 
@@ -760,9 +740,6 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned pool_size)
     } else
 #endif
     {
-        sys->picQuad.i_width    = surface_fmt.i_width;
-        sys->picQuad.i_height   = surface_fmt.i_height;
-
         for (picture_count = 0; picture_count < pool_size; picture_count++) {
             if (AllocateShaderView(VLC_OBJECT(vd), sys->d3ddevice, sys->picQuadConfig,
                                    pictures[picture_count]->p_sys->texture, picture_count,
@@ -1060,8 +1037,6 @@ static void UpdateSize(vout_display_t *vd)
 
     UpdatePicQuadPosition(vd);
 
-    sys->picQuad.i_width = RECTWidth(sys->sys.rect_src);
-    sys->picQuad.i_height = RECTHeight(sys->sys.rect_src);
     UpdateQuadPosition(vd, &sys->picQuad, &sys->sys.rect_src_clipped,
                        vd->fmt.projection_mode, vd->fmt.orientation);
 
@@ -1645,6 +1620,21 @@ static int Direct3D11Open(vout_display_t *vd, video_format_t *fmt)
     if (!sys->d3dregion_format)
         sys->d3dregion_format = GetBlendableFormat(vd, VLC_CODEC_BGRA);
 
+    sys->picQuad.i_width  = fmt->i_width;
+    sys->picQuad.i_height = fmt->i_height;
+    if (is_d3d11_opaque(fmt->i_chroma))
+    {
+        /* worst case scenario we need 128 alignment for HEVC */
+        sys->picQuad.i_width  = (sys->picQuad.i_width  + 0x7F) & ~0x7F;
+        sys->picQuad.i_height = (sys->picQuad.i_height + 0x7F) & ~0x7F;
+    }
+    else if ( sys->picQuadConfig->formatTexture != DXGI_FORMAT_R8G8B8A8_UNORM &&
+              sys->picQuadConfig->formatTexture != DXGI_FORMAT_B5G6R5_UNORM )
+    {
+        sys->picQuad.i_width  = (sys->picQuad.i_width  + 0x01) & ~0x01;
+        sys->picQuad.i_height = (sys->picQuad.i_height + 0x01) & ~0x01;
+    }
+
     UpdateRects(vd, NULL, NULL, true);
 
 #if defined(HAVE_ID3D11VIDEODECODER)
-- 
2.12.1



More information about the vlc-devel mailing list