123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372 |
- /*
- * 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_TILING_H_
- #define _VX_KHR_TILING_H_
- /*!
- * \file
- * \brief The Khronos Extension for User Tiling Functions.
- *
- * \defgroup group_tiling Extension: User Tiling API
- * \brief The Khronos Extension for User Tiling Functions.
- */
- #define OPENVX_KHR_TILING "vx_khr_tiling"
- #if defined(OPENVX_TILING_1_0)
- #undef OPENVX_TILING_1_1
- #endif
- #include <VX/vx.h>
- /* For vx_kernel_input_validate_f and vx_kernel_output_validate_f: */
- #include <VX/vx_compatibility.h>
- /*! \def VX_RESTRICT
- * \brief A platform wrapper for the restrict keyword.
- * \ingroup group_tiling
- */
- #if defined(_WIN32)
- #define VX_RESTRICT
- #else
- #if defined(__cplusplus) || defined(ANDROID)
- #define VX_RESTRICT __restrict
- #else
- #define VX_RESTRICT restrict
- #endif
- #endif
- /*! \brief The User Tiling Function tile block size declaration.
- * \details The author of a User Tiling Kernel will use this structure to define
- * the dimensionality of the tile block.
- * \ingroup group_tiling
- */
- typedef struct _vx_tile_block_size_t {
- vx_int32 width; /*!< \brief Tile block width in pixels. */
- vx_int32 height; /*!< \brief Tile block height in pixels. */
- } vx_tile_block_size_t;
- /*! \brief The User Tiling Function Neighborhood declaration.
- * \details The author of a User Tiling Kernel will use this structure to define
- * the neighborhood surrounding the tile block.
- * \ingroup group_tiling
- */
- typedef struct _vx_neighborhood_size_t {
- vx_int32 left; /*!< \brief Left of the tile block. */
- vx_int32 right; /*!< \brief Right of the tile block. */
- vx_int32 top; /*!< \brief Top of the tile block. */
- vx_int32 bottom; /*!< \brief Bottom of the tile block. */
- } vx_neighborhood_size_t;
- /*! \brief A structure which describes the tile's parent image.
- * \ingroup group_tiling
- */
- typedef struct _vx_image_description_t {
- vx_uint32 width; /*!< \brief Width of the image */
- vx_uint32 height; /*!< \brief Height of the image */
- vx_df_image format; /*!< \brief The <tt>\ref vx_df_image_e</tt> of the image */
- vx_uint32 planes; /*!< \brief The number of planes in the image */
- vx_enum range; /*!< \brief The <tt>\ref vx_channel_range_e</tt> enumeration. */
- vx_enum space; /*!< \brief The <tt>\ref vx_color_space_e</tt> enumeration. */
- } vx_image_description_t;
- /*! \brief The maximum number of planes in a tiled image.
- * \ingroup group_tiling
- */
- #define VX_MAX_TILING_PLANES (4)
- /*! \brief The tile structure declaration.
- * \ingroup group_tiling
- */
- typedef struct _vx_tile_t {
- /*! \brief The array of pointers to the tile's image plane. */
- vx_uint8 * VX_RESTRICT base[VX_MAX_TILING_PLANES];
- /*! \brief The top left X pixel index within the width dimension of the image. */
- vx_uint32 tile_x;
- /*! \brief The top left Y pixel index within the height dimension of the image. */
- vx_uint32 tile_y;
- /*! \brief The array of addressing structure to describe each plane. */
- vx_imagepatch_addressing_t addr[VX_MAX_TILING_PLANES];
- /*! \brief The output block size structure. */
- vx_tile_block_size_t tile_block;
- /*! \brief The neighborhood definition. */
- vx_neighborhood_size_t neighborhood;
- /*! \brief The description and attributes of the image. */
- vx_image_description_t image;
- } vx_tile_t;
- #ifndef VX_TILE_ATTRIBUTES_DEFINITIONS
- /*!
- * \brief The full height of the tile's parent image in pixels.
- * \param [in] ptile The pointer to the \ref vx_tile_t structure.
- * \ingroup group_tiling
- */
- #define vxImageHeight(ptile) ((ptile))->image.height)
- /*!
- * \brief The full width of the tile's parent image in pixels.
- * \param [in] ptile The pointer to the \ref vx_tile_t structure.
- * \ingroup group_tiling
- */
- #define vxImageWidth(ptile) ((ptile))->image.width)
- /*!
- * \brief The offset between the left edge of the image and the left edge of the tile, in pixels.
- * \param [in] ptile The pointer to the \ref vx_tile_t structure.
- * \ingroup group_tiling
- */
- #define vxTileX(ptile) ((ptile)->tile_x)
- /*!
- * \brief The offset between the top edge of the image and the top edge of the tile, in pixels.
- * \param [in] ptile The pointer to the \ref vx_tile_t structure.
- * \ingroup group_tiling
- */
- #define vxTileY(ptile) ((ptile)->tile_y)
- /*!
- * \brief The width of the tile in pixels.
- * \param [in] ptile The pointer to the \ref vx_tile_t structure.
- * \param [in] index The plane index.
- * \ingroup group_tiling
- */
- #define vxTileWidth(ptile, index) ((ptile)->addr[index].dim_x)
- /*!
- * \brief The height of the tile in pixels.
- * \param [in] ptile The pointer to the \ref vx_tile_t structure.
- * \param [in] index The plane index.
- * \ingroup group_tiling
- */
- #define vxTileHeight(ptile, index) ((ptile)->addr[index].dim_y)
- /*!
- * \brief The tile block height.
- * \param [in] ptile The pointer to the \ref vx_tile_t structure.
- * \ingroup group_tiling
- */
- #define vxTileBlockHeight(ptile) ((ptile)->tile_block.height)
- /*!
- * \brief The tile block width.
- * \param [in] ptile The pointer to the \ref vx_tile_t structure.
- * \ingroup group_tiling
- */
- #define vxTileBlockWidth(ptile) ((ptile)->tile_block.width)
- /*!
- * \brief The simple wrapper to access each image's neighborhood -X value.
- * \param [in] ptile The pointer to the \ref vx_tile_t structure.
- * \ingroup group_tiling
- */
- #define vxNeighborhoodLeft(ptile) ((ptile)->neighborhood.left)
- /*!
- * \brief The simple wrapper to access each image's neighborhood +X value.
- * \param [in] ptile The pointer to the \ref vx_tile_t structure.
- * \ingroup group_tiling
- */
- #define vxNeighborhoodRight(ptile) ((ptile)->neighborhood.right)
- /*!
- * \brief The simple wrapper to access each image's neighborhood -Y value.
- * \param [in] ptile The pointer to the \ref vx_tile_t structure.
- * \ingroup group_tiling
- */
- #define vxNeighborhoodTop(ptile) ((ptile)->neighborhood.top)
- /*!
- * \brief The simple wrapper to access each image's neighborhood +Y value.
- * \param [in] ptile The pointer to the \ref vx_tile_t structure.
- * \ingroup group_tiling
- */
- #define vxNeighborhoodBottom(ptile) ((ptile)->neighborhood.bottom)
- #if 0
- /*!
- * \brief The simple wrapper to access each image's stride X value.
- * \param [in] ptile The pointer to the \ref vx_tile_t structure.
- * \ingroup group_tiling
- */
- #define vxStrideSizeX(ptile, index) ((ptile)->addr[index].stride_x)
- /*!
- * \brief The simple wrapper to access each image's stride Y value.
- * \param [in] ptile The pointer to the \ref vx_tile_t structure.
- * \ingroup group_tiling
- */
- #define vxStrideSizeY(ptile, index) ((ptile)->addr[index].stride_y)
- /*!
- * \brief The simple wrapper to access each image's step X value.
- * \param [in] ptile The pointer to the \ref vx_tile_t structure.
- * \ingroup group_tiling
- */
- #define vxStepSizeX(ptile, index) ((ptile)->addr[index].step_x)
- /*!
- * \brief The simple wrapper to access each image's step Y value.
- * \param [in] ptile The pointer to the \ref vx_tile_t structure.
- * \ingroup group_tiling
- */
- #define vxStepSizeY(ptile, index) ((ptile)->addr[index].step_y)
- #endif
- #endif
- /*! \brief The User Kernel Tiling Attributes.
- * \ingroup group_tiling
- */
- enum vx_kernel_attribute_tiling_e {
- /*! \brief This allows a tiling mode kernel to set its input neighborhood. */
- VX_KERNEL_INPUT_NEIGHBORHOOD = VX_ATTRIBUTE_BASE(VX_ID_KHRONOS, VX_TYPE_KERNEL) + 0x7,
- /*! \brief This allows a tiling mode kernel to set its output tile block size. */
- VX_KERNEL_OUTPUT_TILE_BLOCK_SIZE = VX_ATTRIBUTE_BASE(VX_ID_KHRONOS, VX_TYPE_KERNEL) + 0x8,
- /*! \brief This allows the author to set the border mode on the tiling kernel. */
- VX_KERNEL_BORDER = VX_ATTRIBUTE_BASE(VX_ID_KHRONOS, VX_TYPE_KERNEL) + 0x9,
- /*! \brief This determines the per tile memory allocation. */
- VX_KERNEL_TILE_MEMORY_SIZE = VX_ATTRIBUTE_BASE(VX_ID_KHRONOS, VX_TYPE_KERNEL) + 0xA,
- #if defined(OPENVX_TILING_1_1)
- /*! \brief This allows a tiling mode kernel to set its input tile block size. */
- VX_KERNEL_INPUT_TILE_BLOCK_SIZE = VX_ATTRIBUTE_BASE(VX_ID_KHRONOS, VX_TYPE_KERNEL) + 0xB,
- /*! \brief This allows a tiling mode kernel to set its output neighborhood. */
- VX_KERNEL_OUTPUT_NEIGHBORHOOD = VX_ATTRIBUTE_BASE(VX_ID_KHRONOS, VX_TYPE_KERNEL) + 0xC,
- #endif
- };
- /*! \brief The User Node Tiling Attributes.
- * \note These are largely unusable by the tiling function, as it doesn't give you the node reference!
- * \ingroup group_tiling
- */
- enum vx_node_attribute_tiling_e {
- /*! \brief This allows a tiling mode node to get its input neighborhood. */
- VX_NODE_INPUT_NEIGHBORHOOD = VX_ATTRIBUTE_BASE(VX_ID_KHRONOS, VX_TYPE_NODE) + 0xB,
- /*! \brief This allows a tiling mode node to get its output tile block size. */
- VX_NODE_OUTPUT_TILE_BLOCK_SIZE = VX_ATTRIBUTE_BASE(VX_ID_KHRONOS, VX_TYPE_NODE) + 0xC,
- /*! \brief This is the size of the tile local memory area. */
- VX_NODE_TILE_MEMORY_SIZE = VX_ATTRIBUTE_BASE(VX_ID_KHRONOS, VX_TYPE_NODE) + 0xD,
- #if defined(OPENVX_TILING_1_1)
- /*! \brief This allows a tiling mode node to get its input tile block size. */
- VX_NODE_INPUT_TILE_BLOCK_SIZE = VX_ATTRIBUTE_BASE(VX_ID_KHRONOS, VX_TYPE_NODE) + 0xE,
- /*! \brief This allows a tiling mode node to get its output neighborhood. */
- VX_NODE_OUTPUT_NEIGHBORHOOD = VX_ATTRIBUTE_BASE(VX_ID_KHRONOS, VX_TYPE_NODE) + 0xF,
- #endif
- };
- /*! \brief The tiling border mode extensions
- * \ingroup group_tiling
- */
- enum vx_border_tiling_e {
- /*! \brief This value indicates that the author of the tiling kernel wrote
- * code to handle border conditions into the kernel itself. If this mode
- * is set, it can not be overriden by a call to the \ref vxSetNodeAttribute
- * with \ref VX_NODE_BORDER.
- */
- VX_BORDER_MODE_SELF = VX_ENUM_BASE(VX_ID_KHRONOS, VX_ENUM_BORDER) + 0x3,
- };
- /*! \typedef vx_tiling_kernel_f
- * \brief Tiling Kernel function typedef for User Tiling Kernels.
- * \note Tiles may come in any dimension and are not guaranteed to be delivered in
- * any particular order.
- * \param [in] parameters The array abstract pointers to parameters.
- * \param [in] tile_memory The local tile memory pointer if requested, otherwise NULL.
- * \param [in] tile_memory_size The size of the local tile memory, if not requested, 0.
- * \ingroup group_tiling
- */
- #ifdef __cplusplus
- typedef void (*vx_tiling_kernel_f)(void * VX_RESTRICT parameters[],
- void * VX_RESTRICT tile_memory,
- vx_size tile_memory_size);
- #else
- typedef void (*vx_tiling_kernel_f)(void * VX_RESTRICT parameters[VX_RESTRICT],
- void * VX_RESTRICT tile_memory,
- vx_size tile_memory_size);
- #endif
- #ifndef VX_IMAGE_PIXEL_DEFINITION
- /*! \def vxImageOffset
- * \brief Computes the offset within an image.
- * \param [in] ptile The pointer to the \ref vx_tile_t structure.
- * \param [in] i The plane index.
- * \param [in] x The Width Coordinates.
- * \param [in] y The Height Coordinates.
- * \param [in] ox The X offset.
- * \param [in] oy The Y offset.
- * \ingroup group_tiling
- */
- #define vxImageOffset(ptile, i, x, y, ox, oy) \
- ((ptile)->addr[i].stride_y * (vx_int32)(((vx_int32)((oy)+(y)) * (vx_int32)(ptile)->addr[i].scale_y)/(vx_int32)VX_SCALE_UNITY)) + \
- ((ptile)->addr[i].stride_x * (vx_int32)(((vx_int32)((ox)+(x)) * (vx_int32)(ptile)->addr[i].scale_x)/(vx_int32)VX_SCALE_UNITY))
- /*! \def vxImagePixel
- * \brief Accesses an image pixel as a type-cast indexed pointer dereference.
- * \param [in] type The type of the image pixel. Example values are <tt>\ref vx_uint8</tt>, <tt>\ref vx_uint16</tt>, <tt>\ref vx_uint32</tt>, etc.
- * \param [in] ptile The pointer to the \ref vx_tile_t structure.
- * \param [in] i The plane index.
- * \param [in] x The Center Pixel in Width Coordinates.
- * \param [in] y The Center Pixel in Height Coordinates.
- * \param [in] ox The X offset.
- * \param [in] oy The Y offset.
- * \ingroup group_tiling
- */
- #define vxImagePixel(type, ptile, i, x, y, ox, oy) \
- *((type *)(&((vx_uint8 *)(ptile)->base[i])[vxImageOffset(ptile, i, x, y, ox, oy)]))
- #endif
- #ifdef __cplusplus
- extern "C" {
- #endif
- /*! \brief Allows a user to add a tile-able kernel to the OpenVX system.
- * \param [in] context The handle to the implementation context.
- * \param [in] name The string to be used to match the kernel.
- * \param [in] enumeration The enumerated value of the kernel to be used by clients.
- * \param [in] flexible_func_ptr The process-local flexible function pointer to be invoked.
- * \param [in] fast_func_ptr The process-local fast function pointer to be invoked.
- * \param [in] num_params The number of parameters for this kernel.
- * \param [in] input The pointer to a function which will validate the
- * input parameters to this kernel.
- * \param [in] output The pointer to a function which will validate the
- * output parameters to this kernel.
- * \note Tiling Kernels do not have access to any of the normal node attributes listed
- * in \ref vx_node_attribute_e.
- * \post Call <tt>\ref vxAddParameterToKernel</tt> for as many parameters as the function has,
- * then call <tt>\ref vxFinalizeKernel</tt>.
- * \retval 0 Indicates that an error occurred when adding the kernel.
- * Note that the fast or flexible formula, but not both, can be NULL.
- * \ingroup group_tiling
- */
- VX_API_ENTRY vx_kernel VX_API_CALL vxAddTilingKernel(vx_context context,
- vx_char name[VX_MAX_KERNEL_NAME],
- vx_enum enumeration,
- vx_tiling_kernel_f flexible_func_ptr,
- vx_tiling_kernel_f fast_func_ptr,
- vx_uint32 num_params,
- vx_kernel_input_validate_f input,
- vx_kernel_output_validate_f output);
- #ifdef __cplusplus
- }
- #endif
- #endif
|