From 568abe24fba9682ad78b6fd481b0fa6bf4b54919 Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Wed, 26 Jun 2024 02:31:02 +0200 Subject: [PATCH] Load d3dxof.dll dynamically --- 3rdparty/d3drm/CMakeLists.txt | 12 +++++++++++- 3rdparty/d3drm/d3drm.c | 4 ++++ 3rdparty/d3drm/d3drm_private.h | 4 ++++ 3rdparty/d3drm/dyn_d3dxof.c | 32 ++++++++++++++++++++++++++++++++ 3rdparty/d3drm/dyn_d3dxof.h | 8 ++++++++ 3rdparty/d3drm/meshbuilder.c | 4 ++++ 6 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 3rdparty/d3drm/dyn_d3dxof.c create mode 100644 3rdparty/d3drm/dyn_d3dxof.h diff --git a/3rdparty/d3drm/CMakeLists.txt b/3rdparty/d3drm/CMakeLists.txt index 6914d03e..3ef12866 100644 --- a/3rdparty/d3drm/CMakeLists.txt +++ b/3rdparty/d3drm/CMakeLists.txt @@ -28,6 +28,8 @@ else() add_library(d3drm_guid INTERFACE) endif() +option(WINE_D3DRM_DYNAMIC_D3DXOF "Dynamic d3dxof" ON) + add_library(d3drm-wine SHARED d3drm.c d3drm_main.c @@ -49,8 +51,16 @@ if(CMAKE_SIZEOF_VOID_P EQUAL 4) else() target_sources(d3drm-wine PRIVATE d3drm64.def) endif() +if(WINE_D3DRM_DYNAMIC_D3DXOF) + target_sources(d3drm-wine PRIVATE dyn_d3dxof.c dyn_d3dxof.h) + target_compile_definitions(d3drm-wine PRIVATE DYNAMIC_D3DXOF) +endif() + target_include_directories(d3drm-wine SYSTEM PUBLIC "${CMAKE_CURRENT_LIST_DIR}/include") -target_link_libraries(d3drm-wine PRIVATE d3dxof ddraw) +if(NOT WINE_D3DRM_DYNAMIC_D3DXOF) + target_link_libraries(d3drm-wine PRIVATE d3dxof) +endif() +target_link_libraries(d3drm-wine PRIVATE ddraw) set_property(TARGET d3drm-wine PROPERTY PREFIX "") set_property(TARGET d3drm-wine PROPERTY OUTPUT_NAME "d3drm") target_compile_definitions(d3drm-wine PRIVATE "__WINESRC__") diff --git a/3rdparty/d3drm/d3drm.c b/3rdparty/d3drm/d3drm.c index cde2f868..a8d08169 100644 --- a/3rdparty/d3drm/d3drm.c +++ b/3rdparty/d3drm/d3drm.c @@ -2145,7 +2145,11 @@ static HRESULT WINAPI d3drm3_Load(IDirect3DRM3 *iface, void *source, void *objec return E_NOTIMPL; } +#ifdef DYNAMIC_D3DXOF + hr = DynamicDirectXFileCreate(&file); +#else hr = DirectXFileCreate(&file); +#endif if (hr != DXFILE_OK) goto end; diff --git a/3rdparty/d3drm/d3drm_private.h b/3rdparty/d3drm/d3drm_private.h index 6aa3ec9e..ee7c91c3 100644 --- a/3rdparty/d3drm/d3drm_private.h +++ b/3rdparty/d3drm/d3drm_private.h @@ -30,6 +30,10 @@ #include "wine/debug.h" #include "wine/list.h" +#ifdef DYNAMIC_D3DXOF +#include "dyn_d3dxof.h" +#endif + struct d3drm_matrix { float _11, _12, _13, _14; diff --git a/3rdparty/d3drm/dyn_d3dxof.c b/3rdparty/d3drm/dyn_d3dxof.c new file mode 100644 index 00000000..375d81bd --- /dev/null +++ b/3rdparty/d3drm/dyn_d3dxof.c @@ -0,0 +1,32 @@ +#include "dyn_d3dxof.h" + +static enum { + DYN_D3DXOF_INIT = 0, + DYN_D3DXOF_SUCCESS = 1, +} g_dyn_d3dxof_state = DYN_D3DXOF_INIT; +static HMODULE g_d3dxof; +static HRESULT (STDAPICALLTYPE * g_DynamicDirectXFileCreate)(LPDIRECTXFILE *lplpDirectXFile); + +static void init_dyn_d3d(void) { + if (g_dyn_d3dxof_state == DYN_D3DXOF_SUCCESS) { + return; + } + g_d3dxof = LoadLibraryA("d3dxof.dll"); + if (g_d3dxof == NULL) { + MessageBoxA(NULL, "Cannot find d3dxof.dll", "Cannot find d3dxof.dll", MB_ICONERROR); + abort(); + } + g_DynamicDirectXFileCreate = (void*)GetProcAddress(g_d3dxof, "DirectXFileCreate"); + if (g_d3dxof == NULL) { + MessageBoxA(NULL, "Missing symbols", "d3dxof.dll misses DirectXFileCreate", MB_ICONERROR); + abort(); + } + g_dyn_d3dxof_state = DYN_D3DXOF_SUCCESS; +} + + +STDAPI DynamicDirectXFileCreate(LPDIRECTXFILE *lplpDirectXFile) +{ + init_dyn_d3d(); + return g_DynamicDirectXFileCreate(lplpDirectXFile); +} diff --git a/3rdparty/d3drm/dyn_d3dxof.h b/3rdparty/d3drm/dyn_d3dxof.h new file mode 100644 index 00000000..2ed75e34 --- /dev/null +++ b/3rdparty/d3drm/dyn_d3dxof.h @@ -0,0 +1,8 @@ +#ifndef __DYN_D3DXOF_H__ +#define __DYN_D3DXOF_H__ + +#include + +STDAPI DynamicDirectXFileCreate(LPDIRECTXFILE *lplpDirectXFile); + +#endif /* __DYN_D3DXOF_H__ */ diff --git a/3rdparty/d3drm/meshbuilder.c b/3rdparty/d3drm/meshbuilder.c index 5aab5cf1..45ddaa53 100644 --- a/3rdparty/d3drm/meshbuilder.c +++ b/3rdparty/d3drm/meshbuilder.c @@ -1483,7 +1483,11 @@ static HRESULT WINAPI d3drm_mesh_builder3_Load(IDirect3DRMMeshBuilder3 *iface, v clean_mesh_builder_data(mesh_builder); +#ifdef DYNAMIC_D3DXOF + hr = DynamicDirectXFileCreate(&dxfile); +#else hr = DirectXFileCreate(&dxfile); +#endif if (hr != DXFILE_OK) goto end;