From e0c986041ee470a4fe6ebbd80b2270c83e8676ff Mon Sep 17 00:00:00 2001 From: HenningJ Date: Mon, 15 Jun 2015 15:47:10 +0200 Subject: [PATCH] Build OpenCL program as soon as the OpenCL device is initialized. Before this, the program was built when the first frame arrives and the following frames were dropped, because building the program takes a while. Now, the program is built before the device is started. When the first frame arrives, it only needs to be initialized, which is quite fast. --- .../src/opencl_depth_packet_processor.cpp | 77 ++++++++++++++----- 1 file changed, 59 insertions(+), 18 deletions(-) diff --git a/examples/protonect/src/opencl_depth_packet_processor.cpp b/examples/protonect/src/opencl_depth_packet_processor.cpp index 6bb48f076..c4d30e767 100644 --- a/examples/protonect/src/opencl_depth_packet_processor.cpp +++ b/examples/protonect/src/opencl_depth_packet_processor.cpp @@ -138,10 +138,14 @@ class OpenCLDepthPacketProcessorImpl cl::Buffer buf_filtered; bool deviceInitialized; + bool programBuilt; bool programInitialized; std::string sourceCode; - OpenCLDepthPacketProcessorImpl(const int deviceId = -1) : deviceInitialized(false), programInitialized(false) + OpenCLDepthPacketProcessorImpl(const int deviceId = -1) + : deviceInitialized(false) + , programBuilt(false) + , programInitialized(false) { newIrFrame(); newDepthFrame(); @@ -350,7 +354,8 @@ class OpenCLDepthPacketProcessorImpl std::cerr << OUT_NAME("init") "ERROR: " << err.what() << "(" << err.err() << ")" << std::endl; throw; } - return true; + + return buildProgram(sourceCode); } bool initProgram() @@ -360,16 +365,13 @@ class OpenCLDepthPacketProcessorImpl return false; } + if (!programBuilt) + if (!buildProgram(sourceCode)) + return false; + cl_int err = CL_SUCCESS; try { - std::string options; - generateOptions(options); - - cl::Program::Sources source(1, std::make_pair(sourceCode.c_str(), sourceCode.length())); - program = cl::Program(context, source); - program.build(options.c_str()); - queue = cl::CommandQueue(context, device, 0, &err); //Read only @@ -454,14 +456,6 @@ class OpenCLDepthPacketProcessorImpl catch(const cl::Error &err) { std::cerr << OUT_NAME("init") "ERROR: " << err.what() << "(" << err.err() << ")" << std::endl; - - if(err.err() == CL_BUILD_PROGRAM_FAILURE) - { - std::cout << OUT_NAME("init") "Build Status: " << program.getBuildInfo(device) << std::endl; - std::cout << OUT_NAME("init") "Build Options:\t" << program.getBuildInfo(device) << std::endl; - std::cout << OUT_NAME("init") "Build Log:\t " << program.getBuildInfo(device) << std::endl; - } - throw; } programInitialized = true; @@ -517,6 +511,38 @@ class OpenCLDepthPacketProcessorImpl return !source.empty(); } + bool buildProgram(const std::string& sources) + { + try + { + std::cout<< OUT_NAME("buildProgram") "building OpenCL program..." <(device) << std::endl; + std::cout << OUT_NAME("buildProgram") "Build Options:\t" << program.getBuildInfo(device) << std::endl; + std::cout << OUT_NAME("buildProgram") "Build Log:\t " << program.getBuildInfo(device) << std::endl; + } + + programBuilt = false; + return false; + } + programBuilt = true; + return true; + } + void startTiming() { timing_current_start = cv::getTickCount(); @@ -578,8 +604,23 @@ OpenCLDepthPacketProcessor::~OpenCLDepthPacketProcessor() void OpenCLDepthPacketProcessor::setConfiguration(const libfreenect2::DepthPacketProcessor::Config &config) { DepthPacketProcessor::setConfiguration(config); + + if ( impl_->config.MaxDepth != config.MaxDepth + || impl_->config.MinDepth != config.MinDepth) + { + // OpenCL program needs to be rebuilt, then reinitialized + impl_->programBuilt = false; + impl_->programInitialized = false; + impl_->buildProgram(impl_->sourceCode); + } + else if (impl_->config.EnableBilateralFilter != config.EnableBilateralFilter + || impl_->config.EnableEdgeAwareFilter != config.EnableEdgeAwareFilter) + { + // OpenCL program only needs to be reinitialized + impl_->programInitialized = false; + } + impl_->config = config; - impl_->programInitialized = false; } void OpenCLDepthPacketProcessor::loadP0TablesFromCommandResponse(unsigned char *buffer, size_t buffer_length)