Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(98)

Side by Side Diff: tests/DeferredCanvasTest.cpp

Issue 939103002: Do not playback existing commands for full deferred canvas writePixels (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: rebase Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/utils/SkDeferredCanvas.cpp ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2012 Google Inc. 2 * Copyright 2012 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 #include "../src/image/SkImagePriv.h" 8 #include "../src/image/SkImagePriv.h"
9 #include "../src/image/SkSurface_Base.h" 9 #include "../src/image/SkSurface_Base.h"
10 #include "SkBitmap.h" 10 #include "SkBitmap.h"
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
63 SkSurface* onNewSurface(const SkImageInfo&) SK_OVERRIDE { 63 SkSurface* onNewSurface(const SkImageInfo&) SK_OVERRIDE {
64 return NULL; 64 return NULL;
65 } 65 }
66 66
67 SkImage* onNewImageSnapshot(Budgeted) SK_OVERRIDE { 67 SkImage* onNewImageSnapshot(Budgeted) SK_OVERRIDE {
68 return SkNewImageFromBitmap(fBitmap, true, &this->props()); 68 return SkNewImageFromBitmap(fBitmap, true, &this->props());
69 } 69 }
70 70
71 void onCopyOnWrite(ContentChangeMode mode) SK_OVERRIDE { 71 void onCopyOnWrite(ContentChangeMode mode) SK_OVERRIDE {
72 if (mode == SkSurface::kDiscard_ContentChangeMode) { 72 if (mode == SkSurface::kDiscard_ContentChangeMode) {
73 fDiscardCount++; 73 fCOWDiscardCount++;
74 } else { 74 } else {
75 fRetainCount++; 75 fCOWRetainCount++;
76 } 76 }
77 } 77 }
78 78
79 void clearCounts() { 79 void onDiscard() SK_OVERRIDE {
80 fDiscardCount = 0; 80 fDiscardCount++;
81 fRetainCount = 0;
82 } 81 }
83 82
84 int fDiscardCount, fRetainCount; 83 void clearCounts() {
84 fCOWDiscardCount = 0;
85 fCOWRetainCount = 0;
86 fDiscardCount = 0;
87 }
88
89 int fCOWDiscardCount;
90 int fCOWRetainCount;
91 int fDiscardCount;
85 SkBitmap fBitmap; 92 SkBitmap fBitmap;
86 }; 93 };
87 94
88 static void TestDeferredCanvasWritePixelsToSurface(skiatest::Reporter* reporter) { 95 static void TestDeferredCanvasWritePixelsToSurface(skiatest::Reporter* reporter) {
89 SkAutoTUnref<MockSurface> surface(SkNEW_ARGS(MockSurface, (10, 10))); 96 SkAutoTUnref<MockSurface> surface(SkNEW_ARGS(MockSurface, (10, 10)));
90 SkAutoTUnref<SkDeferredCanvas> canvas(SkDeferredCanvas::Create(surface.get() )); 97 SkAutoTUnref<SkDeferredCanvas> canvas(SkDeferredCanvas::Create(surface.get() ));
91 98
92 SkBitmap srcBitmap; 99 SkBitmap srcBitmap;
93 srcBitmap.allocPixels(SkImageInfo::Make(10, 10, kRGBA_8888_SkColorType, kUnp remul_SkAlphaType)); 100 srcBitmap.allocPixels(SkImageInfo::Make(10, 10, kRGBA_8888_SkColorType, kUnp remul_SkAlphaType));
94 srcBitmap.eraseColor(SK_ColorGREEN); 101 srcBitmap.eraseColor(SK_ColorGREEN);
95 // Tests below depend on this bitmap being recognized as opaque 102 // Tests below depend on this bitmap being recognized as opaque
96 103
97 // Preliminary sanity check: no copy on write if no active snapshot 104 // Preliminary sanity check: no copy on write if no active snapshot
105 // Discard notification happens on SkSurface::onDiscard, since no
106 // active snapshot.
98 surface->clearCounts(); 107 surface->clearCounts();
99 canvas->clear(SK_ColorWHITE); 108 canvas->clear(SK_ColorWHITE);
109 REPORTER_ASSERT(reporter, 0 == surface->fCOWDiscardCount);
110 REPORTER_ASSERT(reporter, 0 == surface->fCOWRetainCount);
100 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); 111 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount);
101 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount);
102 112
103 surface->clearCounts(); 113 surface->clearCounts();
104 canvas->flush(); 114 canvas->flush();
105 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); 115 REPORTER_ASSERT(reporter, 0 == surface->fCOWDiscardCount);
106 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount); 116 REPORTER_ASSERT(reporter, 0 == surface->fCOWRetainCount);
117 REPORTER_ASSERT(reporter, 1 == surface->fDiscardCount);
107 118
108 // Case 1: Discard notification happens upon flushing 119 // Case 1: Discard notification happens upon flushing
109 // with an Image attached. 120 // with an Image attached.
110 surface->clearCounts(); 121 surface->clearCounts();
111 SkAutoTUnref<SkImage> image1(canvas->newImageSnapshot()); 122 SkAutoTUnref<SkImage> image1(canvas->newImageSnapshot());
123 REPORTER_ASSERT(reporter, 0 == surface->fCOWDiscardCount);
124 REPORTER_ASSERT(reporter, 0 == surface->fCOWRetainCount);
112 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); 125 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount);
113 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount);
114 126
115 surface->clearCounts(); 127 surface->clearCounts();
116 canvas->clear(SK_ColorWHITE); 128 canvas->clear(SK_ColorWHITE);
129 REPORTER_ASSERT(reporter, 0 == surface->fCOWDiscardCount);
130 REPORTER_ASSERT(reporter, 0 == surface->fCOWRetainCount);
117 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); 131 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount);
118 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount);
119 132
120 surface->clearCounts(); 133 surface->clearCounts();
121 canvas->flush(); 134 canvas->flush();
122 REPORTER_ASSERT(reporter, 1 == surface->fDiscardCount); 135 REPORTER_ASSERT(reporter, 1 == surface->fCOWDiscardCount);
123 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount); 136 REPORTER_ASSERT(reporter, 0 == surface->fCOWRetainCount);
137 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount);
124 138
125 // Case 2: Opaque writePixels 139 // Case 2: Opaque writePixels
126 surface->clearCounts(); 140 surface->clearCounts();
127 SkAutoTUnref<SkImage> image2(canvas->newImageSnapshot()); 141 SkAutoTUnref<SkImage> image2(canvas->newImageSnapshot());
142 REPORTER_ASSERT(reporter, 0 == surface->fCOWDiscardCount);
143 REPORTER_ASSERT(reporter, 0 == surface->fCOWRetainCount);
128 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); 144 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount);
129 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount);
130 145
131 // Case 3: writePixels that partially covers the canvas 146 // Case 3: writePixels that partially covers the canvas
132 surface->clearCounts(); 147 surface->clearCounts();
133 SkAutoTUnref<SkImage> image3(canvas->newImageSnapshot()); 148 SkAutoTUnref<SkImage> image3(canvas->newImageSnapshot());
149 REPORTER_ASSERT(reporter, 0 == surface->fCOWDiscardCount);
150 REPORTER_ASSERT(reporter, 0 == surface->fCOWRetainCount);
134 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); 151 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount);
135 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount);
136 152
137 // Case 4: unpremultiplied opaque writePixels that entirely 153 // Case 4: unpremultiplied opaque writePixels that entirely
138 // covers the canvas 154 // covers the canvas
139 surface->clearCounts(); 155 surface->clearCounts();
140 SkAutoTUnref<SkImage> image4(canvas->newImageSnapshot()); 156 SkAutoTUnref<SkImage> image4(canvas->newImageSnapshot());
157 REPORTER_ASSERT(reporter, 0 == surface->fCOWDiscardCount);
158 REPORTER_ASSERT(reporter, 0 == surface->fCOWRetainCount);
141 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); 159 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount);
142 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount);
143 160
144 surface->clearCounts(); 161 surface->clearCounts();
145 canvas->writePixels(srcBitmap, 0, 0); 162 canvas->writePixels(srcBitmap, 0, 0);
146 REPORTER_ASSERT(reporter, 1 == surface->fDiscardCount); 163 REPORTER_ASSERT(reporter, 1 == surface->fCOWDiscardCount);
147 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount); 164 REPORTER_ASSERT(reporter, 0 == surface->fCOWRetainCount);
165 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount);
148 166
149 surface->clearCounts(); 167 surface->clearCounts();
150 canvas->flush(); 168 canvas->flush();
169 REPORTER_ASSERT(reporter, 0 == surface->fCOWDiscardCount);
170 REPORTER_ASSERT(reporter, 0 == surface->fCOWRetainCount);
151 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); 171 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount);
152 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount);
153 172
154 // Case 5: unpremultiplied opaque writePixels that partially 173 // Case 5: unpremultiplied opaque writePixels that partially
155 // covers the canvas 174 // covers the canvas
156 surface->clearCounts(); 175 surface->clearCounts();
157 SkAutoTUnref<SkImage> image5(canvas->newImageSnapshot()); 176 SkAutoTUnref<SkImage> image5(canvas->newImageSnapshot());
177 REPORTER_ASSERT(reporter, 0 == surface->fCOWDiscardCount);
178 REPORTER_ASSERT(reporter, 0 == surface->fCOWRetainCount);
158 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); 179 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount);
159 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount);
160 180
161 surface->clearCounts(); 181 surface->clearCounts();
162 canvas->writePixels(srcBitmap, 5, 0); 182 canvas->writePixels(srcBitmap, 5, 0);
183 REPORTER_ASSERT(reporter, 0 == surface->fCOWDiscardCount);
184 REPORTER_ASSERT(reporter, 1 == surface->fCOWRetainCount);
163 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); 185 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount);
164 REPORTER_ASSERT(reporter, 1 == surface->fRetainCount);
165 186
166 surface->clearCounts(); 187 surface->clearCounts();
167 canvas->flush(); 188 canvas->flush();
189 REPORTER_ASSERT(reporter, 0 == surface->fCOWDiscardCount);
190 REPORTER_ASSERT(reporter, 0 == surface->fCOWRetainCount);
168 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); 191 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount);
169 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount);
170 192
171 // Case 6: unpremultiplied opaque writePixels that entirely 193 // Case 6: unpremultiplied opaque writePixels that entirely
172 // covers the canvas, preceded by clear 194 // covers the canvas, preceded by clear
173 surface->clearCounts(); 195 surface->clearCounts();
174 SkAutoTUnref<SkImage> image6(canvas->newImageSnapshot()); 196 SkAutoTUnref<SkImage> image6(canvas->newImageSnapshot());
197 REPORTER_ASSERT(reporter, 0 == surface->fCOWDiscardCount);
198 REPORTER_ASSERT(reporter, 0 == surface->fCOWRetainCount);
175 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); 199 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount);
176 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount);
177 200
178 surface->clearCounts(); 201 surface->clearCounts();
179 canvas->clear(SK_ColorWHITE); 202 canvas->clear(SK_ColorWHITE);
203 REPORTER_ASSERT(reporter, 0 == surface->fCOWDiscardCount);
204 REPORTER_ASSERT(reporter, 0 == surface->fCOWRetainCount);
180 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); 205 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount);
181 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount);
182 206
183 surface->clearCounts(); 207 surface->clearCounts();
184 canvas->writePixels(srcBitmap, 0, 0); 208 canvas->writePixels(srcBitmap, 0, 0);
185 REPORTER_ASSERT(reporter, 1 == surface->fDiscardCount); 209 REPORTER_ASSERT(reporter, 1 == surface->fCOWDiscardCount);
186 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount); 210 REPORTER_ASSERT(reporter, 0 == surface->fCOWRetainCount);
211 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount);
187 212
188 surface->clearCounts(); 213 surface->clearCounts();
189 canvas->flush(); 214 canvas->flush();
215 REPORTER_ASSERT(reporter, 0 == surface->fCOWDiscardCount);
216 REPORTER_ASSERT(reporter, 0 == surface->fCOWRetainCount);
190 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); 217 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount);
191 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount);
192 218
193 // Case 7: unpremultiplied opaque writePixels that partially 219 // Case 7: unpremultiplied opaque writePixels that partially
194 // covers the canvas, preceeded by a clear 220 // covers the canvas, preceeded by a clear
195 surface->clearCounts(); 221 surface->clearCounts();
196 SkAutoTUnref<SkImage> image7(canvas->newImageSnapshot()); 222 SkAutoTUnref<SkImage> image7(canvas->newImageSnapshot());
223 REPORTER_ASSERT(reporter, 0 == surface->fCOWDiscardCount);
224 REPORTER_ASSERT(reporter, 0 == surface->fCOWRetainCount);
197 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); 225 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount);
198 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount);
199 226
200 surface->clearCounts(); 227 surface->clearCounts();
201 canvas->clear(SK_ColorWHITE); 228 canvas->clear(SK_ColorWHITE);
229 REPORTER_ASSERT(reporter, 0 == surface->fCOWDiscardCount);
230 REPORTER_ASSERT(reporter, 0 == surface->fCOWRetainCount);
202 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); 231 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount);
203 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount);
204 232
205 surface->clearCounts(); 233 surface->clearCounts();
206 canvas->writePixels(srcBitmap, 5, 0); 234 canvas->writePixels(srcBitmap, 5, 0);
207 REPORTER_ASSERT(reporter, 1 == surface->fDiscardCount); // because of the cl ear 235 REPORTER_ASSERT(reporter, 1 == surface->fCOWDiscardCount); // because of the clear
208 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount); 236 REPORTER_ASSERT(reporter, 0 == surface->fCOWRetainCount);
237 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount);
209 238
210 surface->clearCounts(); 239 surface->clearCounts();
211 canvas->flush(); 240 canvas->flush();
241 REPORTER_ASSERT(reporter, 0 == surface->fCOWDiscardCount);
242 REPORTER_ASSERT(reporter, 0 == surface->fCOWRetainCount);
212 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); 243 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount);
213 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount);
214 244
215 // Case 8: unpremultiplied opaque writePixels that partially 245 // Case 8: unpremultiplied opaque writePixels that partially
216 // covers the canvas, preceeded by a drawREct that partially 246 // covers the canvas, preceeded by a drawREct that partially
217 // covers the canvas 247 // covers the canvas
218 surface->clearCounts(); 248 surface->clearCounts();
219 SkAutoTUnref<SkImage> image8(canvas->newImageSnapshot()); 249 SkAutoTUnref<SkImage> image8(canvas->newImageSnapshot());
250 REPORTER_ASSERT(reporter, 0 == surface->fCOWDiscardCount);
251 REPORTER_ASSERT(reporter, 0 == surface->fCOWRetainCount);
220 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); 252 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount);
221 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount);
222 253
223 surface->clearCounts(); 254 surface->clearCounts();
224 SkPaint paint; 255 SkPaint paint;
225 canvas->drawRect(SkRect::MakeLTRB(0, 0, 5, 5), paint); 256 canvas->drawRect(SkRect::MakeLTRB(0, 0, 5, 5), paint);
257 REPORTER_ASSERT(reporter, 0 == surface->fCOWDiscardCount);
258 REPORTER_ASSERT(reporter, 0 == surface->fCOWRetainCount);
226 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); 259 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount);
227 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount);
228 260
229 surface->clearCounts(); 261 surface->clearCounts();
230 canvas->writePixels(srcBitmap, 5, 0); 262 canvas->writePixels(srcBitmap, 5, 0);
263 REPORTER_ASSERT(reporter, 0 == surface->fCOWDiscardCount);
264 REPORTER_ASSERT(reporter, 1 == surface->fCOWRetainCount);
231 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); 265 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount);
232 REPORTER_ASSERT(reporter, 1 == surface->fRetainCount);
233 266
234 surface->clearCounts(); 267 surface->clearCounts();
235 canvas->flush(); 268 canvas->flush();
269 REPORTER_ASSERT(reporter, 0 == surface->fCOWDiscardCount);
270 REPORTER_ASSERT(reporter, 0 == surface->fCOWRetainCount);
236 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); 271 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount);
237 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount);
238 } 272 }
239 273
240 static void TestDeferredCanvasFlush(skiatest::Reporter* reporter) { 274 static void TestDeferredCanvasFlush(skiatest::Reporter* reporter) {
241 SkAutoTUnref<SkSurface> surface(createSurface(0xFFFFFFFF)); 275 SkAutoTUnref<SkSurface> surface(createSurface(0xFFFFFFFF));
242 SkAutoTUnref<SkDeferredCanvas> canvas(SkDeferredCanvas::Create(surface.get() )); 276 SkAutoTUnref<SkDeferredCanvas> canvas(SkDeferredCanvas::Create(surface.get() ));
243 277
244 canvas->clear(0x00000000); 278 canvas->clear(0x00000000);
245 279
246 // verify that clear was deferred 280 // verify that clear was deferred
247 REPORTER_ASSERT(reporter, 0xFFFFFFFF == read_pixel(surface, 0, 0)); 281 REPORTER_ASSERT(reporter, 0xFFFFFFFF == read_pixel(surface, 0, 0));
(...skipping 654 matching lines...) Expand 10 before | Expand all | Expand 10 after
902 TestDeferredCanvasSurface(reporter, NULL); 936 TestDeferredCanvasSurface(reporter, NULL);
903 TestDeferredCanvasSetSurface(reporter, NULL); 937 TestDeferredCanvasSetSurface(reporter, NULL);
904 } 938 }
905 939
906 DEF_GPUTEST(DeferredCanvas_GPU, reporter, factory) { 940 DEF_GPUTEST(DeferredCanvas_GPU, reporter, factory) {
907 if (factory != NULL) { 941 if (factory != NULL) {
908 TestDeferredCanvasSurface(reporter, factory); 942 TestDeferredCanvasSurface(reporter, factory);
909 TestDeferredCanvasSetSurface(reporter, factory); 943 TestDeferredCanvasSetSurface(reporter, factory);
910 } 944 }
911 } 945 }
OLDNEW
« no previous file with comments | « src/utils/SkDeferredCanvas.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698