Skip to content

Commit 418db08

Browse files
Verify HDC handle when returning devices for GL sharing
Resolves: NEO-4952 Change-Id: I298bb26aacd2cc5ad7206f7fff2b2235098fb8bf Signed-off-by: Mateusz Jablonski <[email protected]>
1 parent c2a4835 commit 418db08

File tree

11 files changed

+194
-13
lines changed

11 files changed

+194
-13
lines changed

opencl/source/sharings/gl/windows/cl_gl_api.cpp

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
*/
77

88
#include "shared/source/helpers/get_info.h"
9+
#include "shared/source/os_interface/windows/os_interface.h"
910
#include "shared/source/utilities/api_intercept.h"
1011

1112
#include "opencl/source/api/api.h"
@@ -350,11 +351,23 @@ cl_int CL_API_CALL clGetGLContextInfoKHR(const cl_context_properties *properties
350351
}
351352

352353
if (paramName == CL_DEVICES_FOR_GL_CONTEXT_KHR || paramName == CL_CURRENT_DEVICE_FOR_GL_CONTEXT_KHR) {
353-
if (platform) {
354-
info.set<cl_device_id>(platform->getClDevice(0));
355-
} else {
356-
info.set<cl_device_id>(platformsImpl[0]->getClDevice(0));
354+
if (!platform) {
355+
platform = platformsImpl[0].get();
356+
}
357+
358+
ClDevice *deviceToReturn = nullptr;
359+
for (auto i = 0u; i < platform->getNumDevices(); i++) {
360+
auto device = platform->getClDevice(i);
361+
if (device->getRootDeviceEnvironment().osInterface->get()->getWddm()->verifyHdcHandle(GLHDCHandle)) {
362+
deviceToReturn = device;
363+
break;
364+
}
365+
}
366+
if (!deviceToReturn) {
367+
retVal = CL_INVALID_GL_SHAREGROUP_REFERENCE_KHR;
368+
return retVal;
357369
}
370+
info.set<cl_device_id>(deviceToReturn);
358371
return retVal;
359372
}
360373

opencl/test/unit_test/api/gl/CMakeLists.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ if(WIN32)
1515
${CMAKE_CURRENT_SOURCE_DIR}/cl_enqueue_acquire_gl_objects_tests.cpp
1616
${CMAKE_CURRENT_SOURCE_DIR}/cl_enqueue_release_gl_objects_tests.cpp
1717
${CMAKE_CURRENT_SOURCE_DIR}/cl_get_gl_device_info_tests.cpp
18-
${CMAKE_CURRENT_SOURCE_DIR}/cl_get_gl_context_info_khr_tests.cpp
1918
${CMAKE_CURRENT_SOURCE_DIR}/cl_get_gl_object_info_tests.cpp
2019
${CMAKE_CURRENT_SOURCE_DIR}/cl_get_gl_texture_info_tests.cpp
2120
${CMAKE_CURRENT_SOURCE_DIR}/cl_gl_intel_tracing_tests.cpp

opencl/test/unit_test/mocks/mock_wddm.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ class WddmMock : public Wddm {
4646
using Wddm::temporaryResources;
4747
using Wddm::wddmInterface;
4848

49+
WddmMock(std::unique_ptr<HwDeviceId> hwDeviceId, RootDeviceEnvironment &rootDeviceEnvironment) : Wddm(std::move(hwDeviceId), rootDeviceEnvironment) {}
4950
WddmMock(RootDeviceEnvironment &rootDeviceEnvironment);
5051
~WddmMock();
5152

@@ -108,6 +109,9 @@ class WddmMock : public Wddm {
108109
++counterVerifySharedHandle;
109110
return Wddm::verifySharedHandle(osHandle);
110111
}
112+
bool verifyHdcHandle(size_t hdcHandle) const override {
113+
return verifyHdcReturnValue;
114+
}
111115

112116
void resetGdi(Gdi *gdi);
113117

@@ -147,6 +151,7 @@ class WddmMock : public Wddm {
147151
bool makeResidentStatus = true;
148152
bool callBaseMakeResident = true;
149153
bool callBaseCreatePagingLogger = true;
154+
bool verifyHdcReturnValue = true;
150155
};
151156

152157
struct GmockWddm : WddmMock {
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#
2+
# Copyright (C) 2020 Intel Corporation
3+
#
4+
# SPDX-License-Identifier: MIT
5+
#
6+
7+
set(IGDRCL_SRCS_tests_os_interface_windows_gl
8+
${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt
9+
${CMAKE_CURRENT_SOURCE_DIR}/cl_get_gl_context_info_khr_tests.cpp
10+
)
11+
if(WIN32)
12+
target_sources(igdrcl_tests PRIVATE ${IGDRCL_SRCS_tests_os_interface_windows_gl})
13+
endif()

opencl/test/unit_test/api/gl/cl_get_gl_context_info_khr_tests.cpp renamed to opencl/test/unit_test/os_interface/windows/gl/cl_get_gl_context_info_khr_tests.cpp

Lines changed: 71 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,28 @@
77

88
#include "shared/source/helpers/hw_info.h"
99
#include "shared/source/os_interface/device_factory.h"
10+
#include "shared/source/os_interface/windows/os_interface.h"
1011
#include "shared/test/unit_test/mocks/mock_device.h"
1112

1213
#include "opencl/source/cl_device/cl_device.h"
1314
#include "opencl/test/unit_test/api/cl_api_tests.h"
1415
#include "opencl/test/unit_test/mocks/mock_platform.h"
16+
#include "opencl/test/unit_test/mocks/mock_wddm.h"
1517
#include "opencl/test/unit_test/sharings/gl/gl_dll_helper.h"
1618

1719
using namespace NEO;
1820

19-
typedef api_tests clGetGLContextInfoKHR_;
21+
using clGetGLContextInfoKhrTest = api_tests;
2022

2123
namespace ULT {
2224

23-
TEST_F(clGetGLContextInfoKHR_, successWithDefaultPlatform) {
25+
TEST_F(clGetGLContextInfoKhrTest, successWithDefaultPlatform) {
26+
VariableBackup<UltHwConfig> backup(&ultHwConfig);
27+
ultHwConfig.useMockedPrepareDeviceEnvironmentsFunc = false;
28+
29+
auto defaultPlatform = std::make_unique<MockPlatform>();
30+
defaultPlatform->initializeWithNewDevices();
31+
platformsImpl[0] = std::move(defaultPlatform);
2432
auto expectedDevice = ::platform()->getClDevice(0);
2533
cl_device_id retDevice = 0;
2634
size_t retSize = 0;
@@ -44,6 +52,9 @@ using clGetGLContextInfoKHRNonDefaultPlatform = ::testing::Test;
4452
TEST_F(clGetGLContextInfoKHRNonDefaultPlatform, successWithNonDefaultPlatform) {
4553
platformsImpl.clear();
4654

55+
VariableBackup<UltHwConfig> backup(&ultHwConfig);
56+
ultHwConfig.useMockedPrepareDeviceEnvironmentsFunc = false;
57+
4758
cl_int retVal = CL_SUCCESS;
4859

4960
auto nonDefaultPlatform = std::make_unique<MockPlatform>();
@@ -68,7 +79,7 @@ TEST_F(clGetGLContextInfoKHRNonDefaultPlatform, successWithNonDefaultPlatform) {
6879
EXPECT_EQ(sizeof(cl_device_id), retSize);
6980
}
7081

71-
TEST_F(clGetGLContextInfoKHR_, invalidParam) {
82+
TEST_F(clGetGLContextInfoKhrTest, invalidParam) {
7283
cl_device_id retDevice = 0;
7384
size_t retSize = 0;
7485
const cl_context_properties properties[] = {CL_GL_CONTEXT_KHR, 1, CL_WGL_HDC_KHR, 2, 0};
@@ -79,7 +90,7 @@ TEST_F(clGetGLContextInfoKHR_, invalidParam) {
7990
EXPECT_EQ(0u, retSize);
8091
}
8192

82-
TEST_F(clGetGLContextInfoKHR_, givenContextFromNoIntelOpenGlDriverWhenCallClGetGLContextInfoKHRThenReturnClInvalidContext) {
93+
TEST_F(clGetGLContextInfoKhrTest, givenContextFromNoIntelOpenGlDriverWhenCallClGetGLContextInfoKHRThenReturnClInvalidContext) {
8394
cl_device_id retDevice = 0;
8495
size_t retSize = 0;
8596
const cl_context_properties properties[] = {CL_GL_CONTEXT_KHR, 1, CL_WGL_HDC_KHR, 2, 0};
@@ -92,7 +103,7 @@ TEST_F(clGetGLContextInfoKHR_, givenContextFromNoIntelOpenGlDriverWhenCallClGetG
92103
EXPECT_EQ(0u, retSize);
93104
}
94105

95-
TEST_F(clGetGLContextInfoKHR_, givenNullVersionFromIntelOpenGlDriverWhenCallClGetGLContextInfoKHRThenReturnClInvalidContext) {
106+
TEST_F(clGetGLContextInfoKhrTest, givenNullVersionFromIntelOpenGlDriverWhenCallClGetGLContextInfoKHRThenReturnClInvalidContext) {
96107
cl_device_id retDevice = 0;
97108
size_t retSize = 0;
98109
const cl_context_properties properties[] = {CL_GL_CONTEXT_KHR, 1, CL_WGL_HDC_KHR, 2, 0};
@@ -105,7 +116,7 @@ TEST_F(clGetGLContextInfoKHR_, givenNullVersionFromIntelOpenGlDriverWhenCallClGe
105116
EXPECT_EQ(0u, retSize);
106117
}
107118

108-
TEST_F(clGetGLContextInfoKHR_, GivenIncorrectPropertiesWhenCallclGetGLContextInfoKHRThenReturnClInvalidGlShareGroupRererencKhr) {
119+
TEST_F(clGetGLContextInfoKhrTest, GivenIncorrectPropertiesWhenCallclGetGLContextInfoKHRThenReturnClInvalidGlShareGroupRererencKhr) {
109120
cl_device_id retDevice = 0;
110121
size_t retSize = 0;
111122
retVal = clGetGLContextInfoKHR(nullptr, 0, sizeof(cl_device_id), &retDevice, &retSize);
@@ -120,4 +131,58 @@ TEST_F(clGetGLContextInfoKHR_, GivenIncorrectPropertiesWhenCallclGetGLContextInf
120131
EXPECT_EQ(CL_INVALID_GL_SHAREGROUP_REFERENCE_KHR, retVal);
121132
}
122133

134+
TEST_F(clGetGLContextInfoKHRNonDefaultPlatform, whenVerificationOfHdcHandleFailsThenInvalidGlReferenceErrorIsReturned) {
135+
platformsImpl.clear();
136+
137+
VariableBackup<UltHwConfig> backup(&ultHwConfig);
138+
ultHwConfig.useMockedPrepareDeviceEnvironmentsFunc = false;
139+
140+
cl_int retVal = CL_SUCCESS;
141+
142+
auto nonDefaultPlatform = std::make_unique<MockPlatform>();
143+
nonDefaultPlatform->initializeWithNewDevices();
144+
cl_platform_id nonDefaultPlatformCl = nonDefaultPlatform.get();
145+
146+
auto device = nonDefaultPlatform->getClDevice(0);
147+
148+
static_cast<WddmMock *>(device->getRootDeviceEnvironment().osInterface->get()->getWddm())->verifyHdcReturnValue = false;
149+
size_t retSize = 0;
150+
cl_device_id retDevice = 0;
151+
152+
const cl_context_properties properties[] = {CL_GL_CONTEXT_KHR, 1, CL_WGL_HDC_KHR, 2, CL_CONTEXT_PLATFORM, reinterpret_cast<cl_context_properties>(nonDefaultPlatformCl), 0};
153+
retVal = clGetGLContextInfoKHR(properties, CL_CURRENT_DEVICE_FOR_GL_CONTEXT_KHR, sizeof(cl_device_id), &retDevice, &retSize);
154+
155+
EXPECT_EQ(CL_INVALID_GL_SHAREGROUP_REFERENCE_KHR, retVal);
156+
}
157+
TEST_F(clGetGLContextInfoKHRNonDefaultPlatform, whenVerificationOfHdcHandleFailsForFirstDeviceButSucceedsForSecondOneThenReturnTheSecondDevice) {
158+
platformsImpl.clear();
159+
160+
DebugManagerStateRestore restorer;
161+
DebugManager.flags.CreateMultipleRootDevices.set(2);
162+
VariableBackup<UltHwConfig> backup(&ultHwConfig);
163+
ultHwConfig.useMockedPrepareDeviceEnvironmentsFunc = false;
164+
165+
cl_int retVal = CL_SUCCESS;
166+
167+
auto nonDefaultPlatform = std::make_unique<MockPlatform>();
168+
nonDefaultPlatform->initializeWithNewDevices();
169+
cl_platform_id nonDefaultPlatformCl = nonDefaultPlatform.get();
170+
171+
auto device0 = nonDefaultPlatform->getClDevice(0);
172+
auto device1 = nonDefaultPlatform->getClDevice(0);
173+
cl_device_id expectedDevice = device1;
174+
175+
static_cast<WddmMock *>(device0->getRootDeviceEnvironment().osInterface->get()->getWddm())->verifyHdcReturnValue = false;
176+
static_cast<WddmMock *>(device1->getRootDeviceEnvironment().osInterface->get()->getWddm())->verifyHdcReturnValue = true;
177+
size_t retSize = 0;
178+
cl_device_id retDevice = 0;
179+
180+
const cl_context_properties properties[] = {CL_GL_CONTEXT_KHR, 1, CL_WGL_HDC_KHR, 2, CL_CONTEXT_PLATFORM, reinterpret_cast<cl_context_properties>(nonDefaultPlatformCl), 0};
181+
retVal = clGetGLContextInfoKHR(properties, CL_CURRENT_DEVICE_FOR_GL_CONTEXT_KHR, sizeof(cl_device_id), &retDevice, &retSize);
182+
183+
EXPECT_EQ(CL_SUCCESS, retVal);
184+
EXPECT_EQ(expectedDevice, retDevice);
185+
EXPECT_EQ(sizeof(cl_device_id), retSize);
186+
}
187+
123188
} // namespace ULT

opencl/test/unit_test/os_interface/windows/wddm20_tests.cpp

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1449,3 +1449,63 @@ TEST(DiscoverDevices, whenDriverInfoHasIncompatibleDriverStoreThenHwDeviceIdIsNo
14491449
auto hwDeviceIds = OSInterface::discoverDevices(executionEnvironment);
14501450
EXPECT_TRUE(hwDeviceIds.empty());
14511451
}
1452+
1453+
TEST(VerifyHdcTest, givenHdcHandleFromCorrectAdapterLuidWhenVerifyHdcHandleIsCalledThenSuccessIsReturned) {
1454+
auto gdi = std::make_unique<MockGdi>();
1455+
auto osEnv = std::make_unique<OsEnvironmentWin>();
1456+
osEnv->gdi = std::move(gdi);
1457+
1458+
LUID adapterLuid = {0x1234, 0x5678};
1459+
1460+
VariableBackup<LUID> luidBackup(&MockGdi::adapterLuidToReturn, adapterLuid);
1461+
1462+
auto hwDeviceId = std::make_unique<HwDeviceId>(ADAPTER_HANDLE, adapterLuid, osEnv.get());
1463+
1464+
MockExecutionEnvironment executionEnvironment;
1465+
executionEnvironment.osEnvironment = std::move(osEnv);
1466+
RootDeviceEnvironment rootDeviceEnvironment(executionEnvironment);
1467+
1468+
WddmMock wddm(std::move(hwDeviceId), rootDeviceEnvironment);
1469+
1470+
size_t hdcHandle = 0x1;
1471+
1472+
auto status = wddm.Wddm::verifyHdcHandle(hdcHandle);
1473+
1474+
EXPECT_TRUE(status);
1475+
1476+
status = wddm.Wddm::verifyHdcHandle(0u);
1477+
1478+
EXPECT_FALSE(status);
1479+
}
1480+
1481+
TEST(VerifyHdcTest, givenHdcHandleFromInvalidAdapterLuidWhenVerifyHdcHandleIsCalledThenFailureIsReturned) {
1482+
auto gdi = std::make_unique<MockGdi>();
1483+
auto osEnv = std::make_unique<OsEnvironmentWin>();
1484+
osEnv->gdi = std::move(gdi);
1485+
1486+
LUID adapterLuid = {0x1234, 0x5678};
1487+
1488+
VariableBackup<LUID> luidBackup(&MockGdi::adapterLuidToReturn);
1489+
1490+
auto hwDeviceId = std::make_unique<HwDeviceId>(ADAPTER_HANDLE, adapterLuid, osEnv.get());
1491+
1492+
MockExecutionEnvironment executionEnvironment;
1493+
executionEnvironment.osEnvironment = std::move(osEnv);
1494+
RootDeviceEnvironment rootDeviceEnvironment(executionEnvironment);
1495+
1496+
WddmMock wddm(std::move(hwDeviceId), rootDeviceEnvironment);
1497+
1498+
size_t hdcHandle = 0x1;
1499+
1500+
MockGdi::adapterLuidToReturn = {0x1233, 0x5678};
1501+
1502+
auto status = wddm.Wddm::verifyHdcHandle(hdcHandle);
1503+
1504+
EXPECT_FALSE(status);
1505+
1506+
MockGdi::adapterLuidToReturn = {0x1234, 0x5679};
1507+
1508+
status = wddm.Wddm::verifyHdcHandle(hdcHandle);
1509+
1510+
EXPECT_FALSE(status);
1511+
}

shared/source/os_interface/windows/gdi_interface.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ inline const std::string getGdiName() {
2222
Gdi::Gdi() : gdiDll(getGdiName()),
2323
initialized(false) {
2424
if (gdiDll.isLoaded()) {
25-
initialized = getAllProcAddresses();
25+
initialized = Gdi::getAllProcAddresses();
2626
}
2727
}
2828

shared/source/os_interface/windows/wddm/wddm.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1059,4 +1059,15 @@ void Wddm::createPagingFenceLogger() {
10591059
}
10601060
}
10611061

1062+
bool Wddm::verifyHdcHandle(size_t hdcHandle) const {
1063+
D3DKMT_OPENADAPTERFROMHDC openAdapterFromHdcStruct{};
1064+
openAdapterFromHdcStruct.hDc = reinterpret_cast<HDC>(hdcHandle);
1065+
auto status = getGdi()->openAdapterFromHdc(&openAdapterFromHdcStruct);
1066+
if (STATUS_SUCCESS != status) {
1067+
DEBUG_BREAK_IF(true);
1068+
return false;
1069+
}
1070+
return openAdapterFromHdcStruct.AdapterLuid.HighPart == hwDeviceId->getAdapterLuid().HighPart && openAdapterFromHdcStruct.AdapterLuid.LowPart == hwDeviceId->getAdapterLuid().LowPart;
1071+
}
1072+
10621073
} // namespace NEO

shared/source/os_interface/windows/wddm/wddm.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,8 @@ class Wddm {
9292

9393
bool configureDeviceAddressSpace();
9494

95+
MOCKABLE_VIRTUAL bool verifyHdcHandle(size_t hdcHandle) const;
96+
9597
GT_SYSTEM_INFO *getGtSysInfo() const {
9698
DEBUG_BREAK_IF(!gtSystemInfo);
9799
return gtSystemInfo.get();

shared/test/unit_test/os_interface/windows/mock_gdi_interface.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,5 @@
99

1010
namespace NEO {
1111
UINT64 MockGdi::pagingFenceReturnValue = 0x3ull;
12+
LUID MockGdi::adapterLuidToReturn{};
1213
} // namespace NEO

0 commit comments

Comments
 (0)