blob: fbc04bf6a51b3911f0c7462c37fb47870cfc8acc [file] [log] [blame]
commit-bot@chromium.org78a10782013-08-21 19:27:48 +00001/*
2 * Copyright 2013 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
Mike Kleinc0bd9f92019-04-23 12:05:21 -05008#include "include/core/SkString.h"
9#include "include/gpu/GrBackendSurface.h"
10#include "include/gpu/GrContextOptions.h"
Robert Phillipsb7bfbc22020-07-01 12:55:01 -040011#include "include/gpu/GrRecordingContext.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050012#include "include/private/SkTo.h"
13#include "src/core/SkMathPriv.h"
14#include "src/gpu/GrClip.h"
Adlai Hollera0693042020-10-14 11:23:11 -040015#include "src/gpu/GrDirectContextPriv.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050016#include "src/gpu/GrDrawOpAtlas.h"
17#include "src/gpu/GrDrawingManager.h"
18#include "src/gpu/GrGpu.h"
19#include "src/gpu/GrGpuResourceCacheAccess.h"
20#include "src/gpu/GrMemoryPool.h"
21#include "src/gpu/GrRecordingContextPriv.h"
22#include "src/gpu/GrRenderTargetContext.h"
Greg Danielf91aeb22019-06-18 09:58:02 -040023#include "src/gpu/GrRenderTargetProxy.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050024#include "src/gpu/GrResourceCache.h"
25#include "src/gpu/GrSemaphore.h"
Greg Daniel456f9b52020-03-05 19:14:18 +000026#include "src/gpu/GrTexture.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050027#include "src/gpu/SkGr.h"
28#include "src/gpu/ccpr/GrCCPathCache.h"
29#include "src/gpu/ccpr/GrCoverageCountingPathRenderer.h"
30#include "src/gpu/ops/GrMeshDrawOp.h"
31#include "src/gpu/text/GrStrikeCache.h"
32#include "src/gpu/text/GrTextBlobCache.h"
33#include "src/image/SkImage_Gpu.h"
Hal Canary8a001442018-09-19 11:31:27 -040034
Hal Canaryc640d0d2018-06-13 09:59:02 -040035#include <algorithm>
joshualitte8042922015-12-11 06:11:21 -080036
bsalomonddf30e62015-02-19 11:38:44 -080037///////////////////////////////////////////////////////////////////////////////
38
39void GrResourceCache::changeTimestamp(uint32_t newTimestamp) { fTimestamp = newTimestamp; }
mtkleinb9eb4ac2015-02-02 18:26:03 -080040
Brian Salomon1090da62017-01-06 12:04:19 -050041#ifdef SK_DEBUG
42int GrResourceCache::countUniqueKeysWithTag(const char* tag) const {
43 int count = 0;
Mike Kleincff63962020-03-14 16:22:45 -050044 fUniqueHash.foreach([&](const GrGpuResource& resource){
45 if (0 == strcmp(tag, resource.getUniqueKey().tag())) {
Brian Salomon1090da62017-01-06 12:04:19 -050046 ++count;
47 }
Mike Kleincff63962020-03-14 16:22:45 -050048 });
Brian Salomon1090da62017-01-06 12:04:19 -050049 return count;
50}
51#endif
52
Brian Salomon17726632017-05-12 14:09:46 -040053//////////////////////////////////////////////////////////////////////////////
54
Chris Daltona2b5b642018-06-24 13:08:57 -060055void GrCoverageCountingPathRenderer::testingOnly_drawPathDirectly(const DrawPathArgs& args) {
56 // Call onDrawPath() directly: We want to test paths that might fail onCanDrawPath() simply for
57 // performance reasons, and GrPathRenderer::drawPath() assert that this call returns true.
58 // The test is responsible to not draw any paths that CCPR is not actually capable of.
59 this->onDrawPath(args);
60}
61
Chris Dalton351e80c2019-01-06 22:51:00 -070062const GrCCPerFlushResources*
63GrCoverageCountingPathRenderer::testingOnly_getCurrentFlushResources() {
64 SkASSERT(fFlushing);
65 if (fFlushingPaths.empty()) {
66 return nullptr;
67 }
68 // All pending paths should share the same resources.
69 const GrCCPerFlushResources* resources = fFlushingPaths.front()->fFlushResources.get();
70#ifdef SK_DEBUG
71 for (const auto& flushingPaths : fFlushingPaths) {
72 SkASSERT(flushingPaths->fFlushResources.get() == resources);
73 }
74#endif
75 return resources;
Chris Dalton4da70192018-06-18 09:51:36 -060076}
77
Chris Dalton351e80c2019-01-06 22:51:00 -070078const GrCCPathCache* GrCoverageCountingPathRenderer::testingOnly_getPathCache() const {
79 return fPathCache.get();
80}
81
82const GrTexture* GrCCPerFlushResources::testingOnly_frontCopyAtlasTexture() const {
83 if (fCopyAtlasStack.empty()) {
84 return nullptr;
85 }
86 const GrTextureProxy* proxy = fCopyAtlasStack.front().textureProxy();
87 return (proxy) ? proxy->peekTexture() : nullptr;
88}
89
90const GrTexture* GrCCPerFlushResources::testingOnly_frontRenderedAtlasTexture() const {
91 if (fRenderedAtlasStack.empty()) {
92 return nullptr;
93 }
94 const GrTextureProxy* proxy = fRenderedAtlasStack.front().textureProxy();
95 return (proxy) ? proxy->peekTexture() : nullptr;
96}
97
98const SkTHashTable<GrCCPathCache::HashNode, const GrCCPathCache::Key&>&
99GrCCPathCache::testingOnly_getHashTable() const {
100 return fHashTable;
101}
102
103const SkTInternalLList<GrCCPathCacheEntry>& GrCCPathCache::testingOnly_getLRU() const {
104 return fLRU;
105}
106
107int GrCCPathCacheEntry::testingOnly_peekOnFlushRefCnt() const { return fOnFlushRefCnt; }
108
109int GrCCCachedAtlas::testingOnly_peekOnFlushRefCnt() const { return fOnFlushRefCnt; }
110
Chris Dalton4da70192018-06-18 09:51:36 -0600111//////////////////////////////////////////////////////////////////////////////
112
Brian Salomon17726632017-05-12 14:09:46 -0400113#define DRAW_OP_TEST_EXTERN(Op) \
Herb Derbyc76d4092020-10-07 16:46:15 -0400114 extern GrOp::Owner Op##__Test(GrPaint&&, SkRandom*, \
115 GrRecordingContext*, int numSamples)
Brian Salomon17726632017-05-12 14:09:46 -0400116#define DRAW_OP_TEST_ENTRY(Op) Op##__Test
117
Brian Salomon10978a62017-06-15 16:21:49 -0400118DRAW_OP_TEST_EXTERN(AAConvexPathOp);
Brian Salomonb2955732017-07-13 16:42:55 -0400119DRAW_OP_TEST_EXTERN(AAFlatteningConvexPathOp);
Brian Salomona531f252017-07-07 13:29:28 -0400120DRAW_OP_TEST_EXTERN(AAHairlineOp);
Brian Salomonbaaf4392017-06-15 09:59:23 -0400121DRAW_OP_TEST_EXTERN(AAStrokeRectOp);
Brian Salomon815486c2017-07-11 08:52:13 -0400122DRAW_OP_TEST_EXTERN(CircleOp);
Brian Salomon98222ac2017-07-12 15:27:54 -0400123DRAW_OP_TEST_EXTERN(DashOp);
Brian Salomonee3e0ba2017-07-13 16:40:46 -0400124DRAW_OP_TEST_EXTERN(DefaultPathOp);
Brian Salomon05441c42017-05-15 16:45:49 -0400125DRAW_OP_TEST_EXTERN(DIEllipseOp);
126DRAW_OP_TEST_EXTERN(EllipseOp);
Michael Ludwig69858532018-11-28 15:34:34 -0500127DRAW_OP_TEST_EXTERN(FillRectOp);
Brian Salomon44acb5b2017-07-18 19:59:24 -0400128DRAW_OP_TEST_EXTERN(GrAtlasTextOp);
Brian Osman4d92b892019-03-24 00:53:23 +0000129DRAW_OP_TEST_EXTERN(DrawAtlasOp);
Robert Phillipsb6e9d3c2019-02-11 14:29:34 -0500130DRAW_OP_TEST_EXTERN(DrawVerticesOp);
Brian Salomon815486c2017-07-11 08:52:13 -0400131DRAW_OP_TEST_EXTERN(NonAALatticeOp);
Brian Salomonbaaf4392017-06-15 09:59:23 -0400132DRAW_OP_TEST_EXTERN(NonAAStrokeRectOp);
Brian Salomon05969092017-07-13 11:20:51 -0400133DRAW_OP_TEST_EXTERN(ShadowRRectOp);
Brian Salomonfebbd232017-07-11 15:52:02 -0400134DRAW_OP_TEST_EXTERN(SmallPathOp);
Brian Salomonf0366322017-07-11 15:53:05 -0400135DRAW_OP_TEST_EXTERN(RegionOp);
Brian Salomon05441c42017-05-15 16:45:49 -0400136DRAW_OP_TEST_EXTERN(RRectOp);
Chris Dalton17dc4182020-03-25 16:18:16 -0600137DRAW_OP_TEST_EXTERN(TriangulatingPathOp);
Brian Salomon34169692017-08-28 15:32:01 -0400138DRAW_OP_TEST_EXTERN(TextureOp);
Brian Salomon17726632017-05-12 14:09:46 -0400139
140void GrDrawRandomOp(SkRandom* random, GrRenderTargetContext* renderTargetContext, GrPaint&& paint) {
Brian Salomon70fe17e2020-11-30 14:33:58 -0500141 auto context = renderTargetContext->recordingContext();
Herb Derbyc76d4092020-10-07 16:46:15 -0400142 using MakeDrawOpFn = GrOp::Owner (GrPaint&&, SkRandom*,
143 GrRecordingContext*, int numSamples);
Brian Salomon17726632017-05-12 14:09:46 -0400144 static constexpr MakeDrawOpFn* gFactories[] = {
Brian Salomon34169692017-08-28 15:32:01 -0400145 DRAW_OP_TEST_ENTRY(AAConvexPathOp),
Brian Salomon34169692017-08-28 15:32:01 -0400146 DRAW_OP_TEST_ENTRY(AAFlatteningConvexPathOp),
147 DRAW_OP_TEST_ENTRY(AAHairlineOp),
148 DRAW_OP_TEST_ENTRY(AAStrokeRectOp),
149 DRAW_OP_TEST_ENTRY(CircleOp),
150 DRAW_OP_TEST_ENTRY(DashOp),
151 DRAW_OP_TEST_ENTRY(DefaultPathOp),
152 DRAW_OP_TEST_ENTRY(DIEllipseOp),
153 DRAW_OP_TEST_ENTRY(EllipseOp),
Michael Ludwig69858532018-11-28 15:34:34 -0500154 DRAW_OP_TEST_ENTRY(FillRectOp),
Brian Salomon34169692017-08-28 15:32:01 -0400155 DRAW_OP_TEST_ENTRY(GrAtlasTextOp),
Brian Osman4d92b892019-03-24 00:53:23 +0000156 DRAW_OP_TEST_ENTRY(DrawAtlasOp),
Robert Phillipsb6e9d3c2019-02-11 14:29:34 -0500157 DRAW_OP_TEST_ENTRY(DrawVerticesOp),
Brian Salomon34169692017-08-28 15:32:01 -0400158 DRAW_OP_TEST_ENTRY(NonAALatticeOp),
159 DRAW_OP_TEST_ENTRY(NonAAStrokeRectOp),
160 DRAW_OP_TEST_ENTRY(ShadowRRectOp),
161 DRAW_OP_TEST_ENTRY(SmallPathOp),
162 DRAW_OP_TEST_ENTRY(RegionOp),
163 DRAW_OP_TEST_ENTRY(RRectOp),
Chris Dalton17dc4182020-03-25 16:18:16 -0600164 DRAW_OP_TEST_ENTRY(TriangulatingPathOp),
Brian Salomon34169692017-08-28 15:32:01 -0400165 DRAW_OP_TEST_ENTRY(TextureOp),
Brian Salomon17726632017-05-12 14:09:46 -0400166 };
167
Brian Salomonfc26f3c2017-07-14 15:27:56 -0400168 static constexpr size_t kTotal = SK_ARRAY_COUNT(gFactories);
Brian Salomon17726632017-05-12 14:09:46 -0400169 uint32_t index = random->nextULessThan(static_cast<uint32_t>(kTotal));
Brian Salomonfc26f3c2017-07-14 15:27:56 -0400170 auto op = gFactories[index](
Chris Dalton6ce447a2019-06-23 18:07:38 -0600171 std::move(paint), random, context, renderTargetContext->numSamples());
Herb Derby411e7aa2020-07-09 16:02:08 -0400172
173 // Creating a GrAtlasTextOp my not produce an op if for example, it is totally outside the
174 // render target context.
Ben Wagner525e8762020-07-09 16:19:35 -0400175 if (op) {
Brian Salomon70fe17e2020-11-30 14:33:58 -0500176 renderTargetContext->addDrawOp(std::move(op));
Ben Wagner525e8762020-07-09 16:19:35 -0400177 }
Brian Salomon17726632017-05-12 14:09:46 -0400178}