OpenVX并发数据对象访问
并发数据对象访问
只有当所有访问都是只读的时,才允许使用映射、复制、读取功能,访问OpenVX数据对象,同时执行正在访问相同数据对象的图形。对于Map,Copy具有只读访问模式,而对于图中的节点,则仅将该数据对象作为输入参数。在所有其他情况下,包括写入或读写模式和写入访问功能,以及将数据对象作为输出的图形节点,应用程序必须保证访问不会与图形执行同时执行。这可以通过在调用vxScheduleGraph或vxProcessGraph前,先调用映射后的un-map来实现。此外,在调用Map、Read、Write或Copy前,应用程序必须在vxScheduleGraph后调用vxWaitGraph,以避免受限的并发访问。如果应用程序未能遵守上述规定,则可能会在未经OpenVX框架通知时,遇到实现定义的行为和/或数据丢失。访问从ROI(vxCreateImageFromROI)创建的图像,或从通道(vxCreateImage FromChannel)创建的图像,必须视为访问整个图像。在这方面,设置属性被视为写入数据对象。
2.2.17扩展 OpenVX
除了用户内核之外,供应商还有其他机制来扩展OpenVX中的功能。这些机制不适用于用户内核。每个OpenVX扩展都有一个唯一的标识符,由大写字母、数字和下划线组成,前缀为KHR_,例如KHR_NEW_FEATURE。
1. 扩展属性
在扩展属性时,供应商必须将其从vx_销售方_ID_e分配的ID与相应的宏一起使用,以使用vx_ATTRIBUTE_BASE创建新属性。为某些对象类型扩展新属性的典型机制(例如vx_ID_TI中的vx_node属性)如下所示:
enum {
VX_NODE_TI_NEWTHING = VX_ATTRIBUTE_BASE(VX_ID_TI, VX_TYPE_NODE) + 0x0,
};
某些对象支持 API 设置属性,即使它们的所有属性都是 在OpenVX中指定为只读。这些 API 用于扩展属性。
2.自定义内核
将更多内核添加到提供给 OpenVX 的基本集的供应商,提供表单的标题。
#include <VX/vx_ext_<销售方>.h>
包含以下各项的定义。
每个函数的新节点创建函数原型。
/*! \brief [Graph] 这是ISV或OEM提供的一个示例节点,在Graph中执行以调用XYZ内核。
* \param [in] graph 要在其中实例化节点的图形的句柄。
* \param [in] input 输入图像
* \param [in] value 输入标量值
* \param [out] output 输出图像
* \param [in,out] temp 每个迭代所需的一些数据的临时数组。
* \ingroup group_example_kernel
*/
vx_node vxXYZNode(vx_graph graph, vx_image input, vx_uint32 value, vx_image output, vx_array temp);
每个函数都有一个新的内核枚举和内核字符串。
#define VX_KERNEL_NAME_KHR_XYZ org.khronos.example.xyz
/*! \brief:XYZ示例库集
* \ingroup group_xyz_ext
*/
#define VX_LIBRARY_XYZ (0x3) // 由Khronos分配,供应商自主控制的
/*! \brief:内核列表
* \ingroup group_xyz_ext
*/
enum vx_kernel_xyz_ext_e {
/*! \brief:用户定义的内核示例 */
VX_KERNEL_KHR_XYZ = VX_KERNEL_BASE(VX_ID_DEFAULT, VX_LIBRARY_XYZ) + 0x0,
// 最多可以创建0xFFF内核枚举
};
[可选]每个函数都有一个新的 VXU 函数。
/*! \brief [Immediate] 这是XYZ节点的即时模式版本的一个示例。
* \param [in] context 实现的总体上下文。
* \param [in] input 输入图像
* \param [in] value 输入标量值
* \param [out] output 输出图像
* \param [in,out] temp 每个迭代所需的一些数据的临时数组。
* \ingroup group_example_kernel
*/
vx_status vxuXYZ(vx_context context, vx_image input, vx_uint32 value, vx_image output, vx_array temp);
这应该为扩展的每个新部分提供良好的文档。理想情况下,这些类型的扩展不应要求链接到新对象 以方便使用。
3.供应商自定义扩展
一些扩展会影响基本视觉功能,因此可能对大多数用户不可见。在这种情况下,供应商必须通过上下文上的VX_CONTEXT_extensions属性向基本节点报告支持的扩展。
vx_char *tmp, *extensions = NULL;
vx_size size = 0;
vxQueryContext(context,VX_CONTEXT_EXTENSIONS_SIZE,&size,sizeof(size));
extensions = malloc(size);
vxQueryContext(context,VX_CONTEXT_EXTENSIONS,
extensions, size);
此列表中的扩展依赖于扩展本身;可以具有,也可以不具有报头和新的内核,或框架特征或数据对象。共同的特点是由实现供应商实现和支持。
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号