blob: ebda886aef69289274bcbd26ef506f3ec8c590ed [file] [log] [blame]
Chia-I Wu998c2ac2014-12-08 14:30:10 +08001// XGL tests
Chia-I Wud7414b02014-10-21 11:06:26 +08002//
Chia-I Wu998c2ac2014-12-08 14:30:10 +08003// Copyright (C) 2014 LunarG, Inc.
Chia-I Wud7414b02014-10-21 11:06:26 +08004//
Chia-I Wu998c2ac2014-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 Wud7414b02014-10-21 11:06:26 +080011//
Chia-I Wu998c2ac2014-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 Wud7414b02014-10-21 11:06:26 +080014//
Chia-I Wu998c2ac2014-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 Wud7414b02014-10-21 11:06:26 +080022
23// Blit (copy, clear, and resolve) tests
24
Chia-I Wua9a506a2014-12-27 22:04:00 +080025#include "test_common.h"
26#include "xgltestbinding.h"
Chia-I Wud7414b02014-10-21 11:06:26 +080027
28#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
29
Chia-I Wu998c2ac2014-12-08 14:30:10 +080030namespace xgl_testing {
Chia-I Wud7414b02014-10-21 11:06:26 +080031
Mark Lobodzinski17caf572015-01-29 08:55:56 -060032size_t get_format_size(XGL_FORMAT format);
Chia-I Wu998c2ac2014-12-08 14:30:10 +080033
34class Environment : public ::testing::Environment {
35public:
36 Environment();
37
38 bool parse_args(int argc, char **argv);
Chia-I Wud7414b02014-10-21 11:06:26 +080039
40 virtual void SetUp();
41 virtual void TearDown();
42
Chia-I Wu998c2ac2014-12-08 14:30:10 +080043 const std::vector<Device *> &devices() { return devs_; }
44 Device &default_device() { return *(devs_[default_dev_]); }
Chia-I Wud7414b02014-10-21 11:06:26 +080045
Chia-I Wu998c2ac2014-12-08 14:30:10 +080046private:
47 XGL_APPLICATION_INFO app_;
48 int default_dev_;
Chia-I Wud7414b02014-10-21 11:06:26 +080049
Chia-I Wu998c2ac2014-12-08 14:30:10 +080050 std::vector<Device *> devs_;
Chia-I Wud7414b02014-10-21 11:06:26 +080051};
52
Chia-I Wu998c2ac2014-12-08 14:30:10 +080053class ImageChecker {
54public:
Chia-I Wu1a28fe02015-01-01 07:55:04 +080055 explicit ImageChecker(const XGL_IMAGE_CREATE_INFO &info, const std::vector<XGL_BUFFER_IMAGE_COPY> &regions)
Chia-I Wu998c2ac2014-12-08 14:30:10 +080056 : info_(info), regions_(regions), pattern_(HASH) {}
57 explicit ImageChecker(const XGL_IMAGE_CREATE_INFO &info, const std::vector<XGL_IMAGE_SUBRESOURCE_RANGE> &ranges);
58 explicit ImageChecker(const XGL_IMAGE_CREATE_INFO &info);
59
60 void set_solid_pattern(const std::vector<uint8_t> &solid);
61
62 XGL_GPU_SIZE buffer_size() const;
63 bool fill(Buffer &buf) const { return walk(FILL, buf); }
64 bool fill(Image &img) const { return walk(FILL, img); }
65 bool check(Buffer &buf) const { return walk(CHECK, buf); }
66 bool check(Image &img) const { return walk(CHECK, img); }
67
Chia-I Wu1a28fe02015-01-01 07:55:04 +080068 const std::vector<XGL_BUFFER_IMAGE_COPY> &regions() const { return regions_; }
Chia-I Wu998c2ac2014-12-08 14:30:10 +080069
70 static void hash_salt_generate() { hash_salt_++; }
71
72private:
73 enum Action {
74 FILL,
75 CHECK,
76 };
77
78 enum Pattern {
79 HASH,
80 SOLID,
81 };
82
Mark Lobodzinski17caf572015-01-29 08:55:56 -060083 size_t buffer_cpp() const;
Chia-I Wu1a28fe02015-01-01 07:55:04 +080084 XGL_SUBRESOURCE_LAYOUT buffer_layout(const XGL_BUFFER_IMAGE_COPY &region) const;
Chia-I Wu998c2ac2014-12-08 14:30:10 +080085
86 bool walk(Action action, Buffer &buf) const;
87 bool walk(Action action, Image &img) const;
Chia-I Wu1a28fe02015-01-01 07:55:04 +080088 bool walk_region(Action action, const XGL_BUFFER_IMAGE_COPY &region, const XGL_SUBRESOURCE_LAYOUT &layout, void *data) const;
Chia-I Wu998c2ac2014-12-08 14:30:10 +080089
90 std::vector<uint8_t> pattern_hash(const XGL_IMAGE_SUBRESOURCE &subres, const XGL_OFFSET3D &offset) const;
91
92 static uint32_t hash_salt_;
93
94 XGL_IMAGE_CREATE_INFO info_;
Chia-I Wu1a28fe02015-01-01 07:55:04 +080095 std::vector<XGL_BUFFER_IMAGE_COPY> regions_;
Chia-I Wu998c2ac2014-12-08 14:30:10 +080096
97 Pattern pattern_;
98 std::vector<uint8_t> pattern_solid_;
99};
100
101Environment::Environment() :
102 default_dev_(0)
Chia-I Wud7414b02014-10-21 11:06:26 +0800103{
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800104 app_.sType = XGL_STRUCTURE_TYPE_APPLICATION_INFO;
Chia-I Wuf1a5a742014-12-27 15:16:07 +0800105 app_.pAppName = "xgl_testing";
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800106 app_.appVersion = 1;
Chia-I Wuf1a5a742014-12-27 15:16:07 +0800107 app_.pEngineName = "xgl_testing";
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800108 app_.engineVersion = 1;
109 app_.apiVersion = XGL_MAKE_VERSION(0, 22, 0);
110}
111
112bool Environment::parse_args(int argc, char **argv)
113{
114 int i;
115
116 for (i = 1; i < argc; i++) {
117#define ARG(name) (strcmp(argv[i], name) == 0)
118#define ARG_P(name) (i < argc - 1 && ARG(name))
119 if (ARG_P("--gpu")) {
120 default_dev_ = atoi(argv[++i]);
121 } else {
122 break;
123 }
124#undef ARG
125#undef ARG_P
126 }
127
128 if (i < argc) {
129 std::cout <<
130 "invalid argument: " << argv[i] << "\n\n" <<
131 "Usage: " << argv[0] << " <options>\n\n" <<
132 "Options:\n"
133 " --gpu <n> Use GPU<n> as the default GPU\n";
134
135 return false;
136 }
137
138 return true;
139}
140
141void Environment::SetUp()
142{
143 XGL_PHYSICAL_GPU gpus[XGL_MAX_PHYSICAL_GPUS];
Mark Lobodzinski17caf572015-01-29 08:55:56 -0600144 uint32_t count;
Chia-I Wud7414b02014-10-21 11:06:26 +0800145 XGL_RESULT err;
146
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800147 err = xglInitAndEnumerateGpus(&app_, NULL, ARRAY_SIZE(gpus), &count, gpus);
148 ASSERT_EQ(XGL_SUCCESS, err);
149 ASSERT_GT(count, default_dev_);
Chia-I Wud7414b02014-10-21 11:06:26 +0800150
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800151 devs_.reserve(count);
Mark Lobodzinski17caf572015-01-29 08:55:56 -0600152 for (uint32_t i = 0; i < count; i++) {
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800153 devs_.push_back(new Device(gpus[i]));
154 if (i == default_dev_) {
Chia-I Wua9a506a2014-12-27 22:04:00 +0800155 devs_[i]->init();
156 ASSERT_NE(true, devs_[i]->graphics_queues().empty());
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800157 }
158 }
Chia-I Wud7414b02014-10-21 11:06:26 +0800159}
160
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800161void Environment::TearDown()
Chia-I Wud7414b02014-10-21 11:06:26 +0800162{
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800163 // destroy devices first
164 for (std::vector<Device *>::iterator it = devs_.begin(); it != devs_.end(); it++)
165 delete *it;
166 devs_.clear();
Chia-I Wud7414b02014-10-21 11:06:26 +0800167
Mark Lobodzinski17caf572015-01-29 08:55:56 -0600168 uint32_t dummy_count;
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800169 xglInitAndEnumerateGpus(&app_, NULL, 0, &dummy_count, NULL);
Chia-I Wud7414b02014-10-21 11:06:26 +0800170}
171
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800172uint32_t ImageChecker::hash_salt_;
173
174ImageChecker::ImageChecker(const XGL_IMAGE_CREATE_INFO &info)
175 : info_(info), regions_(), pattern_(HASH)
176{
177 // create a region for every mip level in array slice 0
178 XGL_GPU_SIZE offset = 0;
Mark Lobodzinski17caf572015-01-29 08:55:56 -0600179 for (uint32_t lv = 0; lv < info_.mipLevels; lv++) {
Chia-I Wu1a28fe02015-01-01 07:55:04 +0800180 XGL_BUFFER_IMAGE_COPY region = {};
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800181
Chia-I Wu1a28fe02015-01-01 07:55:04 +0800182 region.bufferOffset = offset;
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800183 region.imageSubresource.mipLevel = lv;
184 region.imageSubresource.arraySlice = 0;
Chia-I Wua9a506a2014-12-27 22:04:00 +0800185 region.imageExtent = Image::extent(info_.extent, lv);
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800186
187 if (info_.usage & XGL_IMAGE_USAGE_DEPTH_STENCIL_BIT) {
Jeremy Hayesa058eee2015-01-23 08:51:43 -0700188 if (info_.format != XGL_FMT_S8_UINT) {
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800189 region.imageSubresource.aspect = XGL_IMAGE_ASPECT_DEPTH;
190 regions_.push_back(region);
191 }
192
Jeremy Hayesa058eee2015-01-23 08:51:43 -0700193 if (info_.format == XGL_FMT_D16_UNORM_S8_UINT ||
194 info_.format == XGL_FMT_D32_SFLOAT_S8_UINT ||
195 info_.format == XGL_FMT_S8_UINT) {
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800196 region.imageSubresource.aspect = XGL_IMAGE_ASPECT_STENCIL;
197 regions_.push_back(region);
198 }
Chia-I Wud7414b02014-10-21 11:06:26 +0800199 } else {
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800200 region.imageSubresource.aspect = XGL_IMAGE_ASPECT_COLOR;
201 regions_.push_back(region);
202 }
203
204 offset += buffer_layout(region).size;
205 }
206
207 // arraySize should be limited in our tests. If this proves to be an
208 // issue, we can store only the regions for array slice 0 and be smart.
209 if (info_.arraySize > 1) {
210 const XGL_GPU_SIZE slice_pitch = offset;
Mark Lobodzinski17caf572015-01-29 08:55:56 -0600211 const uint32_t slice_region_count = regions_.size();
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800212
213 regions_.reserve(slice_region_count * info_.arraySize);
214
Mark Lobodzinski17caf572015-01-29 08:55:56 -0600215 for (uint32_t slice = 1; slice < info_.arraySize; slice++) {
216 for (uint32_t i = 0; i < slice_region_count; i++) {
Chia-I Wu1a28fe02015-01-01 07:55:04 +0800217 XGL_BUFFER_IMAGE_COPY region = regions_[i];
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800218
Chia-I Wu1a28fe02015-01-01 07:55:04 +0800219 region.bufferOffset += slice_pitch * slice;
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800220 region.imageSubresource.arraySlice = slice;
221 regions_.push_back(region);
222 }
223 }
224 }
225}
226
227ImageChecker::ImageChecker(const XGL_IMAGE_CREATE_INFO &info, const std::vector<XGL_IMAGE_SUBRESOURCE_RANGE> &ranges)
228 : info_(info), regions_(), pattern_(HASH)
229{
230 XGL_GPU_SIZE offset = 0;
231 for (std::vector<XGL_IMAGE_SUBRESOURCE_RANGE>::const_iterator it = ranges.begin();
232 it != ranges.end(); it++) {
Mark Lobodzinski17caf572015-01-29 08:55:56 -0600233 for (uint32_t lv = 0; lv < it->mipLevels; lv++) {
234 for (uint32_t slice = 0; slice < it->arraySize; slice++) {
Chia-I Wu1a28fe02015-01-01 07:55:04 +0800235 XGL_BUFFER_IMAGE_COPY region = {};
236 region.bufferOffset = offset;
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800237 region.imageSubresource = Image::subresource(*it, lv, slice);
Chia-I Wua9a506a2014-12-27 22:04:00 +0800238 region.imageExtent = Image::extent(info_.extent, lv);
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800239
240 regions_.push_back(region);
241
242 offset += buffer_layout(region).size;
243 }
244 }
245 }
246}
247
248void ImageChecker::set_solid_pattern(const std::vector<uint8_t> &solid)
249{
250 pattern_ = SOLID;
Chia-I Wu72e34332014-12-21 14:59:04 +0800251 pattern_solid_.clear();
252 pattern_solid_.reserve(buffer_cpp());
253 for (int i = 0; i < buffer_cpp(); i++)
254 pattern_solid_.push_back(solid[i % solid.size()]);
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800255}
256
Mark Lobodzinski17caf572015-01-29 08:55:56 -0600257size_t ImageChecker::buffer_cpp() const
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800258{
259 return get_format_size(info_.format);
260}
261
Chia-I Wu1a28fe02015-01-01 07:55:04 +0800262XGL_SUBRESOURCE_LAYOUT ImageChecker::buffer_layout(const XGL_BUFFER_IMAGE_COPY &region) const
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800263{
264 XGL_SUBRESOURCE_LAYOUT layout = {};
Chia-I Wu1a28fe02015-01-01 07:55:04 +0800265 layout.offset = region.bufferOffset;
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800266 layout.rowPitch = buffer_cpp() * region.imageExtent.width;
267 layout.depthPitch = layout.rowPitch * region.imageExtent.height;
268 layout.size = layout.depthPitch * region.imageExtent.depth;
269
270 return layout;
271}
272
273XGL_GPU_SIZE ImageChecker::buffer_size() const
274{
275 XGL_GPU_SIZE size = 0;
276
Chia-I Wu1a28fe02015-01-01 07:55:04 +0800277 for (std::vector<XGL_BUFFER_IMAGE_COPY>::const_iterator it = regions_.begin();
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800278 it != regions_.end(); it++) {
279 const XGL_SUBRESOURCE_LAYOUT layout = buffer_layout(*it);
280 if (size < layout.offset + layout.size)
281 size = layout.offset + layout.size;
282 }
283
284 return size;
285}
286
Chia-I Wu1a28fe02015-01-01 07:55:04 +0800287bool ImageChecker::walk_region(Action action, const XGL_BUFFER_IMAGE_COPY &region,
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800288 const XGL_SUBRESOURCE_LAYOUT &layout, void *data) const
289{
Mark Lobodzinski17caf572015-01-29 08:55:56 -0600290 for (int32_t z = 0; z < region.imageExtent.depth; z++) {
291 for (int32_t y = 0; y < region.imageExtent.height; y++) {
292 for (int32_t x = 0; x < region.imageExtent.width; x++) {
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800293 uint8_t *dst = static_cast<uint8_t *>(data);
294 dst += layout.offset + layout.depthPitch * z +
295 layout.rowPitch * y + buffer_cpp() * x;
296
297 XGL_OFFSET3D offset = region.imageOffset;
298 offset.x += x;
299 offset.y += y;
300 offset.z += z;
301
302 const std::vector<uint8_t> &val = (pattern_ == HASH) ?
303 pattern_hash(region.imageSubresource, offset) :
304 pattern_solid_;
305 assert(val.size() == buffer_cpp());
306
307 if (action == FILL) {
308 memcpy(dst, &val[0], val.size());
309 } else {
310 for (int i = 0; i < val.size(); i++) {
311 EXPECT_EQ(val[i], dst[i]) <<
312 "Offset is: (" << x << ", " << y << ", " << z << ")";
313 if (val[i] != dst[i])
314 return false;
315 }
316 }
317 }
Chia-I Wud7414b02014-10-21 11:06:26 +0800318 }
319 }
320
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800321 return true;
Chia-I Wud7414b02014-10-21 11:06:26 +0800322}
323
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800324bool ImageChecker::walk(Action action, Buffer &buf) const
Chia-I Wu5b22bc72014-11-22 02:51:25 +0800325{
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800326 void *data = buf.map();
327 if (!data)
328 return false;
Chia-I Wu5b22bc72014-11-22 02:51:25 +0800329
Chia-I Wu1a28fe02015-01-01 07:55:04 +0800330 std::vector<XGL_BUFFER_IMAGE_COPY>::const_iterator it;
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800331 for (it = regions_.begin(); it != regions_.end(); it++) {
332 if (!walk_region(action, *it, buffer_layout(*it), data))
333 break;
Chia-I Wu5b22bc72014-11-22 02:51:25 +0800334 }
335
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800336 buf.unmap();
Chia-I Wu5b22bc72014-11-22 02:51:25 +0800337
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800338 return (it == regions_.end());
Chia-I Wu5b22bc72014-11-22 02:51:25 +0800339}
340
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800341bool ImageChecker::walk(Action action, Image &img) const
342{
343 void *data = img.map();
344 if (!data)
345 return false;
346
Chia-I Wu1a28fe02015-01-01 07:55:04 +0800347 std::vector<XGL_BUFFER_IMAGE_COPY>::const_iterator it;
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800348 for (it = regions_.begin(); it != regions_.end(); it++) {
349 if (!walk_region(action, *it, img.subresource_layout(it->imageSubresource), data))
350 break;
351 }
352
353 img.unmap();
354
355 return (it == regions_.end());
356}
357
358std::vector<uint8_t> ImageChecker::pattern_hash(const XGL_IMAGE_SUBRESOURCE &subres, const XGL_OFFSET3D &offset) const
359{
360#define HASH_BYTE(val, b) static_cast<uint8_t>((static_cast<uint32_t>(val) >> (b * 8)) & 0xff)
361#define HASH_BYTES(val) HASH_BYTE(val, 0), HASH_BYTE(val, 1), HASH_BYTE(val, 2), HASH_BYTE(val, 3)
362 const unsigned char input[] = {
363 HASH_BYTES(hash_salt_),
364 HASH_BYTES(subres.mipLevel),
365 HASH_BYTES(subres.arraySlice),
366 HASH_BYTES(offset.x),
367 HASH_BYTES(offset.y),
368 HASH_BYTES(offset.z),
369 };
370 unsigned long hash = 5381;
371
Mark Lobodzinski17caf572015-01-29 08:55:56 -0600372 for (int32_t i = 0; i < ARRAY_SIZE(input); i++)
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800373 hash = ((hash << 5) + hash) + input[i];
374
375 const uint8_t output[4] = { HASH_BYTES(hash) };
376#undef HASH_BYTES
377#undef HASH_BYTE
378
Chia-I Wu72e34332014-12-21 14:59:04 +0800379 std::vector<uint8_t> val;
380 val.reserve(buffer_cpp());
381 for (int i = 0; i < buffer_cpp(); i++)
382 val.push_back(output[i % 4]);
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800383
384 return val;
385}
386
Mark Lobodzinski17caf572015-01-29 08:55:56 -0600387size_t get_format_size(XGL_FORMAT format)
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800388{
389 static const struct format_info {
Mark Lobodzinski17caf572015-01-29 08:55:56 -0600390 size_t size;
391 uint32_t channel_count;
Jeremy Hayesa058eee2015-01-23 08:51:43 -0700392 } format_table[XGL_NUM_FMT] = {
393 [XGL_FMT_UNDEFINED] = { 0, 0 },
394 [XGL_FMT_R4G4_UNORM] = { 1, 2 },
395 [XGL_FMT_R4G4_USCALED] = { 1, 2 },
396 [XGL_FMT_R4G4B4A4_UNORM] = { 2, 4 },
397 [XGL_FMT_R4G4B4A4_USCALED] = { 2, 4 },
398 [XGL_FMT_R5G6B5_UNORM] = { 2, 3 },
399 [XGL_FMT_R5G6B5_USCALED] = { 2, 3 },
400 [XGL_FMT_R5G5B5A1_UNORM] = { 2, 4 },
401 [XGL_FMT_R5G5B5A1_USCALED] = { 2, 4 },
402 [XGL_FMT_R8_UNORM] = { 1, 1 },
403 [XGL_FMT_R8_SNORM] = { 1, 1 },
404 [XGL_FMT_R8_USCALED] = { 1, 1 },
405 [XGL_FMT_R8_SSCALED] = { 1, 1 },
406 [XGL_FMT_R8_UINT] = { 1, 1 },
407 [XGL_FMT_R8_SINT] = { 1, 1 },
408 [XGL_FMT_R8_SRGB] = { 1, 1 },
409 [XGL_FMT_R8G8_UNORM] = { 2, 2 },
410 [XGL_FMT_R8G8_SNORM] = { 2, 2 },
411 [XGL_FMT_R8G8_USCALED] = { 2, 2 },
412 [XGL_FMT_R8G8_SSCALED] = { 2, 2 },
413 [XGL_FMT_R8G8_UINT] = { 2, 2 },
414 [XGL_FMT_R8G8_SINT] = { 2, 2 },
415 [XGL_FMT_R8G8_SRGB] = { 2, 2 },
416 [XGL_FMT_R8G8B8_UNORM] = { 3, 3 },
417 [XGL_FMT_R8G8B8_SNORM] = { 3, 3 },
418 [XGL_FMT_R8G8B8_USCALED] = { 3, 3 },
419 [XGL_FMT_R8G8B8_SSCALED] = { 3, 3 },
420 [XGL_FMT_R8G8B8_UINT] = { 3, 3 },
421 [XGL_FMT_R8G8B8_SINT] = { 3, 3 },
422 [XGL_FMT_R8G8B8_SRGB] = { 3, 3 },
423 [XGL_FMT_R8G8B8A8_UNORM] = { 4, 4 },
424 [XGL_FMT_R8G8B8A8_SNORM] = { 4, 4 },
425 [XGL_FMT_R8G8B8A8_USCALED] = { 4, 4 },
426 [XGL_FMT_R8G8B8A8_SSCALED] = { 4, 4 },
427 [XGL_FMT_R8G8B8A8_UINT] = { 4, 4 },
428 [XGL_FMT_R8G8B8A8_SINT] = { 4, 4 },
429 [XGL_FMT_R8G8B8A8_SRGB] = { 4, 4 },
430 [XGL_FMT_R10G10B10A2_UNORM] = { 4, 4 },
431 [XGL_FMT_R10G10B10A2_SNORM] = { 4, 4 },
432 [XGL_FMT_R10G10B10A2_USCALED] = { 4, 4 },
433 [XGL_FMT_R10G10B10A2_SSCALED] = { 4, 4 },
434 [XGL_FMT_R10G10B10A2_UINT] = { 4, 4 },
435 [XGL_FMT_R10G10B10A2_SINT] = { 4, 4 },
436 [XGL_FMT_R16_UNORM] = { 2, 1 },
437 [XGL_FMT_R16_SNORM] = { 2, 1 },
438 [XGL_FMT_R16_USCALED] = { 2, 1 },
439 [XGL_FMT_R16_SSCALED] = { 2, 1 },
440 [XGL_FMT_R16_UINT] = { 2, 1 },
441 [XGL_FMT_R16_SINT] = { 2, 1 },
442 [XGL_FMT_R16_SFLOAT] = { 2, 1 },
443 [XGL_FMT_R16G16_UNORM] = { 4, 2 },
444 [XGL_FMT_R16G16_SNORM] = { 4, 2 },
445 [XGL_FMT_R16G16_USCALED] = { 4, 2 },
446 [XGL_FMT_R16G16_SSCALED] = { 4, 2 },
447 [XGL_FMT_R16G16_UINT] = { 4, 2 },
448 [XGL_FMT_R16G16_SINT] = { 4, 2 },
449 [XGL_FMT_R16G16_SFLOAT] = { 4, 2 },
450 [XGL_FMT_R16G16B16_UNORM] = { 6, 3 },
451 [XGL_FMT_R16G16B16_SNORM] = { 6, 3 },
452 [XGL_FMT_R16G16B16_USCALED] = { 6, 3 },
453 [XGL_FMT_R16G16B16_SSCALED] = { 6, 3 },
454 [XGL_FMT_R16G16B16_UINT] = { 6, 3 },
455 [XGL_FMT_R16G16B16_SINT] = { 6, 3 },
456 [XGL_FMT_R16G16B16_SFLOAT] = { 6, 3 },
457 [XGL_FMT_R16G16B16A16_UNORM] = { 8, 4 },
458 [XGL_FMT_R16G16B16A16_SNORM] = { 8, 4 },
459 [XGL_FMT_R16G16B16A16_USCALED] = { 8, 4 },
460 [XGL_FMT_R16G16B16A16_SSCALED] = { 8, 4 },
461 [XGL_FMT_R16G16B16A16_UINT] = { 8, 4 },
462 [XGL_FMT_R16G16B16A16_SINT] = { 8, 4 },
463 [XGL_FMT_R16G16B16A16_SFLOAT] = { 8, 4 },
464 [XGL_FMT_R32_UINT] = { 4, 1 },
465 [XGL_FMT_R32_SINT] = { 4, 1 },
466 [XGL_FMT_R32_SFLOAT] = { 4, 1 },
467 [XGL_FMT_R32G32_UINT] = { 8, 2 },
468 [XGL_FMT_R32G32_SINT] = { 8, 2 },
469 [XGL_FMT_R32G32_SFLOAT] = { 8, 2 },
470 [XGL_FMT_R32G32B32_UINT] = { 12, 3 },
471 [XGL_FMT_R32G32B32_SINT] = { 12, 3 },
472 [XGL_FMT_R32G32B32_SFLOAT] = { 12, 3 },
473 [XGL_FMT_R32G32B32A32_UINT] = { 16, 4 },
474 [XGL_FMT_R32G32B32A32_SINT] = { 16, 4 },
475 [XGL_FMT_R32G32B32A32_SFLOAT] = { 16, 4 },
476 [XGL_FMT_R64_SFLOAT] = { 8, 1 },
477 [XGL_FMT_R64G64_SFLOAT] = { 16, 2 },
478 [XGL_FMT_R64G64B64_SFLOAT] = { 24, 3 },
479 [XGL_FMT_R64G64B64A64_SFLOAT] = { 32, 4 },
480 [XGL_FMT_R11G11B10_UFLOAT] = { 4, 3 },
481 [XGL_FMT_R9G9B9E5_UFLOAT] = { 4, 3 },
482 [XGL_FMT_D16_UNORM] = { 2, 1 },
483 [XGL_FMT_D24_UNORM] = { 3, 1 },
484 [XGL_FMT_D32_SFLOAT] = { 4, 1 },
485 [XGL_FMT_S8_UINT] = { 1, 1 },
486 [XGL_FMT_D16_UNORM_S8_UINT] = { 3, 2 },
487 [XGL_FMT_D24_UNORM_S8_UINT] = { 4, 2 },
488 [XGL_FMT_D32_SFLOAT_S8_UINT] = { 4, 2 },
489 [XGL_FMT_BC1_UNORM] = { 8, 4 },
490 [XGL_FMT_BC1_SRGB] = { 8, 4 },
491 [XGL_FMT_BC2_UNORM] = { 16, 4 },
492 [XGL_FMT_BC2_SRGB] = { 16, 4 },
493 [XGL_FMT_BC3_UNORM] = { 16, 4 },
494 [XGL_FMT_BC3_SRGB] = { 16, 4 },
495 [XGL_FMT_BC4_UNORM] = { 8, 4 },
496 [XGL_FMT_BC4_SNORM] = { 8, 4 },
497 [XGL_FMT_BC5_UNORM] = { 16, 4 },
498 [XGL_FMT_BC5_SNORM] = { 16, 4 },
499 [XGL_FMT_BC6H_UFLOAT] = { 16, 4 },
500 [XGL_FMT_BC6H_SFLOAT] = { 16, 4 },
501 [XGL_FMT_BC7_UNORM] = { 16, 4 },
502 [XGL_FMT_BC7_SRGB] = { 16, 4 },
503 // TODO: Initialize remaining compressed formats.
504 [XGL_FMT_ETC2_R8G8B8_UNORM] = { 0, 0 },
505 [XGL_FMT_ETC2_R8G8B8A1_UNORM] = { 0, 0 },
506 [XGL_FMT_ETC2_R8G8B8A8_UNORM] = { 0, 0 },
507 [XGL_FMT_EAC_R11_UNORM] = { 0, 0 },
508 [XGL_FMT_EAC_R11_SNORM] = { 0, 0 },
509 [XGL_FMT_EAC_R11G11_UNORM] = { 0, 0 },
510 [XGL_FMT_EAC_R11G11_SNORM] = { 0, 0 },
511 [XGL_FMT_ASTC_4x4_UNORM] = { 0, 0 },
512 [XGL_FMT_ASTC_4x4_SRGB] = { 0, 0 },
513 [XGL_FMT_ASTC_4x5_UNORM] = { 0, 0 },
514 [XGL_FMT_ASTC_4x5_SRGB] = { 0, 0 },
515 [XGL_FMT_ASTC_5x5_UNORM] = { 0, 0 },
516 [XGL_FMT_ASTC_5x5_SRGB] = { 0, 0 },
517 [XGL_FMT_ASTC_6x5_UNORM] = { 0, 0 },
518 [XGL_FMT_ASTC_6x5_SRGB] = { 0, 0 },
519 [XGL_FMT_ASTC_6x6_UNORM] = { 0, 0 },
520 [XGL_FMT_ASTC_6x6_SRGB] = { 0, 0 },
521 [XGL_FMT_ASTC_8x5_UNORM] = { 0, 0 },
522 [XGL_FMT_ASTC_8x5_SRGB] = { 0, 0 },
523 [XGL_FMT_ASTC_8x6_UNORM] = { 0, 0 },
524 [XGL_FMT_ASTC_8x6_SRGB] = { 0, 0 },
525 [XGL_FMT_ASTC_8x8_UNORM] = { 0, 0 },
526 [XGL_FMT_ASTC_8x8_SRGB] = { 0, 0 },
527 [XGL_FMT_ASTC_10x5_UNORM] = { 0, 0 },
528 [XGL_FMT_ASTC_10x5_SRGB] = { 0, 0 },
529 [XGL_FMT_ASTC_10x6_UNORM] = { 0, 0 },
530 [XGL_FMT_ASTC_10x6_SRGB] = { 0, 0 },
531 [XGL_FMT_ASTC_10x8_UNORM] = { 0, 0 },
532 [XGL_FMT_ASTC_10x8_SRGB] = { 0, 0 },
533 [XGL_FMT_ASTC_10x10_UNORM] = { 0, 0 },
534 [XGL_FMT_ASTC_10x10_SRGB] = { 0, 0 },
535 [XGL_FMT_ASTC_12x10_UNORM] = { 0, 0 },
536 [XGL_FMT_ASTC_12x10_SRGB] = { 0, 0 },
537 [XGL_FMT_ASTC_12x12_UNORM] = { 0, 0 },
538 [XGL_FMT_ASTC_12x12_SRGB] = { 0, 0 },
539 [XGL_FMT_B5G6R5_UNORM] = { 2, 3 },
540 [XGL_FMT_B5G6R5_USCALED] = { 2, 3 },
541 [XGL_FMT_B8G8R8_UNORM] = { 3, 3 },
542 [XGL_FMT_B8G8R8_SNORM] = { 3, 3 },
543 [XGL_FMT_B8G8R8_USCALED] = { 3, 3 },
544 [XGL_FMT_B8G8R8_SSCALED] = { 3, 3 },
545 [XGL_FMT_B8G8R8_UINT] = { 3, 3 },
546 [XGL_FMT_B8G8R8_SINT] = { 3, 3 },
547 [XGL_FMT_B8G8R8_SRGB] = { 3, 3 },
548 [XGL_FMT_B8G8R8A8_UNORM] = { 4, 4 },
549 [XGL_FMT_B8G8R8A8_SNORM] = { 4, 4 },
550 [XGL_FMT_B8G8R8A8_USCALED] = { 4, 4 },
551 [XGL_FMT_B8G8R8A8_SSCALED] = { 4, 4 },
552 [XGL_FMT_B8G8R8A8_UINT] = { 4, 4 },
553 [XGL_FMT_B8G8R8A8_SINT] = { 4, 4 },
554 [XGL_FMT_B8G8R8A8_SRGB] = { 4, 4 },
555 [XGL_FMT_B10G10R10A2_UNORM] = { 4, 4 },
556 [XGL_FMT_B10G10R10A2_SNORM] = { 4, 4 },
557 [XGL_FMT_B10G10R10A2_USCALED] = { 4, 4 },
558 [XGL_FMT_B10G10R10A2_SSCALED] = { 4, 4 },
559 [XGL_FMT_B10G10R10A2_UINT] = { 4, 4 },
560 [XGL_FMT_B10G10R10A2_SINT] = { 4, 4 },
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800561 };
562
Jeremy Hayesa058eee2015-01-23 08:51:43 -0700563 return format_table[format].size;
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800564}
565
Mark Lobodzinski17caf572015-01-29 08:55:56 -0600566XGL_EXTENT3D get_mip_level_extent(const XGL_EXTENT3D &extent, uint32_t mip_level)
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800567{
568 const XGL_EXTENT3D ext = {
569 (extent.width >> mip_level) ? extent.width >> mip_level : 1,
570 (extent.height >> mip_level) ? extent.height >> mip_level : 1,
571 (extent.depth >> mip_level) ? extent.depth >> mip_level : 1,
572 };
573
574 return ext;
575}
576
577}; // namespace xgl_testing
578
579namespace {
580
581#define DO(action) ASSERT_EQ(true, action);
582
583xgl_testing::Environment *environment;
584
585class XglCmdBlitTest : public ::testing::Test {
586protected:
587 XglCmdBlitTest() :
588 dev_(environment->default_device()),
Chia-I Wua9a506a2014-12-27 22:04:00 +0800589 queue_(*dev_.graphics_queues()[0]),
590 cmd_(dev_, xgl_testing::CmdBuffer::create_info(XGL_QUEUE_TYPE_GRAPHICS))
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800591 {
592 // make sure every test uses a different pattern
593 xgl_testing::ImageChecker::hash_salt_generate();
594 }
595
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800596 bool submit_and_done()
597 {
Chia-I Wua9a506a2014-12-27 22:04:00 +0800598 queue_.submit(cmd_, mem_refs_);
599 queue_.wait();
600 mem_refs_.clear();
601 return true;
602 }
603
604 void add_memory_ref(const xgl_testing::Object &obj, XGL_FLAGS flags)
605 {
606 const std::vector<XGL_GPU_MEMORY> mems = obj.memories();
607 for (std::vector<XGL_GPU_MEMORY>::const_iterator it = mems.begin(); it != mems.end(); it++) {
608 std::vector<XGL_MEMORY_REF>::iterator ref;
609 for (ref = mem_refs_.begin(); ref != mem_refs_.end(); ref++) {
610 if (ref->mem == *it)
611 break;
612 }
613
614 if (ref == mem_refs_.end()) {
615 XGL_MEMORY_REF tmp = {};
616 tmp.mem = *it;
617 tmp.flags = flags;
618 mem_refs_.push_back(tmp);
619 } else {
620 ref->flags &= flags;
621 }
622 }
623 }
624
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800625 xgl_testing::Device &dev_;
Chia-I Wua9a506a2014-12-27 22:04:00 +0800626 xgl_testing::Queue &queue_;
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800627 xgl_testing::CmdBuffer cmd_;
Chia-I Wua9a506a2014-12-27 22:04:00 +0800628
629 std::vector<XGL_MEMORY_REF> mem_refs_;
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800630};
631
Chia-I Wu1a28fe02015-01-01 07:55:04 +0800632typedef XglCmdBlitTest XglCmdFillBufferTest;
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800633
Chia-I Wu1a28fe02015-01-01 07:55:04 +0800634TEST_F(XglCmdFillBufferTest, Basic)
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800635{
636 xgl_testing::Buffer buf;
637
638 buf.init(dev_, 20);
Chia-I Wua9a506a2014-12-27 22:04:00 +0800639 add_memory_ref(buf, 0);
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800640
641 cmd_.begin();
Chia-I Wu1a28fe02015-01-01 07:55:04 +0800642 xglCmdFillBuffer(cmd_.obj(), buf.obj(), 0, 4, 0x11111111);
643 xglCmdFillBuffer(cmd_.obj(), buf.obj(), 4, 16, 0x22222222);
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800644 cmd_.end();
645
646 submit_and_done();
647
648 const uint32_t *data = static_cast<const uint32_t *>(buf.map());
649 EXPECT_EQ(0x11111111, data[0]);
650 EXPECT_EQ(0x22222222, data[1]);
651 EXPECT_EQ(0x22222222, data[2]);
652 EXPECT_EQ(0x22222222, data[3]);
653 EXPECT_EQ(0x22222222, data[4]);
654 buf.unmap();
655}
656
Chia-I Wu1a28fe02015-01-01 07:55:04 +0800657TEST_F(XglCmdFillBufferTest, Large)
Chia-I Wud94726f2014-11-23 02:16:45 +0800658{
659 const XGL_GPU_SIZE size = 32 * 1024 * 1024;
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800660 xgl_testing::Buffer buf;
Chia-I Wud94726f2014-11-23 02:16:45 +0800661
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800662 buf.init(dev_, size);
Chia-I Wua9a506a2014-12-27 22:04:00 +0800663 add_memory_ref(buf, 0);
Chia-I Wud94726f2014-11-23 02:16:45 +0800664
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800665 cmd_.begin();
Chia-I Wu1a28fe02015-01-01 07:55:04 +0800666 xglCmdFillBuffer(cmd_.obj(), buf.obj(), 0, size / 2, 0x11111111);
667 xglCmdFillBuffer(cmd_.obj(), buf.obj(), size / 2, size / 2, 0x22222222);
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800668 cmd_.end();
Chia-I Wud94726f2014-11-23 02:16:45 +0800669
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800670 submit_and_done();
Chia-I Wud94726f2014-11-23 02:16:45 +0800671
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800672 const uint32_t *data = static_cast<const uint32_t *>(buf.map());
673 XGL_GPU_SIZE offset;
674 for (offset = 0; offset < size / 2; offset += 4)
675 EXPECT_EQ(0x11111111, data[offset / 4]) << "Offset is: " << offset;
676 for (; offset < size; offset += 4)
677 EXPECT_EQ(0x22222222, data[offset / 4]) << "Offset is: " << offset;
678 buf.unmap();
679}
Chia-I Wud94726f2014-11-23 02:16:45 +0800680
Chia-I Wu1a28fe02015-01-01 07:55:04 +0800681TEST_F(XglCmdFillBufferTest, Overlap)
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800682{
683 xgl_testing::Buffer buf;
684
685 buf.init(dev_, 64);
Chia-I Wua9a506a2014-12-27 22:04:00 +0800686 add_memory_ref(buf, 0);
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800687
688 cmd_.begin();
Chia-I Wu1a28fe02015-01-01 07:55:04 +0800689 xglCmdFillBuffer(cmd_.obj(), buf.obj(), 0, 48, 0x11111111);
690 xglCmdFillBuffer(cmd_.obj(), buf.obj(), 32, 32, 0x22222222);
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800691 cmd_.end();
692
693 submit_and_done();
694
695 const uint32_t *data = static_cast<const uint32_t *>(buf.map());
696 XGL_GPU_SIZE offset;
697 for (offset = 0; offset < 32; offset += 4)
698 EXPECT_EQ(0x11111111, data[offset / 4]) << "Offset is: " << offset;
699 for (; offset < 64; offset += 4)
700 EXPECT_EQ(0x22222222, data[offset / 4]) << "Offset is: " << offset;
701 buf.unmap();
702}
703
Chia-I Wu1a28fe02015-01-01 07:55:04 +0800704TEST_F(XglCmdFillBufferTest, MultiAlignments)
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800705{
706 xgl_testing::Buffer bufs[9];
707 XGL_GPU_SIZE size = 4;
708
709 cmd_.begin();
710 for (int i = 0; i < ARRAY_SIZE(bufs); i++) {
711 bufs[i].init(dev_, size);
Chia-I Wua9a506a2014-12-27 22:04:00 +0800712 add_memory_ref(bufs[i], 0);
Chia-I Wu1a28fe02015-01-01 07:55:04 +0800713 xglCmdFillBuffer(cmd_.obj(), bufs[i].obj(), 0, size, 0x11111111);
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800714 size <<= 1;
715 }
716 cmd_.end();
717
718 submit_and_done();
719
720 size = 4;
721 for (int i = 0; i < ARRAY_SIZE(bufs); i++) {
722 const uint32_t *data = static_cast<const uint32_t *>(bufs[i].map());
723 XGL_GPU_SIZE offset;
724 for (offset = 0; offset < size; offset += 4)
725 EXPECT_EQ(0x11111111, data[offset / 4]) << "Buffser is: " << i << "\n" <<
726 "Offset is: " << offset;
727 bufs[i].unmap();
728
729 size <<= 1;
730 }
731}
732
Chia-I Wu1a28fe02015-01-01 07:55:04 +0800733typedef XglCmdBlitTest XglCmdCopyBufferTest;
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800734
Chia-I Wu1a28fe02015-01-01 07:55:04 +0800735TEST_F(XglCmdCopyBufferTest, Basic)
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800736{
737 xgl_testing::Buffer src, dst;
738
739 src.init(dev_, 4);
740 uint32_t *data = static_cast<uint32_t *>(src.map());
741 data[0] = 0x11111111;
742 src.unmap();
Chia-I Wua9a506a2014-12-27 22:04:00 +0800743 add_memory_ref(src, XGL_MEMORY_REF_READ_ONLY_BIT);
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800744
745 dst.init(dev_, 4);
Chia-I Wua9a506a2014-12-27 22:04:00 +0800746 add_memory_ref(dst, 0);
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800747
748 cmd_.begin();
Chia-I Wu1a28fe02015-01-01 07:55:04 +0800749 XGL_BUFFER_COPY region = {};
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800750 region.copySize = 4;
Chia-I Wu1a28fe02015-01-01 07:55:04 +0800751 xglCmdCopyBuffer(cmd_.obj(), src.obj(), dst.obj(), 1, &region);
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800752 cmd_.end();
753
754 submit_and_done();
755
756 data = static_cast<uint32_t *>(dst.map());
757 EXPECT_EQ(0x11111111, data[0]);
758 dst.unmap();
759}
760
Chia-I Wu1a28fe02015-01-01 07:55:04 +0800761TEST_F(XglCmdCopyBufferTest, Large)
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800762{
763 const XGL_GPU_SIZE size = 32 * 1024 * 1024;
764 xgl_testing::Buffer src, dst;
765
766 src.init(dev_, size);
767 uint32_t *data = static_cast<uint32_t *>(src.map());
768 XGL_GPU_SIZE offset;
769 for (offset = 0; offset < size; offset += 4)
770 data[offset / 4] = offset;
771 src.unmap();
Chia-I Wua9a506a2014-12-27 22:04:00 +0800772 add_memory_ref(src, XGL_MEMORY_REF_READ_ONLY_BIT);
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800773
774 dst.init(dev_, size);
Chia-I Wua9a506a2014-12-27 22:04:00 +0800775 add_memory_ref(dst, 0);
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800776
777 cmd_.begin();
Chia-I Wu1a28fe02015-01-01 07:55:04 +0800778 XGL_BUFFER_COPY region = {};
Chia-I Wud94726f2014-11-23 02:16:45 +0800779 region.copySize = size;
Chia-I Wu1a28fe02015-01-01 07:55:04 +0800780 xglCmdCopyBuffer(cmd_.obj(), src.obj(), dst.obj(), 1, &region);
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800781 cmd_.end();
Chia-I Wud94726f2014-11-23 02:16:45 +0800782
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800783 submit_and_done();
Chia-I Wud94726f2014-11-23 02:16:45 +0800784
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800785 data = static_cast<uint32_t *>(dst.map());
786 for (offset = 0; offset < size; offset += 4)
787 EXPECT_EQ(offset, data[offset / 4]);
788 dst.unmap();
Chia-I Wud94726f2014-11-23 02:16:45 +0800789}
790
Chia-I Wu1a28fe02015-01-01 07:55:04 +0800791TEST_F(XglCmdCopyBufferTest, MultiAlignments)
Chia-I Wud7414b02014-10-21 11:06:26 +0800792{
Chia-I Wu1a28fe02015-01-01 07:55:04 +0800793 const XGL_BUFFER_COPY regions[] = {
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800794 /* well aligned */
795 { 0, 0, 256 },
796 { 0, 256, 128 },
797 { 0, 384, 64 },
798 { 0, 448, 32 },
799 { 0, 480, 16 },
800 { 0, 496, 8 },
Chia-I Wud7414b02014-10-21 11:06:26 +0800801
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800802 /* ill aligned */
803 { 7, 510, 16 },
804 { 16, 530, 13 },
805 { 32, 551, 16 },
806 { 45, 570, 15 },
807 { 50, 590, 1 },
808 };
809 xgl_testing::Buffer src, dst;
Chia-I Wud7414b02014-10-21 11:06:26 +0800810
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800811 src.init(dev_, 256);
812 uint8_t *data = static_cast<uint8_t *>(src.map());
813 for (int i = 0; i < 256; i++)
814 data[i] = i;
815 src.unmap();
Chia-I Wua9a506a2014-12-27 22:04:00 +0800816 add_memory_ref(src, XGL_MEMORY_REF_READ_ONLY_BIT);
Chia-I Wud7414b02014-10-21 11:06:26 +0800817
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800818 dst.init(dev_, 1024);
Chia-I Wua9a506a2014-12-27 22:04:00 +0800819 add_memory_ref(dst, 0);
Chia-I Wud7414b02014-10-21 11:06:26 +0800820
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800821 cmd_.begin();
Chia-I Wu1a28fe02015-01-01 07:55:04 +0800822 xglCmdCopyBuffer(cmd_.obj(), src.obj(), dst.obj(), ARRAY_SIZE(regions), regions);
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800823 cmd_.end();
Chia-I Wud7414b02014-10-21 11:06:26 +0800824
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800825 submit_and_done();
Chia-I Wud7414b02014-10-21 11:06:26 +0800826
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800827 data = static_cast<uint8_t *>(dst.map());
828 for (int i = 0; i < ARRAY_SIZE(regions); i++) {
Chia-I Wu1a28fe02015-01-01 07:55:04 +0800829 const XGL_BUFFER_COPY &r = regions[i];
Chia-I Wud7414b02014-10-21 11:06:26 +0800830
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800831 for (int j = 0; j < r.copySize; j++) {
832 EXPECT_EQ(r.srcOffset + j, data[r.destOffset + j]) <<
833 "Region is: " << i << "\n" <<
834 "Offset is: " << r.destOffset + j;
835 }
836 }
837 dst.unmap();
838}
Chia-I Wud7414b02014-10-21 11:06:26 +0800839
Chia-I Wu1a28fe02015-01-01 07:55:04 +0800840TEST_F(XglCmdCopyBufferTest, RAWHazard)
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800841{
842 xgl_testing::Buffer bufs[3];
Mike Stroyanfb80d5f2014-12-04 11:08:39 +0000843 XGL_EVENT_CREATE_INFO event_info;
844 XGL_EVENT event;
845 XGL_MEMORY_REQUIREMENTS mem_req;
846 size_t data_size = sizeof(mem_req);
847 XGL_RESULT err;
848
849 // typedef struct _XGL_EVENT_CREATE_INFO
850 // {
851 // XGL_STRUCTURE_TYPE sType; // Must be XGL_STRUCTURE_TYPE_EVENT_CREATE_INFO
Mark Lobodzinski17caf572015-01-29 08:55:56 -0600852 // const void* pNext; // Pointer to next structure
Mike Stroyanfb80d5f2014-12-04 11:08:39 +0000853 // XGL_FLAGS flags; // Reserved
854 // } XGL_EVENT_CREATE_INFO;
855 memset(&event_info, 0, sizeof(event_info));
856 event_info.sType = XGL_STRUCTURE_TYPE_EVENT_CREATE_INFO;
857
858 err = xglCreateEvent(dev_.obj(), &event_info, &event);
859 ASSERT_XGL_SUCCESS(err);
860
861 err = xglGetObjectInfo(event, XGL_INFO_TYPE_MEMORY_REQUIREMENTS,
862 &data_size, &mem_req);
863 ASSERT_XGL_SUCCESS(err);
864
865 // XGL_RESULT XGLAPI xglAllocMemory(
866 // XGL_DEVICE device,
867 // const XGL_MEMORY_ALLOC_INFO* pAllocInfo,
868 // XGL_GPU_MEMORY* pMem);
869 XGL_MEMORY_ALLOC_INFO mem_info;
870 XGL_GPU_MEMORY event_mem;
871
872 ASSERT_NE(0, mem_req.size) << "xglGetObjectInfo (Event): Failed - expect events to require memory";
873
Mike Stroyanfb80d5f2014-12-04 11:08:39 +0000874 memset(&mem_info, 0, sizeof(mem_info));
875 mem_info.sType = XGL_STRUCTURE_TYPE_MEMORY_ALLOC_INFO;
876 mem_info.allocationSize = mem_req.size;
Jon Ashburn205b4222015-01-20 16:59:42 -0700877 mem_info.memType = mem_req.memType;
Mike Stroyanfb80d5f2014-12-04 11:08:39 +0000878 mem_info.memPriority = XGL_MEMORY_PRIORITY_NORMAL;
Jon Ashburne01ff7a2015-01-20 15:06:59 -0700879 mem_info.memProps = XGL_MEMORY_PROPERTY_SHAREABLE_BIT;
Mike Stroyanfb80d5f2014-12-04 11:08:39 +0000880 err = xglAllocMemory(dev_.obj(), &mem_info, &event_mem);
881 ASSERT_XGL_SUCCESS(err);
882
Jon Ashburn9b6eae52015-01-15 10:39:19 -0700883 err = xglBindObjectMemory(event, 0, event_mem, 0);
Mike Stroyanfb80d5f2014-12-04 11:08:39 +0000884 ASSERT_XGL_SUCCESS(err);
885
886 err = xglResetEvent(event);
887 ASSERT_XGL_SUCCESS(err);
Chia-I Wud7414b02014-10-21 11:06:26 +0800888
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800889 for (int i = 0; i < ARRAY_SIZE(bufs); i++) {
890 bufs[i].init(dev_, 4);
Chia-I Wua9a506a2014-12-27 22:04:00 +0800891 add_memory_ref(bufs[i], 0);
Chia-I Wud7414b02014-10-21 11:06:26 +0800892
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800893 uint32_t *data = static_cast<uint32_t *>(bufs[i].map());
894 data[0] = 0x22222222 * (i + 1);
895 bufs[i].unmap();
896 }
897
898 cmd_.begin();
899
Chia-I Wu1a28fe02015-01-01 07:55:04 +0800900 xglCmdFillBuffer(cmd_.obj(), bufs[0].obj(), 0, 4, 0x11111111);
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800901 // is this necessary?
Mike Stroyanfb80d5f2014-12-04 11:08:39 +0000902 XGL_BUFFER_MEMORY_BARRIER memory_barrier = bufs[0].buffer_memory_barrier(
903 XGL_MEMORY_OUTPUT_COPY_BIT, XGL_MEMORY_INPUT_COPY_BIT, 0, 4);
Mark Lobodzinski837ef922015-01-29 14:24:14 -0600904 XGL_BUFFER_MEMORY_BARRIER *pmemory_barrier = &memory_barrier;
Mike Stroyanfb80d5f2014-12-04 11:08:39 +0000905
906 XGL_SET_EVENT set_events[] = { XGL_SET_EVENT_TRANSFER_COMPLETE };
907 XGL_PIPELINE_BARRIER pipeline_barrier = {};
908 pipeline_barrier.sType = XGL_STRUCTURE_TYPE_PIPELINE_BARRIER;
909 pipeline_barrier.eventCount = 1;
910 pipeline_barrier.pEvents = set_events;
911 pipeline_barrier.waitEvent = XGL_WAIT_EVENT_TOP_OF_PIPE;
912 pipeline_barrier.memBarrierCount = 1;
Mark Lobodzinski837ef922015-01-29 14:24:14 -0600913 pipeline_barrier.pMemBarriers = (const void **)&pmemory_barrier;
Mike Stroyanfb80d5f2014-12-04 11:08:39 +0000914 xglCmdPipelineBarrier(cmd_.obj(), &pipeline_barrier);
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800915
Chia-I Wu1a28fe02015-01-01 07:55:04 +0800916 XGL_BUFFER_COPY region = {};
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800917 region.copySize = 4;
Chia-I Wu1a28fe02015-01-01 07:55:04 +0800918 xglCmdCopyBuffer(cmd_.obj(), bufs[0].obj(), bufs[1].obj(), 1, &region);
Mike Stroyanfb80d5f2014-12-04 11:08:39 +0000919
920 memory_barrier = bufs[1].buffer_memory_barrier(
921 XGL_MEMORY_OUTPUT_COPY_BIT, XGL_MEMORY_INPUT_COPY_BIT, 0, 4);
Mark Lobodzinski837ef922015-01-29 14:24:14 -0600922 pmemory_barrier = &memory_barrier;
Mike Stroyanfb80d5f2014-12-04 11:08:39 +0000923 pipeline_barrier.sType = XGL_STRUCTURE_TYPE_PIPELINE_BARRIER;
924 pipeline_barrier.eventCount = 1;
925 pipeline_barrier.pEvents = set_events;
926 pipeline_barrier.waitEvent = XGL_WAIT_EVENT_TOP_OF_PIPE;
927 pipeline_barrier.memBarrierCount = 1;
Mark Lobodzinski837ef922015-01-29 14:24:14 -0600928 pipeline_barrier.pMemBarriers = (const void **)&pmemory_barrier;
Mike Stroyanfb80d5f2014-12-04 11:08:39 +0000929 xglCmdPipelineBarrier(cmd_.obj(), &pipeline_barrier);
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800930
Chia-I Wu1a28fe02015-01-01 07:55:04 +0800931 xglCmdCopyBuffer(cmd_.obj(), bufs[1].obj(), bufs[2].obj(), 1, &region);
Mike Stroyanfb80d5f2014-12-04 11:08:39 +0000932
933 /* Use xglCmdSetEvent and xglCmdWaitEvents to test them.
934 * This could be xglCmdPipelineBarrier.
935 */
936 xglCmdSetEvent(cmd_.obj(), event, XGL_SET_EVENT_TRANSFER_COMPLETE);
937
938 // Additional commands could go into the buffer here before the wait.
939
940 memory_barrier = bufs[1].buffer_memory_barrier(
941 XGL_MEMORY_OUTPUT_COPY_BIT, XGL_MEMORY_INPUT_CPU_READ_BIT, 0, 4);
Mark Lobodzinski837ef922015-01-29 14:24:14 -0600942 pmemory_barrier = &memory_barrier;
Mike Stroyanfb80d5f2014-12-04 11:08:39 +0000943 XGL_EVENT_WAIT_INFO wait_info = {};
944 wait_info.sType = XGL_STRUCTURE_TYPE_EVENT_WAIT_INFO;
945 wait_info.eventCount = 1;
946 wait_info.pEvents = &event;
947 wait_info.waitEvent = XGL_WAIT_EVENT_TOP_OF_PIPE;
948 wait_info.memBarrierCount = 1;
Mark Lobodzinski837ef922015-01-29 14:24:14 -0600949 wait_info.pMemBarriers = (const void **)&pmemory_barrier;
Mike Stroyanfb80d5f2014-12-04 11:08:39 +0000950 xglCmdWaitEvents(cmd_.obj(), &wait_info);
951
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800952 cmd_.end();
953
954 submit_and_done();
955
956 const uint32_t *data = static_cast<const uint32_t *>(bufs[2].map());
957 EXPECT_EQ(0x11111111, data[0]);
958 bufs[2].unmap();
Mike Stroyanfb80d5f2014-12-04 11:08:39 +0000959
960 // All done with event memory, clean up
Jon Ashburn9b6eae52015-01-15 10:39:19 -0700961 err = xglBindObjectMemory(event, 0, XGL_NULL_HANDLE, 0);
Mike Stroyanfb80d5f2014-12-04 11:08:39 +0000962 ASSERT_XGL_SUCCESS(err);
963
964 err = xglDestroyObject(event);
965 ASSERT_XGL_SUCCESS(err);
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800966}
967
968class XglCmdBlitImageTest : public XglCmdBlitTest {
969protected:
970 void init_test_formats(XGL_FLAGS features)
Chia-I Wud7414b02014-10-21 11:06:26 +0800971 {
Jeremy Hayesa058eee2015-01-23 08:51:43 -0700972 first_linear_format_ = XGL_FMT_UNDEFINED;
973 first_optimal_format_ = XGL_FMT_UNDEFINED;
Chia-I Wud7414b02014-10-21 11:06:26 +0800974
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800975 for (std::vector<xgl_testing::Device::Format>::const_iterator it = dev_.formats().begin();
976 it != dev_.formats().end(); it++) {
977 if (it->features & features) {
978 test_formats_.push_back(*it);
Chia-I Wud7414b02014-10-21 11:06:26 +0800979
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800980 if (it->tiling == XGL_LINEAR_TILING &&
Jeremy Hayesa058eee2015-01-23 08:51:43 -0700981 first_linear_format_ == XGL_FMT_UNDEFINED)
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800982 first_linear_format_ = it->format;
983 if (it->tiling == XGL_OPTIMAL_TILING &&
Jeremy Hayesa058eee2015-01-23 08:51:43 -0700984 first_optimal_format_ == XGL_FMT_UNDEFINED)
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800985 first_optimal_format_ = it->format;
986 }
987 }
988 }
Chia-I Wud7414b02014-10-21 11:06:26 +0800989
Chia-I Wu5bc27862014-12-22 13:19:08 +0800990 void init_test_formats()
991 {
992 init_test_formats(static_cast<XGL_FLAGS>(-1));
993 }
994
Chia-I Wu998c2ac2014-12-08 14:30:10 +0800995 void fill_src(xgl_testing::Image &img, const xgl_testing::ImageChecker &checker)
996 {
997 if (img.transparent()) {
998 checker.fill(img);
999 return;
Chia-I Wud7414b02014-10-21 11:06:26 +08001000 }
1001
Chia-I Wu998c2ac2014-12-08 14:30:10 +08001002 ASSERT_EQ(true, img.copyable());
1003
1004 xgl_testing::Buffer in_buf;
1005 in_buf.init(dev_, checker.buffer_size());
1006 checker.fill(in_buf);
1007
Chia-I Wua9a506a2014-12-27 22:04:00 +08001008 add_memory_ref(in_buf, XGL_MEMORY_REF_READ_ONLY_BIT);
1009 add_memory_ref(img, 0);
Chia-I Wu998c2ac2014-12-08 14:30:10 +08001010
1011 // copy in and tile
1012 cmd_.begin();
Chia-I Wu1a28fe02015-01-01 07:55:04 +08001013 xglCmdCopyBufferToImage(cmd_.obj(), in_buf.obj(), img.obj(),
Chia-I Wu998c2ac2014-12-08 14:30:10 +08001014 checker.regions().size(), &checker.regions()[0]);
1015 cmd_.end();
1016
1017 submit_and_done();
Chia-I Wud7414b02014-10-21 11:06:26 +08001018 }
1019
Chia-I Wu998c2ac2014-12-08 14:30:10 +08001020 void check_dst(xgl_testing::Image &img, const xgl_testing::ImageChecker &checker)
Chia-I Wud6479012014-11-22 15:09:42 +08001021 {
Chia-I Wu998c2ac2014-12-08 14:30:10 +08001022 if (img.transparent()) {
1023 DO(checker.check(img));
1024 return;
Chia-I Wud6479012014-11-22 15:09:42 +08001025 }
1026
Chia-I Wu998c2ac2014-12-08 14:30:10 +08001027 ASSERT_EQ(true, img.copyable());
1028
1029 xgl_testing::Buffer out_buf;
1030 out_buf.init(dev_, checker.buffer_size());
1031
Chia-I Wua9a506a2014-12-27 22:04:00 +08001032 add_memory_ref(img, XGL_MEMORY_REF_READ_ONLY_BIT);
1033 add_memory_ref(out_buf, 0);
Chia-I Wu998c2ac2014-12-08 14:30:10 +08001034
1035 // copy out and linearize
1036 cmd_.begin();
Chia-I Wu1a28fe02015-01-01 07:55:04 +08001037 xglCmdCopyImageToBuffer(cmd_.obj(), img.obj(), out_buf.obj(),
Chia-I Wu998c2ac2014-12-08 14:30:10 +08001038 checker.regions().size(), &checker.regions()[0]);
1039 cmd_.end();
1040
1041 submit_and_done();
1042
1043 DO(checker.check(out_buf));
Chia-I Wud6479012014-11-22 15:09:42 +08001044 }
1045
Chia-I Wu998c2ac2014-12-08 14:30:10 +08001046 std::vector<xgl_testing::Device::Format> test_formats_;
1047 XGL_FORMAT first_linear_format_;
1048 XGL_FORMAT first_optimal_format_;
1049};
1050
Chia-I Wu1a28fe02015-01-01 07:55:04 +08001051class XglCmdCopyBufferToImageTest : public XglCmdBlitImageTest {
Chia-I Wu998c2ac2014-12-08 14:30:10 +08001052protected:
1053 virtual void SetUp()
1054 {
1055 XglCmdBlitTest::SetUp();
1056 init_test_formats(XGL_FORMAT_IMAGE_COPY_BIT);
1057 ASSERT_NE(true, test_formats_.empty());
1058 }
1059
1060 void test_copy_memory_to_image(const XGL_IMAGE_CREATE_INFO &img_info, const xgl_testing::ImageChecker &checker)
1061 {
1062 xgl_testing::Buffer buf;
1063 xgl_testing::Image img;
1064
1065 buf.init(dev_, checker.buffer_size());
1066 checker.fill(buf);
Chia-I Wua9a506a2014-12-27 22:04:00 +08001067 add_memory_ref(buf, XGL_MEMORY_REF_READ_ONLY_BIT);
Chia-I Wu998c2ac2014-12-08 14:30:10 +08001068
1069 img.init(dev_, img_info);
Chia-I Wua9a506a2014-12-27 22:04:00 +08001070 add_memory_ref(img, 0);
Chia-I Wu998c2ac2014-12-08 14:30:10 +08001071
1072 cmd_.begin();
Chia-I Wu1a28fe02015-01-01 07:55:04 +08001073 xglCmdCopyBufferToImage(cmd_.obj(), buf.obj(), img.obj(),
Chia-I Wu998c2ac2014-12-08 14:30:10 +08001074 checker.regions().size(), &checker.regions()[0]);
1075 cmd_.end();
1076
1077 submit_and_done();
1078
1079 check_dst(img, checker);
1080 }
1081
Chia-I Wu1a28fe02015-01-01 07:55:04 +08001082 void test_copy_memory_to_image(const XGL_IMAGE_CREATE_INFO &img_info, const std::vector<XGL_BUFFER_IMAGE_COPY> &regions)
Chia-I Wu998c2ac2014-12-08 14:30:10 +08001083 {
1084 xgl_testing::ImageChecker checker(img_info, regions);
1085 test_copy_memory_to_image(img_info, checker);
1086 }
1087
1088 void test_copy_memory_to_image(const XGL_IMAGE_CREATE_INFO &img_info)
1089 {
1090 xgl_testing::ImageChecker checker(img_info);
1091 test_copy_memory_to_image(img_info, checker);
1092 }
1093};
1094
Chia-I Wu1a28fe02015-01-01 07:55:04 +08001095TEST_F(XglCmdCopyBufferToImageTest, Basic)
Chia-I Wu998c2ac2014-12-08 14:30:10 +08001096{
1097 for (std::vector<xgl_testing::Device::Format>::const_iterator it = test_formats_.begin();
1098 it != test_formats_.end(); it++) {
Jeremy Hayesa058eee2015-01-23 08:51:43 -07001099
1100 // not sure what to do here
1101 if (it->format == XGL_FMT_UNDEFINED ||
1102 (it->format >= XGL_FMT_B8G8R8_UNORM &&
1103 it->format <= XGL_FMT_B8G8R8_SRGB))
1104 continue;
1105
Chia-I Wu998c2ac2014-12-08 14:30:10 +08001106 XGL_IMAGE_CREATE_INFO img_info = xgl_testing::Image::create_info();
1107 img_info.imageType = XGL_IMAGE_2D;
1108 img_info.format = it->format;
1109 img_info.extent.width = 64;
1110 img_info.extent.height = 64;
1111 img_info.tiling = it->tiling;
1112
1113 test_copy_memory_to_image(img_info);
1114 }
Chia-I Wud6479012014-11-22 15:09:42 +08001115}
1116
Chia-I Wu1a28fe02015-01-01 07:55:04 +08001117class XglCmdCopyImageToBufferTest : public XglCmdBlitImageTest {
Chia-I Wu42b97b82014-12-13 15:28:20 +08001118protected:
1119 virtual void SetUp()
1120 {
1121 XglCmdBlitTest::SetUp();
1122 init_test_formats(XGL_FORMAT_IMAGE_COPY_BIT);
1123 ASSERT_NE(true, test_formats_.empty());
1124 }
1125
1126 void test_copy_image_to_memory(const XGL_IMAGE_CREATE_INFO &img_info, const xgl_testing::ImageChecker &checker)
1127 {
1128 xgl_testing::Image img;
1129 xgl_testing::Buffer buf;
1130
1131 img.init(dev_, img_info);
1132 fill_src(img, checker);
Chia-I Wua9a506a2014-12-27 22:04:00 +08001133 add_memory_ref(img, XGL_MEMORY_REF_READ_ONLY_BIT);
Chia-I Wu42b97b82014-12-13 15:28:20 +08001134
1135 buf.init(dev_, checker.buffer_size());
Chia-I Wua9a506a2014-12-27 22:04:00 +08001136 add_memory_ref(buf, 0);
Chia-I Wu42b97b82014-12-13 15:28:20 +08001137
1138 cmd_.begin();
Chia-I Wu1a28fe02015-01-01 07:55:04 +08001139 xglCmdCopyImageToBuffer(cmd_.obj(), img.obj(), buf.obj(),
Chia-I Wu42b97b82014-12-13 15:28:20 +08001140 checker.regions().size(), &checker.regions()[0]);
1141 cmd_.end();
1142
1143 submit_and_done();
1144
1145 checker.check(buf);
1146 }
1147
Chia-I Wu1a28fe02015-01-01 07:55:04 +08001148 void test_copy_image_to_memory(const XGL_IMAGE_CREATE_INFO &img_info, const std::vector<XGL_BUFFER_IMAGE_COPY> &regions)
Chia-I Wu42b97b82014-12-13 15:28:20 +08001149 {
1150 xgl_testing::ImageChecker checker(img_info, regions);
1151 test_copy_image_to_memory(img_info, checker);
1152 }
1153
1154 void test_copy_image_to_memory(const XGL_IMAGE_CREATE_INFO &img_info)
1155 {
1156 xgl_testing::ImageChecker checker(img_info);
1157 test_copy_image_to_memory(img_info, checker);
1158 }
1159};
1160
Chia-I Wu1a28fe02015-01-01 07:55:04 +08001161TEST_F(XglCmdCopyImageToBufferTest, Basic)
Chia-I Wu42b97b82014-12-13 15:28:20 +08001162{
1163 for (std::vector<xgl_testing::Device::Format>::const_iterator it = test_formats_.begin();
1164 it != test_formats_.end(); it++) {
Jeremy Hayesa058eee2015-01-23 08:51:43 -07001165
1166 // not sure what to do here
1167 if (it->format == XGL_FMT_UNDEFINED ||
1168 (it->format >= XGL_FMT_B8G8R8_UNORM &&
1169 it->format <= XGL_FMT_B8G8R8_SRGB))
1170 continue;
1171
Chia-I Wu42b97b82014-12-13 15:28:20 +08001172 XGL_IMAGE_CREATE_INFO img_info = xgl_testing::Image::create_info();
1173 img_info.imageType = XGL_IMAGE_2D;
1174 img_info.format = it->format;
1175 img_info.extent.width = 64;
1176 img_info.extent.height = 64;
1177 img_info.tiling = it->tiling;
1178
1179 test_copy_image_to_memory(img_info);
1180 }
1181}
1182
Chia-I Wu998c2ac2014-12-08 14:30:10 +08001183class XglCmdCopyImageTest : public XglCmdBlitImageTest {
1184protected:
1185 virtual void SetUp()
1186 {
1187 XglCmdBlitTest::SetUp();
1188 init_test_formats(XGL_FORMAT_IMAGE_COPY_BIT);
1189 ASSERT_NE(true, test_formats_.empty());
Chia-I Wu89078aa2014-11-22 16:24:41 +08001190 }
1191
Chia-I Wu998c2ac2014-12-08 14:30:10 +08001192 void test_copy_image(const XGL_IMAGE_CREATE_INFO &src_info, const XGL_IMAGE_CREATE_INFO &dst_info,
1193 const std::vector<XGL_IMAGE_COPY> &copies)
Chia-I Wu89078aa2014-11-22 16:24:41 +08001194 {
Chia-I Wu1a28fe02015-01-01 07:55:04 +08001195 // convert XGL_IMAGE_COPY to two sets of XGL_BUFFER_IMAGE_COPY
1196 std::vector<XGL_BUFFER_IMAGE_COPY> src_regions, dst_regions;
Chia-I Wu998c2ac2014-12-08 14:30:10 +08001197 XGL_GPU_SIZE src_offset = 0, dst_offset = 0;
1198 for (std::vector<XGL_IMAGE_COPY>::const_iterator it = copies.begin(); it != copies.end(); it++) {
Chia-I Wu1a28fe02015-01-01 07:55:04 +08001199 XGL_BUFFER_IMAGE_COPY src_region = {}, dst_region = {};
Chia-I Wu89078aa2014-11-22 16:24:41 +08001200
Chia-I Wu1a28fe02015-01-01 07:55:04 +08001201 src_region.bufferOffset = src_offset;
Chia-I Wu998c2ac2014-12-08 14:30:10 +08001202 src_region.imageSubresource = it->srcSubresource;
1203 src_region.imageOffset = it->srcOffset;
1204 src_region.imageExtent = it->extent;
1205 src_regions.push_back(src_region);
Chia-I Wu89078aa2014-11-22 16:24:41 +08001206
Chia-I Wu1a28fe02015-01-01 07:55:04 +08001207 dst_region.bufferOffset = src_offset;
Chia-I Wu998c2ac2014-12-08 14:30:10 +08001208 dst_region.imageSubresource = it->destSubresource;
1209 dst_region.imageOffset = it->destOffset;
1210 dst_region.imageExtent = it->extent;
1211 dst_regions.push_back(dst_region);
Chia-I Wu89078aa2014-11-22 16:24:41 +08001212
Chia-I Wu998c2ac2014-12-08 14:30:10 +08001213 const XGL_GPU_SIZE size = it->extent.width * it->extent.height * it->extent.depth;
1214 src_offset += xgl_testing::get_format_size(src_info.format) * size;
1215 dst_offset += xgl_testing::get_format_size(dst_info.format) * size;
1216 }
Chia-I Wu89078aa2014-11-22 16:24:41 +08001217
Chia-I Wu998c2ac2014-12-08 14:30:10 +08001218 xgl_testing::ImageChecker src_checker(src_info, src_regions);
1219 xgl_testing::ImageChecker dst_checker(dst_info, dst_regions);
1220
1221 xgl_testing::Image src;
1222 src.init(dev_, src_info);
1223 fill_src(src, src_checker);
Chia-I Wua9a506a2014-12-27 22:04:00 +08001224 add_memory_ref(src, XGL_MEMORY_REF_READ_ONLY_BIT);
Chia-I Wu998c2ac2014-12-08 14:30:10 +08001225
1226 xgl_testing::Image dst;
1227 dst.init(dev_, dst_info);
Chia-I Wua9a506a2014-12-27 22:04:00 +08001228 add_memory_ref(dst, 0);
Chia-I Wu998c2ac2014-12-08 14:30:10 +08001229
1230 cmd_.begin();
1231 xglCmdCopyImage(cmd_.obj(), src.obj(), dst.obj(), copies.size(), &copies[0]);
1232 cmd_.end();
1233
1234 submit_and_done();
1235
1236 check_dst(dst, dst_checker);
1237 }
1238};
1239
1240TEST_F(XglCmdCopyImageTest, Basic)
1241{
1242 for (std::vector<xgl_testing::Device::Format>::const_iterator it = test_formats_.begin();
1243 it != test_formats_.end(); it++) {
Jeremy Hayesa058eee2015-01-23 08:51:43 -07001244
1245 // not sure what to do here
1246 if (it->format == XGL_FMT_UNDEFINED ||
1247 (it->format >= XGL_FMT_B8G8R8_UNORM &&
1248 it->format <= XGL_FMT_B8G8R8_SRGB))
1249 continue;
1250
Chia-I Wu998c2ac2014-12-08 14:30:10 +08001251 XGL_IMAGE_CREATE_INFO img_info = xgl_testing::Image::create_info();
1252 img_info.imageType = XGL_IMAGE_2D;
1253 img_info.format = it->format;
1254 img_info.extent.width = 64;
1255 img_info.extent.height = 64;
1256 img_info.tiling = it->tiling;
1257
1258 XGL_IMAGE_COPY copy = {};
1259 copy.srcSubresource = xgl_testing::Image::subresource(XGL_IMAGE_ASPECT_COLOR, 0, 0);
1260 copy.destSubresource = copy.srcSubresource;
1261 copy.extent = img_info.extent;
1262
1263 test_copy_image(img_info, img_info, std::vector<XGL_IMAGE_COPY>(&copy, &copy + 1));
1264 }
1265}
1266
Chia-I Wu2bb96ef2014-12-22 14:46:56 +08001267class XglCmdCloneImageDataTest : public XglCmdBlitImageTest {
1268protected:
1269 virtual void SetUp()
1270 {
1271 XglCmdBlitTest::SetUp();
1272 init_test_formats();
1273 ASSERT_NE(true, test_formats_.empty());
1274 }
1275
1276 void test_clone_image_data(const XGL_IMAGE_CREATE_INFO &img_info)
1277 {
1278 xgl_testing::ImageChecker checker(img_info);
1279 xgl_testing::Image src, dst;
1280
1281 src.init(dev_, img_info);
1282 if (src.transparent() || src.copyable())
1283 fill_src(src, checker);
Chia-I Wua9a506a2014-12-27 22:04:00 +08001284 add_memory_ref(src, XGL_MEMORY_REF_READ_ONLY_BIT);
Chia-I Wu2bb96ef2014-12-22 14:46:56 +08001285
1286 dst.init(dev_, img_info);
Chia-I Wua9a506a2014-12-27 22:04:00 +08001287 add_memory_ref(dst, 0);
Chia-I Wu2bb96ef2014-12-22 14:46:56 +08001288
Mike Stroyanfb80d5f2014-12-04 11:08:39 +00001289 const XGL_IMAGE_LAYOUT layout = XGL_IMAGE_LAYOUT_GENERAL;
Chia-I Wu2bb96ef2014-12-22 14:46:56 +08001290
1291 cmd_.begin();
Mike Stroyanfb80d5f2014-12-04 11:08:39 +00001292 xglCmdCloneImageData(cmd_.obj(), src.obj(), layout, dst.obj(), layout);
Chia-I Wu2bb96ef2014-12-22 14:46:56 +08001293 cmd_.end();
1294
1295 submit_and_done();
1296
1297 // cannot verify
1298 if (!dst.transparent() && !dst.copyable())
1299 return;
1300
1301 check_dst(dst, checker);
1302 }
1303};
1304
1305TEST_F(XglCmdCloneImageDataTest, Basic)
1306{
1307 for (std::vector<xgl_testing::Device::Format>::const_iterator it = test_formats_.begin();
1308 it != test_formats_.end(); it++) {
1309 // not sure what to do here
Jeremy Hayesa058eee2015-01-23 08:51:43 -07001310 if (it->format == XGL_FMT_UNDEFINED ||
1311 (it->format >= XGL_FMT_R32G32B32_UINT &&
1312 it->format <= XGL_FMT_R32G32B32_SFLOAT) ||
1313 (it->format >= XGL_FMT_B8G8R8_UNORM &&
1314 it->format <= XGL_FMT_B8G8R8_SRGB) ||
1315 (it->format >= XGL_FMT_BC1_UNORM &&
1316 it->format <= XGL_FMT_ASTC_12x12_SRGB) ||
1317 (it->format >= XGL_FMT_D16_UNORM &&
1318 it->format <= XGL_FMT_D32_SFLOAT_S8_UINT) ||
1319 it->format == XGL_FMT_R64G64B64_SFLOAT ||
1320 it->format == XGL_FMT_R64G64B64A64_SFLOAT)
Chia-I Wu2bb96ef2014-12-22 14:46:56 +08001321 continue;
1322
1323 XGL_IMAGE_CREATE_INFO img_info = xgl_testing::Image::create_info();
1324 img_info.imageType = XGL_IMAGE_2D;
1325 img_info.format = it->format;
1326 img_info.extent.width = 64;
1327 img_info.extent.height = 64;
1328 img_info.tiling = it->tiling;
1329 img_info.flags = XGL_IMAGE_CREATE_CLONEABLE_BIT;
1330
1331 const XGL_IMAGE_SUBRESOURCE_RANGE range =
Chia-I Wua9a506a2014-12-27 22:04:00 +08001332 xgl_testing::Image::subresource_range(img_info, XGL_IMAGE_ASPECT_COLOR);
Chia-I Wu2bb96ef2014-12-22 14:46:56 +08001333 std::vector<XGL_IMAGE_SUBRESOURCE_RANGE> ranges(&range, &range + 1);
1334
1335 test_clone_image_data(img_info);
1336 }
1337}
1338
Chia-I Wu998c2ac2014-12-08 14:30:10 +08001339class XglCmdClearColorImageTest : public XglCmdBlitImageTest {
1340protected:
Chia-I Wu5bc27862014-12-22 13:19:08 +08001341 XglCmdClearColorImageTest() : test_raw_(false) {}
1342 XglCmdClearColorImageTest(bool test_raw) : test_raw_(test_raw) {}
1343
Chia-I Wu998c2ac2014-12-08 14:30:10 +08001344 virtual void SetUp()
1345 {
1346 XglCmdBlitTest::SetUp();
Chia-I Wu5bc27862014-12-22 13:19:08 +08001347
1348 if (test_raw_)
1349 init_test_formats();
1350 else
1351 init_test_formats(XGL_FORMAT_CONVERSION_BIT);
1352
Chia-I Wu998c2ac2014-12-08 14:30:10 +08001353 ASSERT_NE(true, test_formats_.empty());
1354 }
1355
Chia-I Wu5bc27862014-12-22 13:19:08 +08001356 union Color {
Mark Lobodzinski17caf572015-01-29 08:55:56 -06001357 float color[4];
1358 uint32_t raw[4];
Chia-I Wu5bc27862014-12-22 13:19:08 +08001359 };
1360
1361 bool test_raw_;
1362
Mark Lobodzinski17caf572015-01-29 08:55:56 -06001363 std::vector<uint8_t> color_to_raw(XGL_FORMAT format, const float color[4])
Chia-I Wu998c2ac2014-12-08 14:30:10 +08001364 {
1365 std::vector<uint8_t> raw;
1366
1367 // TODO support all formats
Jeremy Hayesa058eee2015-01-23 08:51:43 -07001368 switch (format) {
1369 case XGL_FMT_R8G8B8A8_UNORM:
1370 raw.push_back(color[0] * 255.0f);
1371 raw.push_back(color[1] * 255.0f);
1372 raw.push_back(color[2] * 255.0f);
1373 raw.push_back(color[3] * 255.0f);
1374 break;
1375 case XGL_FMT_B8G8R8A8_UNORM:
1376 raw.push_back(color[2] * 255.0f);
1377 raw.push_back(color[1] * 255.0f);
1378 raw.push_back(color[0] * 255.0f);
1379 raw.push_back(color[3] * 255.0f);
1380 break;
1381 default:
1382 break;
Chia-I Wu89078aa2014-11-22 16:24:41 +08001383 }
1384
Chia-I Wu998c2ac2014-12-08 14:30:10 +08001385 return raw;
Chia-I Wu89078aa2014-11-22 16:24:41 +08001386 }
Chia-I Wu89078aa2014-11-22 16:24:41 +08001387
Mark Lobodzinski17caf572015-01-29 08:55:56 -06001388 std::vector<uint8_t> color_to_raw(XGL_FORMAT format, const uint32_t color[4])
Chia-I Wu5bc27862014-12-22 13:19:08 +08001389 {
1390 std::vector<uint8_t> raw;
1391
1392 // TODO support all formats
Jeremy Hayesa058eee2015-01-23 08:51:43 -07001393 switch (format) {
1394 case XGL_FMT_R8G8B8A8_UNORM:
1395 raw.push_back(static_cast<uint8_t>(color[0]));
1396 raw.push_back(static_cast<uint8_t>(color[1]));
1397 raw.push_back(static_cast<uint8_t>(color[2]));
1398 raw.push_back(static_cast<uint8_t>(color[3]));
1399 break;
1400 case XGL_FMT_B8G8R8A8_UNORM:
1401 raw.push_back(static_cast<uint8_t>(color[2]));
1402 raw.push_back(static_cast<uint8_t>(color[1]));
1403 raw.push_back(static_cast<uint8_t>(color[0]));
1404 raw.push_back(static_cast<uint8_t>(color[3]));
1405 break;
1406 default:
1407 break;
Chia-I Wu5bc27862014-12-22 13:19:08 +08001408 }
1409
1410 return raw;
1411 }
1412
1413 std::vector<uint8_t> color_to_raw(XGL_FORMAT format, const Color &color)
1414 {
1415 if (test_raw_)
1416 return color_to_raw(format, color.raw);
1417 else
1418 return color_to_raw(format, color.color);
1419 }
1420
Chia-I Wu998c2ac2014-12-08 14:30:10 +08001421 void test_clear_color_image(const XGL_IMAGE_CREATE_INFO &img_info,
Chia-I Wu5bc27862014-12-22 13:19:08 +08001422 const Color &color,
Chia-I Wu998c2ac2014-12-08 14:30:10 +08001423 const std::vector<XGL_IMAGE_SUBRESOURCE_RANGE> &ranges)
Chia-I Wud7414b02014-10-21 11:06:26 +08001424 {
Chia-I Wu998c2ac2014-12-08 14:30:10 +08001425 xgl_testing::Image img;
1426 img.init(dev_, img_info);
Chia-I Wua9a506a2014-12-27 22:04:00 +08001427 add_memory_ref(img, 0);
Mike Stroyanfb80d5f2014-12-04 11:08:39 +00001428 const XGL_FLAGS all_cache_outputs =
1429 XGL_MEMORY_OUTPUT_CPU_WRITE_BIT |
1430 XGL_MEMORY_OUTPUT_SHADER_WRITE_BIT |
1431 XGL_MEMORY_OUTPUT_COLOR_ATTACHMENT_BIT |
1432 XGL_MEMORY_OUTPUT_DEPTH_STENCIL_ATTACHMENT_BIT |
1433 XGL_MEMORY_OUTPUT_COPY_BIT;
1434 const XGL_FLAGS all_cache_inputs =
1435 XGL_MEMORY_INPUT_CPU_READ_BIT |
1436 XGL_MEMORY_INPUT_INDIRECT_COMMAND_BIT |
1437 XGL_MEMORY_INPUT_INDEX_FETCH_BIT |
1438 XGL_MEMORY_INPUT_VERTEX_ATTRIBUTE_FETCH_BIT |
1439 XGL_MEMORY_INPUT_UNIFORM_READ_BIT |
1440 XGL_MEMORY_INPUT_SHADER_READ_BIT |
1441 XGL_MEMORY_INPUT_COLOR_ATTACHMENT_BIT |
1442 XGL_MEMORY_INPUT_DEPTH_STENCIL_ATTACHMENT_BIT |
1443 XGL_MEMORY_INPUT_COPY_BIT;
Chia-I Wud7414b02014-10-21 11:06:26 +08001444
Mike Stroyanfb80d5f2014-12-04 11:08:39 +00001445 std::vector<XGL_IMAGE_MEMORY_BARRIER> to_clear;
Mark Lobodzinski837ef922015-01-29 14:24:14 -06001446 std::vector<XGL_IMAGE_MEMORY_BARRIER *> p_to_clear;
Mike Stroyanfb80d5f2014-12-04 11:08:39 +00001447 std::vector<XGL_IMAGE_MEMORY_BARRIER> to_xfer;
Mark Lobodzinski837ef922015-01-29 14:24:14 -06001448 std::vector<XGL_IMAGE_MEMORY_BARRIER *> p_to_xfer;
Chia-I Wud7414b02014-10-21 11:06:26 +08001449
Chia-I Wu998c2ac2014-12-08 14:30:10 +08001450 for (std::vector<XGL_IMAGE_SUBRESOURCE_RANGE>::const_iterator it = ranges.begin();
1451 it != ranges.end(); it++) {
Mike Stroyanfb80d5f2014-12-04 11:08:39 +00001452 to_clear.push_back(img.image_memory_barrier(all_cache_outputs, all_cache_inputs,
1453 XGL_IMAGE_LAYOUT_GENERAL,
1454 XGL_IMAGE_LAYOUT_CLEAR_OPTIMAL,
1455 *it));
Mark Lobodzinski837ef922015-01-29 14:24:14 -06001456 p_to_clear.push_back(&to_clear.back());
Mike Stroyanfb80d5f2014-12-04 11:08:39 +00001457 to_xfer.push_back(img.image_memory_barrier(all_cache_outputs, all_cache_inputs,
1458 XGL_IMAGE_LAYOUT_CLEAR_OPTIMAL,
1459 XGL_IMAGE_LAYOUT_TRANSFER_SOURCE_OPTIMAL, *it));
Mark Lobodzinski837ef922015-01-29 14:24:14 -06001460 p_to_xfer.push_back(&to_xfer.back());
Chia-I Wud7414b02014-10-21 11:06:26 +08001461 }
1462
Chia-I Wu998c2ac2014-12-08 14:30:10 +08001463 cmd_.begin();
Chia-I Wu5bc27862014-12-22 13:19:08 +08001464
Mike Stroyanfb80d5f2014-12-04 11:08:39 +00001465 XGL_SET_EVENT set_events[] = { XGL_SET_EVENT_GPU_COMMANDS_COMPLETE };
1466 XGL_PIPELINE_BARRIER pipeline_barrier = {};
1467 pipeline_barrier.sType = XGL_STRUCTURE_TYPE_PIPELINE_BARRIER;
1468 pipeline_barrier.eventCount = 1;
1469 pipeline_barrier.pEvents = set_events;
1470 pipeline_barrier.waitEvent = XGL_WAIT_EVENT_TOP_OF_PIPE;
1471 pipeline_barrier.memBarrierCount = to_clear.size();
Mark Lobodzinski837ef922015-01-29 14:24:14 -06001472 pipeline_barrier.pMemBarriers = (const void **)&p_to_clear[0];
Mike Stroyanfb80d5f2014-12-04 11:08:39 +00001473 xglCmdPipelineBarrier(cmd_.obj(), &pipeline_barrier);
1474
1475 if (test_raw_) {
Chia-I Wu5bc27862014-12-22 13:19:08 +08001476 xglCmdClearColorImageRaw(cmd_.obj(), img.obj(), color.raw, ranges.size(), &ranges[0]);
Mike Stroyanfb80d5f2014-12-04 11:08:39 +00001477 } else {
Chia-I Wu5bc27862014-12-22 13:19:08 +08001478 xglCmdClearColorImage(cmd_.obj(), img.obj(), color.color, ranges.size(), &ranges[0]);
Mike Stroyanfb80d5f2014-12-04 11:08:39 +00001479 }
1480
1481 pipeline_barrier.sType = XGL_STRUCTURE_TYPE_PIPELINE_BARRIER;
1482 pipeline_barrier.eventCount = 1;
1483 pipeline_barrier.pEvents = set_events;
1484 pipeline_barrier.waitEvent = XGL_WAIT_EVENT_TOP_OF_PIPE;
1485 pipeline_barrier.memBarrierCount = to_xfer.size();
Mark Lobodzinski837ef922015-01-29 14:24:14 -06001486 pipeline_barrier.pMemBarriers = (const void **)&p_to_xfer[0];
Mike Stroyanfb80d5f2014-12-04 11:08:39 +00001487 xglCmdPipelineBarrier(cmd_.obj(), &pipeline_barrier);
Chia-I Wu5bc27862014-12-22 13:19:08 +08001488
Chia-I Wu998c2ac2014-12-08 14:30:10 +08001489 cmd_.end();
1490
1491 submit_and_done();
1492
1493 // cannot verify
1494 if (!img.transparent() && !img.copyable())
1495 return;
1496
1497 xgl_testing::ImageChecker checker(img_info, ranges);
1498
1499 const std::vector<uint8_t> solid_pattern = color_to_raw(img_info.format, color);
1500 if (solid_pattern.empty())
1501 return;
1502
1503 checker.set_solid_pattern(solid_pattern);
1504 check_dst(img, checker);
1505 }
Chia-I Wu5bc27862014-12-22 13:19:08 +08001506
1507 void test_clear_color_image(const XGL_IMAGE_CREATE_INFO &img_info,
Mark Lobodzinski17caf572015-01-29 08:55:56 -06001508 const float color[4],
Chia-I Wu5bc27862014-12-22 13:19:08 +08001509 const std::vector<XGL_IMAGE_SUBRESOURCE_RANGE> &ranges)
1510 {
1511 Color c;
1512 memcpy(c.color, color, sizeof(c.color));
1513 test_clear_color_image(img_info, c, ranges);
1514 }
Chia-I Wu998c2ac2014-12-08 14:30:10 +08001515};
1516
1517TEST_F(XglCmdClearColorImageTest, Basic)
1518{
1519 for (std::vector<xgl_testing::Device::Format>::const_iterator it = test_formats_.begin();
1520 it != test_formats_.end(); it++) {
Mark Lobodzinski17caf572015-01-29 08:55:56 -06001521 const float color[4] = { 0.0f, 1.0f, 0.0f, 1.0f };
Chia-I Wu998c2ac2014-12-08 14:30:10 +08001522
1523 XGL_IMAGE_CREATE_INFO img_info = xgl_testing::Image::create_info();
1524 img_info.imageType = XGL_IMAGE_2D;
1525 img_info.format = it->format;
1526 img_info.extent.width = 64;
1527 img_info.extent.height = 64;
1528 img_info.tiling = it->tiling;
1529
1530 const XGL_IMAGE_SUBRESOURCE_RANGE range =
Chia-I Wua9a506a2014-12-27 22:04:00 +08001531 xgl_testing::Image::subresource_range(img_info, XGL_IMAGE_ASPECT_COLOR);
Chia-I Wu998c2ac2014-12-08 14:30:10 +08001532 std::vector<XGL_IMAGE_SUBRESOURCE_RANGE> ranges(&range, &range + 1);
1533
1534 test_clear_color_image(img_info, color, ranges);
Chia-I Wud7414b02014-10-21 11:06:26 +08001535 }
1536}
1537
Chia-I Wud6422382014-12-22 13:44:24 +08001538class XglCmdClearColorImageRawTest : public XglCmdClearColorImageTest {
1539protected:
1540 XglCmdClearColorImageRawTest() : XglCmdClearColorImageTest(true) {}
1541
1542 void test_clear_color_image_raw(const XGL_IMAGE_CREATE_INFO &img_info,
Mark Lobodzinski17caf572015-01-29 08:55:56 -06001543 const uint32_t color[4],
Chia-I Wud6422382014-12-22 13:44:24 +08001544 const std::vector<XGL_IMAGE_SUBRESOURCE_RANGE> &ranges)
1545 {
1546 Color c;
1547 memcpy(c.raw, color, sizeof(c.raw));
1548 test_clear_color_image(img_info, c, ranges);
1549 }
1550};
1551
1552TEST_F(XglCmdClearColorImageRawTest, Basic)
1553{
1554 for (std::vector<xgl_testing::Device::Format>::const_iterator it = test_formats_.begin();
1555 it != test_formats_.end(); it++) {
Mark Lobodzinski17caf572015-01-29 08:55:56 -06001556 const uint32_t color[4] = { 0x11111111, 0x22222222, 0x33333333, 0x44444444 };
Chia-I Wud6422382014-12-22 13:44:24 +08001557
1558 // not sure what to do here
Jeremy Hayesa058eee2015-01-23 08:51:43 -07001559 if (it->format == XGL_FMT_UNDEFINED ||
1560 (it->format >= XGL_FMT_R8G8B8_UNORM &&
1561 it->format <= XGL_FMT_R8G8B8_SRGB) ||
1562 (it->format >= XGL_FMT_B8G8R8_UNORM &&
1563 it->format <= XGL_FMT_B8G8R8_SRGB) ||
1564 (it->format >= XGL_FMT_R16G16B16_UNORM &&
1565 it->format <= XGL_FMT_R16G16B16_SFLOAT) ||
1566 (it->format >= XGL_FMT_R32G32B32_UINT &&
1567 it->format <= XGL_FMT_R32G32B32_SFLOAT) ||
1568 it->format == XGL_FMT_R64G64B64_SFLOAT ||
1569 it->format == XGL_FMT_R64G64B64A64_SFLOAT ||
1570 (it->format >= XGL_FMT_D16_UNORM &&
1571 it->format <= XGL_FMT_D32_SFLOAT_S8_UINT))
Chia-I Wud6422382014-12-22 13:44:24 +08001572 continue;
1573
1574 XGL_IMAGE_CREATE_INFO img_info = xgl_testing::Image::create_info();
1575 img_info.imageType = XGL_IMAGE_2D;
1576 img_info.format = it->format;
1577 img_info.extent.width = 64;
1578 img_info.extent.height = 64;
1579 img_info.tiling = it->tiling;
1580
1581 const XGL_IMAGE_SUBRESOURCE_RANGE range =
Chia-I Wua9a506a2014-12-27 22:04:00 +08001582 xgl_testing::Image::subresource_range(img_info, XGL_IMAGE_ASPECT_COLOR);
Chia-I Wud6422382014-12-22 13:44:24 +08001583 std::vector<XGL_IMAGE_SUBRESOURCE_RANGE> ranges(&range, &range + 1);
1584
1585 test_clear_color_image_raw(img_info, color, ranges);
1586 }
1587}
1588
Chia-I Wu998c2ac2014-12-08 14:30:10 +08001589class XglCmdClearDepthStencilTest : public XglCmdBlitImageTest {
1590protected:
1591 virtual void SetUp()
1592 {
1593 XglCmdBlitTest::SetUp();
1594 init_test_formats(XGL_FORMAT_DEPTH_ATTACHMENT_BIT |
1595 XGL_FORMAT_STENCIL_ATTACHMENT_BIT);
1596 ASSERT_NE(true, test_formats_.empty());
1597 }
1598
Mark Lobodzinski17caf572015-01-29 08:55:56 -06001599 std::vector<uint8_t> ds_to_raw(XGL_FORMAT format, float depth, uint32_t stencil)
Chia-I Wu998c2ac2014-12-08 14:30:10 +08001600 {
1601 std::vector<uint8_t> raw;
1602
1603 // depth
Jeremy Hayesa058eee2015-01-23 08:51:43 -07001604 switch (format) {
1605 case XGL_FMT_D16_UNORM:
1606 case XGL_FMT_D16_UNORM_S8_UINT:
Chia-I Wu998c2ac2014-12-08 14:30:10 +08001607 {
1608 const uint16_t unorm = depth * 65535.0f;
1609 raw.push_back(unorm & 0xff);
1610 raw.push_back(unorm >> 8);
1611 }
1612 break;
Jeremy Hayesa058eee2015-01-23 08:51:43 -07001613 case XGL_FMT_D32_SFLOAT:
1614 case XGL_FMT_D32_SFLOAT_S8_UINT:
Chia-I Wu998c2ac2014-12-08 14:30:10 +08001615 {
1616 const union {
Mark Lobodzinski17caf572015-01-29 08:55:56 -06001617 float depth;
Chia-I Wu998c2ac2014-12-08 14:30:10 +08001618 uint32_t u32;
1619 } u = { depth };
1620
1621 raw.push_back((u.u32 ) & 0xff);
1622 raw.push_back((u.u32 >> 8) & 0xff);
1623 raw.push_back((u.u32 >> 16) & 0xff);
1624 raw.push_back((u.u32 >> 24) & 0xff);
1625 }
1626 break;
1627 default:
1628 break;
1629 }
1630
1631 // stencil
Jeremy Hayesa058eee2015-01-23 08:51:43 -07001632 switch (format) {
1633 case XGL_FMT_S8_UINT:
Chia-I Wu998c2ac2014-12-08 14:30:10 +08001634 raw.push_back(stencil);
1635 break;
Jeremy Hayesa058eee2015-01-23 08:51:43 -07001636 case XGL_FMT_D16_UNORM_S8_UINT:
Chia-I Wu998c2ac2014-12-08 14:30:10 +08001637 raw.push_back(stencil);
1638 raw.push_back(0);
1639 break;
Jeremy Hayesa058eee2015-01-23 08:51:43 -07001640 case XGL_FMT_D32_SFLOAT_S8_UINT:
Chia-I Wu998c2ac2014-12-08 14:30:10 +08001641 raw.push_back(stencil);
1642 raw.push_back(0);
1643 raw.push_back(0);
1644 raw.push_back(0);
1645 break;
1646 default:
1647 break;
1648 }
1649
1650 return raw;
1651 }
1652
1653 void test_clear_depth_stencil(const XGL_IMAGE_CREATE_INFO &img_info,
Mark Lobodzinski17caf572015-01-29 08:55:56 -06001654 float depth, uint32_t stencil,
Chia-I Wu998c2ac2014-12-08 14:30:10 +08001655 const std::vector<XGL_IMAGE_SUBRESOURCE_RANGE> &ranges)
1656 {
1657 xgl_testing::Image img;
1658 img.init(dev_, img_info);
Chia-I Wua9a506a2014-12-27 22:04:00 +08001659 add_memory_ref(img, 0);
Mike Stroyanfb80d5f2014-12-04 11:08:39 +00001660 const XGL_FLAGS all_cache_outputs =
1661 XGL_MEMORY_OUTPUT_CPU_WRITE_BIT |
1662 XGL_MEMORY_OUTPUT_SHADER_WRITE_BIT |
1663 XGL_MEMORY_OUTPUT_COLOR_ATTACHMENT_BIT |
1664 XGL_MEMORY_OUTPUT_DEPTH_STENCIL_ATTACHMENT_BIT |
1665 XGL_MEMORY_OUTPUT_COPY_BIT;
1666 const XGL_FLAGS all_cache_inputs =
1667 XGL_MEMORY_INPUT_CPU_READ_BIT |
1668 XGL_MEMORY_INPUT_INDIRECT_COMMAND_BIT |
1669 XGL_MEMORY_INPUT_INDEX_FETCH_BIT |
1670 XGL_MEMORY_INPUT_VERTEX_ATTRIBUTE_FETCH_BIT |
1671 XGL_MEMORY_INPUT_UNIFORM_READ_BIT |
1672 XGL_MEMORY_INPUT_SHADER_READ_BIT |
1673 XGL_MEMORY_INPUT_COLOR_ATTACHMENT_BIT |
1674 XGL_MEMORY_INPUT_DEPTH_STENCIL_ATTACHMENT_BIT |
1675 XGL_MEMORY_INPUT_COPY_BIT;
Chia-I Wu998c2ac2014-12-08 14:30:10 +08001676
Mike Stroyanfb80d5f2014-12-04 11:08:39 +00001677 std::vector<XGL_IMAGE_MEMORY_BARRIER> to_clear;
Mark Lobodzinski837ef922015-01-29 14:24:14 -06001678 std::vector<XGL_IMAGE_MEMORY_BARRIER *> p_to_clear;
Mike Stroyanfb80d5f2014-12-04 11:08:39 +00001679 std::vector<XGL_IMAGE_MEMORY_BARRIER> to_xfer;
Mark Lobodzinski837ef922015-01-29 14:24:14 -06001680 std::vector<XGL_IMAGE_MEMORY_BARRIER *> p_to_xfer;
Chia-I Wu998c2ac2014-12-08 14:30:10 +08001681
1682 for (std::vector<XGL_IMAGE_SUBRESOURCE_RANGE>::const_iterator it = ranges.begin();
1683 it != ranges.end(); it++) {
Mike Stroyanfb80d5f2014-12-04 11:08:39 +00001684 to_clear.push_back(img.image_memory_barrier(all_cache_outputs, all_cache_inputs,
1685 XGL_IMAGE_LAYOUT_GENERAL,
1686 XGL_IMAGE_LAYOUT_CLEAR_OPTIMAL,
1687 *it));
Mark Lobodzinski837ef922015-01-29 14:24:14 -06001688 p_to_clear.push_back(&to_clear.back());
Mike Stroyanfb80d5f2014-12-04 11:08:39 +00001689 to_xfer.push_back(img.image_memory_barrier(all_cache_outputs, all_cache_inputs,
1690 XGL_IMAGE_LAYOUT_CLEAR_OPTIMAL,
1691 XGL_IMAGE_LAYOUT_TRANSFER_SOURCE_OPTIMAL, *it));
Mark Lobodzinski837ef922015-01-29 14:24:14 -06001692 p_to_xfer.push_back(&to_xfer.back());
Chia-I Wu998c2ac2014-12-08 14:30:10 +08001693 }
1694
1695 cmd_.begin();
Mike Stroyanfb80d5f2014-12-04 11:08:39 +00001696
1697 XGL_SET_EVENT set_events[] = { XGL_SET_EVENT_GPU_COMMANDS_COMPLETE };
1698 XGL_PIPELINE_BARRIER pipeline_barrier = {};
1699 pipeline_barrier.sType = XGL_STRUCTURE_TYPE_PIPELINE_BARRIER;
1700 pipeline_barrier.eventCount = 1;
1701 pipeline_barrier.pEvents = set_events;
1702 pipeline_barrier.waitEvent = XGL_WAIT_EVENT_TOP_OF_PIPE;
1703 pipeline_barrier.memBarrierCount = to_clear.size();
Mark Lobodzinski837ef922015-01-29 14:24:14 -06001704 pipeline_barrier.pMemBarriers = (const void **)&p_to_clear[0];
Mike Stroyanfb80d5f2014-12-04 11:08:39 +00001705 xglCmdPipelineBarrier(cmd_.obj(), &pipeline_barrier);
1706
Chia-I Wu998c2ac2014-12-08 14:30:10 +08001707 xglCmdClearDepthStencil(cmd_.obj(), img.obj(), depth, stencil, ranges.size(), &ranges[0]);
Mike Stroyanfb80d5f2014-12-04 11:08:39 +00001708
1709 pipeline_barrier.sType = XGL_STRUCTURE_TYPE_PIPELINE_BARRIER;
1710 pipeline_barrier.eventCount = 1;
1711 pipeline_barrier.pEvents = set_events;
1712 pipeline_barrier.waitEvent = XGL_WAIT_EVENT_TOP_OF_PIPE;
1713 pipeline_barrier.memBarrierCount = to_xfer.size();
Mark Lobodzinski837ef922015-01-29 14:24:14 -06001714 pipeline_barrier.pMemBarriers = (const void **)&p_to_xfer[0];
Mike Stroyanfb80d5f2014-12-04 11:08:39 +00001715 xglCmdPipelineBarrier(cmd_.obj(), &pipeline_barrier);
1716
Chia-I Wu998c2ac2014-12-08 14:30:10 +08001717 cmd_.end();
1718
1719 submit_and_done();
1720
1721 // cannot verify
1722 if (!img.transparent() && !img.copyable())
1723 return;
1724
1725 xgl_testing::ImageChecker checker(img_info, ranges);
1726
1727 checker.set_solid_pattern(ds_to_raw(img_info.format, depth, stencil));
1728 check_dst(img, checker);
1729 }
1730};
1731
1732TEST_F(XglCmdClearDepthStencilTest, Basic)
1733{
1734 for (std::vector<xgl_testing::Device::Format>::const_iterator it = test_formats_.begin();
1735 it != test_formats_.end(); it++) {
1736 // known driver issues
Jeremy Hayesa058eee2015-01-23 08:51:43 -07001737 if (it->format == XGL_FMT_S8_UINT ||
1738 it->format == XGL_FMT_D24_UNORM ||
1739 it->format == XGL_FMT_D16_UNORM_S8_UINT ||
1740 it->format == XGL_FMT_D24_UNORM_S8_UINT)
Chia-I Wu998c2ac2014-12-08 14:30:10 +08001741 continue;
1742
1743 XGL_IMAGE_CREATE_INFO img_info = xgl_testing::Image::create_info();
1744 img_info.imageType = XGL_IMAGE_2D;
1745 img_info.format = it->format;
1746 img_info.extent.width = 64;
1747 img_info.extent.height = 64;
1748 img_info.tiling = it->tiling;
1749 img_info.usage = XGL_IMAGE_USAGE_DEPTH_STENCIL_BIT;
1750
1751 const XGL_IMAGE_SUBRESOURCE_RANGE range =
Chia-I Wua9a506a2014-12-27 22:04:00 +08001752 xgl_testing::Image::subresource_range(img_info, XGL_IMAGE_ASPECT_DEPTH);
Chia-I Wu998c2ac2014-12-08 14:30:10 +08001753 std::vector<XGL_IMAGE_SUBRESOURCE_RANGE> ranges(&range, &range + 1);
1754
1755 test_clear_depth_stencil(img_info, 0.25f, 63, ranges);
1756 }
1757}
1758
1759}; // namespace
1760
Chia-I Wud7414b02014-10-21 11:06:26 +08001761int main(int argc, char **argv)
1762{
Chia-I Wud7414b02014-10-21 11:06:26 +08001763 ::testing::InitGoogleTest(&argc, argv);
Chia-I Wud7414b02014-10-21 11:06:26 +08001764
Chia-I Wua9a506a2014-12-27 22:04:00 +08001765 xgl_testing::set_error_callback(test_error_callback);
1766
Chia-I Wu998c2ac2014-12-08 14:30:10 +08001767 environment = new xgl_testing::Environment();
Chia-I Wud7414b02014-10-21 11:06:26 +08001768
Chia-I Wu998c2ac2014-12-08 14:30:10 +08001769 if (!environment->parse_args(argc, argv))
1770 return -1;
Chia-I Wud7414b02014-10-21 11:06:26 +08001771
Chia-I Wu998c2ac2014-12-08 14:30:10 +08001772 ::testing::AddGlobalTestEnvironment(environment);
1773
1774 return RUN_ALL_TESTS();
Chia-I Wud7414b02014-10-21 11:06:26 +08001775}