1 /*
2 * Copyright (c) 2017-2020 Arm Limited.
3 *
4 * SPDX-License-Identifier: MIT
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to
8 * deal in the Software without restriction, including without limitation the
9 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10 * sell copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in all
14 * copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 * SOFTWARE.
23 */
24 #include "arm_compute/runtime/CL/CLMultiImage.h"
25 #include "arm_compute/runtime/CL/CLTensor.h"
26 #include "arm_compute/runtime/CL/CLTensorAllocator.h"
27 #include "arm_compute/runtime/CL/functions/CLColorConvert.h"
28 #include "tests/CL/CLAccessor.h"
29 #include "tests/datasets/ShapeDatasets.h"
30 #include "tests/framework/Asserts.h"
31 #include "tests/framework/Macros.h"
32 #include "tests/validation/Validation.h"
33 #include "tests/validation/fixtures/ColorConvertFixture.h"
34
35 namespace arm_compute
36 {
37 namespace test
38 {
39 namespace validation
40 {
41 namespace
42 {
43 constexpr AbsoluteTolerance<uint8_t> tolerance_nv(2);
44 constexpr AbsoluteTolerance<uint8_t> tolerance_u8(1);
45
46 // Input data sets
47 const auto RGBDataset = framework::dataset::make("FormatType", { Format::RGB888, Format::RGBA8888 });
48 const auto YUYVDataset = framework::dataset::make("FormatType", { Format::YUYV422, Format::UYVY422 });
49
50 const auto ColorConvert_RGBA_to_RGB = combine(framework::dataset::make("FormatType", { Format::RGBA8888 }),
51 framework::dataset::make("FormatType", { Format::RGB888 }));
52
53 const auto ColorConvert_RGB_to_RGBA = combine(framework::dataset::make("FormatType", { Format::RGB888 }),
54 framework::dataset::make("FormatType", { Format::RGBA8888 }));
55
56 const auto ColorConvert_RGB_to_U8 = combine(framework::dataset::make("FormatType", { Format::RGB888 }),
57 framework::dataset::make("FormatType", { Format::U8 }));
58
59 const auto ColorConvert_YUYV_to_RGBDataset = combine(YUYVDataset,
60 RGBDataset);
61
62 const auto ColorConvert_YUVPlanar_to_RGBDataset = combine(framework::dataset::make("FormatType", { Format::IYUV, Format::NV12, Format::NV21 }),
63 RGBDataset);
64
65 const auto ColorConvert_RGBDataset_to_NVDataset = combine(RGBDataset,
66 framework::dataset::make("FormatType", { Format::NV12, Format::IYUV, Format::YUV444 }));
67
68 const auto ColorConvert_YUYVDataset_to_NVDataset = combine(YUYVDataset,
69 framework::dataset::make("FormatType", { Format::NV12, Format::IYUV }));
70
71 const auto ColorConvert_NVDataset_to_YUVDataset = combine(framework::dataset::make("FormatType", { Format::NV12, Format::NV21 }),
72 framework::dataset::make("FormatType", { Format::IYUV, Format::YUV444 }));
73
74 } // namespace
75
76 TEST_SUITE(CL)
77 TEST_SUITE(ColorConvert)
78
79 template <typename T>
80 using CLColorConvertFixture = ColorConvertValidationFixture<CLMultiImage, CLTensor, CLAccessor, CLColorConvert, T>;
81
82 TEST_SUITE(RGBA)
FIXTURE_DATA_TEST_CASE(RunSmall,CLColorConvertFixture<uint8_t>,framework::DatasetMode::PRECOMMIT,combine (datasets::Small2DShapes (),ColorConvert_RGBA_to_RGB))83 FIXTURE_DATA_TEST_CASE(RunSmall, CLColorConvertFixture<uint8_t>, framework::DatasetMode::PRECOMMIT, combine(datasets::Small2DShapes(), ColorConvert_RGBA_to_RGB))
84 {
85 // Validate output
86 for(unsigned int plane_idx = 0; plane_idx < _dst_num_planes; ++plane_idx)
87 {
88 validate(CLAccessor(*_target.cl_plane(plane_idx)), _reference[plane_idx]);
89 }
90 }
91
FIXTURE_DATA_TEST_CASE(RunLarge,CLColorConvertFixture<uint8_t>,framework::DatasetMode::NIGHTLY,combine (datasets::Large2DShapes (),ColorConvert_RGBA_to_RGB))92 FIXTURE_DATA_TEST_CASE(RunLarge, CLColorConvertFixture<uint8_t>, framework::DatasetMode::NIGHTLY, combine(datasets::Large2DShapes(), ColorConvert_RGBA_to_RGB))
93 {
94 // Validate output
95 for(unsigned int plane_idx = 0; plane_idx < _dst_num_planes; ++plane_idx)
96 {
97 validate(CLAccessor(*_target.cl_plane(plane_idx)), _reference[plane_idx]);
98 }
99 }
100 TEST_SUITE_END()
101
TEST_SUITE(RGB)102 TEST_SUITE(RGB)
103 FIXTURE_DATA_TEST_CASE(RunSmall, CLColorConvertFixture<uint8_t>, framework::DatasetMode::PRECOMMIT, combine(datasets::Small2DShapes(), ColorConvert_RGB_to_RGBA))
104 {
105 // Validate output
106 for(unsigned int plane_idx = 0; plane_idx < _dst_num_planes; ++plane_idx)
107 {
108 validate(CLAccessor(*_target.cl_plane(plane_idx)), _reference[plane_idx]);
109 }
110 }
FIXTURE_DATA_TEST_CASE(RunLarge,CLColorConvertFixture<uint8_t>,framework::DatasetMode::NIGHTLY,combine (datasets::Large2DShapes (),ColorConvert_RGB_to_RGBA))111 FIXTURE_DATA_TEST_CASE(RunLarge, CLColorConvertFixture<uint8_t>, framework::DatasetMode::NIGHTLY, combine(datasets::Large2DShapes(), ColorConvert_RGB_to_RGBA))
112 {
113 // Validate output
114 for(unsigned int plane_idx = 0; plane_idx < _dst_num_planes; ++plane_idx)
115 {
116 validate(CLAccessor(*_target.cl_plane(plane_idx)), _reference[plane_idx]);
117 }
118 }
119 TEST_SUITE_END()
120
TEST_SUITE(RGBtoU8)121 TEST_SUITE(RGBtoU8)
122 FIXTURE_DATA_TEST_CASE(RunSmall, CLColorConvertFixture<uint8_t>, framework::DatasetMode::PRECOMMIT, combine(datasets::Small2DShapes(), ColorConvert_RGB_to_U8))
123 {
124 // Validate output
125 for(unsigned int plane_idx = 0; plane_idx < _dst_num_planes; ++plane_idx)
126 {
127 validate(CLAccessor(*_target.cl_plane(plane_idx)), _reference[plane_idx], tolerance_u8);
128 }
129 }
FIXTURE_DATA_TEST_CASE(RunLarge,CLColorConvertFixture<uint8_t>,framework::DatasetMode::NIGHTLY,combine (datasets::Large2DShapes (),ColorConvert_RGB_to_U8))130 FIXTURE_DATA_TEST_CASE(RunLarge, CLColorConvertFixture<uint8_t>, framework::DatasetMode::NIGHTLY, combine(datasets::Large2DShapes(), ColorConvert_RGB_to_U8))
131 {
132 // Validate output
133 for(unsigned int plane_idx = 0; plane_idx < _dst_num_planes; ++plane_idx)
134 {
135 validate(CLAccessor(*_target.cl_plane(plane_idx)), _reference[plane_idx], tolerance_u8);
136 }
137 }
138 TEST_SUITE_END()
139
TEST_SUITE(YUV)140 TEST_SUITE(YUV)
141 FIXTURE_DATA_TEST_CASE(RunSmall, CLColorConvertFixture<uint8_t>, framework::DatasetMode::PRECOMMIT, combine(datasets::Small2DShapes(), ColorConvert_YUYV_to_RGBDataset))
142 {
143 // Validate output
144 for(unsigned int plane_idx = 0; plane_idx < _dst_num_planes; ++plane_idx)
145 {
146 validate(CLAccessor(*_target.cl_plane(plane_idx)), _reference[plane_idx]);
147 }
148 }
FIXTURE_DATA_TEST_CASE(RunLarge,CLColorConvertFixture<uint8_t>,framework::DatasetMode::NIGHTLY,combine (datasets::Large2DShapes (),ColorConvert_YUYV_to_RGBDataset))149 FIXTURE_DATA_TEST_CASE(RunLarge, CLColorConvertFixture<uint8_t>, framework::DatasetMode::NIGHTLY, combine(datasets::Large2DShapes(), ColorConvert_YUYV_to_RGBDataset))
150 {
151 // Validate output
152 for(unsigned int plane_idx = 0; plane_idx < _dst_num_planes; ++plane_idx)
153 {
154 validate(CLAccessor(*_target.cl_plane(plane_idx)), _reference[plane_idx]);
155 }
156 }
157 TEST_SUITE_END()
158
TEST_SUITE(YUVPlanar)159 TEST_SUITE(YUVPlanar)
160 FIXTURE_DATA_TEST_CASE(RunSmall, CLColorConvertFixture<uint8_t>, framework::DatasetMode::PRECOMMIT, combine(datasets::Small2DShapes(), ColorConvert_YUVPlanar_to_RGBDataset))
161 {
162 // Validate output
163 for(unsigned int plane_idx = 0; plane_idx < _dst_num_planes; ++plane_idx)
164 {
165 validate(CLAccessor(*_target.cl_plane(plane_idx)), _reference[plane_idx]);
166 }
167 }
FIXTURE_DATA_TEST_CASE(RunLarge,CLColorConvertFixture<uint8_t>,framework::DatasetMode::NIGHTLY,combine (datasets::Large2DShapes (),ColorConvert_YUVPlanar_to_RGBDataset))168 FIXTURE_DATA_TEST_CASE(RunLarge, CLColorConvertFixture<uint8_t>, framework::DatasetMode::NIGHTLY, combine(datasets::Large2DShapes(), ColorConvert_YUVPlanar_to_RGBDataset))
169 {
170 // Validate output
171 for(unsigned int plane_idx = 0; plane_idx < _dst_num_planes; ++plane_idx)
172 {
173 validate(CLAccessor(*_target.cl_plane(plane_idx)), _reference[plane_idx]);
174 }
175 }
176 TEST_SUITE_END()
177
TEST_SUITE(NV)178 TEST_SUITE(NV)
179 FIXTURE_DATA_TEST_CASE(RunSmall, CLColorConvertFixture<uint8_t>, framework::DatasetMode::PRECOMMIT, combine(datasets::Small2DShapes(), ColorConvert_RGBDataset_to_NVDataset))
180 {
181 // Validate output
182 for(unsigned int plane_idx = 0; plane_idx < _dst_num_planes; ++plane_idx)
183 {
184 validate(CLAccessor(*_target.cl_plane(plane_idx)), _reference[plane_idx], tolerance_nv);
185 }
186 }
FIXTURE_DATA_TEST_CASE(RunLarge,CLColorConvertFixture<uint8_t>,framework::DatasetMode::NIGHTLY,combine (datasets::Large2DShapes (),ColorConvert_RGBDataset_to_NVDataset))187 FIXTURE_DATA_TEST_CASE(RunLarge, CLColorConvertFixture<uint8_t>, framework::DatasetMode::NIGHTLY, combine(datasets::Large2DShapes(), ColorConvert_RGBDataset_to_NVDataset))
188 {
189 // Validate output
190 for(unsigned int plane_idx = 0; plane_idx < _dst_num_planes; ++plane_idx)
191 {
192 validate(CLAccessor(*_target.cl_plane(plane_idx)), _reference[plane_idx], tolerance_nv);
193 }
194 }
195 TEST_SUITE_END()
196
TEST_SUITE(YUYVtoNV)197 TEST_SUITE(YUYVtoNV)
198 FIXTURE_DATA_TEST_CASE(RunSmall, CLColorConvertFixture<uint8_t>, framework::DatasetMode::PRECOMMIT, combine(datasets::Small2DShapes(), ColorConvert_YUYVDataset_to_NVDataset))
199 {
200 // Validate output
201 for(unsigned int plane_idx = 0; plane_idx < _dst_num_planes; ++plane_idx)
202 {
203 validate(CLAccessor(*_target.cl_plane(plane_idx)), _reference[plane_idx]);
204 }
205 }
FIXTURE_DATA_TEST_CASE(RunLarge,CLColorConvertFixture<uint8_t>,framework::DatasetMode::NIGHTLY,combine (datasets::Large2DShapes (),ColorConvert_YUYVDataset_to_NVDataset))206 FIXTURE_DATA_TEST_CASE(RunLarge, CLColorConvertFixture<uint8_t>, framework::DatasetMode::NIGHTLY, combine(datasets::Large2DShapes(), ColorConvert_YUYVDataset_to_NVDataset))
207 {
208 // Validate output
209 for(unsigned int plane_idx = 0; plane_idx < _dst_num_planes; ++plane_idx)
210 {
211 validate(CLAccessor(*_target.cl_plane(plane_idx)), _reference[plane_idx]);
212 }
213 }
214
215 TEST_SUITE_END()
216
TEST_SUITE(NVtoYUV)217 TEST_SUITE(NVtoYUV)
218 FIXTURE_DATA_TEST_CASE(RunSmall, CLColorConvertFixture<uint8_t>, framework::DatasetMode::PRECOMMIT, combine(datasets::Small2DShapes(), ColorConvert_NVDataset_to_YUVDataset))
219 {
220 // Validate output
221 for(unsigned int plane_idx = 0; plane_idx < _dst_num_planes; ++plane_idx)
222 {
223 validate(CLAccessor(*_target.cl_plane(plane_idx)), _reference[plane_idx]);
224 }
225 }
FIXTURE_DATA_TEST_CASE(RunLarge,CLColorConvertFixture<uint8_t>,framework::DatasetMode::NIGHTLY,combine (datasets::Large2DShapes (),ColorConvert_NVDataset_to_YUVDataset))226 FIXTURE_DATA_TEST_CASE(RunLarge, CLColorConvertFixture<uint8_t>, framework::DatasetMode::NIGHTLY, combine(datasets::Large2DShapes(), ColorConvert_NVDataset_to_YUVDataset))
227 {
228 // Validate output
229 for(unsigned int plane_idx = 0; plane_idx < _dst_num_planes; ++plane_idx)
230 {
231 validate(CLAccessor(*_target.cl_plane(plane_idx)), _reference[plane_idx]);
232 }
233 }
234
235 TEST_SUITE_END()
236
237 TEST_SUITE_END()
238 TEST_SUITE_END()
239 } // namespace validation
240 } // namespace test
241 } // namespace arm_compute
242