[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