@@ -161,8 +161,28 @@ namespace loader
161161 {
162162 for( uint32_t i = 0; i < library_driver_handle_count; ++i ) {
163163 uint32_t driver_index = total_driver_handle_count + i;
164- ${ obj[' params' ][1 ][' name' ]} [ driver_index ] = reinterpret_cast<${ n} _driver_handle_t>(
165- context->${ n} _driver_factory.getInstance( ${ obj[' params' ][1 ][' name' ]} [ driver_index ], &drv.dditable ) );
164+ if (drv.driverDDIHandleSupportQueried == false) {
165+ drv.properties = {};
166+ drv.properties.stype = ZE_STRUCTURE_TYPE_DRIVER_DDI_HANDLES_EXT_PROPERTIES;
167+ drv.properties.pNext = nullptr;
168+ ze_driver_properties_t driverProperties = {};
169+ driverProperties.stype = ZE_STRUCTURE_TYPE_DRIVER_PROPERTIES;
170+ driverProperties.pNext = nullptr;
171+ driverProperties.pNext = &drv.properties;
172+ ze_result_t res = drv.dditable.ze.Driver.pfnGetProperties(${ obj[' params' ][1 ][' name' ]} [ driver_index ], &driverProperties);
173+ if (res != ZE_RESULT_SUCCESS) {
174+ if (loader::context->debugTraceEnabled) {
175+ std::string message = drv.name + " failed zeDriverGetProperties query, returned ";
176+ loader::context->debug_trace_message(message, loader::to_string(res));
177+ }
178+ return res;
179+ }
180+ drv.driverDDIHandleSupportQueried = true;
181+ }
182+ if (!(drv.properties.flags & ZE_DRIVER_DDI_HANDLE_EXT_FLAG_DDI_HANDLE_EXT_SUPPORTED)) {
183+ ${ obj[' params' ][1 ][' name' ]} [ driver_index ] = reinterpret_cast<${ n} _driver_handle_t>(
184+ context->${ n} _driver_factory.getInstance( ${ obj[' params' ][1 ][' name' ]} [ driver_index ], &drv.dditable ) );
185+ }
166186 }
167187 }
168188 catch( std::bad_alloc& )
@@ -184,167 +204,62 @@ namespace loader
184204 % else :
185205 % for i, item in enumerate (th.get_loader_prologue(n, tags, obj, meta)):
186206 % if 0 == i:
187- // extract driver 's function pointer table
207+ // extract handle 's function pointer table
188208 % if ' range' in item:
189- auto dditable = reinterpret_cast<${ item[' obj' ]} *>( ${ item[' name' ]} [ 0 ] )->dditable;
190- % else :
191- auto dditable = reinterpret_cast<${ item[' obj' ]} *>( ${ item[' name' ]} )->dditable;
192- %endif
193- auto ${ th.make_pfn_name(n, tags, obj)} = dditable->${ n} .${ th.get_table_name(n, tags, obj)} .${ th.make_pfn_name(n, tags, obj)} ;
194- if( nullptr == ${ th.make_pfn_name(n, tags, obj)} )
195- return ${ X} _RESULT_ERROR_UNINITIALIZED;
196-
209+ % if namespace == " ze" :
210+ auto dditable = reinterpret_cast<ze _handle_t* >( ${ item[' name' ]} [ 0 ] )->pCore;
211+ % elif namespace == " zet" :
212+ auto dditable = reinterpret_cast<ze _handle_t* >( ${ item[' name' ]} [ 0 ] )->pTools;
213+ % elif namespace == " zes" :
214+ auto dditable = reinterpret_cast<ze _handle_t* >( ${ item[' name' ]} [ 0 ] )->pSysman;
197215 %endif
198- % if ' range' in item:
199- <%
200- add_local = True %> // convert loader handles to driver handles
201- auto ${ item[' name' ]} Local = new ${ item[' type' ]} [${ item[' range' ][1 ]} ];
202- <%
203- arrays_to_delete.append(item[' name' ]+ ' Local' )
204- %> for( size_t i = ${ item[' range' ][0 ]} ; ( nullptr != ${ item[' name' ]} ) && ( i < ${ item[' range' ][1 ]} ); ++i )
205- ${ item[' name' ]} Local[ i ] = reinterpret_cast<${ item[' obj' ]} *>( ${ item[' name' ]} [ i ] )->handle;
206- % else :
207- % if item[' optional' ]:
208- // convert loader handle to driver handle
209- ${ item[' name' ]} = ( ${ item[' name' ]} ) ? reinterpret_cast<${ item[' obj' ]} *>( ${ item[' name' ]} )->handle : nullptr;
210216 % else :
211- % if re.match(r " \w + ImageDestroy$ " , th.make_func_name(n, tags, obj)):
212- // remove the handle from the kernel arugment map
213- {
214- std::lock_guard<std::mutex > lock(context->image_handle_map_lock);
215- context->image_handle_map.erase(reinterpret_cast<ze _image_object_t* >(hImage));
216- }
217- %endif
218- % if re.match(r " \w + SamplerDestroy$ " , th.make_func_name(n, tags, obj)):
219- // remove the handle from the kernel arugment map
220- {
221- std::lock_guard<std::mutex > lock(context->sampler_handle_map_lock);
222- context->sampler_handle_map.erase(reinterpret_cast<ze _sampler_object_t* >(hSampler));
223- }
224- %endif
225- // convert loader handle to driver handle
226- ${ item[' name' ]} = reinterpret_cast<${ item[' obj' ]} *>( ${ item[' name' ]} )->handle;
217+ % if namespace == " ze" :
218+ auto dditable = reinterpret_cast<ze _handle_t* >( ${ item[' name' ]} )->pCore;
219+ % elif namespace == " zet" :
220+ auto dditable = reinterpret_cast<ze _handle_t* >( ${ item[' name' ]} )->pTools;
221+ % elif namespace == " zes" :
222+ auto dditable = reinterpret_cast<ze _handle_t* >( ${ item[' name' ]} )->pSysman;
227223 %endif
228224 %endif
229-
230- %endfor
231- % if re.match(r " \w + KernelSetArgumentValue$ " , th.make_func_name(n, tags, obj)):
232- // convert pArgValue to correct handle if applicable
233- void *internalArgValue = const_cast<void * >(pArgValue);
234- if (pArgValue) {
235- // check if the arg value is a translated handle
236- ze_image_object_t **imageHandle = static_cast<ze _image_object_t ** >(internalArgValue);
237- ze_sampler_object_t **samplerHandle = static_cast<ze _sampler_object_t ** >(internalArgValue);
238- {
239- std::lock_guard<std::mutex > image_lock(context->image_handle_map_lock);
240- std::lock_guard<std::mutex > sampler_lock(context->sampler_handle_map_lock);
241- if( context->image_handle_map.find(*imageHandle) != context->image_handle_map.end() ) {
242- internalArgValue = &context->image_handle_map[*imageHandle];
243- } else if( context->sampler_handle_map.find(*samplerHandle) != context->sampler_handle_map.end() ) {
244- internalArgValue = &context->sampler_handle_map[*samplerHandle];
245- }
246- }
225+ if (dditable->isValidFlag == 0)
226+ return ${ X} _RESULT_ERROR_UNINITIALIZED;
227+ // Check that api version in the driver is supported by this version of the API
228+ if (dditable->version < ${ th.get_version(obj)} ) {
229+ return ${ X} _RESULT_ERROR_UNSUPPORTED_VERSION;
247230 }
231+ auto ${ th.make_pfn_name(n, tags, obj)} = dditable->${ th.get_table_name(n, tags, obj)} ->${ th.make_pfn_name(n, tags, obj)} ;
232+ if( nullptr == ${ th.make_pfn_name(n, tags, obj)} )
233+ return ${ X} _RESULT_ERROR_UNINITIALIZED;
248234 %endif
249- ## Workaround due to incorrect defintion of phWaitEvents in the ze headers which missed the range values.
250- ## To be removed once the headers have been updated in a new spec release.
251- % if re.match(r " \w + CommandListAppendMetricQueryEnd$ " , th.make_func_name(n, tags, obj)):
252- // convert loader handles to driver handles
253- auto phWaitEventsLocal = new ze_event_handle_t [numWaitEvents];
254- for( size_t i = 0; ( nullptr != phWaitEvents ) && ( i < numWaitEvents ); ++i )
255- phWaitEventsLocal[ i ] = reinterpret_cast<ze _event_object_t* >( phWaitEvents[ i ] )->handle;
256-
257- // forward to device-driver
258- result = pfnAppendMetricQueryEnd( hCommandList, hMetricQuery, hSignalEvent, numWaitEvents, phWaitEventsLocal );
259- delete []phWaitEventsLocal;
260- % else :
261- // forward to device-driver
262- % if add_local:
263- result = ${ th.make_pfn_name(n, tags, obj)} ( ${ " , " .join(th.make_param_lines(n, tags, obj, format = [" name" , " local" ]))} );
264- % for array_name in arrays_to_delete:
265- delete []${ array_name} ;
266235 %endfor
267- % else :
268- % if re.match(r " \w + KernelSetArgumentValue$ " , th.make_func_name(n, tags, obj)):
269- result = pfnSetArgumentValue( hKernel, argIndex, argSize, const_cast<const void * >(internalArgValue) );
270- % else :
236+ // forward to device-driver
271237 result = ${ th.make_pfn_name(n, tags, obj)} ( ${ " , " .join(th.make_param_lines(n, tags, obj, format = [" name" ]))} );
272- %endif
273- %endif
274- %endif
275- <%
276- del arrays_to_delete
277- del add_local%>
278- % for i, item in enumerate (th.get_loader_epilogue(n, tags, obj, meta)):
279- % if 0 == i:
280- % if not re.match(r " \w + ModuleDynamicLink$ " , th.make_func_name(n, tags, obj)) and not re.match(r " \w + ModuleCreate$ " , th.make_func_name(n, tags, obj)):
281- if( ${ X} _RESULT_SUCCESS != result )
282- return result;
283-
284- %endif
285- %endif
286- % if item[' release' ]:
287- // release loader handle
288- context->${ item[' factory' ]} .release( ${ item[' name' ]} );
289- % else :
290- try
291- {
292- % if ' range' in item:
293- // convert driver handles to loader handles
294- for( size_t i = ${ item[' range' ][0 ]} ; ( nullptr != ${ item[' name' ]} ) && ( i < ${ item[' range' ][1 ]} ); ++i )
295- ${ item[' name' ]} [ i ] = reinterpret_cast<${ item[' type' ]} >(
296- context->${ item[' factory' ]} .getInstance( ${ item[' name' ]} [ i ], dditable ) );
297- % else :
298- // convert driver handle to loader handle
299- % if item[' optional' ]:
300- if( nullptr != ${ item[' name' ]} )
301- *${ item[' name' ]} = reinterpret_cast<${ item[' type' ]} >(
302- context->${ item[' factory' ]} .getInstance( *${ item[' name' ]} , dditable ) );
303- % else :
304- % if re.match(r " \w + ImageCreate$ " , th.make_func_name(n, tags, obj)) or re.match(r " \w + SamplerCreate$ " , th.make_func_name(n, tags, obj)) or re.match(r " \w + ImageViewCreateExp$ " , th.make_func_name(n, tags, obj)):
305- ${ item[' type' ]} internalHandlePtr = *${ item[' name' ]} ;
306- %endif
307- *${ item[' name' ]} = reinterpret_cast<${ item[' type' ]} >(
308- context->${ item[' factory' ]} .getInstance( *${ item[' name' ]} , dditable ) );
309- % if re.match(r " \w + ImageCreate$ " , th.make_func_name(n, tags, obj)) or re.match(r " \w + ImageViewCreateExp$ " , th.make_func_name(n, tags, obj)):
310- // convert loader handle to driver handle and store in map
311- {
312- std::lock_guard<std::mutex > lock(context->image_handle_map_lock);
313- context->image_handle_map.insert({context->ze_image_factory.getInstance( internalHandlePtr, dditable ), internalHandlePtr});
314- }
315- %endif
316- % if re.match(r " \w + SamplerCreate$ " , th.make_func_name(n, tags, obj)):
317- // convert loader handle to driver handle and store in map
318- {
319- std::lock_guard<std::mutex > lock(context->sampler_handle_map_lock);
320- context->sampler_handle_map.insert({context->ze_sampler_factory.getInstance( internalHandlePtr, dditable ), internalHandlePtr});
321- }
322- %endif
323- %endif
324- %endif
325- }
326- catch( std::bad_alloc& )
327- {
328- result = ${ X} _RESULT_ERROR_OUT_OF_HOST_MEMORY;
329- }
330- %endif
331-
332- % if 0 == i:
333- % if re.match(r " \w + ModuleDynamicLink$ " , th.make_func_name(n, tags, obj)) or re.match(r " \w + ModuleCreate$ " , th.make_func_name(n, tags, obj)):
334- if( ${ X} _RESULT_SUCCESS != result )
335- return result;
336-
337- %endif
338- %endif
339- %endfor
340- %endif
341238 return result;
342239 }
343240 % if ' condition' in obj:
344241 #endif // ${ th.subt(n, tags, obj[' condition' ])}
345242 %endif
346243
244+ %endif
245+ % if re.match(r " Init" , obj[' name' ]) or re.match(r " \w + InitDrivers$ " , th.make_func_name(n, tags, obj)) or re.match(r " \w + DriverGet$ " , th.make_func_name(n, tags, obj)):
246+ return result;
247+ }
248+ %endif
347249 %endfor
250+
251+ ///////////////////////////////////////////////////////////////////////////////
252+ /// @brief function for removing the ddi driver tables for ${ n}
253+ __${ x} dlllocal void ${ X} _APICALL
254+ ${ n} DestroyDDiDriverTables(${ n} _dditable_driver_t* pDdiTable)
255+ {
256+ // Delete ddi tables
257+ % for tbl in th.get_pfntables(specs, meta, n, tags):
258+ delete pDdiTable->${ tbl[' name' ]} ;
259+ %endfor
260+ delete pDdiTable;
261+ }
262+
348263} // namespace loader
349264
350265# if defined(__cplusplus)
@@ -442,6 +357,13 @@ ${tbl['export']['name']}(
442357 %endif
443358 {
444359 // return pointers to loader's DDIs
360+ % if namespace == " ze" :
361+ loader::loaderDispatch->pCore->${ tbl[' name' ]} = new ${ tbl[' type' ]} ;
362+ % elif namespace == " zet" :
363+ loader::loaderDispatch->pTools->${ tbl[' name' ]} = new ${ tbl[' type' ]} ;
364+ % elif namespace == " zes" :
365+ loader::loaderDispatch->pSysman->${ tbl[' name' ]} = new ${ tbl[' type' ]} ;
366+ %endif
445367 % for obj in tbl[' functions' ]:
446368 % if ' condition' in obj:
447369 #if ${ th.subt(n, tags, obj[' condition' ])}
@@ -453,6 +375,7 @@ ${tbl['export']['name']}(
453375 #endif
454376 %endif
455377 %endfor
378+ ${ tbl[' export' ][' name' ]} Legacy();
456379 }
457380 else
458381 {
@@ -500,4 +423,4 @@ ${tbl['export']['name']}(
500423
501424# if defined(__cplusplus)
502425};
503- # endif
426+ # endif
0 commit comments