Hi,
Sorry for my late reply.
I tried to move function nvxSemiGlobalMatching into custom node and profiled it again.
Driver API’s result can be displayed via NVVP.
Could you give it a try?
#include <cmath>
#include <iostream>
#include <sstream>
#include <iomanip>
#include <string>
#include <memory>
#include <NVX/nvx.h>
#include <NVXIO/FrameSource.hpp>
#include <NVXIO/Render.hpp>
enum {
USER_LIBRARY = 0x1,
USER_KERNEL_SIMPLE = VX_KERNEL_BASE(VX_ID_DEFAULT, USER_LIBRARY) + 0x0,
};
vx_status simple_kernel(vx_node node, const vx_reference *parameters, vx_uint32 num)
{
vx_image leftU8 = (vx_image)parameters[0];
vx_image rightU8 = (vx_image)parameters[1];
vx_image disp = (vx_image)parameters[2];
nvxio::ContextGuard context;
vx_status status = nvxuSemiGlobalMatching(context, leftU8, rightU8, disp, 0, 64, 8, 109, 5, 0, 1, 31, 32000, 0, 85, 2);
return VX_SUCCESS;
}
vx_status simple_validate(vx_node node, const vx_reference parameters[], vx_uint32 num, vx_meta_format metas[])
{
return VX_SUCCESS;
}
vx_status registerSimpleKernel(vx_context context)
{
vx_status status = VX_SUCCESS;
vx_kernel kernel = vxAddUserKernel(context, "simple_kernel", USER_KERNEL_SIMPLE, simple_kernel, 3, simple_validate, NULL, NULL);
status = vxGetStatus((vx_reference)kernel);
if (status != VX_SUCCESS)
{
vxAddLogEntry((vx_reference)context, status, "Failed to create Simple Kernel");
return status;
}
status |= vxAddParameterToKernel(kernel, 0, VX_INPUT , VX_TYPE_IMAGE , VX_PARAMETER_STATE_REQUIRED);
status |= vxAddParameterToKernel(kernel, 1, VX_INPUT , VX_TYPE_IMAGE , VX_PARAMETER_STATE_REQUIRED);
status |= vxAddParameterToKernel(kernel, 2, VX_BIDIRECTIONAL , VX_TYPE_IMAGE , VX_PARAMETER_STATE_REQUIRED);
if (status != VX_SUCCESS)
{
vxReleaseKernel(&kernel);
vxAddLogEntry((vx_reference)context, status, "Failed to initialize Simple Kernel parameters");
return VX_FAILURE;
}
status = vxFinalizeKernel(kernel);
if (status != VX_SUCCESS)
{
vxReleaseKernel(&kernel);
vxAddLogEntry((vx_reference)context, status, "Failed to finalize Simple Kernel");
return VX_FAILURE;
}
return status;
}
vx_node SimpleNode(vx_graph graph, vx_image leftU8, vx_image rightU8, vx_image disp)
{
vx_node node = NULL;
vx_context context = vxGetContext((vx_reference)graph);
vx_kernel kernel = vxGetKernelByEnum(context, USER_KERNEL_SIMPLE);
if (vxGetStatus((vx_reference)kernel) == VX_SUCCESS)
{
node = vxCreateGenericNode(graph, kernel);
vxReleaseKernel(&kernel);
if (vxGetStatus((vx_reference)node) == VX_SUCCESS)
{
vxSetParameterByIndex(node, 0, (vx_reference)leftU8);
vxSetParameterByIndex(node, 1, (vx_reference)rightU8);
vxSetParameterByIndex(node, 2, (vx_reference)disp);
}
}
return node;
}
int main(int argc, char** argv)
{
std::string sourceUri = "/home/ubuntu/VisionWorks-1.5-Samples/data/signs.avi";
nvxio::Application &app = nvxio::Application::get();
app.addOption('s', "source", "Input URI", nvxio::OptionHandler::string(&sourceUri));
app.init(argc, argv);
nvxio::ContextGuard context;
registerSimpleKernel(context);
std::unique_ptr<nvxio::FrameSource> source(nvxio::createDefaultFrameSource(context, sourceUri));
source->open();
nvxio::FrameSource::Parameters frameConfig = source->getConfiguration();
vx_image frame = vxCreateImage(context, frameConfig.frameWidth, frameConfig.frameHeight, VX_DF_IMAGE_RGBX);
vx_image leftU8 = vxCreateImage(context, frameConfig.frameWidth, frameConfig.frameHeight, VX_DF_IMAGE_U8);
vx_image rightU8 = vxCreateImage(context, frameConfig.frameWidth, frameConfig.frameHeight, VX_DF_IMAGE_U8);
vx_image disp = vxCreateImage(context, frameConfig.frameWidth, frameConfig.frameHeight, VX_DF_IMAGE_S16);
vx_graph graph = vxCreateGraph(context);
vx_node cvtLeftNode = vxColorConvertNode(graph, frame, leftU8);
vx_node cvtRightNode = vxColorConvertNode(graph, frame, rightU8);
vx_node customNode = SimpleNode(graph, leftU8, rightU8, disp);
while (true)
{
nvxio::FrameSource::FrameStatus status = source->fetch(frame);
if (status != nvxio::FrameSource::OK) break;
NVXIO_SAFE_CALL( vxProcessGraph(graph) );
}
vxReleaseNode(&cvtLeftNode);
vxReleaseNode(&cvtRightNode);
vxReleaseNode(&customNode);
vxReleaseImage(&frame);
vxReleaseImage(&leftU8);
vxReleaseImage(&rightU8);
vxReleaseImage(&disp);
return nvxio::Application::APP_EXIT_CODE_SUCCESS;
}
Maybe this issue is code-related. Could you share you code for us debugging?