Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/dxva2/main.c | 37 ++++++++++++++++++++++++--- dlls/dxva2/tests/dxva2.c | 54 ++++++++++++++++++++++++++++------------ 2 files changed, 71 insertions(+), 20 deletions(-)
diff --git a/dlls/dxva2/main.c b/dlls/dxva2/main.c index dd949b3d316..15d65a58344 100644 --- a/dlls/dxva2/main.c +++ b/dlls/dxva2/main.c @@ -19,6 +19,7 @@ #define COBJMACROS
#include <stdarg.h> +#include <limits.h> #include "windef.h" #include "winbase.h" #include "d3d9.h" @@ -132,12 +133,40 @@ static ULONG WINAPI device_manager_processor_service_Release(IDirectXVideoProces
static HRESULT WINAPI device_manager_processor_service_CreateSurface(IDirectXVideoProcessorService *iface, UINT width, UINT height, UINT backbuffers, D3DFORMAT format, D3DPOOL pool, DWORD usage, DWORD dxvaType, - IDirect3DSurface9 **surface, HANDLE *shared_handle) + IDirect3DSurface9 **surfaces, HANDLE *shared_handle) { - FIXME("%p, %u, %u, %u, %u, %u, %u, %u, %p, %p.\n", iface, width, height, backbuffers, format, pool, usage, dxvaType, - surface, shared_handle); + struct device_manager *manager = impl_from_IDirectXVideoProcessorService(iface); + unsigned int i, j; + HRESULT hr;
- return E_NOTIMPL; + TRACE("%p, %u, %u, %u, %u, %u, %u, %u, %p, %p.\n", iface, width, height, backbuffers, format, pool, usage, dxvaType, + surfaces, shared_handle); + + if (backbuffers >= UINT_MAX) + return E_INVALIDARG; + + memset(surfaces, 0, (backbuffers + 1) * sizeof(*surfaces)); + + for (i = 0; i < backbuffers + 1; ++i) + { + if (FAILED(hr = IDirect3DDevice9_CreateOffscreenPlainSurface(manager->device, width, height, format, + pool, &surfaces[i], NULL))) + break; + } + + if (FAILED(hr)) + { + for (j = 0; j < i; ++j) + { + if (surfaces[j]) + { + IDirect3DSurface9_Release(surfaces[j]); + surfaces[j] = NULL; + } + } + } + + return hr; }
static HRESULT WINAPI device_manager_processor_service_RegisterVideoProcessorSoftwareDevice( diff --git a/dlls/dxva2/tests/dxva2.c b/dlls/dxva2/tests/dxva2.c index 49b192a1fad..58b0231420d 100644 --- a/dlls/dxva2/tests/dxva2.c +++ b/dlls/dxva2/tests/dxva2.c @@ -59,13 +59,31 @@ static IDirect3DDevice9 *create_device(IDirect3D9 *d3d9, HWND focus_window) return device; }
+static void test_surface_desc(IDirect3DSurface9 *surface) +{ + D3DSURFACE_DESC desc = { 0 }; + HRESULT hr; + + hr = IDirect3DSurface9_GetDesc(surface, &desc); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + + ok(desc.Format == D3DFMT_X8R8G8B8, "Unexpected format %d.\n", desc.Format); + ok(desc.Type == D3DRTYPE_SURFACE, "Unexpected type %d.\n", desc.Type); + ok(desc.Usage == 0, "Unexpected usage %d.\n", desc.Usage); + ok(desc.Pool == D3DPOOL_DEFAULT, "Unexpected pool %d.\n", desc.Pool); + ok(desc.MultiSampleType == D3DMULTISAMPLE_NONE, "Unexpected multisample type %d.\n", desc.MultiSampleType); + ok(desc.MultiSampleQuality == 0, "Unexpected multisample quality %d.\n", desc.MultiSampleQuality); + ok(desc.Width == 64, "Unexpected width %u.\n", desc.Width); + ok(desc.Height == 64, "Unexpected height %u.\n", desc.Height); +} + static void test_device_manager(void) { IDirectXVideoProcessorService *processor_service; IDirectXVideoAccelerationService *accel_service; IDirect3DDevice9 *device, *device2, *device3; IDirect3DDeviceManager9 *manager; - IDirect3DSurface9 *surface; + IDirect3DSurface9 *surfaces[2]; int refcount, refcount2; HANDLE handle, handle1; IDirect3D9 *d3d; @@ -262,12 +280,20 @@ static void test_device_manager(void) hr = DXVA2CreateVideoService(device, &IID_IDirectXVideoAccelerationService, (void **)&accel_service); ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+ surfaces[0] = surfaces[1] = NULL; + hr = IDirectXVideoAccelerationService_CreateSurface(accel_service, 64, 64, 0, D3DFMT_X8R8G8B8, + D3DPOOL_DEFAULT, 0, DXVA2_VideoProcessorRenderTarget, surfaces, NULL); + ok(hr == S_OK, "Failed to create a surface, hr %#x.\n", hr); + ok(!!surfaces[0] && !surfaces[1], "Unexpected surfaces.\n"); + IDirect3DSurface9_Release(surfaces[0]); + hr = IDirectXVideoAccelerationService_CreateSurface(accel_service, 64, 64, 1, D3DFMT_X8R8G8B8, - D3DPOOL_DEFAULT, 0, DXVA2_VideoProcessorRenderTarget, &surface, NULL); -todo_wine + D3DPOOL_DEFAULT, 0, DXVA2_VideoProcessorRenderTarget, surfaces, NULL); ok(hr == S_OK, "Failed to create a surface, hr %#x.\n", hr); - if (SUCCEEDED(hr)) - IDirect3DSurface9_Release(surface); + ok(!!surfaces[0] && !!surfaces[1], "Unexpected surfaces.\n"); + test_surface_desc(surfaces[0]); + IDirect3DSurface9_Release(surfaces[0]); + IDirect3DSurface9_Release(surfaces[1]);
IDirectXVideoAccelerationService_Release(accel_service);
@@ -281,20 +307,16 @@ todo_wine hr = IDirect3DDeviceManager9_CloseDeviceHandle(manager, handle); ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
- hr = IDirectXVideoAccelerationService_CreateSurface(accel_service, 64, 64, 1, D3DFMT_X8R8G8B8, - D3DPOOL_DEFAULT, 0, DXVA2_VideoProcessorRenderTarget, &surface, NULL); -todo_wine + hr = IDirectXVideoAccelerationService_CreateSurface(accel_service, 64, 64, 0, D3DFMT_X8R8G8B8, + D3DPOOL_DEFAULT, 0, DXVA2_VideoProcessorRenderTarget, surfaces, NULL); ok(hr == S_OK, "Failed to create a surface, hr %#x.\n", hr);
- if (SUCCEEDED(hr)) - { - hr = IDirect3DSurface9_GetDevice(surface, &device3); - ok(hr == S_OK, "Unexpected hr %#x.\n", hr); - ok(device2 == device3, "Unexpected device.\n"); - IDirect3DDevice9_Release(device3); + hr = IDirect3DSurface9_GetDevice(surfaces[0], &device3); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + ok(device2 == device3, "Unexpected device.\n"); + IDirect3DDevice9_Release(device3);
- IDirect3DSurface9_Release(surface); - } + IDirect3DSurface9_Release(surfaces[0]);
IDirectXVideoAccelerationService_Release(accel_service);
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/dxva2/Makefile.in | 2 +- dlls/dxva2/main.c | 10 ++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-)
diff --git a/dlls/dxva2/Makefile.in b/dlls/dxva2/Makefile.in index e3fc2fd6c3a..d331512f019 100644 --- a/dlls/dxva2/Makefile.in +++ b/dlls/dxva2/Makefile.in @@ -1,5 +1,5 @@ MODULE = dxva2.dll -IMPORTS = uuid +IMPORTS = uuid ole32 IMPORTLIB = dxva2
EXTRADLLFLAGS = -mno-cygwin diff --git a/dlls/dxva2/main.c b/dlls/dxva2/main.c index 15d65a58344..22a35c4fbb3 100644 --- a/dlls/dxva2/main.c +++ b/dlls/dxva2/main.c @@ -180,9 +180,15 @@ static HRESULT WINAPI device_manager_processor_service_RegisterVideoProcessorSof static HRESULT WINAPI device_manager_processor_service_GetVideoProcessorDeviceGuids( IDirectXVideoProcessorService *iface, const DXVA2_VideoDesc *video_desc, UINT *count, GUID **guids) { - FIXME("%p, %p, %p, %p.\n", iface, video_desc, count, guids); + FIXME("%p, %p, %p, %p semi-stub.\n", iface, video_desc, count, guids);
- return E_NOTIMPL; + if (!(*guids = CoTaskMemAlloc(sizeof(**guids)))) + return E_OUTOFMEMORY; + + memcpy(*guids, &DXVA2_VideoProcSoftwareDevice, sizeof(**guids)); + *count = 1; + + return S_OK; }
static HRESULT WINAPI device_manager_processor_service_GetVideoProcessorRenderTargets(