@@ -58,16 +58,26 @@ struct DevDescT {
58
58
59
59
const char *devDriverVer = nullptr ;
60
60
int devDriverVerSize = 0 ;
61
+
62
+ const char *pltName = nullptr ;
63
+ int pltNameSize = 0 ;
64
+
65
+ const char *pltVer = nullptr ;
66
+ int pltVerSize = 0 ;
61
67
};
62
68
63
69
static std::vector<DevDescT> getWhiteListDesc () {
64
70
const char *str = SYCLConfig<SYCL_DEVICE_WHITE_LIST>::get ();
65
71
if (!str)
66
72
return {};
67
73
74
+
75
+
68
76
std::vector<DevDescT> decDescs;
69
77
const char devNameStr[] = " DeviceName" ;
70
78
const char driverVerStr[] = " DriverVersion" ;
79
+ const char pltNameStr[] = " PlatformName" ;
80
+ const char platformVerStr[] = " PlatformVersion" ;
71
81
decDescs.emplace_back ();
72
82
while (' \0 ' != *str) {
73
83
const char **valuePtr = nullptr ;
@@ -78,6 +88,14 @@ static std::vector<DevDescT> getWhiteListDesc() {
78
88
valuePtr = &decDescs.back ().devName ;
79
89
size = &decDescs.back ().devNameSize ;
80
90
str += sizeof (devNameStr) - 1 ;
91
+ } else if (0 == strncmp (pltNameStr, str, sizeof (pltNameStr) - 1 )) {
92
+ valuePtr = &decDescs.back ().pltName ;
93
+ size = &decDescs.back ().pltNameSize ;
94
+ str += sizeof (pltNameStr) - 1 ;
95
+ } else if (0 == strncmp (platformVerStr, str, sizeof (platformVerStr) - 1 )) {
96
+ valuePtr = &decDescs.back ().pltVer ;
97
+ size = &decDescs.back ().pltVerSize ;
98
+ str += sizeof (platformVerStr) - 1 ;
81
99
} else if (0 == strncmp (driverVerStr, str, sizeof (driverVerStr) - 1 )) {
82
100
valuePtr = &decDescs.back ().devDriverVer ;
83
101
size = &decDescs.back ().devDriverVerSize ;
@@ -125,11 +143,19 @@ static std::vector<DevDescT> getWhiteListDesc() {
125
143
return decDescs;
126
144
}
127
145
128
- static void filterWhiteList (vector_class<RT::PiDevice> &pi_devices) {
146
+ static void filterWhiteList (vector_class<RT::PiDevice> &pi_devices,
147
+ RT::PiPlatform pi_platform) {
129
148
const std::vector<DevDescT> whiteList (getWhiteListDesc ());
130
149
if (whiteList.empty ())
131
150
return ;
132
151
152
+ const string_class pltName =
153
+ sycl::detail::get_platform_info<string_class, info::platform::name>::get (
154
+ pi_platform);
155
+
156
+ const string_class pltVer = sycl::detail::get_platform_info<
157
+ string_class, info::platform::version>::get (pi_platform);
158
+
133
159
int insertIDx = 0 ;
134
160
for (RT::PiDevice dev : pi_devices) {
135
161
const string_class devName =
@@ -140,8 +166,17 @@ static void filterWhiteList(vector_class<RT::PiDevice> &pi_devices) {
140
166
info::device::driver_version>::get (dev);
141
167
142
168
for (const DevDescT &desc : whiteList) {
143
- // At least device name is required field to consider the filter so far
144
- if (nullptr == desc.devName ||
169
+ if (nullptr != desc.pltName &&
170
+ !std::regex_match (
171
+ pltName, std::regex (std::string (desc.pltName , desc.pltNameSize ))))
172
+ continue ;
173
+
174
+ if (nullptr != desc.pltVer &&
175
+ !std::regex_match (
176
+ pltVer, std::regex (std::string (desc.pltVer , desc.pltVerSize ))))
177
+ continue ;
178
+
179
+ if (nullptr != desc.devName &&
145
180
!std::regex_match (
146
181
devName, std::regex (std::string (desc.devName , desc.devNameSize ))))
147
182
continue ;
@@ -179,7 +214,7 @@ platform_impl_pi::get_devices(info::device_type deviceType) const {
179
214
180
215
// Filter out devices that are not present in the white list
181
216
if (SYCLConfig<SYCL_DEVICE_WHITE_LIST>::get ())
182
- filterWhiteList (pi_devices);
217
+ filterWhiteList (pi_devices, m_platform );
183
218
184
219
std::for_each (pi_devices.begin (), pi_devices.end (),
185
220
[&res](const RT::PiDevice &a_pi_device) {
0 commit comments