blob: a77764ca8fb35fa840b9b9e3739bbb6cd478b327 [file] [log] [blame]
Chia-I Wu6170c9e2014-12-08 14:30:10 +08001// XGL tests
Chia-I Wucb67c652014-10-21 11:06:26 +08002//
Chia-I Wu6170c9e2014-12-08 14:30:10 +08003// Copyright (C) 2014 LunarG, Inc.
Chia-I Wucb67c652014-10-21 11:06:26 +08004//
Chia-I Wu6170c9e2014-12-08 14:30:10 +08005// Permission is hereby granted, free of charge, to any person obtaining a
6// copy of this software and associated documentation files (the "Software"),
7// to deal in the Software without restriction, including without limitation
8// the rights to use, copy, modify, merge, publish, distribute, sublicense,
9// and/or sell copies of the Software, and to permit persons to whom the
10// Software is furnished to do so, subject to the following conditions:
Chia-I Wucb67c652014-10-21 11:06:26 +080011//
Chia-I Wu6170c9e2014-12-08 14:30:10 +080012// The above copyright notice and this permission notice shall be included
13// in all copies or substantial portions of the Software.
Chia-I Wucb67c652014-10-21 11:06:26 +080014//
Chia-I Wu6170c9e2014-12-08 14:30:10 +080015// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21// DEALINGS IN THE SOFTWARE.
Chia-I Wucb67c652014-10-21 11:06:26 +080022
23// Blit (copy, clear, and resolve) tests
24
Chia-I Wu9dac52d2014-12-27 22:04:00 +080025#include "test_common.h"
26#include "xgltestbinding.h"
Chia-I Wucb67c652014-10-21 11:06:26 +080027
28#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
29
Chia-I Wu6170c9e2014-12-08 14:30:10 +080030namespace xgl_testing {
Chia-I Wucb67c652014-10-21 11:06:26 +080031
Chia-I Wu9dac52d2014-12-27 22:04:00 +080032typedef GpuMemory Buffer;
Chia-I Wucb67c652014-10-21 11:06:26 +080033
Chia-I Wu6170c9e2014-12-08 14:30:10 +080034XGL_SIZE get_format_size(XGL_FORMAT format);
Chia-I Wu6170c9e2014-12-08 14:30:10 +080035
36class Environment : public ::testing::Environment {
37public:
38 Environment();
39
40 bool parse_args(int argc, char **argv);
Chia-I Wucb67c652014-10-21 11:06:26 +080041
42 virtual void SetUp();
43 virtual void TearDown();
44
Chia-I Wu6170c9e2014-12-08 14:30:10 +080045 const std::vector<Device *> &devices() { return devs_; }
46 Device &default_device() { return *(devs_[default_dev_]); }
Chia-I Wucb67c652014-10-21 11:06:26 +080047
Chia-I Wu6170c9e2014-12-08 14:30:10 +080048private:
49 XGL_APPLICATION_INFO app_;
50 int default_dev_;
Chia-I Wucb67c652014-10-21 11:06:26 +080051
Chia-I Wu6170c9e2014-12-08 14:30:10 +080052 std::vector<Device *> devs_;
Chia-I Wucb67c652014-10-21 11:06:26 +080053};
54
Chia-I Wu6170c9e2014-12-08 14:30:10 +080055class ImageChecker {
56public:
57 explicit ImageChecker(const XGL_IMAGE_CREATE_INFO &info, const std::vector<XGL_MEMORY_IMAGE_COPY> &regions)
58 : info_(info), regions_(regions), pattern_(HASH) {}
59 explicit ImageChecker(const XGL_IMAGE_CREATE_INFO &info, const std::vector<XGL_IMAGE_SUBRESOURCE_RANGE> &ranges);
60 explicit ImageChecker(const XGL_IMAGE_CREATE_INFO &info);
61
62 void set_solid_pattern(const std::vector<uint8_t> &solid);
63
64 XGL_GPU_SIZE buffer_size() const;
65 bool fill(Buffer &buf) const { return walk(FILL, buf); }
66 bool fill(Image &img) const { return walk(FILL, img); }
67 bool check(Buffer &buf) const { return walk(CHECK, buf); }
68 bool check(Image &img) const { return walk(CHECK, img); }
69
70 const std::vector<XGL_MEMORY_IMAGE_COPY> &regions() const { return regions_; }
71
72 static void hash_salt_generate() { hash_salt_++; }
73
74private:
75 enum Action {
76 FILL,
77 CHECK,
78 };
79
80 enum Pattern {
81 HASH,
82 SOLID,
83 };
84
85 XGL_SIZE buffer_cpp() const;
86 XGL_SUBRESOURCE_LAYOUT buffer_layout(const XGL_MEMORY_IMAGE_COPY &region) const;
87
88 bool walk(Action action, Buffer &buf) const;
89 bool walk(Action action, Image &img) const;
90 bool walk_region(Action action, const XGL_MEMORY_IMAGE_COPY &region, const XGL_SUBRESOURCE_LAYOUT &layout, void *data) const;
91
92 std::vector<uint8_t> pattern_hash(const XGL_IMAGE_SUBRESOURCE &subres, const XGL_OFFSET3D &offset) const;
93
94 static uint32_t hash_salt_;
95
96 XGL_IMAGE_CREATE_INFO info_;
97 std::vector<XGL_MEMORY_IMAGE_COPY> regions_;
98
99 Pattern pattern_;
100 std::vector<uint8_t> pattern_solid_;
101};
102
103Environment::Environment() :
104 default_dev_(0)
Chia-I Wucb67c652014-10-21 11:06:26 +0800105{
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800106 app_.sType = XGL_STRUCTURE_TYPE_APPLICATION_INFO;
Chia-I Wu7461fcf2014-12-27 15:16:07 +0800107 app_.pAppName = "xgl_testing";
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800108 app_.appVersion = 1;
Chia-I Wu7461fcf2014-12-27 15:16:07 +0800109 app_.pEngineName = "xgl_testing";
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800110 app_.engineVersion = 1;
111 app_.apiVersion = XGL_MAKE_VERSION(0, 22, 0);
112}
113
114bool Environment::parse_args(int argc, char **argv)
115{
116 int i;
117
118 for (i = 1; i < argc; i++) {
119#define ARG(name) (strcmp(argv[i], name) == 0)
120#define ARG_P(name) (i < argc - 1 && ARG(name))
121 if (ARG_P("--gpu")) {
122 default_dev_ = atoi(argv[++i]);
123 } else {
124 break;
125 }
126#undef ARG
127#undef ARG_P
128 }
129
130 if (i < argc) {
131 std::cout <<
132 "invalid argument: " << argv[i] << "\n\n" <<
133 "Usage: " << argv[0] << " <options>\n\n" <<
134 "Options:\n"
135 " --gpu <n> Use GPU<n> as the default GPU\n";
136
137 return false;
138 }
139
140 return true;
141}
142
143void Environment::SetUp()
144{
145 XGL_PHYSICAL_GPU gpus[XGL_MAX_PHYSICAL_GPUS];
Chia-I Wucb67c652014-10-21 11:06:26 +0800146 XGL_UINT count;
147 XGL_RESULT err;
148
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800149 err = xglInitAndEnumerateGpus(&app_, NULL, ARRAY_SIZE(gpus), &count, gpus);
150 ASSERT_EQ(XGL_SUCCESS, err);
151 ASSERT_GT(count, default_dev_);
Chia-I Wucb67c652014-10-21 11:06:26 +0800152
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800153 devs_.reserve(count);
154 for (XGL_UINT i = 0; i < count; i++) {
155 devs_.push_back(new Device(gpus[i]));
156 if (i == default_dev_) {
Chia-I Wu9dac52d2014-12-27 22:04:00 +0800157 devs_[i]->init();
158 ASSERT_NE(true, devs_[i]->graphics_queues().empty());
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800159 }
160 }
Chia-I Wucb67c652014-10-21 11:06:26 +0800161}
162
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800163void Environment::TearDown()
Chia-I Wucb67c652014-10-21 11:06:26 +0800164{
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800165 // destroy devices first
166 for (std::vector<Device *>::iterator it = devs_.begin(); it != devs_.end(); it++)
167 delete *it;
168 devs_.clear();
Chia-I Wucb67c652014-10-21 11:06:26 +0800169
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800170 XGL_UINT dummy_count;
171 xglInitAndEnumerateGpus(&app_, NULL, 0, &dummy_count, NULL);
Chia-I Wucb67c652014-10-21 11:06:26 +0800172}
173
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800174uint32_t ImageChecker::hash_salt_;
175
176ImageChecker::ImageChecker(const XGL_IMAGE_CREATE_INFO &info)
177 : info_(info), regions_(), pattern_(HASH)
178{
179 // create a region for every mip level in array slice 0
180 XGL_GPU_SIZE offset = 0;
181 for (XGL_UINT lv = 0; lv < info_.mipLevels; lv++) {
182 XGL_MEMORY_IMAGE_COPY region = {};
183
184 region.memOffset = offset;
185 region.imageSubresource.mipLevel = lv;
186 region.imageSubresource.arraySlice = 0;
Chia-I Wu9dac52d2014-12-27 22:04:00 +0800187 region.imageExtent = Image::extent(info_.extent, lv);
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800188
189 if (info_.usage & XGL_IMAGE_USAGE_DEPTH_STENCIL_BIT) {
190 if (info_.format.channelFormat != XGL_CH_FMT_R8) {
191 region.imageSubresource.aspect = XGL_IMAGE_ASPECT_DEPTH;
192 regions_.push_back(region);
193 }
194
195 if (info_.format.channelFormat == XGL_CH_FMT_R16G8 ||
196 info_.format.channelFormat == XGL_CH_FMT_R32G8 ||
197 info_.format.channelFormat == XGL_CH_FMT_R8) {
198 region.imageSubresource.aspect = XGL_IMAGE_ASPECT_STENCIL;
199 regions_.push_back(region);
200 }
Chia-I Wucb67c652014-10-21 11:06:26 +0800201 } else {
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800202 region.imageSubresource.aspect = XGL_IMAGE_ASPECT_COLOR;
203 regions_.push_back(region);
204 }
205
206 offset += buffer_layout(region).size;
207 }
208
209 // arraySize should be limited in our tests. If this proves to be an
210 // issue, we can store only the regions for array slice 0 and be smart.
211 if (info_.arraySize > 1) {
212 const XGL_GPU_SIZE slice_pitch = offset;
213 const XGL_UINT slice_region_count = regions_.size();
214
215 regions_.reserve(slice_region_count * info_.arraySize);
216
217 for (XGL_UINT slice = 1; slice < info_.arraySize; slice++) {
218 for (XGL_UINT i = 0; i < slice_region_count; i++) {
219 XGL_MEMORY_IMAGE_COPY region = regions_[i];
220
221 region.memOffset += slice_pitch * slice;
222 region.imageSubresource.arraySlice = slice;
223 regions_.push_back(region);
224 }
225 }
226 }
227}
228
229ImageChecker::ImageChecker(const XGL_IMAGE_CREATE_INFO &info, const std::vector<XGL_IMAGE_SUBRESOURCE_RANGE> &ranges)
230 : info_(info), regions_(), pattern_(HASH)
231{
232 XGL_GPU_SIZE offset = 0;
233 for (std::vector<XGL_IMAGE_SUBRESOURCE_RANGE>::const_iterator it = ranges.begin();
234 it != ranges.end(); it++) {
235 for (XGL_UINT lv = 0; lv < it->mipLevels; lv++) {
236 for (XGL_UINT slice = 0; slice < it->arraySize; slice++) {
237 XGL_MEMORY_IMAGE_COPY region = {};
238 region.memOffset = offset;
239 region.imageSubresource = Image::subresource(*it, lv, slice);
Chia-I Wu9dac52d2014-12-27 22:04:00 +0800240 region.imageExtent = Image::extent(info_.extent, lv);
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800241
242 regions_.push_back(region);
243
244 offset += buffer_layout(region).size;
245 }
246 }
247 }
248}
249
250void ImageChecker::set_solid_pattern(const std::vector<uint8_t> &solid)
251{
252 pattern_ = SOLID;
Chia-I Wu4dce6af2014-12-21 14:59:04 +0800253 pattern_solid_.clear();
254 pattern_solid_.reserve(buffer_cpp());
255 for (int i = 0; i < buffer_cpp(); i++)
256 pattern_solid_.push_back(solid[i % solid.size()]);
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800257}
258
259XGL_SIZE ImageChecker::buffer_cpp() const
260{
261 return get_format_size(info_.format);
262}
263
264XGL_SUBRESOURCE_LAYOUT ImageChecker::buffer_layout(const XGL_MEMORY_IMAGE_COPY &region) const
265{
266 XGL_SUBRESOURCE_LAYOUT layout = {};
267 layout.offset = region.memOffset;
268 layout.rowPitch = buffer_cpp() * region.imageExtent.width;
269 layout.depthPitch = layout.rowPitch * region.imageExtent.height;
270 layout.size = layout.depthPitch * region.imageExtent.depth;
271
272 return layout;
273}
274
275XGL_GPU_SIZE ImageChecker::buffer_size() const
276{
277 XGL_GPU_SIZE size = 0;
278
279 for (std::vector<XGL_MEMORY_IMAGE_COPY>::const_iterator it = regions_.begin();
280 it != regions_.end(); it++) {
281 const XGL_SUBRESOURCE_LAYOUT layout = buffer_layout(*it);
282 if (size < layout.offset + layout.size)
283 size = layout.offset + layout.size;
284 }
285
286 return size;
287}
288
289bool ImageChecker::walk_region(Action action, const XGL_MEMORY_IMAGE_COPY &region,
290 const XGL_SUBRESOURCE_LAYOUT &layout, void *data) const
291{
292 for (XGL_INT z = 0; z < region.imageExtent.depth; z++) {
293 for (XGL_INT y = 0; y < region.imageExtent.height; y++) {
294 for (XGL_INT x = 0; x < region.imageExtent.width; x++) {
295 uint8_t *dst = static_cast<uint8_t *>(data);
296 dst += layout.offset + layout.depthPitch * z +
297 layout.rowPitch * y + buffer_cpp() * x;
298
299 XGL_OFFSET3D offset = region.imageOffset;
300 offset.x += x;
301 offset.y += y;
302 offset.z += z;
303
304 const std::vector<uint8_t> &val = (pattern_ == HASH) ?
305 pattern_hash(region.imageSubresource, offset) :
306 pattern_solid_;
307 assert(val.size() == buffer_cpp());
308
309 if (action == FILL) {
310 memcpy(dst, &val[0], val.size());
311 } else {
312 for (int i = 0; i < val.size(); i++) {
313 EXPECT_EQ(val[i], dst[i]) <<
314 "Offset is: (" << x << ", " << y << ", " << z << ")";
315 if (val[i] != dst[i])
316 return false;
317 }
318 }
319 }
Chia-I Wucb67c652014-10-21 11:06:26 +0800320 }
321 }
322
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800323 return true;
Chia-I Wucb67c652014-10-21 11:06:26 +0800324}
325
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800326bool ImageChecker::walk(Action action, Buffer &buf) const
Chia-I Wu3c3fd122014-11-22 02:51:25 +0800327{
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800328 void *data = buf.map();
329 if (!data)
330 return false;
Chia-I Wu3c3fd122014-11-22 02:51:25 +0800331
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800332 std::vector<XGL_MEMORY_IMAGE_COPY>::const_iterator it;
333 for (it = regions_.begin(); it != regions_.end(); it++) {
334 if (!walk_region(action, *it, buffer_layout(*it), data))
335 break;
Chia-I Wu3c3fd122014-11-22 02:51:25 +0800336 }
337
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800338 buf.unmap();
Chia-I Wu3c3fd122014-11-22 02:51:25 +0800339
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800340 return (it == regions_.end());
Chia-I Wu3c3fd122014-11-22 02:51:25 +0800341}
342
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800343bool ImageChecker::walk(Action action, Image &img) const
344{
345 void *data = img.map();
346 if (!data)
347 return false;
348
349 std::vector<XGL_MEMORY_IMAGE_COPY>::const_iterator it;
350 for (it = regions_.begin(); it != regions_.end(); it++) {
351 if (!walk_region(action, *it, img.subresource_layout(it->imageSubresource), data))
352 break;
353 }
354
355 img.unmap();
356
357 return (it == regions_.end());
358}
359
360std::vector<uint8_t> ImageChecker::pattern_hash(const XGL_IMAGE_SUBRESOURCE &subres, const XGL_OFFSET3D &offset) const
361{
362#define HASH_BYTE(val, b) static_cast<uint8_t>((static_cast<uint32_t>(val) >> (b * 8)) & 0xff)
363#define HASH_BYTES(val) HASH_BYTE(val, 0), HASH_BYTE(val, 1), HASH_BYTE(val, 2), HASH_BYTE(val, 3)
364 const unsigned char input[] = {
365 HASH_BYTES(hash_salt_),
366 HASH_BYTES(subres.mipLevel),
367 HASH_BYTES(subres.arraySlice),
368 HASH_BYTES(offset.x),
369 HASH_BYTES(offset.y),
370 HASH_BYTES(offset.z),
371 };
372 unsigned long hash = 5381;
373
374 for (XGL_INT i = 0; i < ARRAY_SIZE(input); i++)
375 hash = ((hash << 5) + hash) + input[i];
376
377 const uint8_t output[4] = { HASH_BYTES(hash) };
378#undef HASH_BYTES
379#undef HASH_BYTE
380
Chia-I Wu4dce6af2014-12-21 14:59:04 +0800381 std::vector<uint8_t> val;
382 val.reserve(buffer_cpp());
383 for (int i = 0; i < buffer_cpp(); i++)
384 val.push_back(output[i % 4]);
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800385
386 return val;
387}
388
389XGL_SIZE get_format_size(XGL_FORMAT format)
390{
391 static const struct format_info {
392 XGL_SIZE size;
393 XGL_UINT channel_count;
394 } format_table[XGL_MAX_CH_FMT + 1] = {
395 [XGL_CH_FMT_UNDEFINED] = { 0, 0 },
396 [XGL_CH_FMT_R4G4] = { 1, 2 },
397 [XGL_CH_FMT_R4G4B4A4] = { 2, 4 },
398 [XGL_CH_FMT_R5G6B5] = { 2, 3 },
399 [XGL_CH_FMT_B5G6R5] = { 2, 3 },
400 [XGL_CH_FMT_R5G5B5A1] = { 2, 4 },
401 [XGL_CH_FMT_R8] = { 1, 1 },
402 [XGL_CH_FMT_R8G8] = { 2, 2 },
403 [XGL_CH_FMT_R8G8B8A8] = { 4, 4 },
404 [XGL_CH_FMT_B8G8R8A8] = { 4, 4 },
405 [XGL_CH_FMT_R10G11B11] = { 4, 3 },
406 [XGL_CH_FMT_R11G11B10] = { 4, 3 },
407 [XGL_CH_FMT_R10G10B10A2] = { 4, 4 },
408 [XGL_CH_FMT_R16] = { 2, 1 },
409 [XGL_CH_FMT_R16G16] = { 4, 2 },
410 [XGL_CH_FMT_R16G16B16A16] = { 8, 4 },
411 [XGL_CH_FMT_R32] = { 4, 1 },
412 [XGL_CH_FMT_R32G32] = { 8, 2 },
413 [XGL_CH_FMT_R32G32B32] = { 12, 3 },
414 [XGL_CH_FMT_R32G32B32A32] = { 16, 4 },
415 [XGL_CH_FMT_R16G8] = { 3, 2 },
416 [XGL_CH_FMT_R32G8] = { 5, 2 },
417 [XGL_CH_FMT_R9G9B9E5] = { 4, 3 },
418 [XGL_CH_FMT_BC1] = { 8, 4 },
419 [XGL_CH_FMT_BC2] = { 16, 4 },
420 [XGL_CH_FMT_BC3] = { 16, 4 },
421 [XGL_CH_FMT_BC4] = { 8, 4 },
422 [XGL_CH_FMT_BC5] = { 16, 4 },
423 [XGL_CH_FMT_BC6U] = { 16, 4 },
424 [XGL_CH_FMT_BC6S] = { 16, 4 },
425 [XGL_CH_FMT_BC7] = { 16, 4 },
426 };
427
428 return format_table[format.channelFormat].size;
429}
430
431XGL_EXTENT3D get_mip_level_extent(const XGL_EXTENT3D &extent, XGL_UINT mip_level)
432{
433 const XGL_EXTENT3D ext = {
434 (extent.width >> mip_level) ? extent.width >> mip_level : 1,
435 (extent.height >> mip_level) ? extent.height >> mip_level : 1,
436 (extent.depth >> mip_level) ? extent.depth >> mip_level : 1,
437 };
438
439 return ext;
440}
441
442}; // namespace xgl_testing
443
444namespace {
445
446#define DO(action) ASSERT_EQ(true, action);
447
448xgl_testing::Environment *environment;
449
450class XglCmdBlitTest : public ::testing::Test {
451protected:
452 XglCmdBlitTest() :
453 dev_(environment->default_device()),
Chia-I Wu9dac52d2014-12-27 22:04:00 +0800454 queue_(*dev_.graphics_queues()[0]),
455 cmd_(dev_, xgl_testing::CmdBuffer::create_info(XGL_QUEUE_TYPE_GRAPHICS))
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800456 {
457 // make sure every test uses a different pattern
458 xgl_testing::ImageChecker::hash_salt_generate();
459 }
460
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800461 bool submit_and_done()
462 {
Chia-I Wu9dac52d2014-12-27 22:04:00 +0800463 queue_.submit(cmd_, mem_refs_);
464 queue_.wait();
465 mem_refs_.clear();
466 return true;
467 }
468
469 void add_memory_ref(const xgl_testing::Object &obj, XGL_FLAGS flags)
470 {
471 const std::vector<XGL_GPU_MEMORY> mems = obj.memories();
472 for (std::vector<XGL_GPU_MEMORY>::const_iterator it = mems.begin(); it != mems.end(); it++) {
473 std::vector<XGL_MEMORY_REF>::iterator ref;
474 for (ref = mem_refs_.begin(); ref != mem_refs_.end(); ref++) {
475 if (ref->mem == *it)
476 break;
477 }
478
479 if (ref == mem_refs_.end()) {
480 XGL_MEMORY_REF tmp = {};
481 tmp.mem = *it;
482 tmp.flags = flags;
483 mem_refs_.push_back(tmp);
484 } else {
485 ref->flags &= flags;
486 }
487 }
488 }
489
490 void add_memory_ref(const xgl_testing::GpuMemory &obj, XGL_FLAGS flags)
491 {
492 std::vector<XGL_MEMORY_REF>::iterator it;
493 for (it = mem_refs_.begin(); it != mem_refs_.end(); it++) {
494 if (it->mem == obj.obj())
495 break;
496 }
497
498 if (it == mem_refs_.end()) {
499 XGL_MEMORY_REF ref = {};
500 ref.mem = obj.obj();
501 ref.flags = flags;
502 mem_refs_.push_back(ref);
503 } else {
504 it->flags &= flags;
505 }
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800506 }
507
508 xgl_testing::Device &dev_;
Chia-I Wu9dac52d2014-12-27 22:04:00 +0800509 xgl_testing::Queue &queue_;
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800510 xgl_testing::CmdBuffer cmd_;
Chia-I Wu9dac52d2014-12-27 22:04:00 +0800511
512 std::vector<XGL_MEMORY_REF> mem_refs_;
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800513};
514
515typedef XglCmdBlitTest XglCmdFillMemoryTest;
516
517TEST_F(XglCmdFillMemoryTest, Basic)
518{
519 xgl_testing::Buffer buf;
520
521 buf.init(dev_, 20);
Chia-I Wu9dac52d2014-12-27 22:04:00 +0800522 add_memory_ref(buf, 0);
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800523
524 cmd_.begin();
525 xglCmdFillMemory(cmd_.obj(), buf.obj(), 0, 4, 0x11111111);
526 xglCmdFillMemory(cmd_.obj(), buf.obj(), 4, 16, 0x22222222);
527 cmd_.end();
528
529 submit_and_done();
530
531 const uint32_t *data = static_cast<const uint32_t *>(buf.map());
532 EXPECT_EQ(0x11111111, data[0]);
533 EXPECT_EQ(0x22222222, data[1]);
534 EXPECT_EQ(0x22222222, data[2]);
535 EXPECT_EQ(0x22222222, data[3]);
536 EXPECT_EQ(0x22222222, data[4]);
537 buf.unmap();
538}
539
540TEST_F(XglCmdFillMemoryTest, Large)
Chia-I Wuea9367f2014-11-23 02:16:45 +0800541{
542 const XGL_GPU_SIZE size = 32 * 1024 * 1024;
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800543 xgl_testing::Buffer buf;
Chia-I Wuea9367f2014-11-23 02:16:45 +0800544
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800545 buf.init(dev_, size);
Chia-I Wu9dac52d2014-12-27 22:04:00 +0800546 add_memory_ref(buf, 0);
Chia-I Wuea9367f2014-11-23 02:16:45 +0800547
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800548 cmd_.begin();
549 xglCmdFillMemory(cmd_.obj(), buf.obj(), 0, size / 2, 0x11111111);
550 xglCmdFillMemory(cmd_.obj(), buf.obj(), size / 2, size / 2, 0x22222222);
551 cmd_.end();
Chia-I Wuea9367f2014-11-23 02:16:45 +0800552
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800553 submit_and_done();
Chia-I Wuea9367f2014-11-23 02:16:45 +0800554
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800555 const uint32_t *data = static_cast<const uint32_t *>(buf.map());
556 XGL_GPU_SIZE offset;
557 for (offset = 0; offset < size / 2; offset += 4)
558 EXPECT_EQ(0x11111111, data[offset / 4]) << "Offset is: " << offset;
559 for (; offset < size; offset += 4)
560 EXPECT_EQ(0x22222222, data[offset / 4]) << "Offset is: " << offset;
561 buf.unmap();
562}
Chia-I Wuea9367f2014-11-23 02:16:45 +0800563
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800564TEST_F(XglCmdFillMemoryTest, Overlap)
565{
566 xgl_testing::Buffer buf;
567
568 buf.init(dev_, 64);
Chia-I Wu9dac52d2014-12-27 22:04:00 +0800569 add_memory_ref(buf, 0);
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800570
571 cmd_.begin();
572 xglCmdFillMemory(cmd_.obj(), buf.obj(), 0, 48, 0x11111111);
573 xglCmdFillMemory(cmd_.obj(), buf.obj(), 32, 32, 0x22222222);
574 cmd_.end();
575
576 submit_and_done();
577
578 const uint32_t *data = static_cast<const uint32_t *>(buf.map());
579 XGL_GPU_SIZE offset;
580 for (offset = 0; offset < 32; offset += 4)
581 EXPECT_EQ(0x11111111, data[offset / 4]) << "Offset is: " << offset;
582 for (; offset < 64; offset += 4)
583 EXPECT_EQ(0x22222222, data[offset / 4]) << "Offset is: " << offset;
584 buf.unmap();
585}
586
587TEST_F(XglCmdFillMemoryTest, MultiAlignments)
588{
589 xgl_testing::Buffer bufs[9];
590 XGL_GPU_SIZE size = 4;
591
592 cmd_.begin();
593 for (int i = 0; i < ARRAY_SIZE(bufs); i++) {
594 bufs[i].init(dev_, size);
Chia-I Wu9dac52d2014-12-27 22:04:00 +0800595 add_memory_ref(bufs[i], 0);
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800596 xglCmdFillMemory(cmd_.obj(), bufs[i].obj(), 0, size, 0x11111111);
597 size <<= 1;
598 }
599 cmd_.end();
600
601 submit_and_done();
602
603 size = 4;
604 for (int i = 0; i < ARRAY_SIZE(bufs); i++) {
605 const uint32_t *data = static_cast<const uint32_t *>(bufs[i].map());
606 XGL_GPU_SIZE offset;
607 for (offset = 0; offset < size; offset += 4)
608 EXPECT_EQ(0x11111111, data[offset / 4]) << "Buffser is: " << i << "\n" <<
609 "Offset is: " << offset;
610 bufs[i].unmap();
611
612 size <<= 1;
613 }
614}
615
616typedef XglCmdBlitTest XglCmdCopyMemoryTest;
617
618TEST_F(XglCmdCopyMemoryTest, Basic)
619{
620 xgl_testing::Buffer src, dst;
621
622 src.init(dev_, 4);
623 uint32_t *data = static_cast<uint32_t *>(src.map());
624 data[0] = 0x11111111;
625 src.unmap();
Chia-I Wu9dac52d2014-12-27 22:04:00 +0800626 add_memory_ref(src, XGL_MEMORY_REF_READ_ONLY_BIT);
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800627
628 dst.init(dev_, 4);
Chia-I Wu9dac52d2014-12-27 22:04:00 +0800629 add_memory_ref(dst, 0);
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800630
631 cmd_.begin();
632 XGL_MEMORY_COPY region = {};
633 region.copySize = 4;
634 xglCmdCopyMemory(cmd_.obj(), src.obj(), dst.obj(), 1, &region);
635 cmd_.end();
636
637 submit_and_done();
638
639 data = static_cast<uint32_t *>(dst.map());
640 EXPECT_EQ(0x11111111, data[0]);
641 dst.unmap();
642}
643
644TEST_F(XglCmdCopyMemoryTest, Large)
645{
646 const XGL_GPU_SIZE size = 32 * 1024 * 1024;
647 xgl_testing::Buffer src, dst;
648
649 src.init(dev_, size);
650 uint32_t *data = static_cast<uint32_t *>(src.map());
651 XGL_GPU_SIZE offset;
652 for (offset = 0; offset < size; offset += 4)
653 data[offset / 4] = offset;
654 src.unmap();
Chia-I Wu9dac52d2014-12-27 22:04:00 +0800655 add_memory_ref(src, XGL_MEMORY_REF_READ_ONLY_BIT);
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800656
657 dst.init(dev_, size);
Chia-I Wu9dac52d2014-12-27 22:04:00 +0800658 add_memory_ref(dst, 0);
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800659
660 cmd_.begin();
661 XGL_MEMORY_COPY region = {};
Chia-I Wuea9367f2014-11-23 02:16:45 +0800662 region.copySize = size;
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800663 xglCmdCopyMemory(cmd_.obj(), src.obj(), dst.obj(), 1, &region);
664 cmd_.end();
Chia-I Wuea9367f2014-11-23 02:16:45 +0800665
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800666 submit_and_done();
Chia-I Wuea9367f2014-11-23 02:16:45 +0800667
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800668 data = static_cast<uint32_t *>(dst.map());
669 for (offset = 0; offset < size; offset += 4)
670 EXPECT_EQ(offset, data[offset / 4]);
671 dst.unmap();
Chia-I Wuea9367f2014-11-23 02:16:45 +0800672}
673
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800674TEST_F(XglCmdCopyMemoryTest, MultiAlignments)
Chia-I Wucb67c652014-10-21 11:06:26 +0800675{
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800676 const XGL_MEMORY_COPY regions[] = {
677 /* well aligned */
678 { 0, 0, 256 },
679 { 0, 256, 128 },
680 { 0, 384, 64 },
681 { 0, 448, 32 },
682 { 0, 480, 16 },
683 { 0, 496, 8 },
Chia-I Wucb67c652014-10-21 11:06:26 +0800684
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800685 /* ill aligned */
686 { 7, 510, 16 },
687 { 16, 530, 13 },
688 { 32, 551, 16 },
689 { 45, 570, 15 },
690 { 50, 590, 1 },
691 };
692 xgl_testing::Buffer src, dst;
Chia-I Wucb67c652014-10-21 11:06:26 +0800693
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800694 src.init(dev_, 256);
695 uint8_t *data = static_cast<uint8_t *>(src.map());
696 for (int i = 0; i < 256; i++)
697 data[i] = i;
698 src.unmap();
Chia-I Wu9dac52d2014-12-27 22:04:00 +0800699 add_memory_ref(src, XGL_MEMORY_REF_READ_ONLY_BIT);
Chia-I Wucb67c652014-10-21 11:06:26 +0800700
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800701 dst.init(dev_, 1024);
Chia-I Wu9dac52d2014-12-27 22:04:00 +0800702 add_memory_ref(dst, 0);
Chia-I Wucb67c652014-10-21 11:06:26 +0800703
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800704 cmd_.begin();
705 xglCmdCopyMemory(cmd_.obj(), src.obj(), dst.obj(), ARRAY_SIZE(regions), regions);
706 cmd_.end();
Chia-I Wucb67c652014-10-21 11:06:26 +0800707
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800708 submit_and_done();
Chia-I Wucb67c652014-10-21 11:06:26 +0800709
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800710 data = static_cast<uint8_t *>(dst.map());
711 for (int i = 0; i < ARRAY_SIZE(regions); i++) {
712 const XGL_MEMORY_COPY &r = regions[i];
Chia-I Wucb67c652014-10-21 11:06:26 +0800713
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800714 for (int j = 0; j < r.copySize; j++) {
715 EXPECT_EQ(r.srcOffset + j, data[r.destOffset + j]) <<
716 "Region is: " << i << "\n" <<
717 "Offset is: " << r.destOffset + j;
718 }
719 }
720 dst.unmap();
721}
Chia-I Wucb67c652014-10-21 11:06:26 +0800722
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800723TEST_F(XglCmdCopyMemoryTest, RAWHazard)
724{
725 xgl_testing::Buffer bufs[3];
Chia-I Wucb67c652014-10-21 11:06:26 +0800726
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800727 for (int i = 0; i < ARRAY_SIZE(bufs); i++) {
728 bufs[i].init(dev_, 4);
Chia-I Wu9dac52d2014-12-27 22:04:00 +0800729 add_memory_ref(bufs[i], 0);
Chia-I Wucb67c652014-10-21 11:06:26 +0800730
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800731 uint32_t *data = static_cast<uint32_t *>(bufs[i].map());
732 data[0] = 0x22222222 * (i + 1);
733 bufs[i].unmap();
734 }
735
736 cmd_.begin();
737
738 xglCmdFillMemory(cmd_.obj(), bufs[0].obj(), 0, 4, 0x11111111);
739 // is this necessary?
Chia-I Wu9dac52d2014-12-27 22:04:00 +0800740 XGL_MEMORY_STATE_TRANSITION transition = bufs[0].state_transition(
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800741 XGL_MEMORY_STATE_DATA_TRANSFER, XGL_MEMORY_STATE_DATA_TRANSFER, 0, 4);
742 xglCmdPrepareMemoryRegions(cmd_.obj(), 1, &transition);
743
744 XGL_MEMORY_COPY region = {};
745 region.copySize = 4;
746 xglCmdCopyMemory(cmd_.obj(), bufs[0].obj(), bufs[1].obj(), 1, &region);
747 // is this necessary?
Chia-I Wu9dac52d2014-12-27 22:04:00 +0800748 transition = bufs[1].state_transition(
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800749 XGL_MEMORY_STATE_DATA_TRANSFER, XGL_MEMORY_STATE_DATA_TRANSFER, 0, 4);
750 xglCmdPrepareMemoryRegions(cmd_.obj(), 1, &transition);
751
752 xglCmdCopyMemory(cmd_.obj(), bufs[1].obj(), bufs[2].obj(), 1, &region);
753 cmd_.end();
754
755 submit_and_done();
756
757 const uint32_t *data = static_cast<const uint32_t *>(bufs[2].map());
758 EXPECT_EQ(0x11111111, data[0]);
759 bufs[2].unmap();
760}
761
762class XglCmdBlitImageTest : public XglCmdBlitTest {
763protected:
764 void init_test_formats(XGL_FLAGS features)
Chia-I Wucb67c652014-10-21 11:06:26 +0800765 {
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800766 first_linear_format_.channelFormat = XGL_CH_FMT_UNDEFINED;
767 first_linear_format_.numericFormat = XGL_NUM_FMT_UNDEFINED;
768 first_optimal_format_.channelFormat = XGL_CH_FMT_UNDEFINED;
769 first_optimal_format_.numericFormat = XGL_NUM_FMT_UNDEFINED;
Chia-I Wucb67c652014-10-21 11:06:26 +0800770
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800771 for (std::vector<xgl_testing::Device::Format>::const_iterator it = dev_.formats().begin();
772 it != dev_.formats().end(); it++) {
773 if (it->features & features) {
774 test_formats_.push_back(*it);
Chia-I Wucb67c652014-10-21 11:06:26 +0800775
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800776 if (it->tiling == XGL_LINEAR_TILING &&
777 first_linear_format_.channelFormat == XGL_CH_FMT_UNDEFINED)
778 first_linear_format_ = it->format;
779 if (it->tiling == XGL_OPTIMAL_TILING &&
780 first_optimal_format_.channelFormat == XGL_CH_FMT_UNDEFINED)
781 first_optimal_format_ = it->format;
782 }
783 }
784 }
Chia-I Wucb67c652014-10-21 11:06:26 +0800785
Chia-I Wu9feab842014-12-22 13:19:08 +0800786 void init_test_formats()
787 {
788 init_test_formats(static_cast<XGL_FLAGS>(-1));
789 }
790
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800791 void fill_src(xgl_testing::Image &img, const xgl_testing::ImageChecker &checker)
792 {
793 if (img.transparent()) {
794 checker.fill(img);
795 return;
Chia-I Wucb67c652014-10-21 11:06:26 +0800796 }
797
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800798 ASSERT_EQ(true, img.copyable());
799
800 xgl_testing::Buffer in_buf;
801 in_buf.init(dev_, checker.buffer_size());
802 checker.fill(in_buf);
803
Chia-I Wu9dac52d2014-12-27 22:04:00 +0800804 add_memory_ref(in_buf, XGL_MEMORY_REF_READ_ONLY_BIT);
805 add_memory_ref(img, 0);
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800806
807 // copy in and tile
808 cmd_.begin();
809 xglCmdCopyMemoryToImage(cmd_.obj(), in_buf.obj(), img.obj(),
810 checker.regions().size(), &checker.regions()[0]);
811 cmd_.end();
812
813 submit_and_done();
Chia-I Wucb67c652014-10-21 11:06:26 +0800814 }
815
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800816 void check_dst(xgl_testing::Image &img, const xgl_testing::ImageChecker &checker)
Chia-I Wu86822632014-11-22 15:09:42 +0800817 {
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800818 if (img.transparent()) {
819 DO(checker.check(img));
820 return;
Chia-I Wu86822632014-11-22 15:09:42 +0800821 }
822
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800823 ASSERT_EQ(true, img.copyable());
824
825 xgl_testing::Buffer out_buf;
826 out_buf.init(dev_, checker.buffer_size());
827
Chia-I Wu9dac52d2014-12-27 22:04:00 +0800828 add_memory_ref(img, XGL_MEMORY_REF_READ_ONLY_BIT);
829 add_memory_ref(out_buf, 0);
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800830
831 // copy out and linearize
832 cmd_.begin();
833 xglCmdCopyImageToMemory(cmd_.obj(), img.obj(), out_buf.obj(),
834 checker.regions().size(), &checker.regions()[0]);
835 cmd_.end();
836
837 submit_and_done();
838
839 DO(checker.check(out_buf));
Chia-I Wu86822632014-11-22 15:09:42 +0800840 }
841
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800842 std::vector<xgl_testing::Device::Format> test_formats_;
843 XGL_FORMAT first_linear_format_;
844 XGL_FORMAT first_optimal_format_;
845};
846
847class XglCmdCopyMemoryToImageTest : public XglCmdBlitImageTest {
848protected:
849 virtual void SetUp()
850 {
851 XglCmdBlitTest::SetUp();
852 init_test_formats(XGL_FORMAT_IMAGE_COPY_BIT);
853 ASSERT_NE(true, test_formats_.empty());
854 }
855
856 void test_copy_memory_to_image(const XGL_IMAGE_CREATE_INFO &img_info, const xgl_testing::ImageChecker &checker)
857 {
858 xgl_testing::Buffer buf;
859 xgl_testing::Image img;
860
861 buf.init(dev_, checker.buffer_size());
862 checker.fill(buf);
Chia-I Wu9dac52d2014-12-27 22:04:00 +0800863 add_memory_ref(buf, XGL_MEMORY_REF_READ_ONLY_BIT);
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800864
865 img.init(dev_, img_info);
Chia-I Wu9dac52d2014-12-27 22:04:00 +0800866 add_memory_ref(img, 0);
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800867
868 cmd_.begin();
869 xglCmdCopyMemoryToImage(cmd_.obj(), buf.obj(), img.obj(),
870 checker.regions().size(), &checker.regions()[0]);
871 cmd_.end();
872
873 submit_and_done();
874
875 check_dst(img, checker);
876 }
877
878 void test_copy_memory_to_image(const XGL_IMAGE_CREATE_INFO &img_info, const std::vector<XGL_MEMORY_IMAGE_COPY> &regions)
879 {
880 xgl_testing::ImageChecker checker(img_info, regions);
881 test_copy_memory_to_image(img_info, checker);
882 }
883
884 void test_copy_memory_to_image(const XGL_IMAGE_CREATE_INFO &img_info)
885 {
886 xgl_testing::ImageChecker checker(img_info);
887 test_copy_memory_to_image(img_info, checker);
888 }
889};
890
891TEST_F(XglCmdCopyMemoryToImageTest, Basic)
892{
893 for (std::vector<xgl_testing::Device::Format>::const_iterator it = test_formats_.begin();
894 it != test_formats_.end(); it++) {
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800895 XGL_IMAGE_CREATE_INFO img_info = xgl_testing::Image::create_info();
896 img_info.imageType = XGL_IMAGE_2D;
897 img_info.format = it->format;
898 img_info.extent.width = 64;
899 img_info.extent.height = 64;
900 img_info.tiling = it->tiling;
901
902 test_copy_memory_to_image(img_info);
903 }
Chia-I Wu86822632014-11-22 15:09:42 +0800904}
905
Chia-I Wu830fb332014-12-13 15:28:20 +0800906class XglCmdCopyImageToMemoryTest : public XglCmdBlitImageTest {
907protected:
908 virtual void SetUp()
909 {
910 XglCmdBlitTest::SetUp();
911 init_test_formats(XGL_FORMAT_IMAGE_COPY_BIT);
912 ASSERT_NE(true, test_formats_.empty());
913 }
914
915 void test_copy_image_to_memory(const XGL_IMAGE_CREATE_INFO &img_info, const xgl_testing::ImageChecker &checker)
916 {
917 xgl_testing::Image img;
918 xgl_testing::Buffer buf;
919
920 img.init(dev_, img_info);
921 fill_src(img, checker);
Chia-I Wu9dac52d2014-12-27 22:04:00 +0800922 add_memory_ref(img, XGL_MEMORY_REF_READ_ONLY_BIT);
Chia-I Wu830fb332014-12-13 15:28:20 +0800923
924 buf.init(dev_, checker.buffer_size());
Chia-I Wu9dac52d2014-12-27 22:04:00 +0800925 add_memory_ref(buf, 0);
Chia-I Wu830fb332014-12-13 15:28:20 +0800926
927 cmd_.begin();
928 xglCmdCopyImageToMemory(cmd_.obj(), img.obj(), buf.obj(),
929 checker.regions().size(), &checker.regions()[0]);
930 cmd_.end();
931
932 submit_and_done();
933
934 checker.check(buf);
935 }
936
937 void test_copy_image_to_memory(const XGL_IMAGE_CREATE_INFO &img_info, const std::vector<XGL_MEMORY_IMAGE_COPY> &regions)
938 {
939 xgl_testing::ImageChecker checker(img_info, regions);
940 test_copy_image_to_memory(img_info, checker);
941 }
942
943 void test_copy_image_to_memory(const XGL_IMAGE_CREATE_INFO &img_info)
944 {
945 xgl_testing::ImageChecker checker(img_info);
946 test_copy_image_to_memory(img_info, checker);
947 }
948};
949
950TEST_F(XglCmdCopyImageToMemoryTest, Basic)
951{
952 for (std::vector<xgl_testing::Device::Format>::const_iterator it = test_formats_.begin();
953 it != test_formats_.end(); it++) {
954 XGL_IMAGE_CREATE_INFO img_info = xgl_testing::Image::create_info();
955 img_info.imageType = XGL_IMAGE_2D;
956 img_info.format = it->format;
957 img_info.extent.width = 64;
958 img_info.extent.height = 64;
959 img_info.tiling = it->tiling;
960
961 test_copy_image_to_memory(img_info);
962 }
963}
964
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800965class XglCmdCopyImageTest : public XglCmdBlitImageTest {
966protected:
967 virtual void SetUp()
968 {
969 XglCmdBlitTest::SetUp();
970 init_test_formats(XGL_FORMAT_IMAGE_COPY_BIT);
971 ASSERT_NE(true, test_formats_.empty());
Chia-I Wuf7ff6b42014-11-22 16:24:41 +0800972 }
973
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800974 void test_copy_image(const XGL_IMAGE_CREATE_INFO &src_info, const XGL_IMAGE_CREATE_INFO &dst_info,
975 const std::vector<XGL_IMAGE_COPY> &copies)
Chia-I Wuf7ff6b42014-11-22 16:24:41 +0800976 {
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800977 // convert XGL_IMAGE_COPY to two sets of XGL_MEMORY_IMAGE_COPY
978 std::vector<XGL_MEMORY_IMAGE_COPY> src_regions, dst_regions;
979 XGL_GPU_SIZE src_offset = 0, dst_offset = 0;
980 for (std::vector<XGL_IMAGE_COPY>::const_iterator it = copies.begin(); it != copies.end(); it++) {
981 XGL_MEMORY_IMAGE_COPY src_region = {}, dst_region = {};
Chia-I Wuf7ff6b42014-11-22 16:24:41 +0800982
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800983 src_region.memOffset = src_offset;
984 src_region.imageSubresource = it->srcSubresource;
985 src_region.imageOffset = it->srcOffset;
986 src_region.imageExtent = it->extent;
987 src_regions.push_back(src_region);
Chia-I Wuf7ff6b42014-11-22 16:24:41 +0800988
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800989 dst_region.memOffset = src_offset;
990 dst_region.imageSubresource = it->destSubresource;
991 dst_region.imageOffset = it->destOffset;
992 dst_region.imageExtent = it->extent;
993 dst_regions.push_back(dst_region);
Chia-I Wuf7ff6b42014-11-22 16:24:41 +0800994
Chia-I Wu6170c9e2014-12-08 14:30:10 +0800995 const XGL_GPU_SIZE size = it->extent.width * it->extent.height * it->extent.depth;
996 src_offset += xgl_testing::get_format_size(src_info.format) * size;
997 dst_offset += xgl_testing::get_format_size(dst_info.format) * size;
998 }
Chia-I Wuf7ff6b42014-11-22 16:24:41 +0800999
Chia-I Wu6170c9e2014-12-08 14:30:10 +08001000 xgl_testing::ImageChecker src_checker(src_info, src_regions);
1001 xgl_testing::ImageChecker dst_checker(dst_info, dst_regions);
1002
1003 xgl_testing::Image src;
1004 src.init(dev_, src_info);
1005 fill_src(src, src_checker);
Chia-I Wu9dac52d2014-12-27 22:04:00 +08001006 add_memory_ref(src, XGL_MEMORY_REF_READ_ONLY_BIT);
Chia-I Wu6170c9e2014-12-08 14:30:10 +08001007
1008 xgl_testing::Image dst;
1009 dst.init(dev_, dst_info);
Chia-I Wu9dac52d2014-12-27 22:04:00 +08001010 add_memory_ref(dst, 0);
Chia-I Wu6170c9e2014-12-08 14:30:10 +08001011
1012 cmd_.begin();
1013 xglCmdCopyImage(cmd_.obj(), src.obj(), dst.obj(), copies.size(), &copies[0]);
1014 cmd_.end();
1015
1016 submit_and_done();
1017
1018 check_dst(dst, dst_checker);
1019 }
1020};
1021
1022TEST_F(XglCmdCopyImageTest, Basic)
1023{
1024 for (std::vector<xgl_testing::Device::Format>::const_iterator it = test_formats_.begin();
1025 it != test_formats_.end(); it++) {
Chia-I Wu6170c9e2014-12-08 14:30:10 +08001026 XGL_IMAGE_CREATE_INFO img_info = xgl_testing::Image::create_info();
1027 img_info.imageType = XGL_IMAGE_2D;
1028 img_info.format = it->format;
1029 img_info.extent.width = 64;
1030 img_info.extent.height = 64;
1031 img_info.tiling = it->tiling;
1032
1033 XGL_IMAGE_COPY copy = {};
1034 copy.srcSubresource = xgl_testing::Image::subresource(XGL_IMAGE_ASPECT_COLOR, 0, 0);
1035 copy.destSubresource = copy.srcSubresource;
1036 copy.extent = img_info.extent;
1037
1038 test_copy_image(img_info, img_info, std::vector<XGL_IMAGE_COPY>(&copy, &copy + 1));
1039 }
1040}
1041
Chia-I Wub75939f2014-12-22 14:46:56 +08001042class XglCmdCloneImageDataTest : public XglCmdBlitImageTest {
1043protected:
1044 virtual void SetUp()
1045 {
1046 XglCmdBlitTest::SetUp();
1047 init_test_formats();
1048 ASSERT_NE(true, test_formats_.empty());
1049 }
1050
1051 void test_clone_image_data(const XGL_IMAGE_CREATE_INFO &img_info)
1052 {
1053 xgl_testing::ImageChecker checker(img_info);
1054 xgl_testing::Image src, dst;
1055
1056 src.init(dev_, img_info);
1057 if (src.transparent() || src.copyable())
1058 fill_src(src, checker);
Chia-I Wu9dac52d2014-12-27 22:04:00 +08001059 add_memory_ref(src, XGL_MEMORY_REF_READ_ONLY_BIT);
Chia-I Wub75939f2014-12-22 14:46:56 +08001060
1061 dst.init(dev_, img_info);
Chia-I Wu9dac52d2014-12-27 22:04:00 +08001062 add_memory_ref(dst, 0);
Chia-I Wub75939f2014-12-22 14:46:56 +08001063
1064 const XGL_IMAGE_STATE state =
1065 (img_info.usage & XGL_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) ?
1066 XGL_IMAGE_STATE_UNINITIALIZED_TARGET : XGL_IMAGE_STATE_DATA_TRANSFER;
1067
1068 cmd_.begin();
1069 xglCmdCloneImageData(cmd_.obj(), src.obj(), state, dst.obj(), state);
1070 cmd_.end();
1071
1072 submit_and_done();
1073
1074 // cannot verify
1075 if (!dst.transparent() && !dst.copyable())
1076 return;
1077
1078 check_dst(dst, checker);
1079 }
1080};
1081
1082TEST_F(XglCmdCloneImageDataTest, Basic)
1083{
1084 for (std::vector<xgl_testing::Device::Format>::const_iterator it = test_formats_.begin();
1085 it != test_formats_.end(); it++) {
1086 // not sure what to do here
1087 if (it->format.channelFormat == XGL_CH_FMT_UNDEFINED ||
1088 (it->format.channelFormat >= XGL_CH_FMT_BC1 &&
1089 it->format.channelFormat <= XGL_CH_FMT_BC7) ||
1090 it->format.numericFormat == XGL_NUM_FMT_DS)
1091 continue;
1092
1093 XGL_IMAGE_CREATE_INFO img_info = xgl_testing::Image::create_info();
1094 img_info.imageType = XGL_IMAGE_2D;
1095 img_info.format = it->format;
1096 img_info.extent.width = 64;
1097 img_info.extent.height = 64;
1098 img_info.tiling = it->tiling;
1099 img_info.flags = XGL_IMAGE_CREATE_CLONEABLE_BIT;
1100
1101 const XGL_IMAGE_SUBRESOURCE_RANGE range =
Chia-I Wu9dac52d2014-12-27 22:04:00 +08001102 xgl_testing::Image::subresource_range(img_info, XGL_IMAGE_ASPECT_COLOR);
Chia-I Wub75939f2014-12-22 14:46:56 +08001103 std::vector<XGL_IMAGE_SUBRESOURCE_RANGE> ranges(&range, &range + 1);
1104
1105 test_clone_image_data(img_info);
1106 }
1107}
1108
Chia-I Wu6170c9e2014-12-08 14:30:10 +08001109class XglCmdClearColorImageTest : public XglCmdBlitImageTest {
1110protected:
Chia-I Wu9feab842014-12-22 13:19:08 +08001111 XglCmdClearColorImageTest() : test_raw_(false) {}
1112 XglCmdClearColorImageTest(bool test_raw) : test_raw_(test_raw) {}
1113
Chia-I Wu6170c9e2014-12-08 14:30:10 +08001114 virtual void SetUp()
1115 {
1116 XglCmdBlitTest::SetUp();
Chia-I Wu9feab842014-12-22 13:19:08 +08001117
1118 if (test_raw_)
1119 init_test_formats();
1120 else
1121 init_test_formats(XGL_FORMAT_CONVERSION_BIT);
1122
Chia-I Wu6170c9e2014-12-08 14:30:10 +08001123 ASSERT_NE(true, test_formats_.empty());
1124 }
1125
Chia-I Wu9feab842014-12-22 13:19:08 +08001126 union Color {
1127 XGL_FLOAT color[4];
1128 XGL_UINT32 raw[4];
1129 };
1130
1131 bool test_raw_;
1132
Chia-I Wu6170c9e2014-12-08 14:30:10 +08001133 std::vector<uint8_t> color_to_raw(XGL_FORMAT format, const XGL_FLOAT color[4])
1134 {
1135 std::vector<uint8_t> raw;
1136
1137 // TODO support all formats
1138 if (format.numericFormat == XGL_NUM_FMT_UNORM) {
1139 switch (format.channelFormat) {
1140 case XGL_CH_FMT_R8G8B8A8:
1141 raw.push_back(color[0] * 255.0f);
1142 raw.push_back(color[1] * 255.0f);
1143 raw.push_back(color[2] * 255.0f);
1144 raw.push_back(color[3] * 255.0f);
1145 break;
1146 case XGL_CH_FMT_B8G8R8A8:
1147 raw.push_back(color[2] * 255.0f);
1148 raw.push_back(color[1] * 255.0f);
1149 raw.push_back(color[0] * 255.0f);
1150 raw.push_back(color[3] * 255.0f);
1151 break;
1152 default:
1153 break;
Chia-I Wuf7ff6b42014-11-22 16:24:41 +08001154 }
1155 }
1156
Chia-I Wu6170c9e2014-12-08 14:30:10 +08001157 return raw;
Chia-I Wuf7ff6b42014-11-22 16:24:41 +08001158 }
Chia-I Wuf7ff6b42014-11-22 16:24:41 +08001159
Chia-I Wu9feab842014-12-22 13:19:08 +08001160 std::vector<uint8_t> color_to_raw(XGL_FORMAT format, const XGL_UINT32 color[4])
1161 {
1162 std::vector<uint8_t> raw;
1163
1164 // TODO support all formats
1165 if (format.numericFormat == XGL_NUM_FMT_UNORM) {
1166 switch (format.channelFormat) {
1167 case XGL_CH_FMT_R8G8B8A8:
1168 raw.push_back(static_cast<uint8_t>(color[0]));
1169 raw.push_back(static_cast<uint8_t>(color[1]));
1170 raw.push_back(static_cast<uint8_t>(color[2]));
1171 raw.push_back(static_cast<uint8_t>(color[3]));
1172 break;
1173 case XGL_CH_FMT_B8G8R8A8:
1174 raw.push_back(static_cast<uint8_t>(color[2]));
1175 raw.push_back(static_cast<uint8_t>(color[1]));
1176 raw.push_back(static_cast<uint8_t>(color[0]));
1177 raw.push_back(static_cast<uint8_t>(color[3]));
1178 break;
1179 default:
1180 break;
1181 }
1182 }
1183
1184 return raw;
1185 }
1186
1187 std::vector<uint8_t> color_to_raw(XGL_FORMAT format, const Color &color)
1188 {
1189 if (test_raw_)
1190 return color_to_raw(format, color.raw);
1191 else
1192 return color_to_raw(format, color.color);
1193 }
1194
Chia-I Wu6170c9e2014-12-08 14:30:10 +08001195 void test_clear_color_image(const XGL_IMAGE_CREATE_INFO &img_info,
Chia-I Wu9feab842014-12-22 13:19:08 +08001196 const Color &color,
Chia-I Wu6170c9e2014-12-08 14:30:10 +08001197 const std::vector<XGL_IMAGE_SUBRESOURCE_RANGE> &ranges)
Chia-I Wucb67c652014-10-21 11:06:26 +08001198 {
Chia-I Wu6170c9e2014-12-08 14:30:10 +08001199 xgl_testing::Image img;
1200 img.init(dev_, img_info);
Chia-I Wu9dac52d2014-12-27 22:04:00 +08001201 add_memory_ref(img, 0);
Chia-I Wucb67c652014-10-21 11:06:26 +08001202
Chia-I Wu6170c9e2014-12-08 14:30:10 +08001203 std::vector<XGL_IMAGE_STATE_TRANSITION> to_clear;
1204 std::vector<XGL_IMAGE_STATE_TRANSITION> to_xfer;
Chia-I Wucb67c652014-10-21 11:06:26 +08001205
Chia-I Wu6170c9e2014-12-08 14:30:10 +08001206 const XGL_IMAGE_STATE initial_state =
1207 (img_info.usage & XGL_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) ?
1208 XGL_IMAGE_STATE_UNINITIALIZED_TARGET : XGL_IMAGE_STATE_DATA_TRANSFER;
1209 for (std::vector<XGL_IMAGE_SUBRESOURCE_RANGE>::const_iterator it = ranges.begin();
1210 it != ranges.end(); it++) {
Chia-I Wu9dac52d2014-12-27 22:04:00 +08001211 to_clear.push_back(img.state_transition(initial_state, XGL_IMAGE_STATE_CLEAR, *it));
1212 to_xfer.push_back(img.state_transition(XGL_IMAGE_STATE_CLEAR, XGL_IMAGE_STATE_DATA_TRANSFER, *it));
Chia-I Wucb67c652014-10-21 11:06:26 +08001213 }
1214
Chia-I Wu6170c9e2014-12-08 14:30:10 +08001215 cmd_.begin();
Chia-I Wu9feab842014-12-22 13:19:08 +08001216
Chia-I Wu6170c9e2014-12-08 14:30:10 +08001217 xglCmdPrepareImages(cmd_.obj(), to_clear.size(), &to_clear[0]);
Chia-I Wu9feab842014-12-22 13:19:08 +08001218 if (test_raw_)
1219 xglCmdClearColorImageRaw(cmd_.obj(), img.obj(), color.raw, ranges.size(), &ranges[0]);
1220 else
1221 xglCmdClearColorImage(cmd_.obj(), img.obj(), color.color, ranges.size(), &ranges[0]);
Chia-I Wu6170c9e2014-12-08 14:30:10 +08001222 xglCmdPrepareImages(cmd_.obj(), to_xfer.size(), &to_xfer[0]);
Chia-I Wu9feab842014-12-22 13:19:08 +08001223
Chia-I Wu6170c9e2014-12-08 14:30:10 +08001224 cmd_.end();
1225
1226 submit_and_done();
1227
1228 // cannot verify
1229 if (!img.transparent() && !img.copyable())
1230 return;
1231
1232 xgl_testing::ImageChecker checker(img_info, ranges);
1233
1234 const std::vector<uint8_t> solid_pattern = color_to_raw(img_info.format, color);
1235 if (solid_pattern.empty())
1236 return;
1237
1238 checker.set_solid_pattern(solid_pattern);
1239 check_dst(img, checker);
1240 }
Chia-I Wu9feab842014-12-22 13:19:08 +08001241
1242 void test_clear_color_image(const XGL_IMAGE_CREATE_INFO &img_info,
1243 const XGL_FLOAT color[4],
1244 const std::vector<XGL_IMAGE_SUBRESOURCE_RANGE> &ranges)
1245 {
1246 Color c;
1247 memcpy(c.color, color, sizeof(c.color));
1248 test_clear_color_image(img_info, c, ranges);
1249 }
Chia-I Wu6170c9e2014-12-08 14:30:10 +08001250};
1251
1252TEST_F(XglCmdClearColorImageTest, Basic)
1253{
1254 for (std::vector<xgl_testing::Device::Format>::const_iterator it = test_formats_.begin();
1255 it != test_formats_.end(); it++) {
Chia-I Wu6170c9e2014-12-08 14:30:10 +08001256 const XGL_FLOAT color[4] = { 0.0f, 1.0f, 0.0f, 1.0f };
1257
1258 XGL_IMAGE_CREATE_INFO img_info = xgl_testing::Image::create_info();
1259 img_info.imageType = XGL_IMAGE_2D;
1260 img_info.format = it->format;
1261 img_info.extent.width = 64;
1262 img_info.extent.height = 64;
1263 img_info.tiling = it->tiling;
1264
1265 const XGL_IMAGE_SUBRESOURCE_RANGE range =
Chia-I Wu9dac52d2014-12-27 22:04:00 +08001266 xgl_testing::Image::subresource_range(img_info, XGL_IMAGE_ASPECT_COLOR);
Chia-I Wu6170c9e2014-12-08 14:30:10 +08001267 std::vector<XGL_IMAGE_SUBRESOURCE_RANGE> ranges(&range, &range + 1);
1268
1269 test_clear_color_image(img_info, color, ranges);
Chia-I Wucb67c652014-10-21 11:06:26 +08001270 }
1271}
1272
Chia-I Wu8dbe8562014-12-22 13:44:24 +08001273class XglCmdClearColorImageRawTest : public XglCmdClearColorImageTest {
1274protected:
1275 XglCmdClearColorImageRawTest() : XglCmdClearColorImageTest(true) {}
1276
1277 void test_clear_color_image_raw(const XGL_IMAGE_CREATE_INFO &img_info,
1278 const XGL_UINT32 color[4],
1279 const std::vector<XGL_IMAGE_SUBRESOURCE_RANGE> &ranges)
1280 {
1281 Color c;
1282 memcpy(c.raw, color, sizeof(c.raw));
1283 test_clear_color_image(img_info, c, ranges);
1284 }
1285};
1286
1287TEST_F(XglCmdClearColorImageRawTest, Basic)
1288{
1289 for (std::vector<xgl_testing::Device::Format>::const_iterator it = test_formats_.begin();
1290 it != test_formats_.end(); it++) {
1291 const XGL_UINT32 color[4] = { 0x11111111, 0x22222222, 0x33333333, 0x44444444 };
1292
1293 // not sure what to do here
1294 if (it->format.channelFormat == XGL_CH_FMT_UNDEFINED ||
1295 it->format.channelFormat == XGL_CH_FMT_R32G32B32 ||
1296 it->format.numericFormat == XGL_NUM_FMT_DS)
1297 continue;
1298
1299 XGL_IMAGE_CREATE_INFO img_info = xgl_testing::Image::create_info();
1300 img_info.imageType = XGL_IMAGE_2D;
1301 img_info.format = it->format;
1302 img_info.extent.width = 64;
1303 img_info.extent.height = 64;
1304 img_info.tiling = it->tiling;
1305
1306 const XGL_IMAGE_SUBRESOURCE_RANGE range =
Chia-I Wu9dac52d2014-12-27 22:04:00 +08001307 xgl_testing::Image::subresource_range(img_info, XGL_IMAGE_ASPECT_COLOR);
Chia-I Wu8dbe8562014-12-22 13:44:24 +08001308 std::vector<XGL_IMAGE_SUBRESOURCE_RANGE> ranges(&range, &range + 1);
1309
1310 test_clear_color_image_raw(img_info, color, ranges);
1311 }
1312}
1313
Chia-I Wu6170c9e2014-12-08 14:30:10 +08001314class XglCmdClearDepthStencilTest : public XglCmdBlitImageTest {
1315protected:
1316 virtual void SetUp()
1317 {
1318 XglCmdBlitTest::SetUp();
1319 init_test_formats(XGL_FORMAT_DEPTH_ATTACHMENT_BIT |
1320 XGL_FORMAT_STENCIL_ATTACHMENT_BIT);
1321 ASSERT_NE(true, test_formats_.empty());
1322 }
1323
1324 std::vector<uint8_t> ds_to_raw(XGL_FORMAT format, XGL_FLOAT depth, XGL_UINT32 stencil)
1325 {
1326 std::vector<uint8_t> raw;
1327
1328 // depth
1329 switch (format.channelFormat) {
1330 case XGL_CH_FMT_R16:
1331 case XGL_CH_FMT_R16G8:
1332 {
1333 const uint16_t unorm = depth * 65535.0f;
1334 raw.push_back(unorm & 0xff);
1335 raw.push_back(unorm >> 8);
1336 }
1337 break;
1338 case XGL_CH_FMT_R32:
1339 case XGL_CH_FMT_R32G8:
1340 {
1341 const union {
1342 XGL_FLOAT depth;
1343 uint32_t u32;
1344 } u = { depth };
1345
1346 raw.push_back((u.u32 ) & 0xff);
1347 raw.push_back((u.u32 >> 8) & 0xff);
1348 raw.push_back((u.u32 >> 16) & 0xff);
1349 raw.push_back((u.u32 >> 24) & 0xff);
1350 }
1351 break;
1352 default:
1353 break;
1354 }
1355
1356 // stencil
1357 switch (format.channelFormat) {
1358 case XGL_CH_FMT_R8:
1359 raw.push_back(stencil);
1360 break;
1361 case XGL_CH_FMT_R16G8:
1362 raw.push_back(stencil);
1363 raw.push_back(0);
1364 break;
1365 case XGL_CH_FMT_R32G8:
1366 raw.push_back(stencil);
1367 raw.push_back(0);
1368 raw.push_back(0);
1369 raw.push_back(0);
1370 break;
1371 default:
1372 break;
1373 }
1374
1375 return raw;
1376 }
1377
1378 void test_clear_depth_stencil(const XGL_IMAGE_CREATE_INFO &img_info,
1379 XGL_FLOAT depth, XGL_UINT32 stencil,
1380 const std::vector<XGL_IMAGE_SUBRESOURCE_RANGE> &ranges)
1381 {
1382 xgl_testing::Image img;
1383 img.init(dev_, img_info);
Chia-I Wu9dac52d2014-12-27 22:04:00 +08001384 add_memory_ref(img, 0);
Chia-I Wu6170c9e2014-12-08 14:30:10 +08001385
1386 std::vector<XGL_IMAGE_STATE_TRANSITION> to_clear;
1387 std::vector<XGL_IMAGE_STATE_TRANSITION> to_xfer;
1388
1389 for (std::vector<XGL_IMAGE_SUBRESOURCE_RANGE>::const_iterator it = ranges.begin();
1390 it != ranges.end(); it++) {
Chia-I Wu9dac52d2014-12-27 22:04:00 +08001391 to_clear.push_back(img.state_transition(XGL_IMAGE_STATE_UNINITIALIZED_TARGET, XGL_IMAGE_STATE_CLEAR, *it));
1392 to_xfer.push_back(img.state_transition(XGL_IMAGE_STATE_CLEAR, XGL_IMAGE_STATE_DATA_TRANSFER, *it));
Chia-I Wu6170c9e2014-12-08 14:30:10 +08001393 }
1394
1395 cmd_.begin();
1396 xglCmdPrepareImages(cmd_.obj(), to_clear.size(), &to_clear[0]);
1397 xglCmdClearDepthStencil(cmd_.obj(), img.obj(), depth, stencil, ranges.size(), &ranges[0]);
1398 xglCmdPrepareImages(cmd_.obj(), to_xfer.size(), &to_xfer[0]);
1399 cmd_.end();
1400
1401 submit_and_done();
1402
1403 // cannot verify
1404 if (!img.transparent() && !img.copyable())
1405 return;
1406
1407 xgl_testing::ImageChecker checker(img_info, ranges);
1408
1409 checker.set_solid_pattern(ds_to_raw(img_info.format, depth, stencil));
1410 check_dst(img, checker);
1411 }
1412};
1413
1414TEST_F(XglCmdClearDepthStencilTest, Basic)
1415{
1416 for (std::vector<xgl_testing::Device::Format>::const_iterator it = test_formats_.begin();
1417 it != test_formats_.end(); it++) {
1418 // known driver issues
1419 if (it->format.channelFormat == XGL_CH_FMT_R8)
1420 continue;
1421
1422 XGL_IMAGE_CREATE_INFO img_info = xgl_testing::Image::create_info();
1423 img_info.imageType = XGL_IMAGE_2D;
1424 img_info.format = it->format;
1425 img_info.extent.width = 64;
1426 img_info.extent.height = 64;
1427 img_info.tiling = it->tiling;
1428 img_info.usage = XGL_IMAGE_USAGE_DEPTH_STENCIL_BIT;
1429
1430 const XGL_IMAGE_SUBRESOURCE_RANGE range =
Chia-I Wu9dac52d2014-12-27 22:04:00 +08001431 xgl_testing::Image::subresource_range(img_info, XGL_IMAGE_ASPECT_DEPTH);
Chia-I Wu6170c9e2014-12-08 14:30:10 +08001432 std::vector<XGL_IMAGE_SUBRESOURCE_RANGE> ranges(&range, &range + 1);
1433
1434 test_clear_depth_stencil(img_info, 0.25f, 63, ranges);
1435 }
1436}
1437
1438}; // namespace
1439
Chia-I Wucb67c652014-10-21 11:06:26 +08001440int main(int argc, char **argv)
1441{
Chia-I Wucb67c652014-10-21 11:06:26 +08001442 ::testing::InitGoogleTest(&argc, argv);
Chia-I Wucb67c652014-10-21 11:06:26 +08001443
Chia-I Wu9dac52d2014-12-27 22:04:00 +08001444 xgl_testing::set_error_callback(test_error_callback);
1445
Chia-I Wu6170c9e2014-12-08 14:30:10 +08001446 environment = new xgl_testing::Environment();
Chia-I Wucb67c652014-10-21 11:06:26 +08001447
Chia-I Wu6170c9e2014-12-08 14:30:10 +08001448 if (!environment->parse_args(argc, argv))
1449 return -1;
Chia-I Wucb67c652014-10-21 11:06:26 +08001450
Chia-I Wu6170c9e2014-12-08 14:30:10 +08001451 ::testing::AddGlobalTestEnvironment(environment);
1452
1453 return RUN_ALL_TESTS();
Chia-I Wucb67c652014-10-21 11:06:26 +08001454}