On Sun, Nov 18, 2018 at 7:40 PM Henri Verbeet <hverbeet(a)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.