diff --git a/modules/video_output/win32/d3d_render.h b/modules/video_output/win32/d3d_render.h
index 062d1d7e5d64ea0dc0645f8f117c9be7aa3f0ea1..790b9b9ced4fa16743ecffc276b9976a9dc95e17 100644
--- a/modules/video_output/win32/d3d_render.h
+++ b/modules/video_output/win32/d3d_render.h
@@ -49,7 +49,7 @@ struct output_cfg_t {
     video_transfer_func_t        transfer;        /** video transfer function */
 };
 
-typedef bool (*d3d_device_setup_cb)(void* opaque, const struct device_cfg_t*, struct device_setup_t* );
+typedef bool (*d3d_device_setup_cb)(void** opaque, const struct device_cfg_t*, struct device_setup_t* );
 typedef void (*d3d_device_cleanup_cb)(void* opaque);
 typedef bool (*d3d_update_output_cb)(void* opaque, const struct direct3d_cfg_t *cfg, struct output_cfg_t *out);
 typedef void (*d3d_swap_cb)(void* opaque);
diff --git a/modules/video_output/win32/direct3d11.c b/modules/video_output/win32/direct3d11.c
index df8cd6b4e7cf936e2d3bc4f05b13ecf7da23f732..4d5ab7a0d2f4471b5ec6ada78334376a7ae87a44 100644
--- a/modules/video_output/win32/direct3d11.c
+++ b/modules/video_output/win32/direct3d11.c
@@ -528,9 +528,9 @@ static bool UpdateSwapchain( struct d3d11_local_swapchain *display, const struct
     return true;
 }
 
-static bool LocalSwapchainSetupDevice( void *opaque, const struct device_cfg_t *cfg, struct device_setup_t *out )
+static bool LocalSwapchainSetupDevice( void **opaque, const struct device_cfg_t *cfg, struct device_setup_t *out )
 {
-    struct d3d11_local_swapchain *display = opaque;
+    struct d3d11_local_swapchain *display = *opaque;
     HRESULT hr;
 #if VLC_WINSTORE_APP
     ID3D11DeviceContext *legacy_ctx = var_InheritInteger( display->obj, "winrt-d3dcontext" ); /* LEGACY */
@@ -1328,7 +1328,7 @@ static int Direct3D11Open(vout_display_t *vd, video_format_t *fmtp)
     };
     struct device_setup_t out;
     ID3D11DeviceContext *d3d11_ctx = NULL;
-    if ( sys->setupDeviceCb( sys->outside_opaque, &cfg, &out ) )
+    if ( sys->setupDeviceCb( &sys->outside_opaque, &cfg, &out ) )
         d3d11_ctx = out.device_context;
     if ( d3d11_ctx == NULL )
     {
diff --git a/modules/video_output/win32/direct3d9.c b/modules/video_output/win32/direct3d9.c
index 554b206f78f12ef52b0f71cce244dc17982ea059..ff571cf26ff4151295a0870d4ee643c995b8c44d 100644
--- a/modules/video_output/win32/direct3d9.c
+++ b/modules/video_output/win32/direct3d9.c
@@ -1626,7 +1626,7 @@ static int FindShadersCallback(const char *name, char ***values, char ***descs)
 
 }
 
-static bool LocalSwapchainSetupDevice( void *opaque, const struct device_cfg_t *cfg, struct device_setup_t *out )
+static bool LocalSwapchainSetupDevice( void **opaque, const struct device_cfg_t *cfg, struct device_setup_t *out )
 {
     return false; /* don't use an "external" D3D9 device */
 }
@@ -1702,7 +1702,7 @@ static int Open(vout_display_t *vd, const vout_display_cfg_t *cfg,
     };
     struct device_setup_t device_setup;
     IDirect3DDevice9 *d3d9_device = NULL;
-    if ( sys->setupDeviceCb( sys->outside_opaque, &surface_cfg, &device_setup ) )
+    if ( sys->setupDeviceCb( &sys->outside_opaque, &surface_cfg, &device_setup ) )
         d3d9_device = device_setup.device_context;
     if ( d3d9_device == NULL && sys->setupDeviceCb != LocalSwapchainSetupDevice )
     {