Giovanni Mascellani (@giomasce) commented about dlls/mfplat/buffer.c:
+ if (FAILED(hr)) + goto end; + + if (flags != MF2DBuffer_LockFlags_Write) + IMFD3D12SynchronizationObjectCommands_EnqueueResourceReadyWait(buffer->d3d12_surface.sync_cmd, buffer->d3d12_surface.queue); + + ID3D12CommandQueue_ExecuteCommandLists(buffer->d3d12_surface.queue, 1, (ID3D12CommandList **) &list); + + if (flags == MF2DBuffer_LockFlags_Write) + IMFD3D12SynchronizationObjectCommands_EnqueueResourceReady(buffer->d3d12_surface.sync_cmd, buffer->d3d12_surface.queue); + else + IMFD3D12SynchronizationObjectCommands_EnqueueResourceRelease(buffer->d3d12_surface.sync_cmd, buffer->d3d12_surface.queue); + + buffer->d3d12_surface.fence_value++; + ID3D12CommandQueue_Signal(buffer->d3d12_surface.queue, buffer->d3d12_surface.fence, buffer->d3d12_surface.fence_value); + ID3D12Fence_SetEventOnCompletion(buffer->d3d12_surface.fence, buffer->d3d12_surface.fence_value, NULL); Do you have to wait when writing back? It seems you could skip it, synchronizing with the consume will be guaranteed by the MF synchronization object.
-- https://gitlab.winehq.org/wine/wine/-/merge_requests/11420#note_148325