|
10 | 10 | #include "include/gpu/graphite/Context.h"
|
11 | 11 | #include "include/gpu/graphite/Recorder.h"
|
12 | 12 | #include "src/gpu/SkBackingFit.h"
|
| 13 | +#include "src/gpu/graphite/ContextPriv.h" |
13 | 14 | #include "src/gpu/graphite/Device.h"
|
14 | 15 | #include "src/gpu/graphite/RecorderPriv.h"
|
15 | 16 |
|
@@ -100,3 +101,46 @@ DEF_GRAPHITE_TEST_FOR_ALL_CONTEXTS(RecorderDevicePtrTest, reporter, context,
|
100 | 101 | device1.reset();
|
101 | 102 | device3.reset();
|
102 | 103 | }
|
| 104 | + |
| 105 | +// Tests to make sure the Recorders can override the ordering requirement. |
| 106 | +DEF_GRAPHITE_TEST_FOR_ALL_CONTEXTS(RecorderOrderingTest, reporter, context, |
| 107 | + CtsEnforcement::kNever) { |
| 108 | + std::unique_ptr<Recorder> orderedRecorder, unorderedRecorder; |
| 109 | + |
| 110 | + if (context->priv().caps()->requireOrderedRecordings()) { |
| 111 | + orderedRecorder = context->makeRecorder(); |
| 112 | + RecorderOptions opts; |
| 113 | + opts.fRequireOrderedRecordings = false; |
| 114 | + unorderedRecorder = context->makeRecorder(opts); |
| 115 | + } else { |
| 116 | + RecorderOptions opts; |
| 117 | + opts.fRequireOrderedRecordings = true; |
| 118 | + orderedRecorder = context->makeRecorder(opts); |
| 119 | + unorderedRecorder = context->makeRecorder(); |
| 120 | + } |
| 121 | + |
| 122 | + auto insert = [context](Recording* r) { |
| 123 | + InsertRecordingInfo info; |
| 124 | + info.fRecording = r; |
| 125 | + return context->insertRecording(info); |
| 126 | + }; |
| 127 | + |
| 128 | + std::unique_ptr<Recording> o1 = orderedRecorder->snap(); |
| 129 | + std::unique_ptr<Recording> o2 = orderedRecorder->snap(); |
| 130 | + std::unique_ptr<Recording> o3 = orderedRecorder->snap(); |
| 131 | + |
| 132 | + std::unique_ptr<Recording> u1 = unorderedRecorder->snap(); |
| 133 | + std::unique_ptr<Recording> u2 = unorderedRecorder->snap(); |
| 134 | + |
| 135 | + // Unordered insertion of an unordered Recorder succeeds. |
| 136 | + // NOTE: These Recordings are all out-of-order with respect to orderedRecorder, which had been |
| 137 | + // snapped multiple times before unorderedRecorder. That is always allowed. |
| 138 | + REPORTER_ASSERT(reporter, insert(u2.get())); |
| 139 | + REPORTER_ASSERT(reporter, insert(u1.get())); |
| 140 | + |
| 141 | + // Unordered insertion of an ordered Recorder fails |
| 142 | + REPORTER_ASSERT(reporter, insert(o1.get())); // succeeds (first insertion) |
| 143 | + REPORTER_ASSERT(reporter, !insert(o3.get())); // fails for out of order |
| 144 | + REPORTER_ASSERT(reporter, insert(o2.get())); // succeeds and recovers |
| 145 | + REPORTER_ASSERT(reporter, insert(o3.get())); // now in order success |
| 146 | +} |
0 commit comments