[PATCH] mfplat/buffer: Avoid two copies when locking a D3D9 buffer if possible.

Giovanni Mascellani gmascellani at codeweavers.com
Fri Feb 11 02:29:49 CST 2022


Hi,

Il 11/02/22 09:17, Nikolay Sivov ha scritto:
> I don't think this works. It should be possible to LockRect() after 
> buffer was locked, if you keep surface locked this won't work. I don't 
> think we have tests for that, but that's what quick testing on Windows 
> shows.

Ouch. So Microsoft really does two more copies per Lock()? Bad!

Maybe the thing we could do anyway is to make call the first LockRect() 
with D3DLOCK_READONLY and the second one with D3DLOCK_DISCARD, though I 
doubt it will save anything near 3 ms per frame.

It would be nice if the Lock() interface had something similar to 
DISCARD, but alas it doesn't.

> We could have a shortcut in MFCopyImage() first, to have a single copy 
> call when strides match, instead of calling per row. Next step could be 
> to have some SIMD variants, with non-temporal copy like docs suggest. No 
> idea how much this improves performance, but for large enough copies 
> it's meant to bypass cache at least, I think.

I tried the single copy thing, but I couldn't see any significant 
change, so I didn't even bother submitting. As for the non-temporal 
copy, I don't know much about it either, but something makes me feel it 
won't change that much either.

Thanks, Giovanni.



More information about the wine-devel mailing list