123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 |
- /*
- * Copyright 2019 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
- #include "include/core/SkPoint.h"
- #include "include/core/SkTypes.h"
- #include "include/utils/SkRandom.h"
- #include "tests/Test.h"
- #include <vector>
- #if SK_SUPPORT_GPU
- #include "src/gpu/GrSamplePatternDictionary.h"
- static SkTArray<SkPoint> make_sample_pattern(const std::vector<SkPoint>& sampleLocations) {
- return SkTArray<SkPoint>(sampleLocations.data(), sampleLocations.size());
- }
- static SkTArray<SkPoint> make_random_sample_pattern(SkRandom* rand) {
- SkTArray<SkPoint> pattern;
- int count = rand->nextULessThan(20) + 1;
- pattern.reset(count);
- for (int i = 0; i < count; ++i) {
- pattern[i] = SkPoint::Make(rand->nextF(), rand->nextF());
- }
- return pattern;
- }
- // This test ensures that the sample pattern dictionary caches and retrieves patterns correctly.
- DEF_TEST(SamplePatternDictionary, reporter) {
- SkTArray<SkTArray<SkPoint>> testPatterns;
- testPatterns.push_back() = make_sample_pattern({ // Intel on mac, msaa8, offscreen.
- {0.562500, 0.312500},
- {0.437500, 0.687500},
- {0.812500, 0.562500},
- {0.312500, 0.187500},
- {0.187500, 0.812500},
- {0.062500, 0.437500},
- {0.687500, 0.937500},
- {0.937500, 0.062500}
- });
- testPatterns.push_back() = make_sample_pattern({ // Intel on mac, msaa8, on-screen.
- {0.562500, 0.687500},
- {0.437500, 0.312500},
- {0.812500, 0.437500},
- {0.312500, 0.812500},
- {0.187500, 0.187500},
- {0.062500, 0.562500},
- {0.687500, 0.062500},
- {0.937500, 0.937500}
- });
- testPatterns.push_back() = make_sample_pattern({ // NVIDIA, msaa16.
- {0.062500, 0.000000},
- {0.250000, 0.125000},
- {0.187500, 0.375000},
- {0.437500, 0.312500},
- {0.500000, 0.062500},
- {0.687500, 0.187500},
- {0.750000, 0.437500},
- {0.937500, 0.250000},
- {0.000000, 0.500000},
- {0.312500, 0.625000},
- {0.125000, 0.750000},
- {0.375000, 0.875000},
- {0.562500, 0.562500},
- {0.812500, 0.687500},
- {0.625000, 0.812500},
- {0.875000, 0.937500}
- });
- testPatterns.push_back() = make_sample_pattern({ // NVIDIA, mixed samples, 16:1.
- {0.250000, 0.125000},
- {0.625000, 0.812500},
- {0.500000, 0.062500},
- {0.812500, 0.687500},
- {0.187500, 0.375000},
- {0.875000, 0.937500},
- {0.125000, 0.750000},
- {0.750000, 0.437500},
- {0.937500, 0.250000},
- {0.312500, 0.625000},
- {0.437500, 0.312500},
- {0.000000, 0.500000},
- {0.375000, 0.875000},
- {0.687500, 0.187500},
- {0.062500, 0.000000},
- {0.562500, 0.562500}
- });
- SkRandom rand;
- for (int i = 0; i < 23; ++i) {
- testPatterns.push_back(make_random_sample_pattern(&rand));
- }
- // Duplicate the initial 4 patterns, with slight differences.
- testPatterns.push_back(testPatterns[0]);
- testPatterns.back().back().fX += 0.001f;
- testPatterns.push_back(testPatterns[1]);
- testPatterns.back().back().fY -= 0.002f;
- testPatterns.push_back(testPatterns[2]);
- testPatterns.back().push_back(SkPoint::Make(.5f, .5f));
- testPatterns.push_back(testPatterns[3]);
- testPatterns.back().pop_back();
- for (int i = 0; i < 13; ++i) {
- testPatterns.push_back(make_random_sample_pattern(&rand));
- }
- GrSamplePatternDictionary dict;
- for (int i = 0; i < 2; ++i) {
- for (int j = 0; j < testPatterns.count(); ++j) {
- for (int k = 0; k < 3; ++k) {
- const SkTArray<SkPoint>& pattern = testPatterns[testPatterns.count() - j - 1];
- REPORTER_ASSERT(reporter, j == dict.findOrAssignSamplePatternKey(pattern));
- }
- }
- }
- for (int j = 0; j < testPatterns.count(); ++j) {
- const SkTArray<SkPoint>& pattern = testPatterns[testPatterns.count() - j - 1];
- REPORTER_ASSERT(reporter, dict.retrieveSampleLocations(j) == pattern);
- }
- }
- #endif
|