Zhiyi Zhang : gdi32/tests: Add D3DKMTQueryVideoMemoryInfo() tests.

Alexandre Julliard julliard at winehq.org
Tue May 17 15:37:23 CDT 2022


Module: wine
Branch: master
Commit: 37b74e644a9011e9c79c2540c4bb7152555037a3
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=37b74e644a9011e9c79c2540c4bb7152555037a3

Author: Zhiyi Zhang <zzhang at codeweavers.com>
Date:   Tue May 17 14:17:41 2022 +0800

gdi32/tests: Add D3DKMTQueryVideoMemoryInfo() tests.

Signed-off-by: Zhiyi Zhang <zzhang at codeweavers.com>
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/gdi32/tests/driver.c | 106 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 106 insertions(+)

diff --git a/dlls/gdi32/tests/driver.c b/dlls/gdi32/tests/driver.c
index 3d25eacacd9..5117d34908d 100644
--- a/dlls/gdi32/tests/driver.c
+++ b/dlls/gdi32/tests/driver.c
@@ -48,8 +48,27 @@ static NTSTATUS (WINAPI *pD3DKMTOpenAdapterFromDeviceName)(D3DKMT_OPENADAPTERFRO
 static NTSTATUS (WINAPI *pD3DKMTOpenAdapterFromGdiDisplayName)(D3DKMT_OPENADAPTERFROMGDIDISPLAYNAME *);
 static NTSTATUS (WINAPI *pD3DKMTOpenAdapterFromHdc)(D3DKMT_OPENADAPTERFROMHDC *);
 static NTSTATUS (WINAPI *pD3DKMTSetVidPnSourceOwner)(const D3DKMT_SETVIDPNSOURCEOWNER *);
+static NTSTATUS (WINAPI *pD3DKMTQueryVideoMemoryInfo)(D3DKMT_QUERYVIDEOMEMORYINFO *);
 static HRESULT  (WINAPI *pDwmEnableComposition)(UINT);
 
+static BOOL get_primary_adapter_name(WCHAR *name)
+{
+    DISPLAY_DEVICEW dd;
+    DWORD adapter_idx;
+
+    dd.cb = sizeof(dd);
+    for (adapter_idx = 0; EnumDisplayDevicesW(NULL, adapter_idx, &dd, 0); ++adapter_idx)
+    {
+        if (dd.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE)
+        {
+            lstrcpyW(name, dd.DeviceName);
+            return TRUE;
+        }
+    }
+
+    return FALSE;
+}
+
 static void test_D3DKMTOpenAdapterFromGdiDisplayName(void)
 {
     D3DKMT_OPENADAPTERFROMGDIDISPLAYNAME open_adapter_gdi_desc;
@@ -886,6 +905,91 @@ static void test_D3DKMTOpenAdapterFromDeviceName(void)
     winetest_pop_context();
 }
 
+static void test_D3DKMTQueryVideoMemoryInfo(void)
+{
+    static const D3DKMT_MEMORY_SEGMENT_GROUP groups[] = {D3DKMT_MEMORY_SEGMENT_GROUP_LOCAL,
+                                                         D3DKMT_MEMORY_SEGMENT_GROUP_NON_LOCAL};
+    D3DKMT_OPENADAPTERFROMGDIDISPLAYNAME open_adapter_desc;
+    D3DKMT_QUERYVIDEOMEMORYINFO query_memory_info;
+    D3DKMT_CLOSEADAPTER close_adapter_desc;
+    NTSTATUS status;
+    unsigned int i;
+    BOOL ret;
+
+    if (!pD3DKMTQueryVideoMemoryInfo)
+    {
+        skip("D3DKMTQueryVideoMemoryInfo() is unavailable.\n");
+        return;
+    }
+
+    ret = get_primary_adapter_name(open_adapter_desc.DeviceName);
+    ok(ret, "Failed to get primary adapter name.\n");
+    status = pD3DKMTOpenAdapterFromGdiDisplayName(&open_adapter_desc);
+    ok(status == STATUS_SUCCESS, "Got unexpected return code %#lx.\n", status);
+
+    /* Normal query */
+    for (i = 0; i < ARRAY_SIZE(groups); ++i)
+    {
+        winetest_push_context("group %d", groups[i]);
+
+        query_memory_info.hProcess = NULL;
+        query_memory_info.hAdapter = open_adapter_desc.hAdapter;
+        query_memory_info.PhysicalAdapterIndex = 0;
+        query_memory_info.MemorySegmentGroup = groups[i];
+        status = pD3DKMTQueryVideoMemoryInfo(&query_memory_info);
+        ok(status == STATUS_SUCCESS, "Got unexpected return code %#lx.\n", status);
+        ok(query_memory_info.Budget >= query_memory_info.AvailableForReservation,
+           "Unexpected budget %I64u and reservation %I64u.\n", query_memory_info.Budget,
+           query_memory_info.AvailableForReservation);
+        ok(query_memory_info.CurrentUsage <= query_memory_info.Budget,
+           "Unexpected current usage %I64u.\n", query_memory_info.CurrentUsage);
+        ok(query_memory_info.CurrentReservation == 0,
+           "Unexpected current reservation %I64u.\n", query_memory_info.CurrentReservation);
+
+        winetest_pop_context();
+    }
+
+    /* Query using the current process handle */
+    query_memory_info.hProcess = GetCurrentProcess();
+    status = pD3DKMTQueryVideoMemoryInfo(&query_memory_info);
+    ok(status == STATUS_SUCCESS, "Got unexpected return code %#lx.\n", status);
+
+    /* Query using a process handle without PROCESS_QUERY_INFORMATION privilege */
+    query_memory_info.hProcess = OpenProcess(PROCESS_SET_INFORMATION, FALSE, GetCurrentProcessId());
+    ok(!!query_memory_info.hProcess, "OpenProcess failed, error %ld.\n", GetLastError());
+    status = pD3DKMTQueryVideoMemoryInfo(&query_memory_info);
+    ok(status == STATUS_ACCESS_DENIED, "Got unexpected return code %#lx.\n", status);
+    CloseHandle(query_memory_info.hProcess);
+    query_memory_info.hProcess = NULL;
+
+    /* Query using an invalid process handle */
+    query_memory_info.hProcess = (HANDLE)0xdeadbeef;
+    status = pD3DKMTQueryVideoMemoryInfo(&query_memory_info);
+    ok(status == STATUS_INVALID_HANDLE, "Got unexpected return code %#lx.\n", status);
+    query_memory_info.hProcess = NULL;
+
+    /* Query using an invalid adapter handle */
+    query_memory_info.hAdapter = (D3DKMT_HANDLE)0xdeadbeef;
+    status = pD3DKMTQueryVideoMemoryInfo(&query_memory_info);
+    ok(status == STATUS_INVALID_PARAMETER, "Got unexpected return code %#lx.\n", status);
+    query_memory_info.hAdapter = open_adapter_desc.hAdapter;
+
+    /* Query using an invalid adapter index */
+    query_memory_info.PhysicalAdapterIndex = 99;
+    status = pD3DKMTQueryVideoMemoryInfo(&query_memory_info);
+    ok(status == STATUS_INVALID_PARAMETER, "Got unexpected return code %#lx.\n", status);
+    query_memory_info.PhysicalAdapterIndex = 0;
+
+    /* Query using an invalid memory segment group */
+    query_memory_info.MemorySegmentGroup = D3DKMT_MEMORY_SEGMENT_GROUP_NON_LOCAL + 1;
+    status = pD3DKMTQueryVideoMemoryInfo(&query_memory_info);
+    ok(status == STATUS_INVALID_PARAMETER, "Got unexpected return code %#lx.\n", status);
+
+    close_adapter_desc.hAdapter = open_adapter_desc.hAdapter;
+    status = pD3DKMTCloseAdapter(&close_adapter_desc);
+    ok(status == STATUS_SUCCESS, "Got unexpected return code %#lx.\n", status);
+}
+
 START_TEST(driver)
 {
     HMODULE gdi32 = GetModuleHandleA("gdi32.dll");
@@ -900,6 +1004,7 @@ START_TEST(driver)
     pD3DKMTOpenAdapterFromGdiDisplayName = (void *)GetProcAddress(gdi32, "D3DKMTOpenAdapterFromGdiDisplayName");
     pD3DKMTOpenAdapterFromHdc = (void *)GetProcAddress(gdi32, "D3DKMTOpenAdapterFromHdc");
     pD3DKMTSetVidPnSourceOwner = (void *)GetProcAddress(gdi32, "D3DKMTSetVidPnSourceOwner");
+    pD3DKMTQueryVideoMemoryInfo = (void *)GetProcAddress(gdi32, "D3DKMTQueryVideoMemoryInfo");
 
     if (dwmapi)
         pDwmEnableComposition = (void *)GetProcAddress(dwmapi, "DwmEnableComposition");
@@ -913,6 +1018,7 @@ START_TEST(driver)
     test_D3DKMTSetVidPnSourceOwner();
     test_D3DKMTCheckOcclusion();
     test_D3DKMTOpenAdapterFromDeviceName();
+    test_D3DKMTQueryVideoMemoryInfo();
 
     FreeLibrary(dwmapi);
 }




More information about the wine-cvs mailing list