[vlc-devel] [PATCH 10/19] direct3d11: factorize the code to select the texture format

Steve Lhomme robux4 at videolabs.io
Thu Feb 2 14:54:10 CET 2017


---
 modules/video_output/win32/direct3d11.c | 114 +++++++++++++-------------------
 1 file changed, 45 insertions(+), 69 deletions(-)

diff --git a/modules/video_output/win32/direct3d11.c b/modules/video_output/win32/direct3d11.c
index bd5d3b9..5462017 100644
--- a/modules/video_output/win32/direct3d11.c
+++ b/modules/video_output/win32/direct3d11.c
@@ -574,6 +574,34 @@ static void Close(vlc_object_t *object)
     free(vd->sys);
 }
 
+static const d3d_format_t *GetOutputFormat(vout_display_t *vd, vlc_fourcc_t i_src_chroma,
+                                           uint8_t bits_per_channel, bool b_allow_opaque)
+{
+    vout_display_sys_t *sys = vd->sys;
+    UINT i_formatSupport;
+    UINT i_quadSupportFlags = D3D11_FORMAT_SUPPORT_TEXTURE2D | D3D11_FORMAT_SUPPORT_SHADER_LOAD;
+
+    for (const d3d_format_t *output_format = GetRenderFormatList();
+         output_format->name != NULL; ++output_format)
+    {
+        if (i_src_chroma && i_src_chroma != output_format->fourcc)
+            continue;
+        if (bits_per_channel && bits_per_channel > output_format->bitsPerChannel)
+            continue;
+        if (!b_allow_opaque && is_d3d11_opaque(output_format->fourcc))
+            continue;
+
+        if( SUCCEEDED( ID3D11Device_CheckFormatSupport(sys->d3ddevice,
+                                                       output_format->formatTexture,
+                                                       &i_formatSupport)) &&
+                ( i_formatSupport & i_quadSupportFlags ) == i_quadSupportFlags )
+        {
+            return output_format;
+        }
+    }
+    return NULL;
+}
+
 static picture_pool_t *Pool(vout_display_t *vd, unsigned pool_size)
 {
     if ( vd->sys->sys.pool != NULL )
@@ -1312,37 +1340,14 @@ static int Direct3D11Open(vout_display_t *vd, video_format_t *fmt)
     }
 #endif
 
-    vlc_fourcc_t i_src_chroma = fmt->i_chroma;
-    fmt->i_chroma = 0;
-
     // look for the requested pixel format first
-    UINT i_quadSupportFlags = D3D11_FORMAT_SUPPORT_TEXTURE2D | D3D11_FORMAT_SUPPORT_SHADER_LOAD;
-    UINT i_formatSupport;
-    for (const d3d_format_t *output_format = GetRenderFormatList();
-         output_format->name != NULL; ++output_format)
-    {
-        if( i_src_chroma == output_format->fourcc )
-        {
-            if( SUCCEEDED( ID3D11Device_CheckFormatSupport(sys->d3ddevice,
-                                                           output_format->formatTexture,
-                                                           &i_formatSupport)) &&
-                    ( i_formatSupport & i_quadSupportFlags ) == i_quadSupportFlags )
-            {
-                msg_Dbg( vd, "Using pixel format %s from chroma %4.4s", output_format->name,
-                             (char *)&i_src_chroma );
-                fmt->i_chroma = output_format->fourcc;
-                DxgiFormatMask( output_format->formatTexture, fmt );
-                sys->picQuadConfig = output_format;
-                break;
-            }
-        }
-    }
+    sys->picQuadConfig = GetOutputFormat(vd, fmt->i_chroma, 0, true);
 
     // look for any pixel format that we can handle with enough pixels per channel
-    if ( !fmt->i_chroma )
+    if ( !sys->picQuadConfig )
     {
         uint8_t bits_per_channel;
-        switch (i_src_chroma)
+        switch (fmt->i_chroma)
         {
         case VLC_CODEC_D3D11_OPAQUE:
             bits_per_channel = 8;
@@ -1352,62 +1357,33 @@ static int Direct3D11Open(vout_display_t *vd, video_format_t *fmt)
             break;
         default:
             {
-                const vlc_chroma_description_t *p_format = vlc_fourcc_GetChromaDescription(i_src_chroma);
+                const vlc_chroma_description_t *p_format = vlc_fourcc_GetChromaDescription(fmt->i_chroma);
                 bits_per_channel = p_format == NULL || p_format->pixel_bits == 0 ? 8 : p_format->pixel_bits;
             }
             break;
         }
 
-        for (const d3d_format_t *output_format = GetRenderFormatList();
-             output_format->name != NULL; ++output_format)
-        {
-            if( bits_per_channel <= output_format->bitsPerChannel &&
-                !is_d3d11_opaque(output_format->fourcc) )
-            {
-                if( SUCCEEDED( ID3D11Device_CheckFormatSupport(sys->d3ddevice,
-                                                               output_format->formatTexture,
-                                                               &i_formatSupport)) &&
-                        ( i_formatSupport & i_quadSupportFlags ) == i_quadSupportFlags )
-                {
-                    msg_Dbg( vd, "Using pixel format %s for chroma %4.4s", output_format->name,
-                                 (char *)&i_src_chroma );
-                    fmt->i_chroma = output_format->fourcc;
-                    DxgiFormatMask( output_format->formatTexture, fmt );
-                    sys->picQuadConfig = output_format;
-                    break;
-                }
-            }
-        }
+        sys->picQuadConfig = GetOutputFormat(vd, 0, bits_per_channel, false);
     }
+
     // look for any pixel format that we can handle
-    if ( !fmt->i_chroma )
-    {
-        for (const d3d_format_t *output_format = GetRenderFormatList();
-             output_format->name != NULL; ++output_format)
-        {
-            if( SUCCEEDED( ID3D11Device_CheckFormatSupport(sys->d3ddevice,
-                                                           output_format->formatTexture,
-                                                           &i_formatSupport)) &&
-                    ( i_formatSupport & i_quadSupportFlags ) == i_quadSupportFlags &&
-                    !is_d3d11_opaque(output_format->fourcc) )
-            {
-                msg_Dbg( vd, "Using pixel format %s for chroma %4.4s", output_format->name,
-                             (char *)&i_src_chroma );
-                fmt->i_chroma = output_format->fourcc;
-                DxgiFormatMask( output_format->formatTexture, fmt );
-                sys->picQuadConfig = output_format;
-                break;
-            }
-        }
-    }
-    if ( !fmt->i_chroma )
+    if ( !sys->picQuadConfig )
+        sys->picQuadConfig = GetOutputFormat(vd, 0, 0, false);
+
+    if ( !sys->picQuadConfig )
     {
        msg_Err(vd, "Could not get a suitable texture pixel format");
        return VLC_EGENERIC;
     }
+    msg_Dbg( vd, "Using pixel format %s for chroma %4.4s", sys->picQuadConfig->name,
+                 (char *)&fmt->i_chroma );
+    fmt->i_chroma = sys->picQuadConfig->fourcc;
+    DxgiFormatMask( sys->picQuadConfig->formatTexture, fmt );
 
     /* check the region pixel format */
-    i_quadSupportFlags |= D3D11_FORMAT_SUPPORT_BLENDABLE;
+    UINT i_formatSupport;
+    UINT i_quadSupportFlags = D3D11_FORMAT_SUPPORT_TEXTURE2D |
+            D3D11_FORMAT_SUPPORT_SHADER_LOAD| D3D11_FORMAT_SUPPORT_BLENDABLE;
     if( SUCCEEDED( ID3D11Device_CheckFormatSupport(sys->d3ddevice,
                                                    DXGI_FORMAT_R8G8B8A8_UNORM,
                                                    &i_formatSupport)) &&
-- 
2.10.2



More information about the vlc-devel mailing list