Nikolay Sivov : dxva2: Add a semi-stub for VideoProcessBlt().
Alexandre Julliard
julliard at winehq.org
Fri Nov 13 15:57:52 CST 2020
Module: wine
Branch: master
Commit: 0824d408ba20ddbf30607e4d50ccb6a0c65f2fd3
URL: https://source.winehq.org/git/wine.git/?a=commit;h=0824d408ba20ddbf30607e4d50ccb6a0c65f2fd3
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Fri Nov 13 15:30:03 2020 +0300
dxva2: Add a semi-stub for VideoProcessBlt().
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/dxva2/main.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 49 insertions(+), 2 deletions(-)
diff --git a/dlls/dxva2/main.c b/dlls/dxva2/main.c
index 83c4723a7dc..341ee33d44d 100644
--- a/dlls/dxva2/main.c
+++ b/dlls/dxva2/main.c
@@ -218,13 +218,60 @@ static HRESULT WINAPI video_processor_GetFilterPropertyRange(IDirectXVideoProces
return E_NOTIMPL;
}
+static BOOL intersect_rect(RECT *dest, const RECT *src1, const RECT *src2)
+{
+ if (IsRectEmpty(src1) || IsRectEmpty(src2) ||
+ (src1->left >= src2->right) || (src2->left >= src1->right) ||
+ (src1->top >= src2->bottom) || (src2->top >= src1->bottom))
+ {
+ SetRectEmpty(dest);
+ return FALSE;
+ }
+ dest->left = max(src1->left, src2->left);
+ dest->right = min(src1->right, src2->right);
+ dest->top = max(src1->top, src2->top);
+ dest->bottom = min(src1->bottom, src2->bottom);
+
+ return TRUE;
+}
+
static HRESULT WINAPI video_processor_VideoProcessBlt(IDirectXVideoProcessor *iface, IDirect3DSurface9 *rt,
const DXVA2_VideoProcessBltParams *params, const DXVA2_VideoSample *samples, UINT sample_count,
HANDLE *complete_handle)
{
- FIXME("%p, %p, %p, %p, %u, %p.\n", iface, rt, params, samples, sample_count, complete_handle);
+ IDirect3DDevice9 *device;
+ unsigned int i;
+ RECT dst_rect;
+ HRESULT hr;
- return E_NOTIMPL;
+ TRACE("%p, %p, %p, %p, %u, %p.\n", iface, rt, params, samples, sample_count, complete_handle);
+
+ if (FAILED(hr = IDirect3DSurface9_GetDevice(rt, &device)))
+ {
+ WARN("Failed to get surface device, hr %#x.\n", hr);
+ return hr;
+ }
+
+ /* FIXME: use specified color */
+ IDirect3DDevice9_ColorFill(device, rt, NULL, 0);
+
+ for (i = 0; i < sample_count; ++i)
+ {
+ dst_rect = params->TargetRect;
+
+ if (!intersect_rect(&dst_rect, &dst_rect, &samples[i].DstRect))
+ continue;
+
+ if (FAILED(hr = IDirect3DDevice9_StretchRect(device, samples[i].SrcSurface, &samples[i].SrcRect,
+ rt, &dst_rect, D3DTEXF_POINT)))
+ {
+ WARN("Failed to copy sample %u, hr %#x.\n", i, hr);
+ }
+ }
+
+ IDirect3DDevice9_Release(device);
+
+ return S_OK;
}
static const IDirectXVideoProcessorVtbl video_processor_vtbl =
More information about the wine-cvs
mailing list