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

Side by Side Diff: src/gpu/SkGpuDevice.cpp

Issue 1658823002: Remove deferred clear from SkGpuDevice (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Fix ptr->bool warning on windows Created 4 years, 10 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/gpu/SkGpuDevice.h ('k') | src/gpu/batches/GrClearBatch.h » ('j') | 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 2011 Google Inc. 2 * Copyright 2011 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 "SkGpuDevice.h" 8 #include "SkGpuDevice.h"
9 9
10 #include "GrBlurUtils.h" 10 #include "GrBlurUtils.h"
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
59 extern bool (*gShouldDrawProc)(); 59 extern bool (*gShouldDrawProc)();
60 #define CHECK_SHOULD_DRAW(draw) \ 60 #define CHECK_SHOULD_DRAW(draw) \
61 do { \ 61 do { \
62 if (gShouldDrawProc && !gShouldDrawProc()) return; \ 62 if (gShouldDrawProc && !gShouldDrawProc()) return; \
63 this->prepareDraw(draw); \ 63 this->prepareDraw(draw); \
64 } while (0) 64 } while (0)
65 #else 65 #else
66 #define CHECK_SHOULD_DRAW(draw) this->prepareDraw(draw) 66 #define CHECK_SHOULD_DRAW(draw) this->prepareDraw(draw)
67 #endif 67 #endif
68 68
69 #define DO_DEFERRED_CLEAR() \
70 do { \
71 if (fNeedClear) { \
72 this->clearAll(); \
73 } \
74 } while (false) \
75
76 /////////////////////////////////////////////////////////////////////////////// 69 ///////////////////////////////////////////////////////////////////////////////
77 70
78 #define CHECK_FOR_ANNOTATION(paint) \ 71 #define CHECK_FOR_ANNOTATION(paint) \
79 do { if (paint.getAnnotation()) { return; } } while (0) 72 do { if (paint.getAnnotation()) { return; } } while (0)
80 73
81 /////////////////////////////////////////////////////////////////////////////// 74 ///////////////////////////////////////////////////////////////////////////////
82 75
83 // Helper for turning a bitmap into a texture. If the bitmap is GrTexture backed this 76 // Helper for turning a bitmap into a texture. If the bitmap is GrTexture backed this
84 // just accesses the backing GrTexture. Otherwise, it creates a cached texture 77 // just accesses the backing GrTexture. Otherwise, it creates a cached texture
85 // representation and releases it in the destructor. 78 // representation and releases it in the destructor.
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
168 } 161 }
169 162
170 return new SkGpuDevice(rt, info.width(), info.height(), props, flags); 163 return new SkGpuDevice(rt, info.width(), info.height(), props, flags);
171 } 164 }
172 165
173 SkGpuDevice::SkGpuDevice(GrRenderTarget* rt, int width, int height, 166 SkGpuDevice::SkGpuDevice(GrRenderTarget* rt, int width, int height,
174 const SkSurfaceProps* props, unsigned flags) 167 const SkSurfaceProps* props, unsigned flags)
175 : INHERITED(SkSurfacePropsCopyOrDefault(props)) 168 : INHERITED(SkSurfacePropsCopyOrDefault(props))
176 , fContext(SkRef(rt->getContext())) 169 , fContext(SkRef(rt->getContext()))
177 , fRenderTarget(SkRef(rt)) { 170 , fRenderTarget(SkRef(rt)) {
178 fNeedClear = SkToBool(flags & kNeedClear_Flag);
179 fOpaque = SkToBool(flags & kIsOpaque_Flag); 171 fOpaque = SkToBool(flags & kIsOpaque_Flag);
180 172
181 SkAlphaType at = fOpaque ? kOpaque_SkAlphaType : kPremul_SkAlphaType; 173 SkAlphaType at = fOpaque ? kOpaque_SkAlphaType : kPremul_SkAlphaType;
182 SkImageInfo info = rt->surfacePriv().info(at).makeWH(width, height); 174 SkImageInfo info = rt->surfacePriv().info(at).makeWH(width, height);
183 SkPixelRef* pr = new SkGrPixelRef(info, rt); 175 SkPixelRef* pr = new SkGrPixelRef(info, rt);
184 fLegacyBitmap.setInfo(info); 176 fLegacyBitmap.setInfo(info);
185 fLegacyBitmap.setPixelRef(pr)->unref(); 177 fLegacyBitmap.setPixelRef(pr)->unref();
186 178
187 fDrawContext.reset(this->context()->drawContext(rt, &this->surfaceProps())); 179 fDrawContext.reset(this->context()->drawContext(rt, &this->surfaceProps()));
180 if (flags & kNeedClear_Flag) {
181 this->clearAll();
182 }
188 } 183 }
189 184
190 GrRenderTarget* SkGpuDevice::CreateRenderTarget(GrContext* context, SkSurface::B udgeted budgeted, 185 GrRenderTarget* SkGpuDevice::CreateRenderTarget(GrContext* context, SkSurface::B udgeted budgeted,
191 const SkImageInfo& origInfo, int sampleCount) { 186 const SkImageInfo& origInfo, int sampleCount) {
192 if (kUnknown_SkColorType == origInfo.colorType() || 187 if (kUnknown_SkColorType == origInfo.colorType() ||
193 origInfo.width() < 0 || origInfo.height() < 0) { 188 origInfo.width() < 0 || origInfo.height() < 0) {
194 return nullptr; 189 return nullptr;
195 } 190 }
196 191
197 if (!context) { 192 if (!context) {
(...skipping 26 matching lines...) Expand all
224 } 219 }
225 SkASSERT(nullptr != texture->asRenderTarget()); 220 SkASSERT(nullptr != texture->asRenderTarget());
226 return texture->asRenderTarget(); 221 return texture->asRenderTarget();
227 } 222 }
228 223
229 /////////////////////////////////////////////////////////////////////////////// 224 ///////////////////////////////////////////////////////////////////////////////
230 225
231 bool SkGpuDevice::onReadPixels(const SkImageInfo& dstInfo, void* dstPixels, size _t dstRowBytes, 226 bool SkGpuDevice::onReadPixels(const SkImageInfo& dstInfo, void* dstPixels, size _t dstRowBytes,
232 int x, int y) { 227 int x, int y) {
233 ASSERT_SINGLE_OWNER 228 ASSERT_SINGLE_OWNER
234 DO_DEFERRED_CLEAR();
235 229
236 // TODO: teach fRenderTarget to take ImageInfo directly to specify the src p ixels 230 // TODO: teach fRenderTarget to take ImageInfo directly to specify the src p ixels
237 GrPixelConfig config = SkImageInfo2GrPixelConfig(dstInfo); 231 GrPixelConfig config = SkImageInfo2GrPixelConfig(dstInfo);
238 if (kUnknown_GrPixelConfig == config) { 232 if (kUnknown_GrPixelConfig == config) {
239 return false; 233 return false;
240 } 234 }
241 235
242 uint32_t flags = 0; 236 uint32_t flags = 0;
243 if (kUnpremul_SkAlphaType == dstInfo.alphaType()) { 237 if (kUnpremul_SkAlphaType == dstInfo.alphaType()) {
244 flags = GrContext::kUnpremul_PixelOpsFlag; 238 flags = GrContext::kUnpremul_PixelOpsFlag;
(...skipping 17 matching lines...) Expand all
262 fRenderTarget->writePixels(x, y, info.width(), info.height(), config, pixels , rowBytes, flags); 256 fRenderTarget->writePixels(x, y, info.width(), info.height(), config, pixels , rowBytes, flags);
263 257
264 // need to bump our genID for compatibility with clients that "know" we have a bitmap 258 // need to bump our genID for compatibility with clients that "know" we have a bitmap
265 fLegacyBitmap.notifyPixelsChanged(); 259 fLegacyBitmap.notifyPixelsChanged();
266 260
267 return true; 261 return true;
268 } 262 }
269 263
270 const SkBitmap& SkGpuDevice::onAccessBitmap() { 264 const SkBitmap& SkGpuDevice::onAccessBitmap() {
271 ASSERT_SINGLE_OWNER 265 ASSERT_SINGLE_OWNER
272 DO_DEFERRED_CLEAR();
273 return fLegacyBitmap; 266 return fLegacyBitmap;
274 } 267 }
275 268
276 bool SkGpuDevice::onAccessPixels(SkPixmap* pmap) { 269 bool SkGpuDevice::onAccessPixels(SkPixmap* pmap) {
277 ASSERT_SINGLE_OWNER 270 ASSERT_SINGLE_OWNER
278 DO_DEFERRED_CLEAR();
279 // For compatibility with clients the know we're backed w/ a bitmap, and wan t to inspect its 271 // For compatibility with clients the know we're backed w/ a bitmap, and wan t to inspect its
280 // genID. When we can hide/remove that fact, we can eliminate this call to n otify. 272 // genID. When we can hide/remove that fact, we can eliminate this call to n otify.
281 // ... ugh. 273 // ... ugh.
282 fLegacyBitmap.notifyPixelsChanged(); 274 fLegacyBitmap.notifyPixelsChanged();
283 return false; 275 return false;
284 } 276 }
285 277
286 void SkGpuDevice::onAttachToCanvas(SkCanvas* canvas) { 278 void SkGpuDevice::onAttachToCanvas(SkCanvas* canvas) {
287 ASSERT_SINGLE_OWNER 279 ASSERT_SINGLE_OWNER
288 INHERITED::onAttachToCanvas(canvas); 280 INHERITED::onAttachToCanvas(canvas);
(...skipping 11 matching lines...) Expand all
300 292
301 // call this every draw call, to ensure that the context reflects our state, 293 // call this every draw call, to ensure that the context reflects our state,
302 // and not the state from some other canvas/device 294 // and not the state from some other canvas/device
303 void SkGpuDevice::prepareDraw(const SkDraw& draw) { 295 void SkGpuDevice::prepareDraw(const SkDraw& draw) {
304 ASSERT_SINGLE_OWNER 296 ASSERT_SINGLE_OWNER
305 SkASSERT(fClipStack.get()); 297 SkASSERT(fClipStack.get());
306 298
307 SkASSERT(draw.fClipStack && draw.fClipStack == fClipStack); 299 SkASSERT(draw.fClipStack && draw.fClipStack == fClipStack);
308 300
309 fClip.setClipStack(fClipStack, &this->getOrigin()); 301 fClip.setClipStack(fClipStack, &this->getOrigin());
310
311 DO_DEFERRED_CLEAR();
312 } 302 }
313 303
314 GrRenderTarget* SkGpuDevice::accessRenderTarget() { 304 GrRenderTarget* SkGpuDevice::accessRenderTarget() {
315 ASSERT_SINGLE_OWNER 305 ASSERT_SINGLE_OWNER
316 DO_DEFERRED_CLEAR();
317 return fRenderTarget; 306 return fRenderTarget;
318 } 307 }
319 308
320 void SkGpuDevice::clearAll() { 309 void SkGpuDevice::clearAll() {
321 ASSERT_SINGLE_OWNER 310 ASSERT_SINGLE_OWNER
322 GrColor color = 0; 311 GrColor color = 0;
323 GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice", "clearAll", fContext); 312 GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice", "clearAll", fContext);
324 SkIRect rect = SkIRect::MakeWH(this->width(), this->height()); 313 SkIRect rect = SkIRect::MakeWH(this->width(), this->height());
325 fDrawContext->clear(&rect, color, true); 314 fDrawContext->clear(&rect, color, true);
326 fNeedClear = false;
327 } 315 }
328 316
329 void SkGpuDevice::replaceRenderTarget(bool shouldRetainContent) { 317 void SkGpuDevice::replaceRenderTarget(bool shouldRetainContent) {
330 ASSERT_SINGLE_OWNER 318 ASSERT_SINGLE_OWNER
331 // Caller must have accessed the render target, because it knows the rt must be replaced.
332 SkASSERT(!fNeedClear);
333 319
334 SkSurface::Budgeted budgeted = 320 SkSurface::Budgeted budgeted =
335 fRenderTarget->resourcePriv().isBudgeted() ? SkSurface::kYes_Budgete d 321 fRenderTarget->resourcePriv().isBudgeted() ? SkSurface::kYes_Budgete d
336 : SkSurface::kNo_Budgeted ; 322 : SkSurface::kNo_Budgeted ;
337 323
338 SkAutoTUnref<GrRenderTarget> newRT(CreateRenderTarget( 324 SkAutoTUnref<GrRenderTarget> newRT(CreateRenderTarget(
339 this->context(), budgeted, this->imageInfo(), fRenderTarget->desc().fSam pleCnt)); 325 this->context(), budgeted, this->imageInfo(), fRenderTarget->desc().fSam pleCnt));
340 326
341 if (nullptr == newRT) { 327 if (nullptr == newRT) {
342 return; 328 return;
(...skipping 960 matching lines...) Expand 10 before | Expand all | Expand 10 after
1303 this->drawTextureProducer(&maker, src, dst, constraint, *draw.fMatrix, fClip , paint); 1289 this->drawTextureProducer(&maker, src, dst, constraint, *draw.fMatrix, fClip , paint);
1304 } 1290 }
1305 1291
1306 void SkGpuDevice::drawDevice(const SkDraw& draw, SkBaseDevice* device, 1292 void SkGpuDevice::drawDevice(const SkDraw& draw, SkBaseDevice* device,
1307 int x, int y, const SkPaint& paint) { 1293 int x, int y, const SkPaint& paint) {
1308 ASSERT_SINGLE_OWNER 1294 ASSERT_SINGLE_OWNER
1309 // clear of the source device must occur before CHECK_SHOULD_DRAW 1295 // clear of the source device must occur before CHECK_SHOULD_DRAW
1310 GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice", "drawDevice", fContext); 1296 GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice", "drawDevice", fContext);
1311 SkGpuDevice* dev = static_cast<SkGpuDevice*>(device); 1297 SkGpuDevice* dev = static_cast<SkGpuDevice*>(device);
1312 1298
1313 // TODO: If the source device covers the whole of this device, we could
1314 // omit fNeedsClear -related flushing.
1315 // TODO: if source needs clear, we could maybe omit the draw fully.
1316
1317 // drawDevice is defined to be in device coords. 1299 // drawDevice is defined to be in device coords.
1318 CHECK_SHOULD_DRAW(draw); 1300 CHECK_SHOULD_DRAW(draw);
1319 1301
1320 GrRenderTarget* devRT = dev->accessRenderTarget(); 1302 GrRenderTarget* devRT = dev->accessRenderTarget();
1321 GrTexture* devTex; 1303 GrTexture* devTex;
1322 if (nullptr == (devTex = devRT->asTexture())) { 1304 if (nullptr == (devTex = devRT->asTexture())) {
1323 return; 1305 return;
1324 } 1306 }
1325 1307
1326 const SkImageInfo ii = dev->imageInfo(); 1308 const SkImageInfo ii = dev->imageInfo();
(...skipping 435 matching lines...) Expand 10 before | Expand all | Expand 10 after
1762 } 1744 }
1763 1745
1764 /////////////////////////////////////////////////////////////////////////////// 1746 ///////////////////////////////////////////////////////////////////////////////
1765 1747
1766 bool SkGpuDevice::onShouldDisableLCD(const SkPaint& paint) const { 1748 bool SkGpuDevice::onShouldDisableLCD(const SkPaint& paint) const {
1767 return GrTextContext::ShouldDisableLCD(paint); 1749 return GrTextContext::ShouldDisableLCD(paint);
1768 } 1750 }
1769 1751
1770 void SkGpuDevice::flush() { 1752 void SkGpuDevice::flush() {
1771 ASSERT_SINGLE_OWNER 1753 ASSERT_SINGLE_OWNER
1772 DO_DEFERRED_CLEAR();
1773 1754
1774 // Clear batch debugging output 1755 // Clear batch debugging output
1775 // TODO not exactly sure where this should live 1756 // TODO not exactly sure where this should live
1776 if (GR_BATCH_DEBUGGING_OUTPUT) { 1757 if (GR_BATCH_DEBUGGING_OUTPUT) {
1777 SkDebugf("%s\n", fContext->getAuditTrail()->toJson().c_str()); 1758 SkDebugf("%s\n", fContext->getAuditTrail()->toJson().c_str());
1778 // TODO This currently crashes because not all ops are accounted for 1759 // TODO This currently crashes because not all ops are accounted for
1779 GR_AUDIT_TRAIL_RESET(fContext->getAuditTrail()); 1760 GR_AUDIT_TRAIL_RESET(fContext->getAuditTrail());
1780 } 1761 }
1781 fRenderTarget->prepareForExternalIO(); 1762 fRenderTarget->prepareForExternalIO();
1782 } 1763 }
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
1900 } 1881 }
1901 1882
1902 SkImageFilter::Cache* SkGpuDevice::getImageFilterCache() { 1883 SkImageFilter::Cache* SkGpuDevice::getImageFilterCache() {
1903 ASSERT_SINGLE_OWNER 1884 ASSERT_SINGLE_OWNER
1904 // We always return a transient cache, so it is freed after each 1885 // We always return a transient cache, so it is freed after each
1905 // filter traversal. 1886 // filter traversal.
1906 return SkGpuDevice::NewImageFilterCache(); 1887 return SkGpuDevice::NewImageFilterCache();
1907 } 1888 }
1908 1889
1909 #endif 1890 #endif
OLDNEW
« no previous file with comments | « src/gpu/SkGpuDevice.h ('k') | src/gpu/batches/GrClearBatch.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698