diff --git a/include/CL/opencl.hpp b/include/CL/opencl.hpp index 6e21e17e..88351de8 100644 --- a/include/CL/opencl.hpp +++ b/include/CL/opencl.hpp @@ -1787,7 +1787,7 @@ CL_HPP_DECLARE_PARAM_TRAITS_(cl_command_buffer_info_khr, CL_COMMAND_BUFFER_PROPE CL_HPP_DECLARE_PARAM_TRAITS_(cl_mutable_command_info_khr, CL_MUTABLE_COMMAND_COMMAND_QUEUE_KHR, CommandQueue) CL_HPP_DECLARE_PARAM_TRAITS_(cl_mutable_command_info_khr, CL_MUTABLE_COMMAND_COMMAND_BUFFER_KHR, CommandBufferKhr) CL_HPP_DECLARE_PARAM_TRAITS_(cl_mutable_command_info_khr, CL_MUTABLE_COMMAND_COMMAND_TYPE_KHR, cl_command_type) -CL_HPP_DECLARE_PARAM_TRAITS_(cl_mutable_command_info_khr, CL_MUTABLE_DISPATCH_PROPERTIES_ARRAY_KHR, cl::vector) +CL_HPP_DECLARE_PARAM_TRAITS_(cl_mutable_command_info_khr, CL_MUTABLE_COMMAND_PROPERTIES_ARRAY_KHR, cl::vector) CL_HPP_DECLARE_PARAM_TRAITS_(cl_mutable_command_info_khr, CL_MUTABLE_DISPATCH_KERNEL_KHR, cl_kernel) CL_HPP_DECLARE_PARAM_TRAITS_(cl_mutable_command_info_khr, CL_MUTABLE_DISPATCH_DIMENSIONS_KHR, cl_uint) CL_HPP_DECLARE_PARAM_TRAITS_(cl_mutable_command_info_khr, CL_MUTABLE_DISPATCH_GLOBAL_WORK_OFFSET_KHR, cl::vector) diff --git a/layers/10_cmdbufemu/emulate.cpp b/layers/10_cmdbufemu/emulate.cpp index e6c83759..532ecae6 100644 --- a/layers/10_cmdbufemu/emulate.cpp +++ b/layers/10_cmdbufemu/emulate.cpp @@ -20,9 +20,9 @@ #include "emulate.h" static constexpr cl_version version_cl_khr_command_buffer = - CL_MAKE_VERSION(0, 9, 4); + CL_MAKE_VERSION(0, 9, 5); static constexpr cl_version version_cl_khr_command_buffer_mutable_dispatch = - CL_MAKE_VERSION(0, 9, 1); + CL_MAKE_VERSION(0, 9, 3); SLayerContext& getLayerContext(void) { @@ -106,11 +106,9 @@ typedef struct _cl_mutable_command_khr ptr ); } break; - // These are only valid for clCommandNDRangeKernel, but the spec says - // they should return size = 0 rather than an error. - case CL_MUTABLE_DISPATCH_PROPERTIES_ARRAY_KHR: + case CL_MUTABLE_COMMAND_PROPERTIES_ARRAY_KHR: { - auto ptr = (cl_ndrange_kernel_command_properties_khr*)param_value; + auto ptr = (cl_command_properties_khr*)param_value; return writeVectorToMemory( param_value_size, {}, // No properties are currently supported. @@ -811,7 +809,7 @@ struct SVMMemFill : Command struct NDRangeKernel : Command { static std::unique_ptr create( - const cl_ndrange_kernel_command_properties_khr* properties, + const cl_command_properties_khr* properties, cl_command_buffer_khr cmdbuf, cl_command_queue queue, cl_kernel kernel, @@ -836,9 +834,10 @@ struct NDRangeKernel : Command { switch( param_name ) { - case CL_MUTABLE_DISPATCH_PROPERTIES_ARRAY_KHR: + // TODO: eventually this should move to the base Command class. + case CL_MUTABLE_COMMAND_PROPERTIES_ARRAY_KHR: { - auto ptr = (cl_ndrange_kernel_command_properties_khr*)param_value; + auto ptr = (cl_command_properties_khr*)param_value; return writeVectorToMemory( param_value_size, properties, @@ -1101,7 +1100,7 @@ struct NDRangeKernel : Command cl_mutable_dispatch_asserts_khr mutableAsserts = 0; size_t numWorkGroups = 0; #endif // defined(cl_khr_command_buffer_mutable_dispatch) - std::vector properties; + std::vector properties; std::vector global_work_offset; std::vector global_work_size; std::vector local_work_size; @@ -1510,7 +1509,10 @@ typedef struct _cl_command_buffer_khr } #if defined(cl_khr_command_buffer_mutable_dispatch) - cl_int mutate( const cl_mutable_base_config_khr* mutable_config ) + cl_int mutate( + cl_uint numUpdates, + const cl_command_buffer_update_type_khr* updateTypes, + const void** updateConfigs ) { if( State != CL_COMMAND_BUFFER_STATE_EXECUTABLE_KHR ) { @@ -1521,48 +1523,32 @@ typedef struct _cl_command_buffer_khr return CL_INVALID_OPERATION; } - if( mutable_config == nullptr ) - { - return CL_INVALID_VALUE; - } - if( mutable_config->type != CL_STRUCTURE_TYPE_MUTABLE_BASE_CONFIG_KHR ) - { - return CL_INVALID_VALUE; - } - if( mutable_config->next == nullptr && mutable_config->mutable_dispatch_list == nullptr ) - { - return CL_INVALID_VALUE; - } - if( ( mutable_config->num_mutable_dispatch > 0 && mutable_config->mutable_dispatch_list == nullptr ) || - ( mutable_config->num_mutable_dispatch == 0 && mutable_config->mutable_dispatch_list != nullptr ) ) + if( ( numUpdates > 0 && updateTypes == nullptr ) || + ( numUpdates == 0 && updateTypes != nullptr ) ) { return CL_INVALID_VALUE; } - // No "next" extensions are currently supported. - if( mutable_config->next != nullptr ) + if( ( numUpdates > 0 && updateConfigs == nullptr ) || + ( numUpdates == 0 && updateConfigs != nullptr ) ) { return CL_INVALID_VALUE; } - for( cl_uint i = 0; i < mutable_config->num_mutable_dispatch; i++ ) + for( cl_uint i = 0; i < numUpdates; i++ ) { - const cl_mutable_dispatch_config_khr* dispatchConfig = - &mutable_config->mutable_dispatch_list[i]; - if( !Command::isValid(dispatchConfig->command) || - dispatchConfig->command->getCmdBuf() != this ) - { - return CL_INVALID_MUTABLE_COMMAND_KHR; - } - if( dispatchConfig->type == CL_STRUCTURE_TYPE_MUTABLE_DISPATCH_CONFIG_KHR ) + if( updateTypes[i] == CL_STRUCTURE_TYPE_MUTABLE_DISPATCH_CONFIG_KHR && + updateConfigs[i] != nullptr ) { - if( dispatchConfig->command->getType() != CL_COMMAND_NDRANGE_KERNEL ) + auto config = (const cl_mutable_dispatch_config_khr*)updateConfigs[i]; + if( !Command::isValid(config->command) || + config->command->getCmdBuf() != this || + config->command->getType() != CL_COMMAND_NDRANGE_KERNEL ) { return CL_INVALID_MUTABLE_COMMAND_KHR; } - - if( cl_int errorCode = ((NDRangeKernel*)dispatchConfig->command)->mutate( + if( cl_int errorCode = ((NDRangeKernel*)config->command)->mutate( MutableDispatchAsserts, - dispatchConfig ) ) + config ) ) { return errorCode; } @@ -1624,7 +1610,7 @@ _cl_mutable_command_khr::_cl_mutable_command_khr( Queue(queue ? queue : cmdbuf->getQueue()) {} std::unique_ptr NDRangeKernel::create( - const cl_ndrange_kernel_command_properties_khr* properties, + const cl_command_properties_khr* properties, cl_command_buffer_khr cmdbuf, cl_command_queue queue, cl_kernel kernel, @@ -1644,7 +1630,7 @@ std::unique_ptr NDRangeKernel::create( if( properties ) { - const cl_ndrange_kernel_command_properties_khr* check = properties; + const cl_command_properties_khr* check = properties; bool found_CL_MUTABLE_DISPATCH_UPDATABLE_FIELDS_KHR = false; bool found_CL_MUTABLE_DISPATCH_ASSERTS_KHR = false; while( errorCode == CL_SUCCESS && check[0] != 0 ) @@ -1890,6 +1876,7 @@ cl_int CL_API_CALL clEnqueueCommandBufferKHR_EMU( cl_int CL_API_CALL clCommandBarrierWithWaitListKHR_EMU( cl_command_buffer_khr cmdbuf, cl_command_queue command_queue, + const cl_command_properties_khr* properties, cl_uint num_sync_points_in_wait_list, const cl_sync_point_khr* sync_point_wait_list, cl_sync_point_khr* sync_point, @@ -1906,6 +1893,10 @@ cl_int CL_API_CALL clCommandBarrierWithWaitListKHR_EMU( { return errorCode; } + if( properties != nullptr && properties[0] != 0 ) + { + return CL_INVALID_PROPERTY; + } if( mutable_handle != nullptr ) { return CL_INVALID_VALUE; @@ -1926,6 +1917,7 @@ cl_int CL_API_CALL clCommandBarrierWithWaitListKHR_EMU( cl_int CL_API_CALL clCommandCopyBufferKHR_EMU( cl_command_buffer_khr cmdbuf, cl_command_queue command_queue, + const cl_command_properties_khr* properties, cl_mem src_buffer, cl_mem dst_buffer, size_t src_offset, @@ -1947,6 +1939,10 @@ cl_int CL_API_CALL clCommandCopyBufferKHR_EMU( { return errorCode; } + if( properties != nullptr && properties[0] != 0 ) + { + return CL_INVALID_PROPERTY; + } if( mutable_handle != nullptr ) { return CL_INVALID_VALUE; @@ -1974,6 +1970,7 @@ cl_int CL_API_CALL clCommandCopyBufferKHR_EMU( cl_int CL_API_CALL clCommandCopyBufferRectKHR_EMU( cl_command_buffer_khr cmdbuf, cl_command_queue command_queue, + const cl_command_properties_khr* properties, cl_mem src_buffer, cl_mem dst_buffer, const size_t* src_origin, @@ -1999,6 +1996,10 @@ cl_int CL_API_CALL clCommandCopyBufferRectKHR_EMU( { return errorCode; } + if( properties != nullptr && properties[0] != 0 ) + { + return CL_INVALID_PROPERTY; + } if( mutable_handle != nullptr ) { return CL_INVALID_VALUE; @@ -2030,6 +2031,7 @@ cl_int CL_API_CALL clCommandCopyBufferRectKHR_EMU( cl_int CL_API_CALL clCommandCopyBufferToImageKHR_EMU( cl_command_buffer_khr cmdbuf, cl_command_queue command_queue, + const cl_command_properties_khr* properties, cl_mem src_buffer, cl_mem dst_image, size_t src_offset, @@ -2051,6 +2053,10 @@ cl_int CL_API_CALL clCommandCopyBufferToImageKHR_EMU( { return errorCode; } + if( properties != nullptr && properties[0] != 0 ) + { + return CL_INVALID_PROPERTY; + } if( mutable_handle != nullptr ) { return CL_INVALID_VALUE; @@ -2078,6 +2084,7 @@ cl_int CL_API_CALL clCommandCopyBufferToImageKHR_EMU( cl_int CL_API_CALL clCommandCopyImageKHR_EMU( cl_command_buffer_khr cmdbuf, cl_command_queue command_queue, + const cl_command_properties_khr* properties, cl_mem src_image, cl_mem dst_image, const size_t* src_origin, @@ -2099,6 +2106,10 @@ cl_int CL_API_CALL clCommandCopyImageKHR_EMU( { return errorCode; } + if( properties != nullptr && properties[0] != 0 ) + { + return CL_INVALID_PROPERTY; + } if( mutable_handle != nullptr ) { return CL_INVALID_VALUE; @@ -2126,6 +2137,7 @@ cl_int CL_API_CALL clCommandCopyImageKHR_EMU( cl_int CL_API_CALL clCommandCopyImageToBufferKHR_EMU( cl_command_buffer_khr cmdbuf, cl_command_queue command_queue, + const cl_command_properties_khr* properties, cl_mem src_image, cl_mem dst_buffer, const size_t* src_origin, @@ -2147,6 +2159,10 @@ cl_int CL_API_CALL clCommandCopyImageToBufferKHR_EMU( { return errorCode; } + if( properties != nullptr && properties[0] != 0 ) + { + return CL_INVALID_PROPERTY; + } if( mutable_handle != nullptr ) { return CL_INVALID_VALUE; @@ -2174,6 +2190,7 @@ cl_int CL_API_CALL clCommandCopyImageToBufferKHR_EMU( cl_int CL_API_CALL clCommandFillBufferKHR_EMU( cl_command_buffer_khr cmdbuf, cl_command_queue command_queue, + const cl_command_properties_khr* properties, cl_mem buffer, const void* pattern, size_t pattern_size, @@ -2195,6 +2212,10 @@ cl_int CL_API_CALL clCommandFillBufferKHR_EMU( { return errorCode; } + if( properties != nullptr && properties[0] != 0 ) + { + return CL_INVALID_PROPERTY; + } if( mutable_handle != nullptr ) { return CL_INVALID_VALUE; @@ -2222,6 +2243,7 @@ cl_int CL_API_CALL clCommandFillBufferKHR_EMU( cl_int CL_API_CALL clCommandFillImageKHR_EMU( cl_command_buffer_khr cmdbuf, cl_command_queue command_queue, + const cl_command_properties_khr* properties, cl_mem image, const void* fill_color, const size_t* origin, @@ -2242,6 +2264,10 @@ cl_int CL_API_CALL clCommandFillImageKHR_EMU( { return errorCode; } + if( properties != nullptr && properties[0] != 0 ) + { + return CL_INVALID_PROPERTY; + } if( mutable_handle != nullptr ) { return CL_INVALID_VALUE; @@ -2268,6 +2294,7 @@ cl_int CL_API_CALL clCommandFillImageKHR_EMU( cl_int CL_API_CALL clCommandSVMMemcpyKHR_EMU( cl_command_buffer_khr cmdbuf, cl_command_queue command_queue, + const cl_command_properties_khr* properties, void* dst_ptr, const void* src_ptr, size_t size, @@ -2287,6 +2314,10 @@ cl_int CL_API_CALL clCommandSVMMemcpyKHR_EMU( { return errorCode; } + if( properties != nullptr && properties[0] != 0 ) + { + return CL_INVALID_PROPERTY; + } if( mutable_handle != nullptr ) { return CL_INVALID_VALUE; @@ -2312,6 +2343,7 @@ cl_int CL_API_CALL clCommandSVMMemcpyKHR_EMU( cl_int CL_API_CALL clCommandSVMMemFillKHR_EMU( cl_command_buffer_khr cmdbuf, cl_command_queue command_queue, + const cl_command_properties_khr* properties, void* dst_ptr, const void* pattern, size_t pattern_size, @@ -2332,6 +2364,10 @@ cl_int CL_API_CALL clCommandSVMMemFillKHR_EMU( { return errorCode; } + if( properties != nullptr && properties[0] != 0 ) + { + return CL_INVALID_PROPERTY; + } if( mutable_handle != nullptr ) { return CL_INVALID_VALUE; @@ -2358,7 +2394,7 @@ cl_int CL_API_CALL clCommandSVMMemFillKHR_EMU( cl_int CL_API_CALL clCommandNDRangeKernelKHR_EMU( cl_command_buffer_khr cmdbuf, cl_command_queue command_queue, - const cl_ndrange_kernel_command_properties_khr* properties, + const cl_command_properties_khr* properties, cl_kernel kernel, cl_uint work_dim, const size_t* global_work_offset, @@ -2464,14 +2500,18 @@ cl_command_buffer_khr CL_API_CALL clRemapCommandBufferKHR_EMU( // cl_khr_command_buffer_mutable_dispatch cl_int CL_API_CALL clUpdateMutableCommandsKHR_EMU( cl_command_buffer_khr cmdbuf, - const cl_mutable_base_config_khr* mutable_config) + cl_uint num_configs, + const cl_command_buffer_update_type_khr* config_types, + const void** configs ) { if( !CommandBuffer::isValid(cmdbuf) ) { return CL_INVALID_COMMAND_BUFFER_KHR; } if( cl_int errorCode = cmdbuf->mutate( - mutable_config ) ) + num_configs, + config_types, + configs ) ) { return errorCode; } diff --git a/layers/10_cmdbufemu/emulate.h b/layers/10_cmdbufemu/emulate.h index ea37874f..70e653d6 100644 --- a/layers/10_cmdbufemu/emulate.h +++ b/layers/10_cmdbufemu/emulate.h @@ -48,6 +48,7 @@ cl_int CL_API_CALL clEnqueueCommandBufferKHR_EMU( cl_int CL_API_CALL clCommandBarrierWithWaitListKHR_EMU( cl_command_buffer_khr command_buffer, cl_command_queue command_queue, + const cl_command_properties_khr* properties, cl_uint num_sync_points_in_wait_list, const cl_sync_point_khr* sync_point_wait_list, cl_sync_point_khr* sync_point, @@ -56,6 +57,7 @@ cl_int CL_API_CALL clCommandBarrierWithWaitListKHR_EMU( cl_int CL_API_CALL clCommandCopyBufferKHR_EMU( cl_command_buffer_khr command_buffer, cl_command_queue command_queue, + const cl_command_properties_khr* properties, cl_mem src_buffer, cl_mem dst_buffer, size_t src_offset, @@ -69,6 +71,7 @@ cl_int CL_API_CALL clCommandCopyBufferKHR_EMU( cl_int CL_API_CALL clCommandCopyBufferRectKHR_EMU( cl_command_buffer_khr command_buffer, cl_command_queue command_queue, + const cl_command_properties_khr* properties, cl_mem src_buffer, cl_mem dst_buffer, const size_t* src_origin, @@ -86,6 +89,7 @@ cl_int CL_API_CALL clCommandCopyBufferRectKHR_EMU( cl_int CL_API_CALL clCommandCopyBufferToImageKHR_EMU( cl_command_buffer_khr command_buffer, cl_command_queue command_queue, + const cl_command_properties_khr* properties, cl_mem src_buffer, cl_mem dst_image, size_t src_offset, @@ -99,6 +103,7 @@ cl_int CL_API_CALL clCommandCopyBufferToImageKHR_EMU( cl_int CL_API_CALL clCommandCopyImageKHR_EMU( cl_command_buffer_khr command_buffer, cl_command_queue command_queue, + const cl_command_properties_khr* properties, cl_mem src_image, cl_mem dst_image, const size_t* src_origin, @@ -112,6 +117,7 @@ cl_int CL_API_CALL clCommandCopyImageKHR_EMU( cl_int CL_API_CALL clCommandCopyImageToBufferKHR_EMU( cl_command_buffer_khr command_buffer, cl_command_queue command_queue, + const cl_command_properties_khr* properties, cl_mem src_image, cl_mem dst_buffer, const size_t* src_origin, @@ -125,6 +131,7 @@ cl_int CL_API_CALL clCommandCopyImageToBufferKHR_EMU( cl_int CL_API_CALL clCommandFillBufferKHR_EMU( cl_command_buffer_khr command_buffer, cl_command_queue command_queue, + const cl_command_properties_khr* properties, cl_mem buffer, const void* pattern, size_t pattern_size, @@ -138,6 +145,7 @@ cl_int CL_API_CALL clCommandFillBufferKHR_EMU( cl_int CL_API_CALL clCommandFillImageKHR_EMU( cl_command_buffer_khr command_buffer, cl_command_queue command_queue, + const cl_command_properties_khr* properties, cl_mem image, const void* fill_color, const size_t* origin, @@ -150,6 +158,7 @@ cl_int CL_API_CALL clCommandFillImageKHR_EMU( cl_int CL_API_CALL clCommandSVMMemcpyKHR_EMU( cl_command_buffer_khr command_buffer, cl_command_queue command_queue, + const cl_command_properties_khr* properties, void* dst_ptr, const void* src_ptr, size_t size, @@ -161,6 +170,7 @@ cl_int CL_API_CALL clCommandSVMMemcpyKHR_EMU( cl_int CL_API_CALL clCommandSVMMemFillKHR_EMU( cl_command_buffer_khr command_buffer, cl_command_queue command_queue, + const cl_command_properties_khr* properties, void* svm_ptr, const void* pattern, size_t pattern_size, @@ -173,7 +183,7 @@ cl_int CL_API_CALL clCommandSVMMemFillKHR_EMU( cl_int CL_API_CALL clCommandNDRangeKernelKHR_EMU( cl_command_buffer_khr command_buffer, cl_command_queue command_queue, - const cl_ndrange_kernel_command_properties_khr* properties, + const cl_command_properties_khr* properties, cl_kernel kernel, cl_uint work_dim, const size_t* global_work_offset, @@ -209,7 +219,9 @@ cl_command_buffer_khr CL_API_CALL clRemapCommandBufferKHR_EMU( cl_int CL_API_CALL clUpdateMutableCommandsKHR_EMU( cl_command_buffer_khr command_buffer, - const cl_mutable_base_config_khr* mutable_config); + cl_uint num_configs, + const cl_command_buffer_update_type_khr* config_types, + const void** configs ); cl_int CL_API_CALL clGetMutableCommandInfoKHR_EMU( cl_mutable_command_khr command, diff --git a/samples/13_mutablecommandbuffers/main.cpp b/samples/13_mutablecommandbuffers/main.cpp index 61397541..0429f644 100644 --- a/samples/13_mutablecommandbuffers/main.cpp +++ b/samples/13_mutablecommandbuffers/main.cpp @@ -351,18 +351,22 @@ int main( // mutate the command buffer { cl_mutable_dispatch_config_khr dispatchConfig = {}; - dispatchConfig.type = CL_STRUCTURE_TYPE_MUTABLE_DISPATCH_CONFIG_KHR; dispatchConfig.command = command; dispatchConfig.global_work_size = &gwx; - cl_mutable_base_config_khr baseConfig = {}; - baseConfig.type = CL_STRUCTURE_TYPE_MUTABLE_BASE_CONFIG_KHR; - baseConfig.num_mutable_dispatch = 1; - baseConfig.mutable_dispatch_list = &dispatchConfig; + const cl_uint updateCount = 1; + const cl_command_buffer_update_type_khr updateTypes[updateCount] = { + CL_STRUCTURE_TYPE_MUTABLE_DISPATCH_CONFIG_KHR, + }; + const void* updateConfigs[updateCount] = { + &dispatchConfig, + }; clUpdateMutableCommandsKHR( cmdbuf, - &baseConfig ); + updateCount, + updateTypes, + updateConfigs ); } clEnqueueCommandBufferKHR( diff --git a/samples/15_mutablecommandbufferasserts/main.cpp b/samples/15_mutablecommandbufferasserts/main.cpp index 7c3ad217..0345531e 100644 --- a/samples/15_mutablecommandbufferasserts/main.cpp +++ b/samples/15_mutablecommandbufferasserts/main.cpp @@ -164,11 +164,11 @@ int main( kernel.setArg(0, deviceMemDst); kernel.setArg(1, deviceMemSrc); - const cl_ndrange_kernel_command_properties_khr cmdprops[] = { + const cl_command_properties_khr cmdprops[] = { CL_MUTABLE_DISPATCH_ASSERTS_KHR, noCmdAssert ? 0 - : (cl_ndrange_kernel_command_properties_khr) + : (cl_command_properties_khr) CL_MUTABLE_DISPATCH_ASSERT_NO_ADDITIONAL_WORK_GROUPS_KHR, 0, }; @@ -196,18 +196,22 @@ int main( { const size_t gwx_x4 = gwx * 4; cl_mutable_dispatch_config_khr dispatchConfig = {}; - dispatchConfig.type = CL_STRUCTURE_TYPE_MUTABLE_DISPATCH_CONFIG_KHR; dispatchConfig.command = command; dispatchConfig.global_work_size = &gwx_x4; - cl_mutable_base_config_khr baseConfig = {}; - baseConfig.type = CL_STRUCTURE_TYPE_MUTABLE_BASE_CONFIG_KHR; - baseConfig.num_mutable_dispatch = 1; - baseConfig.mutable_dispatch_list = &dispatchConfig; + const cl_uint updateCount = 1; + const cl_command_buffer_update_type_khr updateTypes[updateCount] = { + CL_STRUCTURE_TYPE_MUTABLE_DISPATCH_CONFIG_KHR, + }; + const void* updateConfigs[updateCount] = { + &dispatchConfig, + }; cl_int check = clUpdateMutableCommandsKHR( cmdbuf, - &baseConfig ); + updateCount, + updateTypes, + updateConfigs ); printf("clUpdateMutableCommandsKHR() to increase work-groups returned %s.\n", check == CL_SUCCESS ? "SUCCESS" : "an ERROR"); } @@ -216,18 +220,22 @@ int main( // This should not generate an error even with mutable dispatch asserts. { cl_mutable_dispatch_config_khr dispatchConfig = {}; - dispatchConfig.type = CL_STRUCTURE_TYPE_MUTABLE_DISPATCH_CONFIG_KHR; dispatchConfig.command = command; dispatchConfig.global_work_size = &gwx; - cl_mutable_base_config_khr baseConfig = {}; - baseConfig.type = CL_STRUCTURE_TYPE_MUTABLE_BASE_CONFIG_KHR; - baseConfig.num_mutable_dispatch = 1; - baseConfig.mutable_dispatch_list = &dispatchConfig; + const cl_uint updateCount = 1; + const cl_command_buffer_update_type_khr updateTypes[updateCount] = { + CL_STRUCTURE_TYPE_MUTABLE_DISPATCH_CONFIG_KHR, + }; + const void* updateConfigs[updateCount] = { + &dispatchConfig, + }; cl_int check = clUpdateMutableCommandsKHR( cmdbuf, - &baseConfig ); + updateCount, + updateTypes, + updateConfigs ); printf("clUpdateMutableCommandsKHR() to reduce work-groups returned %s.\n", check == CL_SUCCESS ? "SUCCESS" : "an ERROR"); }