TIM-VX/prebuilt-sdk/x86_64_linux/include/VX/vx_khr_opencl.h

269 lines
11 KiB
C

/*
* 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 <VX/vx.h>
#include <VX/vx_compatibility.h>
/*! \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 <tt>vx_kernel</tt>.
* \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, <tt>vx_image</tt>
* may map to an <tt>image2d_t</tt> 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|
* |:---------|:------|
* |<tt>vx_uint8</tt> |<tt>uchar</tt> |
* |<tt>vx_int8</tt> |<tt>char</tt> |
* |<tt>vx_uint16</tt> |<tt>ushort</tt> |
* |<tt>vx_int16</tt> |<tt>short</tt> |
* |<tt>vx_uint32</tt> |<tt>uint</tt> |
* |<tt>vx_int32</tt> |<tt>int</tt> |
* |<tt>vx_uint64</tt> |<tt>ulong</tt> |
* |<tt>vx_int64</tt> |<tt>long</tt> |
* |<tt>vx_float32</tt>|<tt>float</tt> |
* |<tt>vx_float64</tt>|<tt>double</tt> |
* |<tt>vx_size</tt> |<tt>size_t</tt> |
*
* \note <tt>size_t</tt> can not be used as a parameter to a <tt>__kernel</tt>.
*/
#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 <OpenCL/OpenCL.h>
#else
#include <CL/cl.h>
#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 <tt>vxAddParameterToKernel</tt> 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 <tt>vxAddParameterToKernel</tt> 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 <tt>__global</tt> 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 <tt>__global</tt> 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 <tt>__global</tt> 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 <tt>short</tt>.
* \param ptr The <tt>__global</tt> 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 <tt>__global</tt> 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 <tt>__global</tt> 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 <tt>__global</tt> 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 <tt>__global</tt> 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 <tt>__global</tt> 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 <tt>__global</tt> 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