For React Native.
From: Zhiyi Zhang zzhang@codeweavers.com
--- include/ddk/d3dkmthk.h | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+)
diff --git a/include/ddk/d3dkmthk.h b/include/ddk/d3dkmthk.h index 7828941a9d6..c067f4773d4 100644 --- a/include/ddk/d3dkmthk.h +++ b/include/ddk/d3dkmthk.h @@ -175,6 +175,27 @@ typedef struct _D3DKMT_DESTROYDCFROMMEMORY HANDLE hBitmap; } D3DKMT_DESTROYDCFROMMEMORY;
+typedef enum _QAI_DRIVERVERSION +{ + KMT_DRIVERVERSION_WDDM_1_0 = 1000, + KMT_DRIVERVERSION_WDDM_1_1_PRERELEASE = 1102, + KMT_DRIVERVERSION_WDDM_1_1 = 1105, + KMT_DRIVERVERSION_WDDM_1_2 = 1200, + KMT_DRIVERVERSION_WDDM_1_3 = 1300, + KMT_DRIVERVERSION_WDDM_2_0 = 2000, + KMT_DRIVERVERSION_WDDM_2_1 = 2100, + KMT_DRIVERVERSION_WDDM_2_2 = 2200, + KMT_DRIVERVERSION_WDDM_2_3 = 2300, + KMT_DRIVERVERSION_WDDM_2_4 = 2400, + KMT_DRIVERVERSION_WDDM_2_5 = 2500, + KMT_DRIVERVERSION_WDDM_2_6 = 2600, + KMT_DRIVERVERSION_WDDM_2_7 = 2700, + KMT_DRIVERVERSION_WDDM_2_8 = 2800, + KMT_DRIVERVERSION_WDDM_2_9 = 2900, + KMT_DRIVERVERSION_WDDM_3_0 = 3000, + KMT_DRIVERVERSION_WDDM_3_1 = 3100 +} D3DKMT_DRIVERVERSION; + typedef enum _KMTQUERYADAPTERINFOTYPE { KMTQAITYPE_UMDRIVERPRIVATE,
From: Zhiyi Zhang zzhang@codeweavers.com
--- dlls/gdi32/tests/driver.c | 101 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+)
diff --git a/dlls/gdi32/tests/driver.c b/dlls/gdi32/tests/driver.c index 3a7944e9c02..59c98f38c8e 100644 --- a/dlls/gdi32/tests/driver.c +++ b/dlls/gdi32/tests/driver.c @@ -51,6 +51,7 @@ 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 *pD3DKMTQueryAdapterInfo)(D3DKMT_QUERYADAPTERINFO *); static NTSTATUS (WINAPI *pD3DKMTQueryVideoMemoryInfo)(D3DKMT_QUERYVIDEOMEMORYINFO *); static HRESULT (WINAPI *pDwmEnableComposition)(UINT);
@@ -1120,6 +1121,104 @@ static void test_gpu_device_properties(void) winetest_pop_context(); }
+static void test_D3DKMTQueryAdapterInfo(void) +{ + D3DKMT_OPENADAPTERFROMGDIDISPLAYNAME open_adapter_desc; + D3DKMT_QUERYADAPTERINFO query_adapter_info; + D3DKMT_CLOSEADAPTER close_adapter_desc; + unsigned char buffer[1024]; + NTSTATUS status; + unsigned int i; + BOOL ret; + + static const struct + { + KMTQUERYADAPTERINFOTYPE type; + UINT size; + } + tests[] = + { + {KMTQAITYPE_CHECKDRIVERUPDATESTATUS, sizeof(BOOL)}, + {KMTQAITYPE_DRIVERVERSION, sizeof(D3DKMT_DRIVERVERSION)}, + }; + + if (!pD3DKMTQueryAdapterInfo) + { + win_skip("D3DKMTQueryAdapterInfo() 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); + if (status == STATUS_PROCEDURE_NOT_FOUND) + { + win_skip("D3DKMTOpenAdapterFromGdiDisplayName() is not supported.\n"); + return; + } + ok(status == STATUS_SUCCESS, "Got unexpected return code %#lx.\n", status); + + for (i = 0; i < ARRAY_SIZE(tests); i++) + { + winetest_push_context("type %d", tests[i].type); + + /* NULL buffer */ + query_adapter_info.hAdapter = open_adapter_desc.hAdapter; + query_adapter_info.Type = tests[i].type; + query_adapter_info.pPrivateDriverData = NULL; + query_adapter_info.PrivateDriverDataSize = tests[i].size; + status = pD3DKMTQueryAdapterInfo(&query_adapter_info); + todo_wine + ok(status == STATUS_INVALID_PARAMETER, "Got unexpected return code %#lx.\n", status); + + /* Insufficient buffer size */ + query_adapter_info.pPrivateDriverData = buffer; + query_adapter_info.PrivateDriverDataSize = tests[i].size - 1; + status = pD3DKMTQueryAdapterInfo(&query_adapter_info); + todo_wine + ok(status == STATUS_INVALID_PARAMETER, "Got unexpected return code %#lx.\n", status); + + /* Normal */ + query_adapter_info.pPrivateDriverData = buffer; + query_adapter_info.PrivateDriverDataSize = tests[i].size; + status = pD3DKMTQueryAdapterInfo(&query_adapter_info); + todo_wine + ok(status == STATUS_SUCCESS, "Got unexpected return code %#lx.\n", status); + if (status != STATUS_SUCCESS) + { + winetest_pop_context(); + continue; + } + + switch (tests[i].type) + { + case KMTQAITYPE_CHECKDRIVERUPDATESTATUS: + { + BOOL *value = query_adapter_info.pPrivateDriverData; + ok(*value == FALSE, "Expected %d, got %d.\n", FALSE, *value); + break; + } + case KMTQAITYPE_DRIVERVERSION: + { + D3DKMT_DRIVERVERSION *value = query_adapter_info.pPrivateDriverData; + ok(*value >= KMT_DRIVERVERSION_WDDM_1_3, "Expected %d >= %d.\n", *value, + KMT_DRIVERVERSION_WDDM_1_3); + break; + } + default: + { + ok(0, "Type %d is not handled.\n", tests[i].type); + } + } + + winetest_pop_context(); + } + + 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"); @@ -1135,6 +1234,7 @@ START_TEST(driver) pD3DKMTOpenAdapterFromGdiDisplayName = (void *)GetProcAddress(gdi32, "D3DKMTOpenAdapterFromGdiDisplayName"); pD3DKMTOpenAdapterFromHdc = (void *)GetProcAddress(gdi32, "D3DKMTOpenAdapterFromHdc"); pD3DKMTSetVidPnSourceOwner = (void *)GetProcAddress(gdi32, "D3DKMTSetVidPnSourceOwner"); + pD3DKMTQueryAdapterInfo = (void *)GetProcAddress(gdi32, "D3DKMTQueryAdapterInfo"); pD3DKMTQueryVideoMemoryInfo = (void *)GetProcAddress(gdi32, "D3DKMTQueryVideoMemoryInfo");
if (dwmapi) @@ -1150,6 +1250,7 @@ START_TEST(driver) test_D3DKMTSetVidPnSourceOwner(); test_D3DKMTCheckOcclusion(); test_D3DKMTOpenAdapterFromDeviceName(); + test_D3DKMTQueryAdapterInfo(); test_D3DKMTQueryVideoMemoryInfo(); test_gpu_device_properties();
From: Zhiyi Zhang zzhang@codeweavers.com
--- dlls/gdi32/tests/driver.c | 5 ++--- dlls/win32u/d3dkmt.c | 25 ++++++++++++++++++++++--- 2 files changed, 24 insertions(+), 6 deletions(-)
diff --git a/dlls/gdi32/tests/driver.c b/dlls/gdi32/tests/driver.c index 59c98f38c8e..29bbb5aef26 100644 --- a/dlls/gdi32/tests/driver.c +++ b/dlls/gdi32/tests/driver.c @@ -1168,21 +1168,20 @@ static void test_D3DKMTQueryAdapterInfo(void) query_adapter_info.pPrivateDriverData = NULL; query_adapter_info.PrivateDriverDataSize = tests[i].size; status = pD3DKMTQueryAdapterInfo(&query_adapter_info); - todo_wine ok(status == STATUS_INVALID_PARAMETER, "Got unexpected return code %#lx.\n", status);
/* Insufficient buffer size */ query_adapter_info.pPrivateDriverData = buffer; query_adapter_info.PrivateDriverDataSize = tests[i].size - 1; status = pD3DKMTQueryAdapterInfo(&query_adapter_info); - todo_wine + todo_wine_if(tests[i].type != KMTQAITYPE_CHECKDRIVERUPDATESTATUS) ok(status == STATUS_INVALID_PARAMETER, "Got unexpected return code %#lx.\n", status);
/* Normal */ query_adapter_info.pPrivateDriverData = buffer; query_adapter_info.PrivateDriverDataSize = tests[i].size; status = pD3DKMTQueryAdapterInfo(&query_adapter_info); - todo_wine + todo_wine_if(tests[i].type != KMTQAITYPE_CHECKDRIVERUPDATESTATUS) ok(status == STATUS_SUCCESS, "Got unexpected return code %#lx.\n", status); if (status != STATUS_SUCCESS) { diff --git a/dlls/win32u/d3dkmt.c b/dlls/win32u/d3dkmt.c index 24a668a85b4..8b43c6ba04a 100644 --- a/dlls/win32u/d3dkmt.c +++ b/dlls/win32u/d3dkmt.c @@ -333,10 +333,29 @@ NTSTATUS WINAPI NtGdiDdDDIDestroyDevice( const D3DKMT_DESTROYDEVICE *desc ) */ NTSTATUS WINAPI NtGdiDdDDIQueryAdapterInfo( D3DKMT_QUERYADAPTERINFO *desc ) { - if (!desc) return STATUS_INVALID_PARAMETER; + TRACE( "(%p).\n", desc );
- FIXME( "desc %p, type %d stub\n", desc, desc->Type ); - return STATUS_NOT_IMPLEMENTED; + if (!desc || !desc->hAdapter || !desc->pPrivateDriverData) + return STATUS_INVALID_PARAMETER; + + switch (desc->Type) + { + case KMTQAITYPE_CHECKDRIVERUPDATESTATUS: + { + BOOL *value = desc->pPrivateDriverData; + + if (desc->PrivateDriverDataSize < sizeof(*value)) + return STATUS_INVALID_PARAMETER; + + *value = FALSE; + return STATUS_SUCCESS; + } + default: + { + FIXME( "type %d not handled.\n", desc->Type ); + return STATUS_NOT_IMPLEMENTED; + } + } }
/******************************************************************************
From: Zhiyi Zhang zzhang@codeweavers.com
--- dlls/gdi32/tests/driver.c | 2 -- dlls/win32u/d3dkmt.c | 10 ++++++++++ 2 files changed, 10 insertions(+), 2 deletions(-)
diff --git a/dlls/gdi32/tests/driver.c b/dlls/gdi32/tests/driver.c index 29bbb5aef26..ca67b40d860 100644 --- a/dlls/gdi32/tests/driver.c +++ b/dlls/gdi32/tests/driver.c @@ -1174,14 +1174,12 @@ static void test_D3DKMTQueryAdapterInfo(void) query_adapter_info.pPrivateDriverData = buffer; query_adapter_info.PrivateDriverDataSize = tests[i].size - 1; status = pD3DKMTQueryAdapterInfo(&query_adapter_info); - todo_wine_if(tests[i].type != KMTQAITYPE_CHECKDRIVERUPDATESTATUS) ok(status == STATUS_INVALID_PARAMETER, "Got unexpected return code %#lx.\n", status);
/* Normal */ query_adapter_info.pPrivateDriverData = buffer; query_adapter_info.PrivateDriverDataSize = tests[i].size; status = pD3DKMTQueryAdapterInfo(&query_adapter_info); - todo_wine_if(tests[i].type != KMTQAITYPE_CHECKDRIVERUPDATESTATUS) ok(status == STATUS_SUCCESS, "Got unexpected return code %#lx.\n", status); if (status != STATUS_SUCCESS) { diff --git a/dlls/win32u/d3dkmt.c b/dlls/win32u/d3dkmt.c index 8b43c6ba04a..564b10cbe98 100644 --- a/dlls/win32u/d3dkmt.c +++ b/dlls/win32u/d3dkmt.c @@ -350,6 +350,16 @@ NTSTATUS WINAPI NtGdiDdDDIQueryAdapterInfo( D3DKMT_QUERYADAPTERINFO *desc ) *value = FALSE; return STATUS_SUCCESS; } + case KMTQAITYPE_DRIVERVERSION: + { + D3DKMT_DRIVERVERSION *value = desc->pPrivateDriverData; + + if (desc->PrivateDriverDataSize < sizeof(*value)) + return STATUS_INVALID_PARAMETER; + + *value = KMT_DRIVERVERSION_WDDM_1_3; + return STATUS_SUCCESS; + } default: { FIXME( "type %d not handled.\n", desc->Type );
This merge request was approved by Huw Davies.