Module: wine Branch: master Commit: 0352a7fb88f603fcbacc904418a72b3dbf44011c URL: http://source.winehq.org/git/wine.git/?a=commit;h=0352a7fb88f603fcbacc904418...
Author: Aric Stewart aric@codeweavers.com Date: Mon May 21 07:53:52 2012 -0500
quartz: Add offscreen presentation to VMR9.
---
dlls/quartz/vmr9.c | 32 +++++++++++++++++++++++++++++++- 1 files changed, 31 insertions(+), 1 deletions(-)
diff --git a/dlls/quartz/vmr9.c b/dlls/quartz/vmr9.c index fc04269..efd14a1 100644 --- a/dlls/quartz/vmr9.c +++ b/dlls/quartz/vmr9.c @@ -1416,6 +1416,36 @@ static HRESULT VMR9_ImagePresenter_PresentTexture(VMR9DefaultAllocatorPresenterI return S_OK; }
+static HRESULT VMR9_ImagePresenter_PresentOffscreenSurface(VMR9DefaultAllocatorPresenterImpl *This, IDirect3DSurface9 *surface) +{ + HRESULT hr; + IDirect3DSurface9 *target = NULL; + RECT target_rect; + + hr = IDirect3DDevice9_GetBackBuffer(This->d3d9_dev, 0, 0, D3DBACKBUFFER_TYPE_MONO, &target); + if (FAILED(hr)) + { + ERR("IDirect3DDevice9_GetBackBuffer -- %08x\n", hr); + return hr; + } + + target_rect = This->pVMR9->target_rect; + target_rect.right -= target_rect.left; + target_rect.bottom -= target_rect.top; + target_rect.left = target_rect.top = 0; + + /* Flip */ + target_rect.top = target_rect.bottom; + target_rect.bottom = 0; + + hr = IDirect3DDevice9_StretchRect(This->d3d9_dev, surface, &This->pVMR9->source_rect, target, &target_rect, D3DTEXF_LINEAR); + if (FAILED(hr)) + ERR("IDirect3DDevice9_StretchRect -- %08x\n", hr); + IDirect3DSurface9_Release(target); + + return hr; +} + static HRESULT WINAPI VMR9_ImagePresenter_PresentImage(IVMRImagePresenter9 *iface, DWORD_PTR id, VMR9PresentationInfo *info) { VMR9DefaultAllocatorPresenterImpl *This = impl_from_IVMRImagePresenter9(iface); @@ -1441,7 +1471,7 @@ static HRESULT WINAPI VMR9_ImagePresenter_PresentImage(IVMRImagePresenter9 *ifac if (This->d3d9_vertex) hr = VMR9_ImagePresenter_PresentTexture(This, info->lpSurf); else - hr = E_NOTIMPL; + hr = VMR9_ImagePresenter_PresentOffscreenSurface(This, info->lpSurf); render = SUCCEEDED(hr); } else