blob: c3523c7afc93ce822f99e243a5f3c8f0639c83f7 [file] [log] [blame]
/*
* 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.
*/
#include <math.h>
#include <float.h>
#include <VX/vx.h>
#include <VX/vxu.h>
#include "test_engine/test.h"
TESTCASE(ControlFlow, CT_VXContext, ct_setup_vx_context, 0)
static vx_reference create_reference(vx_context context, vx_enum type)
{
vx_reference ref = 0;
vx_uint8 value = 0;
vx_enum format = VX_DF_IMAGE_U8;
vx_uint32 src_width = 128, src_height = 128;
vx_uint32 img_width = 10, img_height = 10;
vx_enum item_type = VX_TYPE_UINT8;
vx_size capacity = 20;
vx_size levels = 8;
vx_float32 scale = 0.5f;
vx_size bins = 36;
vx_int32 offset = 0;
vx_uint32 range = 360;
vx_enum thresh_type = VX_THRESHOLD_TYPE_BINARY;
vx_size num_items = 100;
vx_size m = 5, n = 5;
vx_size object_array_count = 10;
vx_size convolution_x = 3;
vx_size convolution_y = 3;
vx_scalar scalar = 0;
vx_size tensor_dims_num = 2;
vx_size tensor_dims_length = 8;
vx_size *dims;
switch (type)
{
case VX_TYPE_IMAGE:
ref = (vx_reference)vxCreateImage(context, src_width, src_height, format);
break;
case VX_TYPE_ARRAY:
ref = (vx_reference)vxCreateArray(context, item_type, capacity);
break;
case VX_TYPE_PYRAMID:
ref = (vx_reference)vxCreatePyramid(context, levels, scale, src_width, src_height, format);
break;
case VX_TYPE_SCALAR:
ref = (vx_reference)vxCreateScalar(context, item_type, &value);
break;
case VX_TYPE_MATRIX:
ref = (vx_reference)vxCreateMatrix(context, item_type, m, n);
break;
case VX_TYPE_CONVOLUTION:
ref = (vx_reference)vxCreateConvolution(context, convolution_x, convolution_y);
break;
case VX_TYPE_DISTRIBUTION:
ref = (vx_reference)vxCreateDistribution(context, bins, offset, range);
break;
case VX_TYPE_REMAP:
{
vx_remap remap = vxCreateRemap(context, img_width, img_height, img_width*2, img_height*2);
vx_rectangle_t rect = { 0, 0, img_width*2, img_height*2};
vx_size stride = img_width*2;
vx_size stride_y = sizeof(vx_coordinates2df_t) * (stride);
vx_size size = stride * img_height*2;
vx_coordinates2df_t* ptr_w = malloc(sizeof(vx_coordinates2df_t) * size);
for (vx_size i = 0; i < img_height*2; i++)
{
for (vx_size j = 0; j < img_width*2; j++)
{
vx_coordinates2df_t *coord_ptr = &(ptr_w[i * stride + j]);
coord_ptr->x = (vx_float32)j;
coord_ptr->y = (vx_float32)i;
}
}
vxCopyRemapPatch(remap, &rect, stride_y, ptr_w, VX_TYPE_COORDINATES2DF, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST);
ref = (vx_reference)remap;
free(ptr_w);
break;
}
case VX_TYPE_LUT:
ref = (vx_reference)vxCreateLUT(context, item_type, num_items);
break;
case VX_TYPE_THRESHOLD:
ref = (vx_reference)vxCreateThresholdForImage(context, thresh_type, format, format);
break;
case VX_TYPE_OBJECT_ARRAY:
scalar = vxCreateScalar(context, item_type, &value);
ref = (vx_reference)vxCreateObjectArray(context, (vx_reference)scalar, object_array_count);
vxReleaseScalar(&scalar);
break;
case VX_TYPE_TENSOR:
dims = malloc(tensor_dims_num * sizeof(vx_size));
for(vx_size i = 0; i < tensor_dims_num; i++)
{
dims[i] = tensor_dims_length;
}
ref = (vx_reference)vxCreateTensor(context, tensor_dims_num, dims, VX_TYPE_UINT8, 0);
free(dims);
break;
default:
break;
}
return ref;
}
typedef struct
{
const char* testName;
const char* p;
vx_enum item_type;
} select_arg;
#define ADD_VX_CONTROLFLOW_TYPES(testArgName, nextmacro, ...) \
CT_EXPAND(nextmacro(testArgName "/VX_TYPE_IMAGE", __VA_ARGS__, VX_TYPE_IMAGE)), \
CT_EXPAND(nextmacro(testArgName "/VX_TYPE_SCALAR", __VA_ARGS__, VX_TYPE_SCALAR)), \
CT_EXPAND(nextmacro(testArgName "/VX_TYPE_MATRIX", __VA_ARGS__, VX_TYPE_MATRIX)), \
CT_EXPAND(nextmacro(testArgName "/VX_TYPE_CONVOLUTION", __VA_ARGS__, VX_TYPE_CONVOLUTION)), \
CT_EXPAND(nextmacro(testArgName "/VX_TYPE_DISTRIBUTION", __VA_ARGS__, VX_TYPE_DISTRIBUTION)), \
CT_EXPAND(nextmacro(testArgName "/VX_TYPE_LUT", __VA_ARGS__, VX_TYPE_LUT)),\
CT_EXPAND(nextmacro(testArgName "/VX_TYPE_OBJECT_ARRAY", __VA_ARGS__, VX_TYPE_OBJECT_ARRAY)),\
CT_EXPAND(nextmacro(testArgName "/VX_TYPE_PYRAMID", __VA_ARGS__, VX_TYPE_PYRAMID)),\
CT_EXPAND(nextmacro(testArgName "/VX_TYPE_THRESHOLD", __VA_ARGS__, VX_TYPE_THRESHOLD)),\
CT_EXPAND(nextmacro(testArgName "/VX_TYPE_TENSOR", __VA_ARGS__, VX_TYPE_TENSOR )),\
CT_EXPAND(nextmacro(testArgName "/VX_TYPE_REMAP", __VA_ARGS__, VX_TYPE_REMAP))
#define PARAMETERS \
CT_GENERATE_PARAMETERS("controlflow", ADD_VX_CONTROLFLOW_TYPES, ARG, NULL)
TEST_WITH_ARG(ControlFlow, testSelectNode, select_arg, PARAMETERS)
{
vx_reference true_value = NULL;
vx_reference false_value = NULL;
vx_reference output = NULL;
vx_enum input_type = arg_->item_type;
vx_graph graph = 0;
vx_node node = 0;
vx_scalar scalar_true = 0;
vx_bool bool_true = vx_true_e;
vx_context context = context_->vx_context_;
ASSERT_VX_OBJECT(true_value = create_reference(context, input_type), (enum vx_type_e)input_type);
ASSERT_VX_OBJECT(false_value = create_reference(context, input_type), (enum vx_type_e)input_type);
ASSERT_VX_OBJECT(output = create_reference(context, input_type), (enum vx_type_e)input_type);
ASSERT_VX_OBJECT(scalar_true = vxCreateScalar(context, VX_TYPE_BOOL, &bool_true), VX_TYPE_SCALAR);
ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
ASSERT_VX_OBJECT(node = vxSelectNode(graph, scalar_true, true_value, false_value, output), VX_TYPE_NODE);
VX_CALL(vxVerifyGraph(graph));
VX_CALL(vxProcessGraph(graph));
VX_CALL(vxReleaseNode(&node));
VX_CALL(vxReleaseGraph(&graph));
VX_CALL(vxReleaseReference(&true_value));
VX_CALL(vxReleaseReference(&false_value));
VX_CALL(vxReleaseReference(&output));
VX_CALL(vxReleaseScalar(&scalar_true));
}
typedef union
{
vx_char chr;
vx_int8 s08;
vx_uint8 u08;
vx_int16 s16;
vx_uint16 u16;
vx_int32 s32;
vx_uint32 u32;
vx_int64 s64;
vx_uint64 u64;
vx_float32 f32;
vx_float64 f64;
vx_enum enm;
vx_size size;
vx_df_image fcc;
vx_bool boolean;
vx_uint8 data[8];
} scalar_val;
typedef struct
{
const char* testName;
vx_enum operation;
vx_enum param_a_type;
vx_enum param_b_type;
vx_enum result_type;
const char * a_value;
const char * b_value;
const char * o_check;
} scalar_op_arg;
#define PARAMETERS_SCALAR_OP \
ARG("ControlFlow/AND/BOOL", VX_SCALAR_OP_AND, VX_TYPE_BOOL, VX_TYPE_BOOL, VX_TYPE_BOOL, "0|vx_false_e", "0|vx_false_e", "0|vx_false_e"),\
ARG("ControlFlow/AND/BOOL", VX_SCALAR_OP_AND, VX_TYPE_BOOL, VX_TYPE_BOOL, VX_TYPE_BOOL, "0|vx_false_e", "1|vx_true_e", "0|vx_false_e"),\
ARG("ControlFlow/AND/BOOL", VX_SCALAR_OP_AND, VX_TYPE_BOOL, VX_TYPE_BOOL, VX_TYPE_BOOL, "1|vx_true_e", "0|vx_false_e", "0|vx_false_e"),\
ARG("ControlFlow/AND/BOOL", VX_SCALAR_OP_AND, VX_TYPE_BOOL, VX_TYPE_BOOL, VX_TYPE_BOOL, "1|vx_true_e", "1|vx_true_e", "1|vx_true_e") ,\
ARG("ControlFlow/OR/BOOL", VX_SCALAR_OP_OR, VX_TYPE_BOOL, VX_TYPE_BOOL, VX_TYPE_BOOL, "0|vx_false_e", "0|vx_false_e", "0|vx_false_e"),\
ARG("ControlFlow/OR/BOOL", VX_SCALAR_OP_OR, VX_TYPE_BOOL, VX_TYPE_BOOL, VX_TYPE_BOOL, "0|vx_false_e", "1|vx_true_e", "1|vx_true_e"),\
ARG("ControlFlow/OR/BOOL", VX_SCALAR_OP_OR, VX_TYPE_BOOL, VX_TYPE_BOOL, VX_TYPE_BOOL, "1|vx_true_e", "0|vx_false_e", "1|vx_true_e"),\
ARG("ControlFlow/OR/BOOL", VX_SCALAR_OP_OR, VX_TYPE_BOOL, VX_TYPE_BOOL, VX_TYPE_BOOL, "1|vx_true_e", "1|vx_true_e", "1|vx_true_e"),\
ARG("ControlFlow/XOR/BOOL", VX_SCALAR_OP_XOR, VX_TYPE_BOOL, VX_TYPE_BOOL, VX_TYPE_BOOL, "0|vx_false_e", "0|vx_false_e", "0|vx_false_e"),\
ARG("ControlFlow/XOR/BOOL", VX_SCALAR_OP_XOR, VX_TYPE_BOOL, VX_TYPE_BOOL, VX_TYPE_BOOL, "0|vx_false_e", "1|vx_true_e", "1|vx_true_e"),\
ARG("ControlFlow/XOR/BOOL", VX_SCALAR_OP_XOR, VX_TYPE_BOOL, VX_TYPE_BOOL, VX_TYPE_BOOL, "1|vx_true_e", "0|vx_false_e", "1|vx_true_e"),\
ARG("ControlFlow/XOR/BOOL", VX_SCALAR_OP_XOR, VX_TYPE_BOOL, VX_TYPE_BOOL, VX_TYPE_BOOL, "1|vx_true_e", "1|vx_true_e", "0|vx_false_e"),\
ARG("ControlFlow/NAND/BOOL", VX_SCALAR_OP_NAND, VX_TYPE_BOOL, VX_TYPE_BOOL, VX_TYPE_BOOL, "0|vx_false_e", "0|vx_false_e", "1|vx_true_e"),\
ARG("ControlFlow/NAND/BOOL", VX_SCALAR_OP_NAND, VX_TYPE_BOOL, VX_TYPE_BOOL, VX_TYPE_BOOL, "0|vx_false_e", "1|vx_true_e", "1|vx_true_e"),\
ARG("ControlFlow/NAND/BOOL", VX_SCALAR_OP_NAND, VX_TYPE_BOOL, VX_TYPE_BOOL, VX_TYPE_BOOL, "1|vx_true_e", "0|vx_false_e", "1|vx_true_e"),\
ARG("ControlFlow/NAND/BOOL", VX_SCALAR_OP_NAND, VX_TYPE_BOOL, VX_TYPE_BOOL, VX_TYPE_BOOL, "1|vx_true_e", "1|vx_true_e", "0|vx_false_e"),\
ARG("ControlFlow/EQUAL/INT8", VX_SCALAR_OP_EQUAL, VX_TYPE_INT8, VX_TYPE_INT8, VX_TYPE_BOOL, "-1", "1", "0|vx_false_e"),\
ARG("ControlFlow/EQUAL/INT8", VX_SCALAR_OP_EQUAL, VX_TYPE_INT8, VX_TYPE_INT8, VX_TYPE_BOOL, "1", "1", "1|vx_true_e"),\
ARG("ControlFlow/EQUAL/UINT8", VX_SCALAR_OP_EQUAL, VX_TYPE_UINT8, VX_TYPE_UINT8, VX_TYPE_BOOL, "0", "2", "0|vx_false_e"),\
ARG("ControlFlow/EQUAL/UINT8", VX_SCALAR_OP_EQUAL, VX_TYPE_UINT8, VX_TYPE_UINT8, VX_TYPE_BOOL, "2", "2", "1|vx_true_e"),\
ARG("ControlFlow/EQUAL/INT16", VX_SCALAR_OP_EQUAL, VX_TYPE_INT16, VX_TYPE_INT16, VX_TYPE_BOOL, "-3", "3", "0|vx_false_e"),\
ARG("ControlFlow/EQUAL/INT16", VX_SCALAR_OP_EQUAL, VX_TYPE_INT16, VX_TYPE_INT16, VX_TYPE_BOOL, "3", "3", "1|vx_true_e"),\
ARG("ControlFlow/EQUAL/UINT16", VX_SCALAR_OP_EQUAL, VX_TYPE_UINT16, VX_TYPE_UINT16, VX_TYPE_BOOL, "0", "4", "0|vx_false_e"),\
ARG("ControlFlow/EQUAL/UINT16", VX_SCALAR_OP_EQUAL, VX_TYPE_UINT16, VX_TYPE_UINT16, VX_TYPE_BOOL, "4", "4", "1|vx_true_e"),\
ARG("ControlFlow/EQUAL/INT32", VX_SCALAR_OP_EQUAL, VX_TYPE_INT32, VX_TYPE_INT32, VX_TYPE_BOOL, "-5", "5", "0|vx_false_e"),\
ARG("ControlFlow/EQUAL/INT32", VX_SCALAR_OP_EQUAL, VX_TYPE_INT32, VX_TYPE_INT32, VX_TYPE_BOOL, "5", "5", "1|vx_true_e"),\
ARG("ControlFlow/EQUAL/UINT32", VX_SCALAR_OP_EQUAL, VX_TYPE_UINT32, VX_TYPE_UINT32, VX_TYPE_BOOL, "0", "6", "0|vx_false_e"),\
ARG("ControlFlow/EQUAL/UINT32", VX_SCALAR_OP_EQUAL, VX_TYPE_UINT32, VX_TYPE_UINT32, VX_TYPE_BOOL, "6", "6", "1|vx_true_e"),\
ARG("ControlFlow/EQUAL/SIZE", VX_SCALAR_OP_EQUAL, VX_TYPE_SIZE, VX_TYPE_SIZE, VX_TYPE_BOOL, "-7", "7", "0|vx_false_e"),\
ARG("ControlFlow/EQUAL/SIZE", VX_SCALAR_OP_EQUAL, VX_TYPE_SIZE, VX_TYPE_SIZE, VX_TYPE_BOOL, "7", "7", "1|vx_true_e"),\
ARG("ControlFlow/EQUAL/FLOAT32",VX_SCALAR_OP_EQUAL, VX_TYPE_FLOAT32, VX_TYPE_FLOAT32, VX_TYPE_BOOL, "-1.5f", "1.5f", "0|vx_false_e"),\
ARG("ControlFlow/EQUAL/FLOAT32",VX_SCALAR_OP_EQUAL, VX_TYPE_FLOAT32, VX_TYPE_FLOAT32, VX_TYPE_BOOL, "1.5f", "1.5f", "1|vx_true_e"),\
ARG("ControlFlow/NOTEQUAL/INT8", VX_SCALAR_OP_NOTEQUAL, VX_TYPE_INT8, VX_TYPE_INT8, VX_TYPE_BOOL, "1", "1", "0|vx_false_e"),\
ARG("ControlFlow/NOTEQUAL/UINT8", VX_SCALAR_OP_NOTEQUAL, VX_TYPE_UINT8, VX_TYPE_UINT8, VX_TYPE_BOOL, "2", "2", "0|vx_false_e"),\
ARG("ControlFlow/NOTEQUAL/INT16", VX_SCALAR_OP_NOTEQUAL, VX_TYPE_INT16, VX_TYPE_INT16, VX_TYPE_BOOL, "3", "3", "0|vx_false_e"),\
ARG("ControlFlow/NOTEQUAL/UINT16", VX_SCALAR_OP_NOTEQUAL, VX_TYPE_UINT16, VX_TYPE_UINT16, VX_TYPE_BOOL, "4", "4", "0|vx_false_e"),\
ARG("ControlFlow/NOTEQUAL/INT32", VX_SCALAR_OP_NOTEQUAL, VX_TYPE_INT32, VX_TYPE_INT32, VX_TYPE_BOOL, "5", "5", "0|vx_false_e"),\
ARG("ControlFlow/NOTEQUAL/UINT32", VX_SCALAR_OP_NOTEQUAL, VX_TYPE_UINT32, VX_TYPE_UINT32, VX_TYPE_BOOL, "6", "6", "0|vx_false_e"),\
ARG("ControlFlow/NOTEQUAL/SIZE", VX_SCALAR_OP_NOTEQUAL, VX_TYPE_SIZE, VX_TYPE_SIZE, VX_TYPE_BOOL, "7", "7", "0|vx_false_e"),\
ARG("ControlFlow/NOTEQUAL/FLOAT32",VX_SCALAR_OP_NOTEQUAL, VX_TYPE_FLOAT32, VX_TYPE_FLOAT32, VX_TYPE_BOOL, "1.5f", "1.5f", "0|vx_false_e"),\
ARG("ControlFlow/NOTEQUAL/INT8", VX_SCALAR_OP_NOTEQUAL, VX_TYPE_INT8, VX_TYPE_INT8, VX_TYPE_BOOL, "1", "2", "1|vx_true_e"),\
ARG("ControlFlow/NOTEQUAL/UINT8", VX_SCALAR_OP_NOTEQUAL, VX_TYPE_UINT8, VX_TYPE_UINT8, VX_TYPE_BOOL, "2", "4", "1|vx_true_e"),\
ARG("ControlFlow/NOTEQUAL/INT16", VX_SCALAR_OP_NOTEQUAL, VX_TYPE_INT16, VX_TYPE_INT16, VX_TYPE_BOOL, "3", "5", "1|vx_true_e"),\
ARG("ControlFlow/NOTEQUAL/UINT16", VX_SCALAR_OP_NOTEQUAL, VX_TYPE_UINT16, VX_TYPE_UINT16, VX_TYPE_BOOL, "4", "6", "1|vx_true_e"),\
ARG("ControlFlow/NOTEQUAL/INT32", VX_SCALAR_OP_NOTEQUAL, VX_TYPE_INT32, VX_TYPE_INT32, VX_TYPE_BOOL, "5", "7", "1|vx_true_e"),\
ARG("ControlFlow/NOTEQUAL/UINT32", VX_SCALAR_OP_NOTEQUAL, VX_TYPE_UINT32, VX_TYPE_UINT32, VX_TYPE_BOOL, "6", "7", "1|vx_true_e"),\
ARG("ControlFlow/NOTEQUAL/SIZE", VX_SCALAR_OP_NOTEQUAL, VX_TYPE_SIZE, VX_TYPE_SIZE, VX_TYPE_BOOL, "7", "8", "1|vx_true_e"),\
ARG("ControlFlow/NOTEQUAL/FLOAT32",VX_SCALAR_OP_NOTEQUAL, VX_TYPE_FLOAT32, VX_TYPE_FLOAT32, VX_TYPE_BOOL, "1.5f", "2.5f", "1|vx_true_e"),\
ARG("ControlFlow/LESS/INT8", VX_SCALAR_OP_LESS, VX_TYPE_INT8, VX_TYPE_INT8, VX_TYPE_BOOL, "1", "-2", "0|vx_false_e"),\
ARG("ControlFlow/LESS/UINT8", VX_SCALAR_OP_LESS, VX_TYPE_UINT8, VX_TYPE_UINT8, VX_TYPE_BOOL, "2", "1", "0|vx_false_e"),\
ARG("ControlFlow/LESS/INT16", VX_SCALAR_OP_LESS, VX_TYPE_INT16, VX_TYPE_INT16, VX_TYPE_BOOL, "3", "-5", "0|vx_false_e"),\
ARG("ControlFlow/LESS/UINT16", VX_SCALAR_OP_LESS, VX_TYPE_UINT16, VX_TYPE_UINT16, VX_TYPE_BOOL, "4", "1", "0|vx_false_e"),\
ARG("ControlFlow/LESS/INT32", VX_SCALAR_OP_LESS, VX_TYPE_INT32, VX_TYPE_INT32, VX_TYPE_BOOL, "5", "-7", "0|vx_false_e"),\
ARG("ControlFlow/LESS/UINT32", VX_SCALAR_OP_LESS, VX_TYPE_UINT32, VX_TYPE_UINT32, VX_TYPE_BOOL, "6", "1", "0|vx_false_e"),\
ARG("ControlFlow/LESS/SIZE", VX_SCALAR_OP_LESS, VX_TYPE_SIZE, VX_TYPE_SIZE, VX_TYPE_BOOL, "7", "1", "0|vx_false_e"),\
ARG("ControlFlow/LESS/FLOAT32",VX_SCALAR_OP_LESS, VX_TYPE_FLOAT32, VX_TYPE_FLOAT32, VX_TYPE_BOOL, "1.5f", "-2.5f", "0|vx_false_e"),\
ARG("ControlFlow/LESS/INT8", VX_SCALAR_OP_LESS, VX_TYPE_INT8, VX_TYPE_INT8, VX_TYPE_BOOL, "1", "2", "1|vx_true_e"),\
ARG("ControlFlow/LESS/UINT8", VX_SCALAR_OP_LESS, VX_TYPE_UINT8, VX_TYPE_UINT8, VX_TYPE_BOOL, "2", "4", "1|vx_true_e"),\
ARG("ControlFlow/LESS/INT16", VX_SCALAR_OP_LESS, VX_TYPE_INT16, VX_TYPE_INT16, VX_TYPE_BOOL, "3", "5", "1|vx_true_e"),\
ARG("ControlFlow/LESS/UINT16", VX_SCALAR_OP_LESS, VX_TYPE_UINT16, VX_TYPE_UINT16, VX_TYPE_BOOL, "4", "6", "1|vx_true_e"),\
ARG("ControlFlow/LESS/INT32", VX_SCALAR_OP_LESS, VX_TYPE_INT32, VX_TYPE_INT32, VX_TYPE_BOOL, "5", "7", "1|vx_true_e"),\
ARG("ControlFlow/LESS/UINT32", VX_SCALAR_OP_LESS, VX_TYPE_UINT32, VX_TYPE_UINT32, VX_TYPE_BOOL, "6", "7", "1|vx_true_e"),\
ARG("ControlFlow/LESS/SIZE", VX_SCALAR_OP_LESS, VX_TYPE_SIZE, VX_TYPE_SIZE, VX_TYPE_BOOL, "7", "8", "1|vx_true_e"),\
ARG("ControlFlow/LESS/FLOAT32",VX_SCALAR_OP_LESS, VX_TYPE_FLOAT32, VX_TYPE_FLOAT32, VX_TYPE_BOOL, "1.5f", "2.5f", "1|vx_true_e"),\
ARG("ControlFlow/LESSEQ/INT8", VX_SCALAR_OP_LESSEQ, VX_TYPE_INT8, VX_TYPE_INT8, VX_TYPE_BOOL, "1", "-2", "0|vx_false_e"),\
ARG("ControlFlow/LESSEQ/UINT8", VX_SCALAR_OP_LESSEQ, VX_TYPE_UINT8, VX_TYPE_UINT8, VX_TYPE_BOOL, "2", "0", "0|vx_false_e"),\
ARG("ControlFlow/LESSEQ/INT16", VX_SCALAR_OP_LESSEQ, VX_TYPE_INT16, VX_TYPE_INT16, VX_TYPE_BOOL, "4", "-5", "0|vx_false_e"),\
ARG("ControlFlow/LESSEQ/UINT16", VX_SCALAR_OP_LESSEQ, VX_TYPE_UINT16, VX_TYPE_UINT16, VX_TYPE_BOOL, "5", "0", "0|vx_false_e"),\
ARG("ControlFlow/LESSEQ/INT32", VX_SCALAR_OP_LESSEQ, VX_TYPE_INT32, VX_TYPE_INT32, VX_TYPE_BOOL, "6", "-7", "0|vx_false_e"),\
ARG("ControlFlow/LESSEQ/UINT32", VX_SCALAR_OP_LESSEQ, VX_TYPE_UINT32, VX_TYPE_UINT32, VX_TYPE_BOOL, "7", "0", "0|vx_false_e"),\
ARG("ControlFlow/LESSEQ/SIZE", VX_SCALAR_OP_LESSEQ, VX_TYPE_SIZE, VX_TYPE_SIZE, VX_TYPE_BOOL, "8", "7", "0|vx_false_e"),\
ARG("ControlFlow/LESSEQ/FLOAT32",VX_SCALAR_OP_LESSEQ, VX_TYPE_FLOAT32, VX_TYPE_FLOAT32, VX_TYPE_BOOL, "1.5f", "-1.5f", "0|vx_false_e"),\
ARG("ControlFlow/LESSEQ/INT8", VX_SCALAR_OP_LESSEQ, VX_TYPE_INT8, VX_TYPE_INT8, VX_TYPE_BOOL, "1", "2", "1|vx_true_e"),\
ARG("ControlFlow/LESSEQ/UINT8", VX_SCALAR_OP_LESSEQ, VX_TYPE_UINT8, VX_TYPE_UINT8, VX_TYPE_BOOL, "2", "3", "1|vx_true_e"),\
ARG("ControlFlow/LESSEQ/INT16", VX_SCALAR_OP_LESSEQ, VX_TYPE_INT16, VX_TYPE_INT16, VX_TYPE_BOOL, "4", "5", "1|vx_true_e"),\
ARG("ControlFlow/LESSEQ/UINT16", VX_SCALAR_OP_LESSEQ, VX_TYPE_UINT16, VX_TYPE_UINT16, VX_TYPE_BOOL, "5", "5", "1|vx_true_e"),\
ARG("ControlFlow/LESSEQ/INT32", VX_SCALAR_OP_LESSEQ, VX_TYPE_INT32, VX_TYPE_INT32, VX_TYPE_BOOL, "6", "7", "1|vx_true_e"),\
ARG("ControlFlow/LESSEQ/UINT32", VX_SCALAR_OP_LESSEQ, VX_TYPE_UINT32, VX_TYPE_UINT32, VX_TYPE_BOOL, "7", "8", "1|vx_true_e"),\
ARG("ControlFlow/LESSEQ/SIZE", VX_SCALAR_OP_LESSEQ, VX_TYPE_SIZE, VX_TYPE_SIZE, VX_TYPE_BOOL, "8", "9", "1|vx_true_e"),\
ARG("ControlFlow/LESSEQ/FLOAT32",VX_SCALAR_OP_LESSEQ, VX_TYPE_FLOAT32, VX_TYPE_FLOAT32, VX_TYPE_BOOL, "1.5f", "2.0f", "1|vx_true_e"),\
ARG("ControlFlow/GREATER/INT8", VX_SCALAR_OP_GREATER, VX_TYPE_INT8, VX_TYPE_INT8, VX_TYPE_BOOL, "-2", "1", "0|vx_false_e"),\
ARG("ControlFlow/GREATER/UINT8", VX_SCALAR_OP_GREATER, VX_TYPE_UINT8, VX_TYPE_UINT8, VX_TYPE_BOOL, "0", "2", "0|vx_false_e"),\
ARG("ControlFlow/GREATER/INT16", VX_SCALAR_OP_GREATER, VX_TYPE_INT16, VX_TYPE_INT16, VX_TYPE_BOOL, "-4", "3", "0|vx_false_e"),\
ARG("ControlFlow/GREATER/UINT16", VX_SCALAR_OP_GREATER, VX_TYPE_UINT16, VX_TYPE_UINT16, VX_TYPE_BOOL, "0", "4", "0|vx_false_e"),\
ARG("ControlFlow/GREATER/INT32", VX_SCALAR_OP_GREATER, VX_TYPE_INT32, VX_TYPE_INT32, VX_TYPE_BOOL, "-6", "5", "0|vx_false_e"),\
ARG("ControlFlow/GREATER/UINT32", VX_SCALAR_OP_GREATER, VX_TYPE_UINT32, VX_TYPE_UINT32, VX_TYPE_BOOL, "1", "6", "0|vx_false_e"),\
ARG("ControlFlow/GREATER/SIZE", VX_SCALAR_OP_GREATER, VX_TYPE_SIZE, VX_TYPE_SIZE, VX_TYPE_BOOL, "0", "7", "0|vx_false_e"),\
ARG("ControlFlow/GREATER/FLOAT32",VX_SCALAR_OP_GREATER, VX_TYPE_FLOAT32, VX_TYPE_FLOAT32, VX_TYPE_BOOL, "-2.0f", "1.5f", "0|vx_false_e"),\
ARG("ControlFlow/GREATER/INT8", VX_SCALAR_OP_GREATER, VX_TYPE_INT8, VX_TYPE_INT8, VX_TYPE_BOOL, "2", "1", "1|vx_true_e"),\
ARG("ControlFlow/GREATER/UINT8", VX_SCALAR_OP_GREATER, VX_TYPE_UINT8, VX_TYPE_UINT8, VX_TYPE_BOOL, "3", "2", "1|vx_true_e"),\
ARG("ControlFlow/GREATER/INT16", VX_SCALAR_OP_GREATER, VX_TYPE_INT16, VX_TYPE_INT16, VX_TYPE_BOOL, "4", "3", "1|vx_true_e"),\
ARG("ControlFlow/GREATER/UINT16", VX_SCALAR_OP_GREATER, VX_TYPE_UINT16, VX_TYPE_UINT16, VX_TYPE_BOOL, "5", "4", "1|vx_true_e"),\
ARG("ControlFlow/GREATER/INT32", VX_SCALAR_OP_GREATER, VX_TYPE_INT32, VX_TYPE_INT32, VX_TYPE_BOOL, "6", "5", "1|vx_true_e"),\
ARG("ControlFlow/GREATER/UINT32", VX_SCALAR_OP_GREATER, VX_TYPE_UINT32, VX_TYPE_UINT32, VX_TYPE_BOOL, "7", "6", "1|vx_true_e"),\
ARG("ControlFlow/GREATER/SIZE", VX_SCALAR_OP_GREATER, VX_TYPE_SIZE, VX_TYPE_SIZE, VX_TYPE_BOOL, "8", "7", "1|vx_true_e"),\
ARG("ControlFlow/GREATER/FLOAT32",VX_SCALAR_OP_GREATER, VX_TYPE_FLOAT32, VX_TYPE_FLOAT32, VX_TYPE_BOOL, "2.0f", "1.5f", "1|vx_true_e"),\
ARG("ControlFlow/GREATEREQ/INT8", VX_SCALAR_OP_GREATEREQ, VX_TYPE_INT8, VX_TYPE_INT8, VX_TYPE_BOOL, "-2", "1", "0|vx_false_e"),\
ARG("ControlFlow/GREATEREQ/UINT8", VX_SCALAR_OP_GREATEREQ, VX_TYPE_UINT8, VX_TYPE_UINT8, VX_TYPE_BOOL, "0", "1", "0|vx_false_e"),\
ARG("ControlFlow/GREATEREQ/INT16", VX_SCALAR_OP_GREATEREQ, VX_TYPE_INT16, VX_TYPE_INT16, VX_TYPE_BOOL, "-2", "1", "0|vx_false_e"),\
ARG("ControlFlow/GREATEREQ/UINT16", VX_SCALAR_OP_GREATEREQ, VX_TYPE_UINT16, VX_TYPE_UINT16, VX_TYPE_BOOL, "0", "1", "0|vx_false_e"),\
ARG("ControlFlow/GREATEREQ/INT32", VX_SCALAR_OP_GREATEREQ, VX_TYPE_INT32, VX_TYPE_INT32, VX_TYPE_BOOL, "-2", "1", "0|vx_false_e"),\
ARG("ControlFlow/GREATEREQ/UINT32", VX_SCALAR_OP_GREATEREQ, VX_TYPE_UINT32, VX_TYPE_UINT32, VX_TYPE_BOOL, "0", "1", "0|vx_false_e"),\
ARG("ControlFlow/GREATEREQ/SIZE", VX_SCALAR_OP_GREATEREQ, VX_TYPE_SIZE, VX_TYPE_SIZE, VX_TYPE_BOOL, "0", "1", "0|vx_false_e"),\
ARG("ControlFlow/GREATEREQ/FLOAT32", VX_SCALAR_OP_GREATEREQ, VX_TYPE_FLOAT32, VX_TYPE_FLOAT32, VX_TYPE_BOOL, "0", "1", "0|vx_false_e"),\
ARG("ControlFlow/GREATEREQ/INT8", VX_SCALAR_OP_GREATEREQ, VX_TYPE_INT8, VX_TYPE_INT8, VX_TYPE_BOOL, "-1", "-1", "1|vx_true_e"),\
ARG("ControlFlow/GREATEREQ/UINT8", VX_SCALAR_OP_GREATEREQ, VX_TYPE_UINT8, VX_TYPE_UINT8, VX_TYPE_BOOL, "2", "1", "1|vx_true_e"),\
ARG("ControlFlow/GREATEREQ/INT16", VX_SCALAR_OP_GREATEREQ, VX_TYPE_INT16, VX_TYPE_INT16, VX_TYPE_BOOL, "2", "1", "1|vx_true_e"),\
ARG("ControlFlow/GREATEREQ/UINT16", VX_SCALAR_OP_GREATEREQ, VX_TYPE_UINT16, VX_TYPE_UINT16, VX_TYPE_BOOL, "2", "1", "1|vx_true_e"),\
ARG("ControlFlow/GREATEREQ/INT32", VX_SCALAR_OP_GREATEREQ, VX_TYPE_INT32, VX_TYPE_INT32, VX_TYPE_BOOL, "2", "1", "1|vx_true_e"),\
ARG("ControlFlow/GREATEREQ/UINT32", VX_SCALAR_OP_GREATEREQ, VX_TYPE_UINT32, VX_TYPE_UINT32, VX_TYPE_BOOL, "2", "1", "1|vx_true_e"),\
ARG("ControlFlow/GREATEREQ/SIZE", VX_SCALAR_OP_GREATEREQ, VX_TYPE_SIZE, VX_TYPE_SIZE, VX_TYPE_BOOL, "2", "1", "1|vx_true_e"),\
ARG("ControlFlow/GREATEREQ/FLOAT32", VX_SCALAR_OP_GREATEREQ, VX_TYPE_FLOAT32, VX_TYPE_FLOAT32, VX_TYPE_BOOL, "2.0f", "1.0f", "1|vx_true_e"),\
ARG("ControlFlow/ADD/INT8", VX_SCALAR_OP_ADD, VX_TYPE_INT8, VX_TYPE_INT8, VX_TYPE_INT8, "2", "1", "3"),\
ARG("ControlFlow/ADD/INT8", VX_SCALAR_OP_ADD, VX_TYPE_INT8, VX_TYPE_INT8, VX_TYPE_INT8, "2", "-1", "1"),\
ARG("ControlFlow/ADD/UINT8", VX_SCALAR_OP_ADD, VX_TYPE_UINT8, VX_TYPE_UINT8, VX_TYPE_UINT8, "3", "2", "5"),\
ARG("ControlFlow/ADD/INT16", VX_SCALAR_OP_ADD, VX_TYPE_INT16, VX_TYPE_INT16, VX_TYPE_INT16, "4", "3", "7"),\
ARG("ControlFlow/ADD/INT16", VX_SCALAR_OP_ADD, VX_TYPE_INT16, VX_TYPE_INT16, VX_TYPE_INT16, "4", "-3", "1"),\
ARG("ControlFlow/ADD/UINT16", VX_SCALAR_OP_ADD, VX_TYPE_UINT16, VX_TYPE_UINT16, VX_TYPE_UINT16, "5", "4", "9"),\
ARG("ControlFlow/ADD/INT32", VX_SCALAR_OP_ADD, VX_TYPE_INT32, VX_TYPE_INT32, VX_TYPE_INT32, "6", "5", "11"),\
ARG("ControlFlow/ADD/INT32", VX_SCALAR_OP_ADD, VX_TYPE_INT32, VX_TYPE_INT32, VX_TYPE_INT32, "-6", "5", "-1"),\
ARG("ControlFlow/ADD/UINT32", VX_SCALAR_OP_ADD, VX_TYPE_UINT32, VX_TYPE_UINT32, VX_TYPE_UINT32, "7", "6", "13"),\
ARG("ControlFlow/ADD/SIZE", VX_SCALAR_OP_ADD, VX_TYPE_SIZE, VX_TYPE_SIZE, VX_TYPE_SIZE, "8", "7", "15"),\
ARG("ControlFlow/ADD/FLOAT32",VX_SCALAR_OP_ADD, VX_TYPE_FLOAT32, VX_TYPE_FLOAT32, VX_TYPE_FLOAT32, "-1.5f", "1.0f", "-0.5f"),\
ARG("ControlFlow/SUBTRACT/INT8", VX_SCALAR_OP_SUBTRACT, VX_TYPE_INT8, VX_TYPE_INT8, VX_TYPE_INT8, "2", "1", "1"),\
ARG("ControlFlow/SUBTRACT/UINT8", VX_SCALAR_OP_SUBTRACT, VX_TYPE_UINT8, VX_TYPE_UINT8, VX_TYPE_UINT8, "3", "2", "1"),\
ARG("ControlFlow/SUBTRACT/INT16", VX_SCALAR_OP_SUBTRACT, VX_TYPE_INT16, VX_TYPE_INT16, VX_TYPE_INT16, "4", "3", "1"),\
ARG("ControlFlow/SUBTRACT/UINT16", VX_SCALAR_OP_SUBTRACT, VX_TYPE_UINT16, VX_TYPE_UINT16, VX_TYPE_UINT16, "5", "4", "1"),\
ARG("ControlFlow/SUBTRACT/INT32", VX_SCALAR_OP_SUBTRACT, VX_TYPE_INT32, VX_TYPE_INT32, VX_TYPE_INT32, "6", "5", "1"),\
ARG("ControlFlow/SUBTRACT/UINT32", VX_SCALAR_OP_SUBTRACT, VX_TYPE_UINT32, VX_TYPE_UINT32, VX_TYPE_UINT32, "7", "6", "1"),\
ARG("ControlFlow/SUBTRACT/SIZE", VX_SCALAR_OP_SUBTRACT, VX_TYPE_SIZE, VX_TYPE_SIZE, VX_TYPE_SIZE, "8", "7", "1"),\
ARG("ControlFlow/SUBTRACT/FLOAT32",VX_SCALAR_OP_SUBTRACT, VX_TYPE_FLOAT32, VX_TYPE_FLOAT32, VX_TYPE_FLOAT32, "1.0f", "1.0f", "0.0f"),\
ARG("ControlFlow/MULTIPLY/INT8", VX_SCALAR_OP_MULTIPLY, VX_TYPE_INT8, VX_TYPE_INT8, VX_TYPE_INT8, "2", "2", "4"),\
ARG("ControlFlow/MULTIPLY/UINT8", VX_SCALAR_OP_MULTIPLY, VX_TYPE_UINT8, VX_TYPE_UINT8, VX_TYPE_UINT8, "3", "2", "6"),\
ARG("ControlFlow/MULTIPLY/INT16", VX_SCALAR_OP_MULTIPLY, VX_TYPE_INT16, VX_TYPE_INT16, VX_TYPE_INT16, "4", "2", "8"),\
ARG("ControlFlow/MULTIPLY/UINT16", VX_SCALAR_OP_MULTIPLY, VX_TYPE_UINT16, VX_TYPE_UINT16, VX_TYPE_UINT16, "5", "2", "10"),\
ARG("ControlFlow/MULTIPLY/INT32", VX_SCALAR_OP_MULTIPLY, VX_TYPE_INT32, VX_TYPE_INT32, VX_TYPE_INT32, "6", "2", "12"),\
ARG("ControlFlow/MULTIPLY/UINT32", VX_SCALAR_OP_MULTIPLY, VX_TYPE_UINT32, VX_TYPE_UINT32, VX_TYPE_UINT32, "7", "2", "14"),\
ARG("ControlFlow/MULTIPLY/SIZE", VX_SCALAR_OP_MULTIPLY, VX_TYPE_SIZE, VX_TYPE_SIZE, VX_TYPE_SIZE, "8", "2", "16"),\
ARG("ControlFlow/MULTIPLY/FLOAT32",VX_SCALAR_OP_MULTIPLY, VX_TYPE_FLOAT32, VX_TYPE_FLOAT32, VX_TYPE_FLOAT32, "1.0f", "2.0f", "2.0f"),\
ARG("ControlFlow/MULTIPLY/FLOAT32",VX_SCALAR_OP_MULTIPLY, VX_TYPE_SIZE, VX_TYPE_FLOAT32, VX_TYPE_FLOAT32, "4", "0.5f", "2.0f"),\
ARG("ControlFlow/DIVIDE/INT8", VX_SCALAR_OP_DIVIDE, VX_TYPE_INT8, VX_TYPE_INT8, VX_TYPE_INT8, "4", "2", "2"),\
ARG("ControlFlow/DIVIDE/UINT8", VX_SCALAR_OP_DIVIDE, VX_TYPE_UINT8, VX_TYPE_UINT8, VX_TYPE_UINT8, "6", "3", "2"),\
ARG("ControlFlow/DIVIDE/INT16", VX_SCALAR_OP_DIVIDE, VX_TYPE_INT16, VX_TYPE_INT16, VX_TYPE_INT16, "8", "4", "2"),\
ARG("ControlFlow/DIVIDE/UINT16", VX_SCALAR_OP_DIVIDE, VX_TYPE_UINT16, VX_TYPE_UINT16, VX_TYPE_UINT16, "10", "5", "2"),\
ARG("ControlFlow/DIVIDE/INT32", VX_SCALAR_OP_DIVIDE, VX_TYPE_INT32, VX_TYPE_INT32, VX_TYPE_INT32, "12", "6", "2"),\
ARG("ControlFlow/DIVIDE/UINT32", VX_SCALAR_OP_DIVIDE, VX_TYPE_UINT32, VX_TYPE_UINT32, VX_TYPE_UINT32, "14", "7", "2"),\
ARG("ControlFlow/DIVIDE/SIZE", VX_SCALAR_OP_DIVIDE, VX_TYPE_SIZE, VX_TYPE_SIZE, VX_TYPE_SIZE, "16", "8", "2"),\
ARG("ControlFlow/DIVIDE/FLOAT32",VX_SCALAR_OP_DIVIDE, VX_TYPE_FLOAT32, VX_TYPE_FLOAT32, VX_TYPE_FLOAT32, "1.0f", "2.0f", "0.5f"),\
ARG("ControlFlow/DIVIDE/FLOAT32",VX_SCALAR_OP_DIVIDE, VX_TYPE_SIZE, VX_TYPE_SIZE, VX_TYPE_FLOAT32, "7", "2", "3"),\
ARG("ControlFlow/MODULUS/INT8", VX_SCALAR_OP_MODULUS, VX_TYPE_INT8, VX_TYPE_INT8, VX_TYPE_INT8, "5", "2", "1"),\
ARG("ControlFlow/MODULUS/UINT8", VX_SCALAR_OP_MODULUS, VX_TYPE_UINT8, VX_TYPE_UINT8, VX_TYPE_UINT8, "8", "3", "2"),\
ARG("ControlFlow/MODULUS/INT16", VX_SCALAR_OP_MODULUS, VX_TYPE_INT16, VX_TYPE_INT16, VX_TYPE_INT16, "8", "4", "0"),\
ARG("ControlFlow/MODULUS/UINT16", VX_SCALAR_OP_MODULUS, VX_TYPE_UINT16, VX_TYPE_UINT16, VX_TYPE_UINT16, "10", "6", "4"),\
ARG("ControlFlow/MODULUS/INT32", VX_SCALAR_OP_MODULUS, VX_TYPE_INT32, VX_TYPE_INT32, VX_TYPE_INT32, "12", "7", "5"),\
ARG("ControlFlow/MODULUS/UINT32", VX_SCALAR_OP_MODULUS, VX_TYPE_UINT32, VX_TYPE_UINT32, VX_TYPE_UINT32, "14", "13", "1"),\
ARG("ControlFlow/MIN/INT8", VX_SCALAR_OP_MIN, VX_TYPE_INT8, VX_TYPE_INT8, VX_TYPE_INT8, "4", "-2", "-2"),\
ARG("ControlFlow/MIN/UINT8", VX_SCALAR_OP_MIN, VX_TYPE_UINT8, VX_TYPE_UINT8, VX_TYPE_UINT8, "6", "3", "3"),\
ARG("ControlFlow/MIN/INT16", VX_SCALAR_OP_MIN, VX_TYPE_INT16, VX_TYPE_INT16, VX_TYPE_INT16, "8", "4", "4"),\
ARG("ControlFlow/MIN/UINT16", VX_SCALAR_OP_MIN, VX_TYPE_UINT16, VX_TYPE_UINT16, VX_TYPE_UINT16, "10", "5", "5"),\
ARG("ControlFlow/MIN/INT32", VX_SCALAR_OP_MIN, VX_TYPE_INT32, VX_TYPE_INT32, VX_TYPE_INT32, "12", "6", "6"),\
ARG("ControlFlow/MIN/UINT32", VX_SCALAR_OP_MIN, VX_TYPE_UINT32, VX_TYPE_UINT32, VX_TYPE_UINT32, "14", "7", "7"),\
ARG("ControlFlow/MIN/SIZE", VX_SCALAR_OP_MIN, VX_TYPE_SIZE, VX_TYPE_SIZE, VX_TYPE_SIZE, "16", "8", "8"),\
ARG("ControlFlow/MIN/FLOAT32",VX_SCALAR_OP_MIN, VX_TYPE_FLOAT32, VX_TYPE_FLOAT32, VX_TYPE_FLOAT32, "2.0f", "-1.0f", "-1.0f"),\
ARG("ControlFlow/MIN/FLOAT32",VX_SCALAR_OP_MIN, VX_TYPE_FLOAT32, VX_TYPE_INT32, VX_TYPE_INT32, "7.1f", "7", "7"),\
ARG("ControlFlow/MIN/FLOAT32",VX_SCALAR_OP_MIN, VX_TYPE_FLOAT32, VX_TYPE_UINT32, VX_TYPE_UINT32, "0.5f", "1", "0"),\
ARG("ControlFlow/MAX_INT8", VX_SCALAR_OP_MAX, VX_TYPE_INT8, VX_TYPE_INT8, VX_TYPE_INT8, "4", "2", "4"),\
ARG("ControlFlow/MAX_UINT8", VX_SCALAR_OP_MAX, VX_TYPE_UINT8, VX_TYPE_UINT8, VX_TYPE_UINT8, "6", "3", "6"),\
ARG("ControlFlow/MAX_INT16", VX_SCALAR_OP_MAX, VX_TYPE_INT16, VX_TYPE_INT16, VX_TYPE_INT16, "8", "4", "8"),\
ARG("ControlFlow/MAX_UINT16", VX_SCALAR_OP_MAX, VX_TYPE_UINT16, VX_TYPE_UINT16, VX_TYPE_UINT16, "10", "5", "10"),\
ARG("ControlFlow/MAX_INT32", VX_SCALAR_OP_MAX, VX_TYPE_INT32, VX_TYPE_INT32, VX_TYPE_INT32, "12", "-6", "12"),\
ARG("ControlFlow/MAX_UINT32", VX_SCALAR_OP_MAX, VX_TYPE_UINT32, VX_TYPE_UINT32, VX_TYPE_UINT32, "14", "7", "14"),\
ARG("ControlFlow/MAX_SIZE", VX_SCALAR_OP_MAX, VX_TYPE_SIZE, VX_TYPE_SIZE, VX_TYPE_SIZE, "16", "8", "16"),\
ARG("ControlFlow/MAX/FLOAT32",VX_SCALAR_OP_MAX, VX_TYPE_FLOAT32, VX_TYPE_FLOAT32, VX_TYPE_FLOAT32, "2.0f", "1.0f", "2.0f"),\
ARG("ControlFlow/MAX/FLOAT32",VX_SCALAR_OP_MAX, VX_TYPE_FLOAT32, VX_TYPE_UINT32, VX_TYPE_UINT32, "2.99f", "3", "3"),\
ARG("ControlFlow/MAX/FLOAT32",VX_SCALAR_OP_MAX, VX_TYPE_FLOAT32, VX_TYPE_INT32, VX_TYPE_FLOAT32, "2.99f","-3", "2.99f"),\
static vx_status ReadValueFromString(const char * str, vx_enum type, scalar_val * val)
{
vx_status status = VX_SUCCESS;
switch (type)
{
case VX_TYPE_CHAR:
val->chr = atoi(str);
break;
case VX_TYPE_INT8:
val->s08 = atoi(str);
break;
case VX_TYPE_UINT8:
val->u08 = atoi(str);
break;
case VX_TYPE_INT16:
val->s16 = atoi(str);
break;
case VX_TYPE_UINT16:
val->u16 = atoi(str);
break;
case VX_TYPE_INT32:
val->s32 = atoi(str);
break;
case VX_TYPE_UINT32:
val->u32 = atoi(str);
break;
case VX_TYPE_INT64:
val->s64 = atoi(str);
break;
case VX_TYPE_UINT64:
val->u64 = atoi(str);
break;
case VX_TYPE_FLOAT32:
val->f32 = atof(str);
break;
case VX_TYPE_SIZE:
val->size = atoi(str);
break;
case VX_TYPE_BOOL:
val->boolean = atoi(str) ? vx_true_e : vx_false_e;
break;
default:
status = VX_ERROR_INVALID_TYPE;
break;
}
return status;
}
TEST_WITH_ARG(ControlFlow, testScalarOperationNode, scalar_op_arg, PARAMETERS_SCALAR_OP)
{
vx_node node = 0;
vx_graph graph = 0;
vx_scalar a = 0, b = 0, o = 0;
vx_context context = context_->vx_context_;
vx_enum param_a_type = arg_->param_a_type;
vx_enum param_b_type = arg_->param_b_type;
vx_enum operation = arg_->operation;
vx_enum result_type = arg_->result_type;
scalar_val a_value;
scalar_val b_value;
scalar_val o_check;
scalar_val o_value;
VX_CALL(ReadValueFromString(arg_->a_value, arg_->param_a_type, &a_value));
VX_CALL(ReadValueFromString(arg_->b_value, arg_->param_b_type, &b_value));
VX_CALL(ReadValueFromString(arg_->o_check, arg_->result_type, &o_check));
graph = vxCreateGraph(context);
ASSERT_VX_OBJECT(graph, VX_TYPE_GRAPH);
ASSERT_VX_OBJECT(a = vxCreateScalar(context, param_a_type, &a_value), VX_TYPE_SCALAR);
ASSERT_VX_OBJECT(b = vxCreateScalar(context, param_b_type, &b_value), VX_TYPE_SCALAR);
ASSERT_VX_OBJECT(o = vxCreateScalar(context, result_type, &o_value), VX_TYPE_SCALAR);
ASSERT_VX_OBJECT(node = vxScalarOperationNode(graph, operation , a, b, o), VX_TYPE_NODE);
VX_CALL(vxVerifyGraph(graph));
VX_CALL(vxProcessGraph(graph));
switch (result_type)
{
case VX_TYPE_CHAR:
VX_CALL(vxReadScalarValue(o, &o_value.chr));
ASSERT_EQ_INT(o_check.chr, o_value.chr);
break;
case VX_TYPE_INT8:
VX_CALL(vxReadScalarValue(o, &o_value.s08));
ASSERT_EQ_INT(o_check.s08, o_value.s08);
break;
case VX_TYPE_UINT8:
VX_CALL(vxReadScalarValue(o, &o_value.u08));
ASSERT_EQ_INT(o_check.u08, o_value.u08);
break;
case VX_TYPE_INT16:
VX_CALL(vxReadScalarValue(o, &o_value.s16));
ASSERT_EQ_INT(o_check.s16, o_value.s16);
break;
case VX_TYPE_UINT16:
VX_CALL(vxReadScalarValue(o, &o_value.u16));
ASSERT_EQ_INT(o_check.u16, o_value.u16);
break;
case VX_TYPE_INT32:
VX_CALL(vxReadScalarValue(o, &o_value.s32));
ASSERT_EQ_INT(o_check.s32, o_value.s32);
break;
case VX_TYPE_UINT32:
VX_CALL(vxReadScalarValue(o, &o_value.u32));
ASSERT_EQ_INT(o_check.u32, o_value.u32);
break;
case VX_TYPE_INT64:
VX_CALL(vxReadScalarValue(o, &o_value.s64));
ASSERT_EQ_INT(o_check.s64, o_value.s64);
break;
case VX_TYPE_UINT64:
VX_CALL(vxReadScalarValue(o, &o_value.u64));
ASSERT_EQ_INT(o_check.u64, o_value.u64);
break;
case VX_TYPE_FLOAT32:
VX_CALL(vxReadScalarValue(o, &o_value.f32));
ASSERT(fabs(o_check.f32 - o_value.f32) < 0.000001f);
break;
case VX_TYPE_SIZE:
VX_CALL(vxReadScalarValue(o, &o_value.size));
ASSERT_EQ_INT(o_check.size, o_value.size);
break;
case VX_TYPE_BOOL:
VX_CALL(vxReadScalarValue(o, &o_value.boolean));
ASSERT_EQ_INT(o_check.boolean, o_value.boolean);
break;
default:
FAIL("Unsupported type: (%.4s)", &result_type);
break;
}
VX_CALL(vxReleaseScalar(&a));
VX_CALL(vxReleaseScalar(&b));
VX_CALL(vxReleaseScalar(&o));
VX_CALL(vxReleaseNode(&node));
VX_CALL(vxReleaseGraph(&graph));
ASSERT(b == 0);
ASSERT(a == 0);
ASSERT(o == 0);
ASSERT(node == 0);
ASSERT(graph == 0);
}
TESTCASE_TESTS(ControlFlow, testSelectNode, testScalarOperationNode)