/************************************************************************************************************ Function to Register the Kernel for Publish *************************************************************************************************************/ vx_status CV_transpose_Register(vx_context context) { vx_status status = VX_SUCCESS; vx_kernel kernel = vxAddKernel(context, "org.opencv.transpose", VX_KERNEL_OPENCV_TRANSPOSE, CV_transpose_Kernel, 2, CV_transpose_InputValidator, CV_transpose_OutputValidator, nullptr, nullptr); if (kernel) { PARAM_ERROR_CHECK(vxAddParameterToKernel(kernel, 0, VX_INPUT, VX_TYPE_IMAGE, VX_PARAMETER_STATE_REQUIRED)); PARAM_ERROR_CHECK(vxAddParameterToKernel(kernel, 1, VX_OUTPUT, VX_TYPE_IMAGE, VX_PARAMETER_STATE_REQUIRED)); PARAM_ERROR_CHECK(vxFinalizeKernel(kernel)); } if (status != VX_SUCCESS) { exit: vxRemoveKernel(kernel); return VX_FAILURE; } return status; }
/************************************************************************************************************ Function to Register the Kernel for Publish *************************************************************************************************************/ vx_status CV_fastNlMeansDenoising_Register(vx_context context) { vx_status status = VX_SUCCESS; vx_kernel Kernel = vxAddKernel(context, "org.opencv.fastnlmeansdenoising", VX_KERNEL_EXT_CV_FAST_NL_MEANS_DENOISING, CV_fastNlMeansDenoising_Kernel, 5, CV_fastNlMeansDenoising_InputValidator, CV_fastNlMeansDenoising_OutputValidator, nullptr, nullptr); if (Kernel) { PARAM_ERROR_CHECK(vxAddParameterToKernel(Kernel, 0, VX_INPUT, VX_TYPE_IMAGE, VX_PARAMETER_STATE_REQUIRED)); PARAM_ERROR_CHECK(vxAddParameterToKernel(Kernel, 1, VX_OUTPUT, VX_TYPE_IMAGE, VX_PARAMETER_STATE_REQUIRED)); PARAM_ERROR_CHECK(vxAddParameterToKernel(Kernel, 2, VX_INPUT, VX_TYPE_SCALAR, VX_PARAMETER_STATE_REQUIRED)); PARAM_ERROR_CHECK(vxAddParameterToKernel(Kernel, 3, VX_INPUT, VX_TYPE_SCALAR, VX_PARAMETER_STATE_REQUIRED)); PARAM_ERROR_CHECK(vxAddParameterToKernel(Kernel, 4, VX_INPUT, VX_TYPE_SCALAR, VX_PARAMETER_STATE_REQUIRED)); PARAM_ERROR_CHECK(vxFinalizeKernel(Kernel)); } if (status != VX_SUCCESS) { exit: vxRemoveKernel(Kernel); return VX_FAILURE; } return status; }
/************************************************************************************************************ Function to Register the Kernel for Publish *************************************************************************************************************/ vx_status CV_norm_Register(vx_context context) { vx_status status = VX_SUCCESS; vx_kernel kernel = vxAddKernel(context, "org.opencv.norm", VX_KERNEL_EXT_CV_NORM, CV_norm_Kernel, 3, CV_norm_InputValidator, CV_norm_OutputValidator, nullptr, nullptr); if (kernel) { PARAM_ERROR_CHECK(vxAddParameterToKernel(kernel, 0, VX_INPUT, VX_TYPE_IMAGE, VX_PARAMETER_STATE_REQUIRED)); PARAM_ERROR_CHECK(vxAddParameterToKernel(kernel, 1, VX_BIDIRECTIONAL, VX_TYPE_SCALAR, VX_PARAMETER_STATE_REQUIRED)); PARAM_ERROR_CHECK(vxAddParameterToKernel(kernel, 2, VX_INPUT, VX_TYPE_SCALAR, VX_PARAMETER_STATE_REQUIRED)); PARAM_ERROR_CHECK(vxFinalizeKernel(kernel)); } if (status != VX_SUCCESS) { exit: vxRemoveKernel(kernel); return VX_FAILURE; } return status; }
/************************************************************************************************************ Function to Register the Kernel for Publish *************************************************************************************************************/ vx_status CV_sepFilter2D_Register(vx_context context) { vx_status status = VX_SUCCESS; vx_kernel kernel = vxAddKernel(context, "org.opencv.sepfilter2d", VX_KERNEL_EXT_CV_SEPFILTER_2D, CV_sepFilter2D_Kernel, 9, CV_sepFilter2D_InputValidator, CV_sepFilter2D_OutputValidator, nullptr, nullptr); if (kernel) { PARAM_ERROR_CHECK(vxAddParameterToKernel(kernel, 0, VX_INPUT, VX_TYPE_IMAGE, VX_PARAMETER_STATE_REQUIRED)); PARAM_ERROR_CHECK(vxAddParameterToKernel(kernel, 1, VX_OUTPUT, VX_TYPE_IMAGE, VX_PARAMETER_STATE_REQUIRED)); PARAM_ERROR_CHECK(vxAddParameterToKernel(kernel, 2, VX_INPUT, VX_TYPE_SCALAR, VX_PARAMETER_STATE_REQUIRED)); PARAM_ERROR_CHECK(vxAddParameterToKernel(kernel, 3, VX_INPUT, VX_TYPE_MATRIX, VX_PARAMETER_STATE_REQUIRED)); PARAM_ERROR_CHECK(vxAddParameterToKernel(kernel, 4, VX_INPUT, VX_TYPE_MATRIX, VX_PARAMETER_STATE_REQUIRED)); PARAM_ERROR_CHECK(vxAddParameterToKernel(kernel, 5, VX_INPUT, VX_TYPE_SCALAR, VX_PARAMETER_STATE_REQUIRED)); PARAM_ERROR_CHECK(vxAddParameterToKernel(kernel, 6, VX_INPUT, VX_TYPE_SCALAR, VX_PARAMETER_STATE_REQUIRED)); PARAM_ERROR_CHECK(vxAddParameterToKernel(kernel, 7, VX_INPUT, VX_TYPE_SCALAR, VX_PARAMETER_STATE_REQUIRED)); PARAM_ERROR_CHECK(vxAddParameterToKernel(kernel, 8, VX_INPUT, VX_TYPE_SCALAR, VX_PARAMETER_STATE_REQUIRED)); PARAM_ERROR_CHECK(vxFinalizeKernel(kernel)); } if (status != VX_SUCCESS) { exit: vxRemoveKernel(kernel); return VX_FAILURE; } return status; }
/************************************************************************************************************ Function to Register the Kernel for Publish *************************************************************************************************************/ vx_status CV_SURF_compute_Register(vx_context context) { vx_status status = VX_SUCCESS; vx_kernel Kernel = vxAddKernel(context, "org.opencv.surf_compute", VX_KERNEL_OPENCV_SURF_COMPUTE, CV_SURF_Compute_Kernel, 9, CV_SURF_Compute_InputValidator, CV_SURF_Compute_OutputValidator, nullptr, nullptr); if (Kernel) { PARAM_ERROR_CHECK(vxAddParameterToKernel(Kernel, 0, VX_INPUT, VX_TYPE_IMAGE, VX_PARAMETER_STATE_REQUIRED)); PARAM_ERROR_CHECK(vxAddParameterToKernel(Kernel, 1, VX_INPUT, VX_TYPE_IMAGE, VX_PARAMETER_STATE_REQUIRED)); PARAM_ERROR_CHECK(vxAddParameterToKernel(Kernel, 2, VX_BIDIRECTIONAL, VX_TYPE_ARRAY, VX_PARAMETER_STATE_REQUIRED)); PARAM_ERROR_CHECK(vxAddParameterToKernel(Kernel, 3, VX_BIDIRECTIONAL, VX_TYPE_ARRAY, VX_PARAMETER_STATE_REQUIRED)); PARAM_ERROR_CHECK(vxAddParameterToKernel(Kernel, 4, VX_INPUT, VX_TYPE_SCALAR, VX_PARAMETER_STATE_REQUIRED)); PARAM_ERROR_CHECK(vxAddParameterToKernel(Kernel, 5, VX_INPUT, VX_TYPE_SCALAR, VX_PARAMETER_STATE_REQUIRED)); PARAM_ERROR_CHECK(vxAddParameterToKernel(Kernel, 6, VX_INPUT, VX_TYPE_SCALAR, VX_PARAMETER_STATE_REQUIRED)); PARAM_ERROR_CHECK(vxAddParameterToKernel(Kernel, 7, VX_INPUT, VX_TYPE_SCALAR, VX_PARAMETER_STATE_REQUIRED)); PARAM_ERROR_CHECK(vxAddParameterToKernel(Kernel, 8, VX_INPUT, VX_TYPE_SCALAR, VX_PARAMETER_STATE_REQUIRED)); PARAM_ERROR_CHECK(vxFinalizeKernel(Kernel)); } if (status != VX_SUCCESS) { exit: vxRemoveKernel(Kernel); return VX_FAILURE; } return status; }
/************************************************************************************************************ Function to Register the Kernel for Publish *************************************************************************************************************/ vx_status CV_warpPerspective_Register(vx_context context) { vx_status status = VX_SUCCESS; vx_kernel Kernel = vxAddKernel(context, "org.opencv.warpperspective", VX_KERNEL_OPENCV_WARP_PERSPECTIVE, CV_warpPerspective_Kernel, 7, CV_warpPerspective_InputValidator, CV_warpPerspective_OutputValidator, nullptr, nullptr); if (Kernel) { PARAM_ERROR_CHECK(vxAddParameterToKernel(Kernel, 0, VX_INPUT, VX_TYPE_IMAGE, VX_PARAMETER_STATE_REQUIRED)); PARAM_ERROR_CHECK(vxAddParameterToKernel(Kernel, 1, VX_OUTPUT, VX_TYPE_IMAGE, VX_PARAMETER_STATE_REQUIRED)); PARAM_ERROR_CHECK(vxAddParameterToKernel(Kernel, 2, VX_INPUT, VX_TYPE_MATRIX, VX_PARAMETER_STATE_REQUIRED)); PARAM_ERROR_CHECK(vxAddParameterToKernel(Kernel, 3, VX_INPUT, VX_TYPE_SCALAR, VX_PARAMETER_STATE_REQUIRED)); PARAM_ERROR_CHECK(vxAddParameterToKernel(Kernel, 4, VX_INPUT, VX_TYPE_SCALAR, VX_PARAMETER_STATE_REQUIRED)); PARAM_ERROR_CHECK(vxAddParameterToKernel(Kernel, 5, VX_INPUT, VX_TYPE_SCALAR, VX_PARAMETER_STATE_REQUIRED)); PARAM_ERROR_CHECK(vxAddParameterToKernel(Kernel, 6, VX_INPUT, VX_TYPE_SCALAR, VX_PARAMETER_STATE_REQUIRED)); PARAM_ERROR_CHECK(vxFinalizeKernel(Kernel)); } if (status != VX_SUCCESS) { exit: vxRemoveKernel(Kernel); return VX_FAILURE; } return status; }
vx_status publishROIPoolingLayer(vx_context context) { // add kernel to the context with callbacks vx_kernel kernel = vxAddUserKernel(context, "org.khronos.nn_extension.roi_pooling_layer", VX_KERNEL_ROI_POOLING_LAYER, processROIPoolingLayer, 4, validateROIPoolingLayer, initializeROIPoolingLayer, uninitializeROIPoolingLayer); ERROR_CHECK_OBJECT(kernel); // set kernel parameters ERROR_CHECK_STATUS(vxAddParameterToKernel(kernel, 0, VX_INPUT, VX_TYPE_TENSOR, VX_PARAMETER_STATE_REQUIRED)); ERROR_CHECK_STATUS(vxAddParameterToKernel(kernel, 1, VX_INPUT, VX_TYPE_TENSOR, VX_PARAMETER_STATE_REQUIRED)); ERROR_CHECK_STATUS(vxAddParameterToKernel(kernel, 2, VX_INPUT, VX_TYPE_SCALAR, VX_PARAMETER_STATE_REQUIRED)); ERROR_CHECK_STATUS(vxAddParameterToKernel(kernel, 3, VX_OUTPUT, VX_TYPE_TENSOR, VX_PARAMETER_STATE_REQUIRED)); // finalize and release kernel object ERROR_CHECK_STATUS(vxFinalizeKernel(kernel)); ERROR_CHECK_STATUS(vxReleaseKernel(&kernel)); return VX_SUCCESS; }
/*! \brief The entry point into this module to add the base kernels to OpenVX. * \param context The handle to the implementation context. * \return vx_status Returns errors if some or all kernels were not added * correctly. * \ingroup group_implementation */ /*VX_API_ENTRY*/ vx_status VX_API_CALL vxPublishKernels(vx_context context) { vx_status status = VX_FAILURE; vx_uint32 p = 0, k = 0; for (k = 0; k < num_kernels; k++) { vx_kernel kernel = vxAddKernel(context, kernels[k]->name, kernels[k]->enumeration, kernels[k]->function, kernels[k]->numParams, kernels[k]->input_validate, kernels[k]->output_validate, kernels[k]->initialize, kernels[k]->deinitialize); if (kernel) { status = VX_SUCCESS; // temporary for (p = 0; p < kernels[k]->numParams; p++) { status = vxAddParameterToKernel(kernel, p, kernels[k]->parameters[p].direction, kernels[k]->parameters[p].data_type, kernels[k]->parameters[p].state); if (status != VX_SUCCESS) { vxAddLogEntry((vx_reference)context, status, "Failed to add parameter %d to kernel %s! (%d)\n", p, kernels[k]->name, status); break; } } if (status == VX_SUCCESS) { status = vxFinalizeKernel(kernel); if (status != VX_SUCCESS) { vxAddLogEntry((vx_reference)context, status, "Failed to finalize kernel[%u]=%s\n",k, kernels[k]->name); } } else { status = vxRemoveKernel(kernel); if (status != VX_SUCCESS) { vxAddLogEntry((vx_reference)context, status, "Failed to remove kernel[%u]=%s\n",k, kernels[k]->name); } } } else { vxAddLogEntry((vx_reference)context, status, "Failed to add kernel %s\n", kernels[k]->name); } } return status; }
//////// // User kernels needs to be registered with every OpenVX context before use in a graph. // // TODO:******** // 1. Use vxAddUserKernel API to register "app.userkernels.tensor_cos" with // kernel enumeration = USER_KERNEL_TENSOR_COS, numParams = 2, and // all of the user kernel callback functions you implemented above. // 2. Use vxAddParameterToKernel API to specify direction, data_type, and // state of all 2 parameters to the kernel. Look into the comments of // userTensorCosNode function (above) to details about the order of // kernel parameters and their types. // 3. Use vxFinalizeKernel API to make the kernel ready to use in a graph. // Note that the kernel object is still valid after this call. // So you need to call vxReleaseKernel before returning from this function. vx_status registerUserKernel( vx_context context ) { vx_kernel kernel = vxAddUserKernel( context, "app.userkernels.tensor_cos", USER_KERNEL_TENSOR_COS, tensor_cos_host_side_function, 2, // numParams tensor_cos_validator, NULL, NULL ); ERROR_CHECK_OBJECT( kernel ); ERROR_CHECK_STATUS( vxAddParameterToKernel( kernel, 0, VX_INPUT, VX_TYPE_TENSOR, VX_PARAMETER_STATE_REQUIRED ) ); // input ERROR_CHECK_STATUS( vxAddParameterToKernel( kernel, 1, VX_OUTPUT, VX_TYPE_TENSOR, VX_PARAMETER_STATE_REQUIRED ) ); // output ERROR_CHECK_STATUS( vxFinalizeKernel( kernel ) ); ERROR_CHECK_STATUS( vxReleaseKernel( &kernel ) ); vxAddLogEntry( ( vx_reference ) context, VX_SUCCESS, "OK: registered user kernel app.userkernels.tensor_cos\n" ); return VX_SUCCESS; }
vx_status publishSoftmaxLayer(vx_context context) { // add kernel to the context with callbacks vx_kernel kernel = vxAddUserKernel(context, "org.khronos.nn_extension.softmax_layer", VX_KERNEL_SOFTMAX_LAYER, processSoftmaxLayer, 2, validateSoftmaxLayer, initializeSoftmaxLayer, uninitializeSoftmaxLayer); ERROR_CHECK_OBJECT(kernel); // enable OpenCL buffer access since the kernel_f callback uses OpenCL buffers instead of host accessible buffers vx_bool enableBufferAccess = vx_true_e; ERROR_CHECK_STATUS(vxSetKernelAttribute(kernel, VX_KERNEL_ATTRIBUTE_AMD_OPENCL_BUFFER_ACCESS_ENABLE, &enableBufferAccess, sizeof(enableBufferAccess))); // set kernel parameters ERROR_CHECK_STATUS(vxAddParameterToKernel(kernel, 0, VX_INPUT, VX_TYPE_TENSOR, VX_PARAMETER_STATE_REQUIRED)); ERROR_CHECK_STATUS(vxAddParameterToKernel(kernel, 1, VX_OUTPUT, VX_TYPE_TENSOR, VX_PARAMETER_STATE_REQUIRED)); // finalize and release kernel object ERROR_CHECK_STATUS(vxFinalizeKernel(kernel)); ERROR_CHECK_STATUS(vxReleaseKernel(&kernel)); return VX_SUCCESS; }
//! \brief The kernel publisher. vx_status publishArgmaxLayer(vx_context context) { vx_kernel kernel = vxAddUserKernel(context, "com.amd.nn_extension.argmax_layer", VX_KERNEL_ARGMAX_LAYER_AMD, host_kernel, 2, validateKernel, nullptr, nullptr); ERROR_CHECK_OBJECT(kernel); amd_kernel_query_target_support_f query_target_support_f = query_target_support; amd_kernel_opencl_codegen_callback_f opencl_codegen_callback_f = opencl_codegen; ERROR_CHECK_STATUS(vxSetKernelAttribute(kernel, VX_KERNEL_ATTRIBUTE_AMD_QUERY_TARGET_SUPPORT, &query_target_support_f, sizeof(query_target_support_f))); ERROR_CHECK_STATUS(vxSetKernelAttribute(kernel, VX_KERNEL_ATTRIBUTE_AMD_OPENCL_CODEGEN_CALLBACK, &opencl_codegen_callback_f, sizeof(opencl_codegen_callback_f))); // set kernel parameters. ERROR_CHECK_STATUS(vxAddParameterToKernel(kernel, 0, VX_INPUT, VX_TYPE_TENSOR, VX_PARAMETER_STATE_REQUIRED)); ERROR_CHECK_STATUS(vxAddParameterToKernel(kernel, 1, VX_OUTPUT, VX_TYPE_REFERENCE, VX_PARAMETER_STATE_REQUIRED)); // finalize and release kernel object. ERROR_CHECK_STATUS(vxFinalizeKernel(kernel)); ERROR_CHECK_STATUS(vxReleaseKernel(&kernel)); return VX_SUCCESS; }
vx_status publishTensorAdd(vx_context context) { // add kernel to the context with callbacks vx_kernel kernel = vxAddUserKernel(context, "org.khronos.openvx.tensor_add", VX_KERNEL_TENSOR_ADD, processTensorAddition, 4, validateTensorAddition, initializeTensorAddition, uninitializeTensorAddition); ERROR_CHECK_OBJECT(kernel); // enable OpenCL buffer access since the kernel_f callback uses OpenCL buffers instead of host accessible buffers vx_bool enableBufferAccess = vx_true_e; ERROR_CHECK_STATUS(vxSetKernelAttribute(kernel, VX_KERNEL_ATTRIBUTE_AMD_OPENCL_BUFFER_ACCESS_ENABLE, &enableBufferAccess, sizeof(enableBufferAccess))); // set kernel parameters ERROR_CHECK_STATUS(vxAddParameterToKernel(kernel, 0, VX_INPUT, VX_TYPE_TENSOR, VX_PARAMETER_STATE_REQUIRED)); ERROR_CHECK_STATUS(vxAddParameterToKernel(kernel, 1, VX_INPUT, VX_TYPE_TENSOR, VX_PARAMETER_STATE_REQUIRED)); ERROR_CHECK_STATUS(vxAddParameterToKernel(kernel, 2, VX_INPUT, VX_TYPE_SCALAR, VX_PARAMETER_STATE_REQUIRED)); ERROR_CHECK_STATUS(vxAddParameterToKernel(kernel, 3, VX_OUTPUT, VX_TYPE_TENSOR, VX_PARAMETER_STATE_REQUIRED)); // finalize and release kernel object ERROR_CHECK_STATUS(vxFinalizeKernel(kernel)); ERROR_CHECK_STATUS(vxReleaseKernel(&kernel)); return VX_SUCCESS; }
//! \brief The kernel publisher. vx_status publishTensorToImageConvert(vx_context context) { vx_kernel kernel = vxAddUserKernel(context, "com.amd.nn_extension.convert_tensor_to_image", VX_KERNEL_CONVERT_TENSOR_TO_IMAGE_AMD, host_kernel, 5, validateTensorToImageKernel, nullptr, nullptr); ERROR_CHECK_OBJECT(kernel); amd_kernel_query_target_support_f query_target_support_f = query_target_support; amd_kernel_opencl_codegen_callback_f opencl_codegen_callback_f = opencl_codegen; ERROR_CHECK_STATUS(vxSetKernelAttribute(kernel, VX_KERNEL_ATTRIBUTE_AMD_QUERY_TARGET_SUPPORT, &query_target_support_f, sizeof(query_target_support_f))); ERROR_CHECK_STATUS(vxSetKernelAttribute(kernel, VX_KERNEL_ATTRIBUTE_AMD_OPENCL_CODEGEN_CALLBACK, &opencl_codegen_callback_f, sizeof(opencl_codegen_callback_f))); // set kernel parameters. ERROR_CHECK_STATUS(vxAddParameterToKernel(kernel, 0, VX_INPUT, VX_TYPE_TENSOR, VX_PARAMETER_STATE_REQUIRED)); ERROR_CHECK_STATUS(vxAddParameterToKernel(kernel, 1, VX_OUTPUT, VX_TYPE_IMAGE, VX_PARAMETER_STATE_REQUIRED)); ERROR_CHECK_STATUS(vxAddParameterToKernel(kernel, 2, VX_INPUT, VX_TYPE_SCALAR, VX_PARAMETER_STATE_REQUIRED)); ERROR_CHECK_STATUS(vxAddParameterToKernel(kernel, 3, VX_INPUT, VX_TYPE_SCALAR, VX_PARAMETER_STATE_REQUIRED)); ERROR_CHECK_STATUS(vxAddParameterToKernel(kernel, 4, VX_INPUT, VX_TYPE_SCALAR, VX_PARAMETER_STATE_REQUIRED)); // finalize and release kernel object. ERROR_CHECK_STATUS(vxFinalizeKernel(kernel)); ERROR_CHECK_STATUS(vxReleaseKernel(&kernel)); return VX_SUCCESS; }