@@ -135,15 +135,16 @@ static int init_message_res(struct dxgvmbusmsgres *msg,
135135 if (use_ext_header ) {
136136 msg -> msg = (char * )& msg -> hdr [1 ];
137137 msg -> hdr -> command_offset = sizeof (msg -> hdr [0 ]);
138- msg -> hdr -> vgpu_luid = adapter -> host_vgpu_luid ;
138+ if (adapter )
139+ msg -> hdr -> vgpu_luid = adapter -> host_vgpu_luid ;
139140 } else {
140141 msg -> msg = (char * )msg -> hdr ;
141142 }
142143 msg -> res = (char * )msg -> hdr + msg -> size ;
143- if (dxgglobal -> async_msg_enabled )
144- msg -> channel = & dxgglobal -> channel ;
145- else
144+ if (adapter && !dxgglobal -> async_msg_enabled )
146145 msg -> channel = & adapter -> channel ;
146+ else
147+ msg -> channel = & dxgglobal -> channel ;
147148 return 0 ;
148149}
149150
@@ -2049,6 +2050,55 @@ int dxgvmb_send_invalidate_cache(struct dxgprocess *process,
20492050 return ret ;
20502051}
20512052
2053+ int dxgvmb_send_is_feature_enabled (struct dxgadapter * adapter ,
2054+ struct d3dkmt_isfeatureenabled * args )
2055+ {
2056+ int ret ;
2057+ struct dxgkvmb_command_isfeatureenabled_return * result ;
2058+ struct dxgvmbusmsgres msg = {.hdr = NULL };
2059+ int res_size = sizeof (* result );
2060+
2061+ if (adapter ) {
2062+ struct dxgkvmb_command_isfeatureenabled * command ;
2063+
2064+ ret = init_message_res (& msg , adapter , sizeof (* command ),
2065+ res_size );
2066+ if (ret )
2067+ goto cleanup ;
2068+ command = (void * )msg .msg ;
2069+ command -> feature_id = args -> feature_id ;
2070+ result = msg .res ;
2071+ command_vgpu_to_host_init1 (& command -> hdr ,
2072+ DXGK_VMBCOMMAND_ISFEATUREENABLED );
2073+ } else {
2074+ struct dxgkvmb_command_isfeatureenabled_gbl * command ;
2075+
2076+ ret = init_message_res (& msg , adapter , sizeof (* command ),
2077+ res_size );
2078+ if (ret )
2079+ goto cleanup ;
2080+ command = (void * )msg .msg ;
2081+ command -> feature_id = args -> feature_id ;
2082+ result = msg .res ;
2083+ command_vm_to_host_init1 (& command -> hdr ,
2084+ DXGK_VMBCOMMAND_ISFEATUREENABLED_GLOBAL );
2085+ }
2086+ ret = dxgvmb_send_sync_msg (msg .channel , msg .hdr , msg .size ,
2087+ result , res_size );
2088+ if (ret == 0 ) {
2089+ ret = ntstatus2int (result -> status );
2090+ if (ret == 0 )
2091+ args -> result = result -> result ;
2092+ goto cleanup ;
2093+ }
2094+
2095+ cleanup :
2096+ free_message ((struct dxgvmbusmsg * )& msg );
2097+ if (ret )
2098+ DXG_TRACE ("err: %d" , ret );
2099+ return ret ;
2100+ }
2101+
20522102int dxgvmb_send_query_alloc_residency (struct dxgprocess * process ,
20532103 struct dxgadapter * adapter ,
20542104 struct d3dkmt_queryallocationresidency
0 commit comments