mirror of
https://github.com/mpv-player/mpv
synced 2024-12-22 06:42:03 +00:00
context_dxinterop: lock rendertarget after present when swapping buffers
Moves the DXLockObjectsNV call to after PresentEx. This fixes an issue where the presented image is a single frame late. This may be due to DXLockObjectsNV locking the render target before StretchRect is done. The spec indicates that the lock call should provide synchronization for the resource, so this may be due to a driver bug.
This commit is contained in:
parent
3d75ba971d
commit
2ba2062e5b
@ -565,12 +565,6 @@ static void dxinterop_swap_buffers(MPGLContext *ctx)
|
||||
return;
|
||||
}
|
||||
|
||||
if (!gl->DXLockObjectsNV(p->device_h, 1, &p->rtarget_h)) {
|
||||
MP_ERR(ctx->vo, "Couldn't lock rendertarget after stretchrect: %s\n",
|
||||
mp_LastError_to_str());
|
||||
return;
|
||||
}
|
||||
|
||||
hr = IDirect3DDevice9Ex_PresentEx(p->device, NULL, NULL, NULL, NULL, 0);
|
||||
switch (hr) {
|
||||
case D3DERR_DEVICELOST:
|
||||
@ -578,11 +572,16 @@ static void dxinterop_swap_buffers(MPGLContext *ctx)
|
||||
MP_VERBOSE(ctx->vo, "Direct3D device lost! Resetting.\n");
|
||||
p->lost_device = true;
|
||||
dxinterop_reset(ctx);
|
||||
break;
|
||||
return;
|
||||
default:
|
||||
if (FAILED(hr))
|
||||
MP_ERR(ctx->vo, "Failed to present: %s\n", mp_HRESULT_to_str(hr));
|
||||
}
|
||||
|
||||
if (!gl->DXLockObjectsNV(p->device_h, 1, &p->rtarget_h)) {
|
||||
MP_ERR(ctx->vo, "Couldn't lock rendertarget after present: %s\n",
|
||||
mp_LastError_to_str());
|
||||
}
|
||||
}
|
||||
|
||||
static int dxinterop_control(MPGLContext *ctx, int *events, int request,
|
||||
|
Loading…
Reference in New Issue
Block a user