/* * Copyright (c) 2012-2017 The Khronos Group Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef _VX_KHR_OPENCL_H_ #define _VX_KHR_OPENCL_H_ #include #include /*! \file * \brief The OpenVX to OpenCL Inter-op Extension Header. * * \defgroup group_cl_api API * \brief The API used by Clients to add OpenCL Kernels as vx_kernel. * \details * * \defgroup group_cl_def Extension Defines * \brief The Extension defines and constants. * * \defgroup group_cl_image Images * \brief OpenVX Images * \details Depending on whether the OpenCL implementation supports images, vx_image * may map to an image2d_t or a OpenCL buffer. * * \defgroup group_cl_array Arrays * \brief OpenVX Arrays * * \defgroup group_cl_convolution Convolutions * \brief OpenVX Convolutions * * \defgroup group_cl_distribution Distributions * \brief OpenVX Distributions * * \defgroup group_cl_matrix Matricies * \brief OpenVX Matrix * * \defgroup group_cl_types OpenVX to OpenCL Atomic Types * \brief Atomic Types * \details OpenVX types map to OpenCL types through this table: * | VX | OpenCL| * |:---------|:------| * |vx_uint8 |uchar | * |vx_int8 |char | * |vx_uint16 |ushort | * |vx_int16 |short | * |vx_uint32 |uint | * |vx_int32 |int | * |vx_uint64 |ulong | * |vx_int64 |long | * |vx_float32|float | * |vx_float64|double | * |vx_size |size_t | * * \note size_t can not be used as a parameter to a __kernel. */ #ifndef VX_SCALE_UNITY #define VX_SCALE_UNITY (1024) #endif /*!\brief The maximum number of planes an image may have which is compatible across both * API. * \ingroup group_cl_def */ #define VX_CL_MAX_PLANES (4) #if defined(VX_CL_DOCUMENTATION) || !defined(VX_CL_KERNEL) #if defined(__APPLE__) || defined(DARWIN) #include #else #include #endif #if (!defined(__APPLE__)) && defined(CL_USE_LUMINANCE) #define CL_USE_IMAGES #endif /*! \brief The string name of this extension to match for in the extensions list * \ingroup group_cl_def */ #define OPENVX_KHR_OPENCL "vx_khr_opencl" /*! \brief Adds an OpenCL Kernel as source code into the OpenVX implementation. * \param [in] context The OpenVX Context. * \param [in] name The name of the kernel in OpenVX nomenclature. * \param [in] enumeration The OpenVX kernel enumeration used to identify this kernel. * \param [in] source The array of source line pointers. * \param [in] line_lengths The array of lines lengths for each line of source. * \param [in] num_lines the number of lines in both the sources array and line_lengths array. * \param [in] symbol_name The name of the kernel to call in the program. * \param [in] numParams The number of parameters to the OpenVX kernel. * \param [in] input The input validator. * \param [in] output The output validator. * \see vxAddParameterToKernel to configure the specific parameter attributes. * \ingroup group_cl_api */ VX_API_ENTRY vx_kernel VX_API_CALL vxAddOpenCLAsSourceKernel(vx_context context, vx_char name[VX_MAX_KERNEL_NAME], vx_enum enumeration, char *source[], size_t line_lengths[], size_t num_lines, char symbol_name[], vx_uint32 numParams, vx_kernel_input_validate_f input, vx_kernel_output_validate_f output); /*! \brief Adds an OpenCL Kernel as binary program into the OpenVX implementation. * \param [in] context The OpenVX Context. * \param [in] name The name of the kernel in OpenVX nomenclature. * \param [in] enumeration The OpenVX kernel enumeration used to identify this kernel. * \param [in] program The OpenCL Program which contains the kernel (either pre-compiled or compiled by user). * \param [in] symbol_name The name of the kernel to call in the program. * \param [in] numParams The number of parameters to the OpenVX kernel. * \param [in] input The input validator. * \param [in] output The output validator. * \see vxAddParameterToKernel to configure the specific parameter attributes. * \ingroup group_cl_api */ VX_API_ENTRY vx_kernel VX_API_CALL vxAddOpenCLAsBinaryKernel(vx_context context, vx_char name[VX_MAX_KERNEL_NAME], vx_enum enumeration, cl_program program, char symbol_name[], vx_uint32 numParams, vx_kernel_input_validate_f input, vx_kernel_output_validate_f output); #endif // External API #if defined(VX_CL_DOCUMENTATION) || defined(VX_CL_KERNEL) #if defined(__IMAGE_SUPPORT__) && defined(CL_USE_LUMINANCE) #define CL_USE_IMAGES #endif /*! \brief Allows access to an image pixel as a typecast pointer deference. * \param type The OpenCL single element type * \param ptr The __global pointer to the base of the image. * \param x The x coordinate. * \param y The y coordinate. * \param sx The x stride. * \param sy The y stride. * \ingroup group_cl_image */ #define vxImagePixel(type, ptr, x, y, sx, sy) \ (*(type *)(&((uchar *)ptr)[((y) * sy) + ((x) * sx)])) /*! * \brief Allows access to an array item as a typecast pointer deference. * \param type The OpenCL single element type or structure type. * \param ptr The __global pointer to the base of the array. * \param index The index of the element to access. * \param stride The stride in bytes between two adjacent elements. * \ingroup group_cl_array */ #define vxArrayItem(type, ptr, index, stride) \ (*(type *)(&((uchar *)ptr)[index*stride])) /*! \brief Allows access to a matrix element \f$ M_{ij} \f$ where i is the column and j is the row. * \param type The OpenCL single element type of the matrix. * \param ptr The __global pointer to the base of the array. * \param columns The number of columns in the matrix. * \param i The column index * \param j The row index * \ingroup group_cl_matrix */ #define vxMatrixElement(type, ptr, columns, i, j) (((type *)ptr)[columns*j + i]) /*! \brief Allows access to a convolution element \f$ C_{ij} \f$ where i is the column and j is the row. * \note Convolution elements are always of type short. * \param ptr The __global pointer to the base of the array. * \param columns The number of columns in the matrix. * \param i The column index * \param j The row index * \ingroup group_cl_convolution */ #define vxConvolveElement(ptr, columns, i, j) (((short *)ptr)[columns*j + i]) /*! \brief Allows access to a distribution frequency counter. * \param ptr The __global pointer to the base of the distribution. * \param value The value to retrive the frequency count for. * \param offset The offset within the input domain. * \param range The total range within the domain starting from offset. * \param window_size The window size of the bin. * \ingroup group_cl_distribution */ #define vxGetFrequency(ptr, value, offset, range, window_size) \ ((offset <= value) && (value <= (range+offset)) ? ptr[(value-offset)/window_size] : 0) /*! \brief Increments a distribution frequency counter for a value. * \param ptr The __global pointer to the base of the distribution. * \param value The value to increment the frequency count for. * \param offset The offset within the input domain. * \param range The total range within the domain starting from offset. * \param window_size The window size of the bin. * \ingroup group_cl_distribution */ #define vxIncFrequency(ptr, value, offset, range, window_size) \ ((offset <= value) && (value <= (range+offset)) ? ++ptr[(value-offset)/window_size] : 0) /*! \brief Decrements a distribution frequency counter for a value. * \param ptr The __global pointer to the base of the distribution. * \param value The value to decrement the frequency count for. * \param offset The offset within the input domain. * \param range The total range within the domain starting from offset. * \param window_size The window size of the bin. * \ingroup group_cl_distribution */ #define vxDecFrequency(ptr, value, offset, range, window_size) \ ((offset <= value) && (value <= (range+offset)) ? --ptr[(value-offset)/window_size] : 0) #if defined(VX_VERSION_1_1) && (VX_VERSION >= VX_VERSION_1_1) /*! \brief Allows access to a distribution frequency counter. * \param ptr The __global pointer to the base of the distribution. * \param value The value to retrive the frequency count for. * \param offset The offset within the input domain. * \param range The total range within the domain starting from offset. * \param num_bins The number of bins in the domain range. * \ingroup group_cl_distribution */ #define vxGetFrequency2(ptr, value, offset, range, num_bins) \ ((offset <= value) && (value <= (range+offset)) ? ptr[(value-offset)*num_bins/range] : 0) /*! \brief Increments a distribution frequency counter for a value. * \param ptr The __global pointer to the base of the distribution. * \param value The value to increment the frequency count for. * \param offset The offset within the input domain. * \param range The total range within the domain starting from offset. * \param num_bins The number of bins in the domain range. * \ingroup group_cl_distribution */ #define vxIncFrequency2(ptr, value, offset, range, num_bins) \ ((offset <= value) && (value <= (range+offset)) ? ++ptr[(value-offset)*num_bins/range] : 0) /*! \brief Decrements a distribution frequency counter for a value. * \param ptr The __global pointer to the base of the distribution. * \param value The value to decrement the frequency count for. * \param offset The offset within the input domain. * \param range The total range within the domain starting from offset. * \param num_bins The number of bins in the domain range. * \ingroup group_cl_distribution */ #define vxDecFrequency2(ptr, value, offset, range, num_bins) \ ((offset <= value) && (value <= (range+offset)) ? --ptr[(value-offset)*num_bins/range] : 0) #endif /*VX_VERSION_1_1*/ #endif #endif