Skip to content

Commit 8deb4bc

Browse files
jchodorCompute-Runtime-Automation
authored andcommitted
Adding helper for QUERYREGISTRY_DRIVERSTOREPATH
Signed-off-by: Jaroslaw Chodor <[email protected]>
1 parent 20549fd commit 8deb4bc

File tree

5 files changed

+143
-2
lines changed

5 files changed

+143
-2
lines changed

shared/source/os_interface/windows/CMakeLists.txt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#
2-
# Copyright (C) 2019-2020 Intel Corporation
2+
# Copyright (C) 2019-2021 Intel Corporation
33
#
44
# SPDX-License-Identifier: MIT
55
#
@@ -49,6 +49,8 @@ set(NEO_CORE_OS_INTERFACE_WINDOWS
4949
${CMAKE_CURRENT_SOURCE_DIR}/print.cpp
5050
${CMAKE_CURRENT_SOURCE_DIR}/sys_calls.h
5151
${CMAKE_CURRENT_SOURCE_DIR}/thk_wrapper.h
52+
${CMAKE_CURRENT_SOURCE_DIR}/wddm/adapter_info.cpp
53+
${CMAKE_CURRENT_SOURCE_DIR}/wddm/adapter_info.h
5254
${CMAKE_CURRENT_SOURCE_DIR}/wddm/wddm.cpp
5355
${CMAKE_CURRENT_SOURCE_DIR}/wddm/wddm.h
5456
${CMAKE_CURRENT_SOURCE_DIR}/wddm/wddm_defs.h
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
/*
2+
* Copyright (C) 2021 Intel Corporation
3+
*
4+
* SPDX-License-Identifier: MIT
5+
*
6+
*/
7+
8+
#include "shared/source/os_interface/windows/wddm/adapter_info.h"
9+
10+
#include "shared/source/helpers/debug_helpers.h"
11+
#include "shared/source/os_interface/windows/gdi_interface.h"
12+
13+
#include <memory>
14+
15+
namespace NEO {
16+
std::wstring queryAdapterDriverStorePath(const Gdi &gdi, D3DKMT_HANDLE adapter) {
17+
D3DDDI_QUERYREGISTRY_INFO queryRegistryInfoSizeDesc = {};
18+
queryRegistryInfoSizeDesc.QueryType = D3DDDI_QUERYREGISTRY_DRIVERSTOREPATH;
19+
queryRegistryInfoSizeDesc.ValueType = 0;
20+
queryRegistryInfoSizeDesc.PhysicalAdapterIndex = 0;
21+
22+
D3DKMT_QUERYADAPTERINFO queryAdapterInfoDesc = {0};
23+
queryAdapterInfoDesc.hAdapter = adapter;
24+
queryAdapterInfoDesc.Type = KMTQAITYPE_QUERYREGISTRY;
25+
queryAdapterInfoDesc.pPrivateDriverData = &queryRegistryInfoSizeDesc;
26+
queryAdapterInfoDesc.PrivateDriverDataSize = static_cast<UINT>(sizeof(queryRegistryInfoSizeDesc));
27+
28+
NTSTATUS status = gdi.queryAdapterInfo(&queryAdapterInfoDesc);
29+
UNRECOVERABLE_IF(status != STATUS_SUCCESS);
30+
DEBUG_BREAK_IF(queryRegistryInfoSizeDesc.Status != D3DDDI_QUERYREGISTRY_STATUS_BUFFER_OVERFLOW);
31+
32+
const auto privateDataSizeNeeded = queryRegistryInfoSizeDesc.OutputValueSize + sizeof(D3DDDI_QUERYREGISTRY_INFO);
33+
std::unique_ptr<uint64_t> storage{new uint64_t[(privateDataSizeNeeded + sizeof(uint64_t) - 1) / sizeof(uint64_t)]};
34+
D3DDDI_QUERYREGISTRY_INFO &queryRegistryInfoValueDesc = *reinterpret_cast<D3DDDI_QUERYREGISTRY_INFO *>(storage.get());
35+
queryRegistryInfoValueDesc = {};
36+
queryRegistryInfoValueDesc.QueryType = D3DDDI_QUERYREGISTRY_DRIVERSTOREPATH;
37+
queryRegistryInfoValueDesc.ValueType = 0;
38+
queryRegistryInfoValueDesc.PhysicalAdapterIndex = 0;
39+
40+
queryAdapterInfoDesc.pPrivateDriverData = &queryRegistryInfoValueDesc;
41+
queryAdapterInfoDesc.PrivateDriverDataSize = static_cast<UINT>(privateDataSizeNeeded);
42+
43+
status = gdi.queryAdapterInfo(&queryAdapterInfoDesc);
44+
UNRECOVERABLE_IF(status != STATUS_SUCCESS);
45+
UNRECOVERABLE_IF(queryRegistryInfoValueDesc.Status != D3DDDI_QUERYREGISTRY_STATUS_SUCCESS);
46+
47+
return std::wstring(std::wstring(queryRegistryInfoValueDesc.OutputString, queryRegistryInfoValueDesc.OutputString + queryRegistryInfoValueDesc.OutputValueSize / sizeof(wchar_t)).c_str());
48+
}
49+
} // namespace NEO
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
/*
2+
* Copyright (C) 2021 Intel Corporation
3+
*
4+
* SPDX-License-Identifier: MIT
5+
*
6+
*/
7+
8+
#pragma once
9+
10+
#include <string>
11+
12+
typedef unsigned int D3DKMT_HANDLE;
13+
14+
namespace NEO {
15+
16+
class Gdi;
17+
18+
std::wstring queryAdapterDriverStorePath(const Gdi &gdi, D3DKMT_HANDLE adapter);
19+
20+
} // namespace NEO

shared/test/unit_test/os_interface/windows/CMakeLists.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
#
2-
# Copyright (C) 2019-2020 Intel Corporation
2+
# Copyright (C) 2019-2021 Intel Corporation
33
#
44
# SPDX-License-Identifier: MIT
55
#
66

77
set(NEO_CORE_OS_INTERFACE_TESTS_WINDOWS
88
${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt
9+
${CMAKE_CURRENT_SOURCE_DIR}/adapter_info_tests.cpp
910
${CMAKE_CURRENT_SOURCE_DIR}/gdi_interface_tests.cpp
1011
${CMAKE_CURRENT_SOURCE_DIR}/gmm_helper_tests_win.cpp
1112
${CMAKE_CURRENT_SOURCE_DIR}/mock_gdi_interface.cpp
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
/*
2+
* Copyright (C) 2021 Intel Corporation
3+
*
4+
* SPDX-License-Identifier: MIT
5+
*
6+
*/
7+
8+
#include "shared/source/os_interface/windows/gdi_interface.h"
9+
#include "shared/source/os_interface/windows/wddm/adapter_info.h"
10+
11+
#include "test.h"
12+
13+
TEST(AdapterInfoTest, whenQueryingForDriverStorePathThenProvidesEnoughMemoryForReturnString) {
14+
static constexpr D3DKMT_HANDLE validHandle = 0x7;
15+
static constexpr auto error = STATUS_SUCCESS + 1;
16+
static const wchar_t *driverStorePathStr = L"some/path/fffff";
17+
struct QueryAdapterInfoMock {
18+
static NTSTATUS(APIENTRY queryadapterinfo)(
19+
const D3DKMT_QUERYADAPTERINFO *queryAdapterInfo) {
20+
EXPECT_NE(nullptr, queryAdapterInfo);
21+
if (nullptr == queryAdapterInfo) {
22+
return error;
23+
}
24+
EXPECT_EQ(validHandle, queryAdapterInfo->hAdapter);
25+
EXPECT_EQ(KMTQAITYPE_QUERYREGISTRY, queryAdapterInfo->Type);
26+
if (KMTQAITYPE_QUERYREGISTRY != queryAdapterInfo->Type) {
27+
return error;
28+
}
29+
30+
EXPECT_NE(nullptr, queryAdapterInfo->pPrivateDriverData);
31+
EXPECT_LE(sizeof(D3DDDI_QUERYREGISTRY_INFO), queryAdapterInfo->PrivateDriverDataSize);
32+
if ((nullptr == queryAdapterInfo->pPrivateDriverData) || (sizeof(D3DDDI_QUERYREGISTRY_INFO) > queryAdapterInfo->PrivateDriverDataSize)) {
33+
return error;
34+
}
35+
36+
D3DDDI_QUERYREGISTRY_INFO *queryRegistryInfo = reinterpret_cast<D3DDDI_QUERYREGISTRY_INFO *>(queryAdapterInfo->pPrivateDriverData);
37+
EXPECT_EQ(D3DDDI_QUERYREGISTRY_DRIVERSTOREPATH, queryRegistryInfo->QueryType);
38+
EXPECT_EQ(0U, queryRegistryInfo->QueryFlags.Value);
39+
bool regValueNameIsEmpty = std::wstring(std::wstring(queryRegistryInfo->ValueName[0], queryRegistryInfo->ValueName[0] + sizeof(queryRegistryInfo->ValueName)).c_str()).empty();
40+
EXPECT_TRUE(regValueNameIsEmpty);
41+
EXPECT_EQ(0U, queryRegistryInfo->ValueType);
42+
EXPECT_EQ(0U, queryRegistryInfo->PhysicalAdapterIndex);
43+
44+
if (D3DDDI_QUERYREGISTRY_DRIVERSTOREPATH != queryRegistryInfo->QueryType) {
45+
return error;
46+
}
47+
48+
queryRegistryInfo->OutputValueSize = static_cast<ULONG>(std::wstring(driverStorePathStr).size() * sizeof(wchar_t));
49+
if (queryAdapterInfo->PrivateDriverDataSize < queryRegistryInfo->OutputValueSize + sizeof(D3DDDI_QUERYREGISTRY_INFO)) {
50+
EXPECT_EQ(sizeof(D3DDDI_QUERYREGISTRY_INFO), queryAdapterInfo->PrivateDriverDataSize);
51+
queryRegistryInfo->Status = D3DDDI_QUERYREGISTRY_STATUS_BUFFER_OVERFLOW;
52+
return STATUS_SUCCESS;
53+
}
54+
55+
memcpy_s(queryRegistryInfo->OutputString, queryAdapterInfo->PrivateDriverDataSize - sizeof(D3DDDI_QUERYREGISTRY_INFO),
56+
driverStorePathStr, queryRegistryInfo->OutputValueSize);
57+
58+
queryRegistryInfo->Status = D3DDDI_QUERYREGISTRY_STATUS_SUCCESS;
59+
return STATUS_SUCCESS;
60+
}
61+
};
62+
NEO::Gdi gdi;
63+
auto handle = validHandle;
64+
gdi.queryAdapterInfo.mFunc = QueryAdapterInfoMock::queryadapterinfo;
65+
66+
auto ret = NEO::queryAdapterDriverStorePath(gdi, handle);
67+
68+
EXPECT_EQ(std::wstring(driverStorePathStr), ret) << "Expected " << driverStorePathStr << ", got : " << ret;
69+
}

0 commit comments

Comments
 (0)