| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2014 Google Inc. | 2 * Copyright 2014 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #if SK_SUPPORT_GPU | |
| 9 | |
| 10 #include "GrTRecorder.h" | |
| 11 #include "SkMatrix.h" | 8 #include "SkMatrix.h" |
| 12 #include "SkRandom.h" | 9 #include "SkRandom.h" |
| 13 #include "SkString.h" | 10 #include "SkString.h" |
| 14 #include "Test.h" | 11 #include "Test.h" |
| 15 | 12 |
| 13 #if SK_SUPPORT_GPU |
| 14 |
| 15 #include "GrTRecorder.h" |
| 16 |
| 16 //////////////////////////////////////////////////////////////////////////////// | 17 //////////////////////////////////////////////////////////////////////////////// |
| 17 | 18 |
| 18 static int activeRecorderItems = 0; | 19 static int activeRecorderItems = 0; |
| 19 | 20 |
| 20 class IntWrapper { | 21 class IntWrapper { |
| 21 public: | 22 public: |
| 22 IntWrapper() {} | 23 IntWrapper() {} |
| 23 IntWrapper(int value) : fValue(value) {} | 24 IntWrapper(int value) : fValue(value) {} |
| 24 operator int() { return fValue; } | 25 operator int() { return fValue; } |
| 25 private: | 26 private: |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 94 ExtraData::Recorder::Iter iter(recorder); | 95 ExtraData::Recorder::Iter iter(recorder); |
| 95 for (int i = 0; i < 100; ++i) { | 96 for (int i = 0; i < 100; ++i) { |
| 96 REPORTER_ASSERT(reporter, iter.next()); | 97 REPORTER_ASSERT(reporter, iter.next()); |
| 97 REPORTER_ASSERT(reporter, i == iter->fData); | 98 REPORTER_ASSERT(reporter, i == iter->fData); |
| 98 for (int j = 0; j < i; j++) { | 99 for (int j = 0; j < i; j++) { |
| 99 REPORTER_ASSERT(reporter, i == iter->extraData()[j]); | 100 REPORTER_ASSERT(reporter, i == iter->extraData()[j]); |
| 100 } | 101 } |
| 101 } | 102 } |
| 102 REPORTER_ASSERT(reporter, !iter.next()); | 103 REPORTER_ASSERT(reporter, !iter.next()); |
| 103 | 104 |
| 105 ExtraData::Recorder::ReverseIter reverseIter(recorder); |
| 106 for (int i = 99; i >= 0; --i) { |
| 107 REPORTER_ASSERT(reporter, i == reverseIter->fData); |
| 108 for (int j = 0; j < i; j++) { |
| 109 REPORTER_ASSERT(reporter, i == reverseIter->extraData()[j]); |
| 110 } |
| 111 REPORTER_ASSERT(reporter, reverseIter.previous() == !!i); |
| 112 } |
| 113 |
| 104 recorder.reset(); | 114 recorder.reset(); |
| 105 REPORTER_ASSERT(reporter, 0 == activeRecorderItems); | 115 REPORTER_ASSERT(reporter, 0 == activeRecorderItems); |
| 106 } | 116 } |
| 107 | 117 |
| 108 enum ClassType { | 118 enum ClassType { |
| 109 kBase_ClassType, | 119 kBase_ClassType, |
| 110 kSubclass_ClassType, | 120 kSubclass_ClassType, |
| 111 kSubSubclass_ClassType, | 121 kSubSubclass_ClassType, |
| 112 kSubclassExtraData_ClassType, | 122 kSubclassExtraData_ClassType, |
| 113 kSubclassEmpty_ClassType, | 123 kSubclassEmpty_ClassType, |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 190 private: | 200 private: |
| 191 static int ValueAt(uint64_t i) { return static_cast<int>(123456789 + 9876543
21 * i); } | 201 static int ValueAt(uint64_t i) { return static_cast<int>(123456789 + 9876543
21 * i); } |
| 192 int fLength; | 202 int fLength; |
| 193 }; | 203 }; |
| 194 | 204 |
| 195 class SubclassEmpty : public Base { | 205 class SubclassEmpty : public Base { |
| 196 public: | 206 public: |
| 197 virtual ClassType getType() { return kSubclassEmpty_ClassType; } | 207 virtual ClassType getType() { return kSubclassEmpty_ClassType; } |
| 198 }; | 208 }; |
| 199 | 209 |
| 210 class Order { |
| 211 public: |
| 212 Order() { this->reset(); } |
| 213 void reset() { fCurrent = 0; } |
| 214 ClassType next() { |
| 215 fCurrent = 1664525 * fCurrent + 1013904223; |
| 216 return static_cast<ClassType>(fCurrent % kNumClassTypes); |
| 217 } |
| 218 private: |
| 219 uint32_t fCurrent; |
| 220 }; |
| 221 static void test_subclasses_iters(skiatest::Reporter*, Order&, Base::Recorder::I
ter&, |
| 222 Base::Recorder::ReverseIter&, int = 0); |
| 200 static void test_subclasses(skiatest::Reporter* reporter) { | 223 static void test_subclasses(skiatest::Reporter* reporter) { |
| 201 class Order { | |
| 202 public: | |
| 203 Order() { this->reset(); } | |
| 204 void reset() { fCurrent = 0; } | |
| 205 ClassType next() { | |
| 206 fCurrent = 1664525 * fCurrent + 1013904223; | |
| 207 return static_cast<ClassType>(fCurrent % kNumClassTypes); | |
| 208 } | |
| 209 private: | |
| 210 uint32_t fCurrent; | |
| 211 }; | |
| 212 | |
| 213 Base::Recorder recorder(1024); | 224 Base::Recorder recorder(1024); |
| 214 | 225 |
| 215 Order order; | 226 Order order; |
| 216 for (int i = 0; i < 1000; i++) { | 227 for (int i = 0; i < 1000; i++) { |
| 217 switch (order.next()) { | 228 switch (order.next()) { |
| 218 case kBase_ClassType: | 229 case kBase_ClassType: |
| 219 GrNEW_APPEND_TO_RECORDER(recorder, Base, ()); | 230 GrNEW_APPEND_TO_RECORDER(recorder, Base, ()); |
| 220 break; | 231 break; |
| 221 | 232 |
| 222 case kSubclass_ClassType: | 233 case kSubclass_ClassType: |
| (...skipping 14 matching lines...) Expand all Loading... |
| 237 | 248 |
| 238 default: | 249 default: |
| 239 ERRORF(reporter, "Invalid class type"); | 250 ERRORF(reporter, "Invalid class type"); |
| 240 break; | 251 break; |
| 241 } | 252 } |
| 242 } | 253 } |
| 243 REPORTER_ASSERT(reporter, 1000 == activeRecorderItems); | 254 REPORTER_ASSERT(reporter, 1000 == activeRecorderItems); |
| 244 | 255 |
| 245 order.reset(); | 256 order.reset(); |
| 246 Base::Recorder::Iter iter(recorder); | 257 Base::Recorder::Iter iter(recorder); |
| 247 for (int i = 0; i < 1000; ++i) { | 258 Base::Recorder::ReverseIter reverseIter(recorder); |
| 248 REPORTER_ASSERT(reporter, iter.next()); | 259 |
| 249 REPORTER_ASSERT(reporter, order.next() == iter->getType()); | 260 test_subclasses_iters(reporter, order, iter, reverseIter); |
| 250 iter->validate(reporter); | 261 |
| 251 } | |
| 252 REPORTER_ASSERT(reporter, !iter.next()); | 262 REPORTER_ASSERT(reporter, !iter.next()); |
| 253 | 263 |
| 254 // Don't reset the recorder. It should automatically destruct all its items. | 264 // Don't reset the recorder. It should automatically destruct all its items. |
| 255 } | 265 } |
| 266 static void test_subclasses_iters(skiatest::Reporter* reporter, Order& order, |
| 267 Base::Recorder::Iter& iter, |
| 268 Base::Recorder::ReverseIter& reverseIter, int
i) { |
| 269 if (i >= 1000) { |
| 270 return; |
| 271 } |
| 272 |
| 273 ClassType classType = order.next(); |
| 274 |
| 275 REPORTER_ASSERT(reporter, iter.next()); |
| 276 REPORTER_ASSERT(reporter, classType == iter->getType()); |
| 277 iter->validate(reporter); |
| 278 |
| 279 test_subclasses_iters(reporter, order, iter, reverseIter, i + 1); |
| 280 |
| 281 REPORTER_ASSERT(reporter, classType == reverseIter->getType()); |
| 282 reverseIter->validate(reporter); |
| 283 REPORTER_ASSERT(reporter, reverseIter.previous() == !!i); |
| 284 } |
| 256 | 285 |
| 257 DEF_GPUTEST(GrTRecorder, reporter, factory) { | 286 DEF_GPUTEST(GrTRecorder, reporter, factory) { |
| 258 test_empty_back_and_pop(reporter); | 287 test_empty_back_and_pop(reporter); |
| 259 | 288 |
| 260 test_extra_data(reporter); | 289 test_extra_data(reporter); |
| 261 REPORTER_ASSERT(reporter, 0 == activeRecorderItems); // test_extra_data shou
ld call reset(). | 290 REPORTER_ASSERT(reporter, 0 == activeRecorderItems); // test_extra_data shou
ld call reset(). |
| 262 | 291 |
| 263 test_subclasses(reporter); | 292 test_subclasses(reporter); |
| 264 REPORTER_ASSERT(reporter, 0 == activeRecorderItems); // Ensure ~GrTRecorder
invokes dtors. | 293 REPORTER_ASSERT(reporter, 0 == activeRecorderItems); // Ensure ~GrTRecorder
invokes dtors. |
| 265 } | 294 } |
| 266 | 295 |
| 267 #endif | 296 #endif |
| OLD | NEW |