On Sun, Nov 18, 2018 at 7:40 PM Henri Verbeet hverbeet@codeweavers.com wrote:
@@ -1937,23 +1939,37 @@ HRESULT WINAPI D3DXLoadSurfaceFromSurface(IDirect3DSurface9 *dst_surface, if (!dst_surface || !src_surface) return D3DERR_INVALIDCALL;
- IDirect3DSurface9_GetDesc(src_surface, &SrcDesc);
- IDirect3DSurface9_GetDesc(src_surface, &src_desc);
- if (src_desc.Pool == D3DPOOL_DEFAULT && !(src_desc.Usage & D3DUSAGE_DYNAMIC))
- {
IDirect3DSurface9_GetDevice(src_surface, &device);
if (FAILED(IDirect3DDevice9_CreateRenderTarget(device, src_desc.Width, src_desc.Height,
src_desc.Format, D3DMULTISAMPLE_NONE, 0, TRUE, &surface, NULL))
|| FAILED(IDirect3DDevice9_StretchRect(device, src_surface, NULL, surface, NULL, D3DTEXF_NONE)))
surface = src_surface;
IDirect3DDevice9_Release(device);
- }
Doesn't this leak the staging RT if StretchRect() fails? I'm also unsure whether StretchRect() covers all the cases of our interest. After staring at the StretchRect() tests + docs for a while, my current understanding is that it should always work for us, we're probably doing an extra copy for off-screen plain surfaces but that's no big deal.
I guess GetRenderTargetData() might be a bit better / faster for the cases where it can be used, although it might complicate the function somewhat and it should probably be in a separate patch anyway.