1313
1414#include " ../device.hpp"
1515
16+ typedef struct _zex_intel_queue_copy_operations_offload_hint_exp_desc_t {
17+ ze_structure_type_t stype;
18+ const void *pNext;
19+ ze_bool_t copyOffloadEnabled;
20+ } zex_intel_queue_copy_operations_offload_hint_exp_desc_t ;
21+
22+ #define ZEX_INTEL_STRUCTURE_TYPE_QUEUE_COPY_OPERATIONS_OFFLOAD_HINT_EXP_PROPERTIES \
23+ (ze_structure_type_t )0x0003001B
24+
25+ template <>
26+ ze_structure_type_t
27+ getZeStructureType<zex_intel_queue_copy_operations_offload_hint_exp_desc_t >() {
28+ return ZEX_INTEL_STRUCTURE_TYPE_QUEUE_COPY_OPERATIONS_OFFLOAD_HINT_EXP_PROPERTIES;
29+ }
30+
1631bool v2::immediate_command_list_descriptor_t ::operator ==(
1732 const immediate_command_list_descriptor_t &rhs) const {
1833 return ZeDevice == rhs.ZeDevice && IsInOrder == rhs.IsInOrder &&
@@ -45,6 +60,10 @@ command_list_cache_t::command_list_cache_t(ze_context_handle_t ZeContext)
4560
4661raii::ze_command_list_handle_t
4762command_list_cache_t::createCommandList (const command_list_descriptor_t &desc) {
63+ ZeStruct<zex_intel_queue_copy_operations_offload_hint_exp_desc_t > offloadDesc;
64+ offloadDesc.copyOffloadEnabled =
65+ std::visit ([](auto &&arg) { return arg.CopyOffloadEnabled ; }, desc);
66+
4867 if (auto ImmCmdDesc =
4968 std::get_if<immediate_command_list_descriptor_t >(&desc)) {
5069 ze_command_list_handle_t ZeCommandList;
@@ -58,6 +77,7 @@ command_list_cache_t::createCommandList(const command_list_descriptor_t &desc) {
5877 QueueDesc.flags |= ZE_COMMAND_QUEUE_FLAG_EXPLICIT_ONLY;
5978 QueueDesc.index = ImmCmdDesc->Index .value ();
6079 }
80+ QueueDesc.pNext = &offloadDesc;
6181 ZE2UR_CALL_THROWS (
6282 zeCommandListCreateImmediate,
6383 (ZeContext, ImmCmdDesc->ZeDevice , &QueueDesc, &ZeCommandList));
@@ -68,6 +88,7 @@ command_list_cache_t::createCommandList(const command_list_descriptor_t &desc) {
6888 CmdListDesc.flags =
6989 RegCmdDesc.IsInOrder ? ZE_COMMAND_LIST_FLAG_IN_ORDER : 0 ;
7090 CmdListDesc.commandQueueGroupOrdinal = RegCmdDesc.Ordinal ;
91+ CmdListDesc.pNext = &offloadDesc;
7192
7293 ze_command_list_handle_t ZeCommandList;
7394 ZE2UR_CALL_THROWS (zeCommandListCreate, (ZeContext, RegCmdDesc.ZeDevice ,
@@ -78,13 +99,14 @@ command_list_cache_t::createCommandList(const command_list_descriptor_t &desc) {
7899
79100raii::command_list_unique_handle command_list_cache_t::getImmediateCommandList (
80101 ze_device_handle_t ZeDevice, bool IsInOrder, uint32_t Ordinal,
81- ze_command_queue_mode_t Mode, ze_command_queue_priority_t Priority ,
82- std::optional<uint32_t > Index) {
102+ bool CopyOffloadEnable, ze_command_queue_mode_t Mode ,
103+ ze_command_queue_priority_t Priority, std::optional<uint32_t > Index) {
83104 TRACK_SCOPE_LATENCY (" command_list_cache_t::getImmediateCommandList" );
84105
85106 immediate_command_list_descriptor_t Desc;
86107 Desc.ZeDevice = ZeDevice;
87108 Desc.Ordinal = Ordinal;
109+ Desc.CopyOffloadEnabled = CopyOffloadEnable;
88110 Desc.IsInOrder = IsInOrder;
89111 Desc.Mode = Mode;
90112 Desc.Priority = Priority;
@@ -99,13 +121,15 @@ raii::command_list_unique_handle command_list_cache_t::getImmediateCommandList(
99121
100122raii::command_list_unique_handle
101123command_list_cache_t::getRegularCommandList (ze_device_handle_t ZeDevice,
102- bool IsInOrder, uint32_t Ordinal) {
124+ bool IsInOrder, uint32_t Ordinal,
125+ bool CopyOffloadEnable) {
103126 TRACK_SCOPE_LATENCY (" command_list_cache_t::getRegularCommandList" );
104127
105128 regular_command_list_descriptor_t Desc;
106129 Desc.ZeDevice = ZeDevice;
107130 Desc.IsInOrder = IsInOrder;
108131 Desc.Ordinal = Ordinal;
132+ Desc.CopyOffloadEnabled = CopyOffloadEnable;
109133
110134 auto [CommandList, _] = getCommandList (Desc).release ();
111135
0 commit comments