#include "perf_precomp.hpp"
#include "opencv2/ts/gpu_perf.hpp"

static const char * impls[] = {
#ifdef HAVE_CUDA
    "cuda",
#endif
#ifdef HAVE_OPENCV_OCL
    "ocl",
#endif
    "plain"
};

#ifdef HAVE_OPENCL
#define DUMP_PROPERTY_XML(propertyName, propertyValue) \
    do { \
        std::stringstream ssName, ssValue;\
        ssName << propertyName;\
        ssValue << propertyValue; \
        ::testing::Test::RecordProperty(ssName.str(), ssValue.str()); \
    } while (false)

#define DUMP_MESSAGE_STDOUT(msg) \
    do { \
        std::cout << msg << std::endl; \
    } while (false)

#include "opencv2/ocl/private/opencl_dumpinfo.hpp"
#endif

int main(int argc, char **argv)
{
    ::perf::TestBase::setPerformanceStrategy(::perf::PERF_STRATEGY_SIMPLE);
#if defined(HAVE_CUDA) && defined(HAVE_OPENCL)
    CV_PERF_TEST_MAIN_INTERNALS(nonfree, impls, perf::printCudaInfo(), dumpOpenCLDevice());
#elif defined(HAVE_CUDA)
    CV_PERF_TEST_MAIN_INTERNALS(nonfree, impls, perf::printCudaInfo());
#elif defined(HAVE_OPENCL)
    CV_PERF_TEST_MAIN_INTERNALS(nonfree, impls, dumpOpenCLDevice());
#else
    CV_PERF_TEST_MAIN_INTERNALS(nonfree, impls)
#endif
}