1// This file is part of OpenCV project.
2// It is subject to the license terms in the LICENSE file found in the top-level directory
3// of this distribution and at http://opencv.org/license.html.
4
5// Copyright (C) 2014, Advanced Micro Devices, Inc., all rights reserved.
6// Third party copyrights are property of their respective owners.
7
8#include "../perf_precomp.hpp"
9#include "opencv2/ts/ocl_perf.hpp"
10
11#ifdef HAVE_OPENCL
12
13namespace cvtest {
14namespace ocl {
15
16///////////// 3 channels Vs 4 ////////////////////////
17
18enum
19{
20    Pure = 0, Split, Convert
21};
22
23CV_ENUM(Modes, Pure, Split, Convert)
24
25typedef tuple <Size, MatType, Modes> _3vs4Params;
26typedef TestBaseWithParam<_3vs4Params> _3vs4_Fixture;
27
28OCL_PERF_TEST_P(_3vs4_Fixture, Resize,
29                ::testing::Combine(OCL_TEST_SIZES, OCL_PERF_ENUM(CV_8UC3, CV_32FC3), Modes::all()))
30{
31    _3vs4Params params = GetParam();
32    const Size srcSize = get<0>(params);
33    const int type = get<1>(params), depth = CV_MAT_DEPTH(type);
34    const int mode = get<2>(params);
35
36    checkDeviceMaxMemoryAllocSize(srcSize, type);
37
38    UMat src(srcSize, type), dst(srcSize, type);
39    declare.in(src, WARMUP_RNG).out(dst);
40
41    if (mode == Pure)
42    {
43        OCL_TEST_CYCLE() resize(src, dst, Size(), 0.5, 0.5, INTER_LINEAR);
44    }
45    else if (mode == Split)
46    {
47        std::vector<UMat> srcs(3), dsts(3);
48
49        for (int i = 0; i < 3; ++i)
50        {
51            dsts[i] = UMat(srcSize, depth);
52            srcs[i] = UMat(srcSize, depth);
53        }
54
55        OCL_TEST_CYCLE()
56        {
57            split(src, srcs);
58
59            for (size_t i = 0; i < srcs.size(); ++i)
60                resize(srcs[i], dsts[i], Size(), 0.5, 0.5, INTER_LINEAR);
61
62            merge(dsts, dst);
63        }
64    }
65    else if (mode == Convert)
66    {
67        int type4 = CV_MAKE_TYPE(depth, 4);
68        UMat src4(srcSize, type4), dst4(srcSize, type4);
69
70        OCL_TEST_CYCLE()
71        {
72            cvtColor(src, src4, COLOR_RGB2RGBA);
73            resize(src4, dst4, Size(), 0.5, 0.5, INTER_LINEAR);
74            cvtColor(dst4, dst, COLOR_RGBA2RGB);
75        }
76    }
77
78    SANITY_CHECK_NOTHING();
79}
80
81OCL_PERF_TEST_P(_3vs4_Fixture, Subtract,
82                ::testing::Combine(OCL_TEST_SIZES, OCL_PERF_ENUM(CV_8UC3, CV_32FC3), Modes::all()))
83{
84    _3vs4Params params = GetParam();
85    const Size srcSize = get<0>(params);
86    const int type = get<1>(params), depth = CV_MAT_DEPTH(type);
87    const int mode = get<2>(params);
88
89    checkDeviceMaxMemoryAllocSize(srcSize, type);
90
91    Scalar s(14);
92    UMat src(srcSize, type), dst(srcSize, type);
93    declare.in(src, WARMUP_RNG).out(dst);
94
95    if (mode == Pure)
96    {
97        OCL_TEST_CYCLE() subtract(src, s, dst);
98    }
99    else if (mode == Split)
100    {
101        std::vector<UMat> srcs(3), dsts(3);
102
103        for (int i = 0; i < 3; ++i)
104        {
105            dsts[i] = UMat(srcSize, depth);
106            srcs[i] = UMat(srcSize, depth);
107        }
108
109        OCL_TEST_CYCLE()
110        {
111            split(src, srcs);
112
113            for (size_t i = 0; i < srcs.size(); ++i)
114                subtract(srcs[i], s, dsts[i]);
115
116            merge(dsts, dst);
117        }
118    }
119    else if (mode == Convert)
120    {
121        int type4 = CV_MAKE_TYPE(depth, 4);
122        UMat src4(srcSize, type4), dst4(srcSize, type4);
123
124        OCL_TEST_CYCLE()
125        {
126            cvtColor(src, src4, COLOR_RGB2RGBA);
127            subtract(src4, s, dst4);
128            cvtColor(dst4, dst, COLOR_RGBA2RGB);
129        }
130    }
131
132    SANITY_CHECK_NOTHING();
133}
134
135} } // namespace cvtest::ocl
136
137#endif // HAVE_OPENCL
138