[vlc-commits] [Git][videolan/vlc][master] 2 commits: d3d11: link directly with d3dcompiler.lib

Steve Lhomme (@robUx4) gitlab at videolan.org
Sat Feb 1 13:38:46 UTC 2025



Steve Lhomme pushed to branch master at VideoLAN / VLC


Commits:
123c7fc5 by Steve Lhomme at 2025-02-01T13:25:19+00:00
d3d11: link directly with d3dcompiler.lib

It redirects to the d3dcompiler_47.dll in mingw-w64 and in the Windows
SDK that's the only variant there is. This is also how D3DCompile()
is supposed to be used [^1].

The DLL is available in Windows 7 with Platform Update [^2].
No version of d3dcompiler_XXX.dll is available in vanilla Windows 7
which doesn't have Direct3D11 anyway.

[^1]: https://learn.microsoft.com/en-us/windows/win32/api/d3dcompiler/nf-d3dcompiler-d3dcompile
[^2]: https://learn.microsoft.com/en-us/windows/win32/direct3darticles/platform-update-for-windows-7

- - - - -
65a54243 by Steve Lhomme at 2025-02-01T13:25:19+00:00
d3d11: remove empty d3d_shader_compiler_t structure

We don't need to create an object just to load the DLL shaders.

- - - - -


7 changed files:

- modules/video_output/Makefile.am
- modules/video_output/win32/d3d11_shaders.cpp
- modules/video_output/win32/d3d11_shaders.h
- modules/video_output/win32/d3d_dynamic_shader.c
- modules/video_output/win32/d3d_dynamic_shader.h
- modules/video_output/win32/direct3d11.cpp
- modules/video_output/win32/meson.build


Changes:

=====================================
modules/video_output/Makefile.am
=====================================
@@ -219,7 +219,7 @@ libdirect3d11_plugin_la_SOURCES = video_output/win32/direct3d11.cpp \
  video_output/win32/d3d_shaders.c video_output/win32/d3d_shaders.h \
  video_output/win32/d3d_dynamic_shader.c video_output/win32/d3d_dynamic_shader.h
 libdirect3d11_plugin_la_CXXFLAGS = $(AM_CXXFLAGS) $(LIBCOMCXXFLAGS)
-libdirect3d11_plugin_la_LIBADD = libchroma_copy.la libd3d11_common.la $(LIBCOM) -luuid -ldxgi -ld3d11
+libdirect3d11_plugin_la_LIBADD = libchroma_copy.la libd3d11_common.la $(LIBCOM) -luuid -ldxgi -ld3d11 -ld3dcompiler
 libdirect3d11_plugin_la_CPPFLAGS = $(AM_CPPFLAGS)
 if !HAVE_WINSTORE
 libdirect3d11_plugin_la_CPPFLAGS += -DHAVE_WIN32_SENSORS
@@ -231,8 +231,6 @@ libdirect3d11_plugin_la_SOURCES += video_output/win32/events.c \
  video_output/win32/sensors.cpp \
  video_output/win32/win32touch.c video_output/win32/win32touch.h
 libdirect3d11_plugin_la_LIBADD += -lgdi32 -luser32
-else
-libdirect3d11_plugin_la_LIBADD += -ld3dcompiler_47
 endif
 if HAVE_NVDEC
 libdirect3d11_plugin_la_SOURCES += hw/nvdec/nvdec_fmt.h


=====================================
modules/video_output/win32/d3d11_shaders.cpp
=====================================
@@ -33,7 +33,7 @@
 
 using Microsoft::WRL::ComPtr;
 
-HRESULT (D3D11_CompilePixelShaderBlob)(vlc_object_t *o, const d3d_shader_compiler_t *compiler,
+HRESULT (D3D11_CompilePixelShaderBlob)(vlc_object_t *o,
                                    d3d11_device_t *d3d_dev,
                                    const display_info_t *display,
                                    video_transfer_func_t transfer,
@@ -41,7 +41,7 @@ HRESULT (D3D11_CompilePixelShaderBlob)(vlc_object_t *o, const d3d_shader_compile
                                    const d3d11_quad_t *quad, d3d_shader_blob pPSBlob[DXGI_MAX_RENDER_TARGET])
 {
     size_t shader_views[DXGI_MAX_RENDER_TARGET];
-    return D3D_CompilePixelShader(o, compiler, d3d_dev->feature_level,
+    return D3D_CompilePixelShader(o, d3d_dev->feature_level,
                                   display, transfer,
                                   src_full_range, quad->generic.textureFormat, pPSBlob, shader_views);
 }
@@ -168,8 +168,8 @@ void D3D11_ReleaseVertexShader(d3d11_vertex_shader_t *shader)
     shader->shader.Reset();
 }
 
-HRESULT D3D11_CompileVertexShaderBlob(vlc_object_t *obj, const d3d_shader_compiler_t *compiler,
+HRESULT D3D11_CompileVertexShaderBlob(vlc_object_t *obj,
                                       d3d11_device_t *d3d_dev, bool flat, d3d_shader_blob *pVSBlob)
 {
-    return D3D_CompileVertexShader(obj, compiler, d3d_dev->feature_level, flat, pVSBlob);
+    return D3D_CompileVertexShader(obj, d3d_dev->feature_level, flat, pVSBlob);
 }


=====================================
modules/video_output/win32/d3d11_shaders.h
=====================================
@@ -70,18 +70,18 @@ struct d3d11_quad_t
     VS_PROJECTION_CONST       vConstants;
 };
 
-HRESULT D3D11_CompilePixelShaderBlob(vlc_object_t *, const d3d_shader_compiler_t *,
+HRESULT D3D11_CompilePixelShaderBlob(vlc_object_t *,
                                  d3d11_device_t *, const display_info_t *,
                                  video_transfer_func_t,
                                  bool src_full_range,
                                  const d3d11_quad_t *, d3d_shader_blob pPSBlob[DXGI_MAX_RENDER_TARGET]);
-#define D3D11_CompilePixelShaderBlob(a,b,c,d,e,f,g,h) \
-    D3D11_CompilePixelShaderBlob(VLC_OBJECT(a),b,c,d,e,f,g,h)
+#define D3D11_CompilePixelShaderBlob(a,b,c,d,e,f,g) \
+    D3D11_CompilePixelShaderBlob(VLC_OBJECT(a),b,c,d,e,f,g)
 HRESULT D3D11_SetQuadPixelShader(vlc_object_t *, d3d11_device_t *,
                                  bool sharp,
                                  d3d11_quad_t *quad, d3d_shader_blob pPSBlob[DXGI_MAX_RENDER_TARGET]);
 
-HRESULT D3D11_CompileVertexShaderBlob(vlc_object_t *, const d3d_shader_compiler_t *,
+HRESULT D3D11_CompileVertexShaderBlob(vlc_object_t *,
                                       d3d11_device_t *, bool flat, d3d_shader_blob *);
 
 HRESULT D3D11_CreateVertexShader(vlc_object_t *, d3d_shader_blob *, d3d11_device_t *, d3d11_vertex_shader_t *);


=====================================
modules/video_output/win32/d3d_dynamic_shader.c
=====================================
@@ -35,12 +35,6 @@
 #include "d3d_shaders.h"
 #include "d3d_dynamic_shader.h"
 
-struct d3d_shader_compiler_t
-{
-    HINSTANCE                 compiler_dll; /* handle of the opened d3dcompiler dll */
-    pD3DCompile               OurD3DCompile;
-};
-
 static const char globPixelShaderDefault[] = "\
 #pragma warning( disable: 3571 )\n\
 cbuffer PS_CONSTANT_BUFFER : register(b0)\n\
@@ -323,7 +317,7 @@ static void ID3D10BlobtoBlob(ID3D10Blob *d3dblob, d3d_shader_blob *blob)
 }
 
 
-static HRESULT CompileShader(vlc_object_t *obj, const d3d_shader_compiler_t *compiler,
+static HRESULT CompileShader(vlc_object_t *obj,
                              D3D_FEATURE_LEVEL feature_level,
                              const char *psz_shader, bool pixelShader,
                              const D3D_SHADER_MACRO *defines,
@@ -332,10 +326,7 @@ static HRESULT CompileShader(vlc_object_t *obj, const d3d_shader_compiler_t *com
     ID3D10Blob* pShaderBlob = NULL, *pErrBlob = NULL;
 
     UINT compileFlags = 0;
-#if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
-    VLC_UNUSED(compiler);
-#else
-# define D3DCompile(a,b,c,d,e,f,g,h,i,j,k)    compiler->OurD3DCompile(a,b,c,d,e,f,g,h,i,j,k)
+#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
 # if !defined(NDEBUG)
     if (IsDebuggerPresent())
         compileFlags += D3DCOMPILE_DEBUG;
@@ -389,7 +380,7 @@ static HRESULT CompileShader(vlc_object_t *obj, const d3d_shader_compiler_t *com
     return S_OK;
 }
 
-static HRESULT CompilePixelShaderBlob(vlc_object_t *o, const d3d_shader_compiler_t *compiler,
+static HRESULT CompilePixelShaderBlob(vlc_object_t *o,
                                    D3D_FEATURE_LEVEL feature_level,
                                    const char *psz_sampler,
                                    const char *psz_shader_resource_views,
@@ -418,11 +409,11 @@ static HRESULT CompilePixelShaderBlob(vlc_object_t *o, const d3d_shader_compiler
     }
 #endif
 
-    return CompileShader(o, compiler, feature_level, globPixelShaderDefault, true,
+    return CompileShader(o, feature_level, globPixelShaderDefault, true,
                          defines, pPSBlob);
 }
 
-HRESULT (D3D_CompilePixelShader)(vlc_object_t *o, const d3d_shader_compiler_t *compiler,
+HRESULT (D3D_CompilePixelShader)(vlc_object_t *o,
                                  D3D_FEATURE_LEVEL feature_level,
                                  const display_info_t *display,
                                  video_transfer_func_t transfer,
@@ -637,7 +628,7 @@ HRESULT (D3D_CompilePixelShader)(vlc_object_t *o, const d3d_shader_compiler_t *c
     }
 
     HRESULT hr;
-    hr = CompilePixelShaderBlob(o, compiler, feature_level,
+    hr = CompilePixelShaderBlob(o, feature_level,
                                 psz_sampler[0], psz_shader_resource_views[0],
                                 psz_src_to_linear,
                                 psz_linear_to_display,
@@ -645,7 +636,7 @@ HRESULT (D3D_CompilePixelShader)(vlc_object_t *o, const d3d_shader_compiler_t *c
                                 &pPSBlob[0]);
     if (SUCCEEDED(hr) && psz_sampler[1])
     {
-        hr = CompilePixelShaderBlob(o, compiler, feature_level,
+        hr = CompilePixelShaderBlob(o, feature_level,
                                     psz_sampler[1],  psz_shader_resource_views[1],
                                     psz_src_to_linear,
                                     psz_linear_to_display,
@@ -658,7 +649,7 @@ HRESULT (D3D_CompilePixelShader)(vlc_object_t *o, const d3d_shader_compiler_t *c
     return hr;
 }
 
-HRESULT D3D_CompileVertexShader(vlc_object_t *obj, const d3d_shader_compiler_t *compiler,
+HRESULT D3D_CompileVertexShader(vlc_object_t *obj,
                                 D3D_FEATURE_LEVEL feature_level, bool flat,
                                 d3d_shader_blob *blob)
 {
@@ -666,44 +657,5 @@ HRESULT D3D_CompileVertexShader(vlc_object_t *obj, const d3d_shader_compiler_t *
          { "HAS_PROJECTION", flat ? "0" : "1" },
          { NULL, NULL },
     };
-    return CompileShader(obj, compiler, feature_level, globVertexShader, false, defines, blob);
-}
-
-
-int D3D_CreateShaderCompiler(vlc_object_t *obj, d3d_shader_compiler_t **compiler)
-{
-    *compiler = calloc(1, sizeof(d3d_shader_compiler_t));
-    if (unlikely(*compiler == NULL))
-        return VLC_ENOMEM;
-#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
-    /* d3dcompiler_47 is the latest on windows 10 */
-    for (int i = 47; i > 41; --i)
-    {
-        WCHAR filename[19];
-        _snwprintf(filename, ARRAY_SIZE(filename), TEXT("D3DCOMPILER_%d.dll"), i);
-        (*compiler)->compiler_dll = LoadLibrary(filename);
-        if ((*compiler)->compiler_dll) break;
-    }
-    if ((*compiler)->compiler_dll)
-        (*compiler)->OurD3DCompile = (pD3DCompile)((void*)GetProcAddress((*compiler)->compiler_dll, "D3DCompile"));
-
-    if (!(*compiler)->OurD3DCompile) {
-        msg_Err(obj, "Cannot locate reference to D3DCompile in d3dcompiler DLL");
-        FreeLibrary((*compiler)->compiler_dll);
-        free(*compiler);
-        return VLC_EGENERIC;
-    }
-#endif // WINAPI_PARTITION_DESKTOP
-
-    return VLC_SUCCESS;
+    return CompileShader(obj, feature_level, globVertexShader, false, defines, blob);
 }
-
-void D3D_ReleaseShaderCompiler(d3d_shader_compiler_t *compiler)
-{
-#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
-    if (compiler->compiler_dll)
-        FreeLibrary(compiler->compiler_dll);
-#endif // WINAPI_PARTITION_DESKTOP
-    free(compiler);
-}
-


=====================================
modules/video_output/win32/d3d_dynamic_shader.h
=====================================
@@ -29,12 +29,7 @@
 extern "C" {
 #endif// __cplusplus
 
-typedef struct d3d_shader_compiler_t d3d_shader_compiler_t;
-
-int D3D_CreateShaderCompiler(vlc_object_t *, d3d_shader_compiler_t **);
-void D3D_ReleaseShaderCompiler(d3d_shader_compiler_t *);
-
-HRESULT D3D_CompilePixelShader(vlc_object_t *, const d3d_shader_compiler_t *,
+HRESULT D3D_CompilePixelShader(vlc_object_t *,
                                D3D_FEATURE_LEVEL,
                                const display_info_t *,
                                video_transfer_func_t,
@@ -43,7 +38,7 @@ HRESULT D3D_CompilePixelShader(vlc_object_t *, const d3d_shader_compiler_t *,
                                d3d_shader_blob pPSBlob[DXGI_MAX_RENDER_TARGET],
                                size_t shader_views[DXGI_MAX_RENDER_TARGET]);
 
-HRESULT D3D_CompileVertexShader(vlc_object_t *, const d3d_shader_compiler_t *,
+HRESULT D3D_CompileVertexShader(vlc_object_t *,
                                 D3D_FEATURE_LEVEL, bool flat,
                                 d3d_shader_blob *);
 


=====================================
modules/video_output/win32/direct3d11.cpp
=====================================
@@ -130,7 +130,6 @@ typedef struct vout_display_sys_t
 
     d3d11_device_t           *d3d_dev = NULL;
     d3d11_decoder_device_t   *local_d3d_dev = NULL; // when opened without a video context
-    d3d_shader_compiler_t    *shaders = nullptr;
     d3d11_quad_t             picQuad = {};
 
     d3d11_gpu_fence          fence = {};
@@ -544,10 +543,6 @@ static int Open(vout_display_t *vd,
 
     d3d11_decoder_device_t *dev_sys = NULL;
 
-    int ret = D3D_CreateShaderCompiler(VLC_OBJECT(vd), &sys->shaders);
-    if (ret != VLC_SUCCESS)
-        goto error;
-
     sys->outside_opaque = var_InheritAddress( vd, "vout-cb-opaque" );
     sys->updateOutputCb      = (libvlc_video_update_output_cb)var_InheritAddress( vd, "vout-cb-update-output" );
     sys->swapCb              = (libvlc_video_swap_cb)var_InheritAddress( vd, "vout-cb-swap" );
@@ -643,7 +638,6 @@ error:
 static void Close(vout_display_t *vd)
 {
     vout_display_sys_t *sys = static_cast<vout_display_sys_t *>(vd->sys);
-    D3D_ReleaseShaderCompiler(sys->shaders);
 #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     CommonWindowClean(sys->video_wnd);
 #endif
@@ -1455,7 +1449,7 @@ static int Direct3D11CreateFormatResources(vout_display_t *vd, const video_forma
         sys->use_staging_texture = false;
 
     d3d_shader_blob pPSBlob[DXGI_MAX_RENDER_TARGET] = { };
-    hr = D3D11_CompilePixelShaderBlob(vd, sys->shaders, sys->d3d_dev,
+    hr = D3D11_CompilePixelShaderBlob(vd, sys->d3d_dev,
                                   &sys->display, fmt->transfer,
                                   fmt->color_range == COLOR_RANGE_FULL,
                                   &sys->picQuad, pPSBlob);
@@ -1551,7 +1545,7 @@ static int Direct3D11CreateGenericResources(vout_display_t *vd)
     if (sys->regionQuad.generic.textureFormat != NULL)
     {
         d3d_shader_blob pPSBlob[DXGI_MAX_RENDER_TARGET] = { };
-        hr = D3D11_CompilePixelShaderBlob(vd, sys->shaders, sys->d3d_dev,
+        hr = D3D11_CompilePixelShaderBlob(vd, sys->d3d_dev,
                                       &sys->display, TRANSFER_FUNC_SRGB, true,
                                       &sys->regionQuad, pPSBlob);
         if (FAILED(hr))
@@ -1569,7 +1563,7 @@ static int Direct3D11CreateGenericResources(vout_display_t *vd)
     }
 
     d3d_shader_blob VSBlob = { };
-    hr = D3D11_CompileVertexShaderBlob(VLC_OBJECT(vd), sys->shaders, sys->d3d_dev, true, &VSBlob);
+    hr = D3D11_CompileVertexShaderBlob(VLC_OBJECT(vd), sys->d3d_dev, true, &VSBlob);
     if(FAILED(hr)) {
       msg_Err(vd, "Failed to compile the flat vertex shader. (hr=0x%lX)", hr);
       return VLC_EGENERIC;
@@ -1581,7 +1575,7 @@ static int Direct3D11CreateGenericResources(vout_display_t *vd)
     }
 
 
-    hr = D3D11_CompileVertexShaderBlob(VLC_OBJECT(vd), sys->shaders, sys->d3d_dev, false, &VSBlob);
+    hr = D3D11_CompileVertexShaderBlob(VLC_OBJECT(vd), sys->d3d_dev, false, &VSBlob);
     if(FAILED(hr)) {
       msg_Err(vd, "Failed to compile the 360 vertex shader. (hr=0x%lX)", hr);
       return VLC_EGENERIC;


=====================================
modules/video_output/win32/meson.build
=====================================
@@ -9,12 +9,8 @@ d3d11_sources = files('direct3d11.cpp', 'd3d11_quad.cpp', 'd3d11_scaler.cpp',
 d3d11_link_with = [ d3d11_common_lib, chroma_copy_lib ]
 d3d11_cargs = []
 d3d11_cxxargs = [ libcom_cppflags ]
-d3d11_deps = [ cc.find_library('dxgi'), cc.find_library('d3d11') ]
-if have_win_store
-    d3d11_deps += [
-        cc.find_library('d3dcompiler_47')
-    ]
-else
+d3d11_deps = [ cc.find_library('dxgi'), cc.find_library('d3d11'), cc.find_library('d3dcompiler') ]
+if not have_win_store
     d3d11_sources += files('d3d11_swapchain.cpp', 'dxgi_swapchain.cpp', 'common.c', 'events.c', 'sensors.cpp', 'win32touch.c')
     d3d11_cargs += '-DHAVE_WIN32_SENSORS'
     d3d11_deps += [



View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/b409e038783fe18fd2488def82e0bd2400f5af18...65a542433120aa430c7bafdc026b2916e0b1c454

-- 
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/b409e038783fe18fd2488def82e0bd2400f5af18...65a542433120aa430c7bafdc026b2916e0b1c454
You're receiving this email because of your account on code.videolan.org.


VideoLAN code repository instance


More information about the vlc-commits mailing list