blob: 524cd634fe5ac59a272049099367d7a9e3cf8399 [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
8#include "GrTest.h"
Brian Salomon17726632017-05-12 14:09:46 -04009#include <algorithm>
Greg Daniel7ef28f32017-04-20 16:41:55 +000010#include "GrBackendSurface.h"
bsalomon682c2692015-05-22 14:01:46 -070011#include "GrContextOptions.h"
Chris Daltonfe199b72017-05-05 11:26:15 -040012#include "GrContextPriv.h"
Brian Salomon2ee084e2016-12-16 18:59:19 -050013#include "GrDrawOpAtlas.h"
robertphillips77a2e522015-10-17 07:43:27 -070014#include "GrDrawingManager.h"
Robert Phillipsfbcef6e2017-06-15 12:07:18 -040015#include "GrGpu.h"
bsalomon3582d3e2015-02-13 14:20:05 -080016#include "GrGpuResourceCacheAccess.h"
Brian Salomon17726632017-05-12 14:09:46 -040017#include "GrRenderTargetContext.h"
Brian Salomon2ee084e2016-12-16 18:59:19 -050018#include "GrRenderTargetContextPriv.h"
csmartdaltonf9635992016-08-10 11:09:07 -070019#include "GrRenderTargetProxy.h"
bsalomon0ea80f42015-02-11 10:49:59 -080020#include "GrResourceCache.h"
Greg Daniel6be35232017-03-01 17:01:09 -050021#include "GrSemaphore.h"
Brian Salomon17726632017-05-12 14:09:46 -040022#include "GrSurfaceContextPriv.h"
Robert Phillips646e4292017-06-13 12:44:56 -040023#include "GrTexture.h"
Brian Osman3b655982017-03-07 16:58:08 -050024#include "SkGr.h"
Robert Phillips22f4a1f2016-12-20 08:57:26 -050025#include "SkImage_Gpu.h"
halcanary4dbbd042016-06-07 17:21:10 -070026#include "SkMathPriv.h"
mtkleinb9eb4ac2015-02-02 18:26:03 -080027#include "SkString.h"
Brian Salomon17726632017-05-12 14:09:46 -040028#include "ops/GrMeshDrawOp.h"
Brian Salomonf856fd12016-12-16 14:24:34 -050029#include "text/GrAtlasGlyphCache.h"
joshualitte8042922015-12-11 06:11:21 -080030#include "text/GrTextBlobCache.h"
31
joshualitt7f9c9eb2015-08-21 11:08:00 -070032namespace GrTest {
Brian Salomond17f6582017-07-19 18:28:58 -040033
joshualitt7f9c9eb2015-08-21 11:08:00 -070034void SetupAlwaysEvictAtlas(GrContext* context) {
35 // These sizes were selected because they allow each atlas to hold a single plot and will thus
36 // stress the atlas
Brian Salomon2ee084e2016-12-16 18:59:19 -050037 int dim = GrDrawOpAtlas::kGlyphMaxDim;
38 GrDrawOpAtlasConfig configs[3];
joshualitt7f9c9eb2015-08-21 11:08:00 -070039 configs[kA8_GrMaskFormat].fWidth = dim;
40 configs[kA8_GrMaskFormat].fHeight = dim;
41 configs[kA8_GrMaskFormat].fPlotWidth = dim;
42 configs[kA8_GrMaskFormat].fPlotHeight = dim;
43
44 configs[kA565_GrMaskFormat].fWidth = dim;
45 configs[kA565_GrMaskFormat].fHeight = dim;
46 configs[kA565_GrMaskFormat].fPlotWidth = dim;
47 configs[kA565_GrMaskFormat].fPlotHeight = dim;
48
49 configs[kARGB_GrMaskFormat].fWidth = dim;
50 configs[kARGB_GrMaskFormat].fHeight = dim;
51 configs[kARGB_GrMaskFormat].fPlotWidth = dim;
52 configs[kARGB_GrMaskFormat].fPlotHeight = dim;
53
54 context->setTextContextAtlasSizes_ForTesting(configs);
55}
Greg Daniel7ef28f32017-04-20 16:41:55 +000056
57GrBackendTexture CreateBackendTexture(GrBackend backend, int width, int height,
Greg Daniel177e6952017-10-12 12:27:11 -040058 GrPixelConfig config, GrMipMapped mipMapped,
59 GrBackendObject handle) {
Brian Salomond17f6582017-07-19 18:28:58 -040060 switch (backend) {
Mike Reedd20b5c42017-06-14 06:03:10 -040061#ifdef SK_VULKAN
Brian Salomond17f6582017-07-19 18:28:58 -040062 case kVulkan_GrBackend: {
63 GrVkImageInfo* vkInfo = (GrVkImageInfo*)(handle);
Greg Daniel177e6952017-10-12 12:27:11 -040064 SkASSERT((GrMipMapped::kYes == mipMapped) == (vkInfo->fLevelCount > 1));
Brian Salomond17f6582017-07-19 18:28:58 -040065 return GrBackendTexture(width, height, *vkInfo);
66 }
Robert Phillipsfcd5fdd2017-06-14 01:43:29 +000067#endif
Brian Salomond17f6582017-07-19 18:28:58 -040068 case kOpenGL_GrBackend: {
69 GrGLTextureInfo* glInfo = (GrGLTextureInfo*)(handle);
Greg Daniel177e6952017-10-12 12:27:11 -040070 return GrBackendTexture(width, height, config, mipMapped, *glInfo);
Brian Salomond17f6582017-07-19 18:28:58 -040071 }
72 case kMock_GrBackend: {
73 GrMockTextureInfo* mockInfo = (GrMockTextureInfo*)(handle);
Greg Daniel177e6952017-10-12 12:27:11 -040074 return GrBackendTexture(width, height, config, mipMapped, *mockInfo);
Brian Salomond17f6582017-07-19 18:28:58 -040075 }
76 default:
77 return GrBackendTexture();
78 }
Greg Daniel7ef28f32017-04-20 16:41:55 +000079}
Brian Salomond17f6582017-07-19 18:28:58 -040080
Robert Phillips57e08282017-11-16 14:59:48 -050081GrBackendRenderTarget CreateBackendRenderTarget(GrBackend backend, int width, int height,
82 int sampleCnt, int stencilBits,
83 GrPixelConfig config,
84 GrBackendObject handle) {
85 switch (backend) {
86#ifdef SK_VULKAN
87 case kVulkan_GrBackend: {
88 GrVkImageInfo* vkInfo = (GrVkImageInfo*)(handle);
89 return GrBackendRenderTarget(width, height, sampleCnt, stencilBits, *vkInfo);
90 }
91#endif
92 case kOpenGL_GrBackend: {
Robert Phillips7f1b4f82017-11-28 07:38:39 -050093 GrGLFramebufferInfo glInfo;
94 glInfo.fFBOID = handle;
95 return GrBackendRenderTarget(width, height, sampleCnt, stencilBits, config, glInfo);
Robert Phillips57e08282017-11-16 14:59:48 -050096 }
97 case kMock_GrBackend: // fall through
98 default:
99 return GrBackendRenderTarget();
100 }
101}
102
Brian Salomond17f6582017-07-19 18:28:58 -0400103} // namespace GrTest
joshualitt7f9c9eb2015-08-21 11:08:00 -0700104
Robert Phillipseaa86252016-11-08 13:49:39 +0000105bool GrSurfaceProxy::isWrapped_ForTesting() const {
106 return SkToBool(fTarget);
107}
108
109bool GrRenderTargetContext::isWrapped_ForTesting() const {
110 return fRenderTargetProxy->isWrapped_ForTesting();
111}
112
joshualitt17d833b2015-08-03 10:17:44 -0700113void GrContext::setTextBlobCacheLimit_ForTesting(size_t bytes) {
114 fTextBlobCache->setBudget(bytes);
115}
116
Brian Salomon2ee084e2016-12-16 18:59:19 -0500117void GrContext::setTextContextAtlasSizes_ForTesting(const GrDrawOpAtlasConfig* configs) {
Brian Salomonf856fd12016-12-16 14:24:34 -0500118 fAtlasGlyphCache->setAtlasSizes_ForTesting(configs);
joshualittda04e0e2015-08-19 08:16:43 -0700119}
120
commit-bot@chromium.org78a10782013-08-21 19:27:48 +0000121///////////////////////////////////////////////////////////////////////////////
122
robertphillips@google.com94d8f1e2013-12-18 17:25:33 +0000123void GrContext::purgeAllUnlockedResources() {
bsalomon0ea80f42015-02-11 10:49:59 -0800124 fResourceCache->purgeAllUnlocked();
robertphillips@google.com94d8f1e2013-12-18 17:25:33 +0000125}
bsalomon33435572014-11-05 14:47:41 -0800126
joshualitte45c81c2015-12-02 09:05:37 -0800127void GrContext::resetGpuStats() const {
128#if GR_GPU_STATS
129 fGpu->stats()->reset();
130#endif
131}
132
mtkleinb9eb4ac2015-02-02 18:26:03 -0800133void GrContext::dumpCacheStats(SkString* out) const {
134#if GR_CACHE_STATS
bsalomon0ea80f42015-02-11 10:49:59 -0800135 fResourceCache->dumpStats(out);
mtkleinb9eb4ac2015-02-02 18:26:03 -0800136#endif
137}
138
joshualittdc5685a2015-12-02 14:08:25 -0800139void GrContext::dumpCacheStatsKeyValuePairs(SkTArray<SkString>* keys,
140 SkTArray<double>* values) const {
141#if GR_CACHE_STATS
142 fResourceCache->dumpStatsKeyValuePairs(keys, values);
143#endif
144}
145
mtkleinb9eb4ac2015-02-02 18:26:03 -0800146void GrContext::printCacheStats() const {
147 SkString out;
148 this->dumpCacheStats(&out);
kkinnunen297aaf92015-02-19 06:32:12 -0800149 SkDebugf("%s", out.c_str());
mtkleinb9eb4ac2015-02-02 18:26:03 -0800150}
151
152void GrContext::dumpGpuStats(SkString* out) const {
153#if GR_GPU_STATS
154 return fGpu->stats()->dump(out);
155#endif
156}
157
joshualitte45c81c2015-12-02 09:05:37 -0800158void GrContext::dumpGpuStatsKeyValuePairs(SkTArray<SkString>* keys,
159 SkTArray<double>* values) const {
160#if GR_GPU_STATS
161 return fGpu->stats()->dumpKeyValuePairs(keys, values);
162#endif
163}
164
mtkleinb9eb4ac2015-02-02 18:26:03 -0800165void GrContext::printGpuStats() const {
166 SkString out;
167 this->dumpGpuStats(&out);
kkinnunen297aaf92015-02-19 06:32:12 -0800168 SkDebugf("%s", out.c_str());
mtkleinb9eb4ac2015-02-02 18:26:03 -0800169}
170
Robert Phillipsc37e6142017-01-20 10:03:25 -0500171sk_sp<SkImage> GrContext::getFontAtlasImage_ForTesting(GrMaskFormat format) {
Brian Salomonf856fd12016-12-16 14:24:34 -0500172 GrAtlasGlyphCache* cache = this->getAtlasGlyphCache();
jvanverth629162d2015-11-08 08:07:24 -0800173
Jim Van Vertha950b632017-09-12 11:54:11 -0400174 const sk_sp<GrTextureProxy>* proxies = cache->getProxies(format);
175 if (!proxies[0]) {
Robert Phillips32f28182017-02-28 16:20:03 -0500176 return nullptr;
177 }
178
Jim Van Vertha950b632017-09-12 11:54:11 -0400179 SkASSERT(proxies[0]->priv().isExact());
Robert Phillipsb726d582017-03-09 16:36:32 -0500180 sk_sp<SkImage> image(new SkImage_Gpu(this, kNeedNewImageUniqueID, kPremul_SkAlphaType,
Jim Van Vertha950b632017-09-12 11:54:11 -0400181 std::move(proxies[0]), nullptr, SkBudgeted::kNo));
Robert Phillips22f4a1f2016-12-20 08:57:26 -0500182 return image;
jvanverth0671b962015-12-08 18:53:44 -0800183}
jvanverth629162d2015-11-08 08:07:24 -0800184
mtkleinb9eb4ac2015-02-02 18:26:03 -0800185#if GR_GPU_STATS
186void GrGpu::Stats::dump(SkString* out) {
187 out->appendf("Render Target Binds: %d\n", fRenderTargetBinds);
188 out->appendf("Shader Compilations: %d\n", fShaderCompilations);
bsalomonb12ea412015-02-02 21:19:50 -0800189 out->appendf("Textures Created: %d\n", fTextureCreates);
190 out->appendf("Texture Uploads: %d\n", fTextureUploads);
jvanverth17aa0472016-01-05 10:41:27 -0800191 out->appendf("Transfers to Texture: %d\n", fTransfersToTexture);
egdaniel8dc7c3a2015-04-16 11:22:42 -0700192 out->appendf("Stencil Buffer Creates: %d\n", fStencilAttachmentCreates);
joshualitt87a5c9f2015-09-08 13:42:05 -0700193 out->appendf("Number of draws: %d\n", fNumDraws);
mtkleinb9eb4ac2015-02-02 18:26:03 -0800194}
joshualitte45c81c2015-12-02 09:05:37 -0800195
196void GrGpu::Stats::dumpKeyValuePairs(SkTArray<SkString>* keys, SkTArray<double>* values) {
197 keys->push_back(SkString("render_target_binds")); values->push_back(fRenderTargetBinds);
198 keys->push_back(SkString("shader_compilations")); values->push_back(fShaderCompilations);
joshualitte45c81c2015-12-02 09:05:37 -0800199 keys->push_back(SkString("texture_uploads")); values->push_back(fTextureUploads);
joshualitte45c81c2015-12-02 09:05:37 -0800200 keys->push_back(SkString("number_of_draws")); values->push_back(fNumDraws);
bsalomon1d417a82016-03-23 11:50:26 -0700201 keys->push_back(SkString("number_of_failed_draws")); values->push_back(fNumFailedDraws);
joshualitte45c81c2015-12-02 09:05:37 -0800202}
203
mtkleinb9eb4ac2015-02-02 18:26:03 -0800204#endif
205
206#if GR_CACHE_STATS
robertphillips60029a52015-11-09 13:51:06 -0800207void GrResourceCache::getStats(Stats* stats) const {
208 stats->reset();
209
210 stats->fTotal = this->getResourceCount();
211 stats->fNumNonPurgeable = fNonpurgeableResources.count();
212 stats->fNumPurgeable = fPurgeableQueue.count();
213
214 for (int i = 0; i < fNonpurgeableResources.count(); ++i) {
215 stats->update(fNonpurgeableResources[i]);
216 }
217 for (int i = 0; i < fPurgeableQueue.count(); ++i) {
218 stats->update(fPurgeableQueue.at(i));
219 }
220}
221
bsalomon0ea80f42015-02-11 10:49:59 -0800222void GrResourceCache::dumpStats(SkString* out) const {
mtkleinb9eb4ac2015-02-02 18:26:03 -0800223 this->validate();
224
bsalomonf320e042015-02-17 15:09:34 -0800225 Stats stats;
226
robertphillips60029a52015-11-09 13:51:06 -0800227 this->getStats(&stats);
mtkleinb9eb4ac2015-02-02 18:26:03 -0800228
229 float countUtilization = (100.f * fBudgetedCount) / fMaxCount;
230 float byteUtilization = (100.f * fBudgetedBytes) / fMaxBytes;
231
232 out->appendf("Budget: %d items %d bytes\n", fMaxCount, (int)fMaxBytes);
233 out->appendf("\t\tEntry Count: current %d"
kkinnunen2e6055b2016-04-22 01:48:29 -0700234 " (%d budgeted, %d wrapped, %d locked, %d scratch %.2g%% full), high %d\n",
235 stats.fTotal, fBudgetedCount, stats.fWrapped, stats.fNumNonPurgeable,
236 stats.fScratch, countUtilization, fHighWaterCount);
mtkleinb9eb4ac2015-02-02 18:26:03 -0800237 out->appendf("\t\tEntry Bytes: current %d (budgeted %d, %.2g%% full, %d unbudgeted) high %d\n",
bsalomonf320e042015-02-17 15:09:34 -0800238 SkToInt(fBytes), SkToInt(fBudgetedBytes), byteUtilization,
239 SkToInt(stats.fUnbudgetedSize), SkToInt(fHighWaterBytes));
mtkleinb9eb4ac2015-02-02 18:26:03 -0800240}
241
joshualittdc5685a2015-12-02 14:08:25 -0800242void GrResourceCache::dumpStatsKeyValuePairs(SkTArray<SkString>* keys,
243 SkTArray<double>* values) const {
244 this->validate();
245
246 Stats stats;
247 this->getStats(&stats);
248
joshualittdc5685a2015-12-02 14:08:25 -0800249 keys->push_back(SkString("gpu_cache_purgable_entries")); values->push_back(stats.fNumPurgeable);
joshualittdc5685a2015-12-02 14:08:25 -0800250}
251
mtkleinb9eb4ac2015-02-02 18:26:03 -0800252#endif
253
bsalomonddf30e62015-02-19 11:38:44 -0800254///////////////////////////////////////////////////////////////////////////////
255
256void GrResourceCache::changeTimestamp(uint32_t newTimestamp) { fTimestamp = newTimestamp; }
mtkleinb9eb4ac2015-02-02 18:26:03 -0800257
Brian Salomon1090da62017-01-06 12:04:19 -0500258#ifdef SK_DEBUG
259int GrResourceCache::countUniqueKeysWithTag(const char* tag) const {
260 int count = 0;
261 UniqueHash::ConstIter iter(&fUniqueHash);
262 while (!iter.done()) {
263 if (0 == strcmp(tag, (*iter).getUniqueKey().tag())) {
264 ++count;
265 }
266 ++iter;
267 }
268 return count;
269}
270#endif
271
bsalomon33435572014-11-05 14:47:41 -0800272///////////////////////////////////////////////////////////////////////////////
joshualittf5883a62016-01-13 07:47:38 -0800273
274#define ASSERT_SINGLE_OWNER \
Robert Phillipsa90aa2b2017-04-10 08:19:26 -0400275 SkDEBUGCODE(GrSingleOwner::AutoEnforce debug_SingleOwner(fRenderTargetContext->singleOwner());)
joshualittf5883a62016-01-13 07:47:38 -0800276
Chris Dalton706a6ff2017-11-29 22:01:06 -0700277
Brian Salomonac70f842017-05-08 10:43:33 -0400278uint32_t GrRenderTargetContextPriv::testingOnly_addDrawOp(std::unique_ptr<GrDrawOp> op) {
Chris Dalton706a6ff2017-11-29 22:01:06 -0700279 return this->testingOnly_addDrawOp(GrNoClip(), std::move(op));
280}
281
282uint32_t GrRenderTargetContextPriv::testingOnly_addDrawOp(const GrClip& clip,
283 std::unique_ptr<GrDrawOp> op) {
Brian Salomonac70f842017-05-08 10:43:33 -0400284 ASSERT_SINGLE_OWNER
285 if (fRenderTargetContext->drawingManager()->wasAbandoned()) {
286 return SK_InvalidUniqueID;
287 }
288 SkDEBUGCODE(fRenderTargetContext->validate());
289 GR_AUDIT_TRAIL_AUTO_FRAME(fRenderTargetContext->fAuditTrail,
290 "GrRenderTargetContext::testingOnly_addDrawOp");
Chris Dalton706a6ff2017-11-29 22:01:06 -0700291 return fRenderTargetContext->addDrawOp(clip, std::move(op));
Brian Salomonac70f842017-05-08 10:43:33 -0400292}
293
joshualittf5883a62016-01-13 07:47:38 -0800294#undef ASSERT_SINGLE_OWNER
joshualittf5883a62016-01-13 07:47:38 -0800295
296///////////////////////////////////////////////////////////////////////////////
csmartdaltonf9635992016-08-10 11:09:07 -0700297
Robert Phillipsc4f0a822017-06-13 08:11:36 -0400298GrRenderTargetFlags GrRenderTargetProxy::testingOnly_getFlags() const {
Brian Salomondac5f6b2017-02-28 16:11:04 -0500299 return fRenderTargetFlags;
csmartdaltonf9635992016-08-10 11:09:07 -0700300}
301
Brian Salomon17726632017-05-12 14:09:46 -0400302//////////////////////////////////////////////////////////////////////////////
303
Chris Daltonfe199b72017-05-05 11:26:15 -0400304void GrContextPriv::testingOnly_flushAndRemoveOnFlushCallbackObject(GrOnFlushCallbackObject* cb) {
305 fContext->flush();
306 fContext->fDrawingManager->testingOnly_removeOnFlushCallbackObject(cb);
307}
308
309void GrDrawingManager::testingOnly_removeOnFlushCallbackObject(GrOnFlushCallbackObject* cb) {
310 int n = std::find(fOnFlushCBObjects.begin(), fOnFlushCBObjects.end(), cb) -
311 fOnFlushCBObjects.begin();
312 SkASSERT(n < fOnFlushCBObjects.count());
313 fOnFlushCBObjects.removeShuffle(n);
314}
Brian Salomon17726632017-05-12 14:09:46 -0400315
316//////////////////////////////////////////////////////////////////////////////
317
318#define DRAW_OP_TEST_EXTERN(Op) \
Brian Salomon815486c2017-07-11 08:52:13 -0400319 extern std::unique_ptr<GrDrawOp> Op##__Test(GrPaint&&, SkRandom*, GrContext*, GrFSAAType)
Brian Salomon17726632017-05-12 14:09:46 -0400320#define DRAW_OP_TEST_ENTRY(Op) Op##__Test
321
Brian Salomon10978a62017-06-15 16:21:49 -0400322DRAW_OP_TEST_EXTERN(AAConvexPathOp);
Brian Salomon815486c2017-07-11 08:52:13 -0400323DRAW_OP_TEST_EXTERN(AAFillRectOp);
Brian Salomonb2955732017-07-13 16:42:55 -0400324DRAW_OP_TEST_EXTERN(AAFlatteningConvexPathOp);
Brian Salomona531f252017-07-07 13:29:28 -0400325DRAW_OP_TEST_EXTERN(AAHairlineOp);
Brian Salomonbaaf4392017-06-15 09:59:23 -0400326DRAW_OP_TEST_EXTERN(AAStrokeRectOp);
Brian Salomon815486c2017-07-11 08:52:13 -0400327DRAW_OP_TEST_EXTERN(CircleOp);
Brian Salomon98222ac2017-07-12 15:27:54 -0400328DRAW_OP_TEST_EXTERN(DashOp);
Brian Salomonee3e0ba2017-07-13 16:40:46 -0400329DRAW_OP_TEST_EXTERN(DefaultPathOp);
Brian Salomon05441c42017-05-15 16:45:49 -0400330DRAW_OP_TEST_EXTERN(DIEllipseOp);
331DRAW_OP_TEST_EXTERN(EllipseOp);
Brian Salomon44acb5b2017-07-18 19:59:24 -0400332DRAW_OP_TEST_EXTERN(GrAtlasTextOp);
Brian Salomon0088f942017-07-12 11:51:27 -0400333DRAW_OP_TEST_EXTERN(GrDrawAtlasOp);
Brian Salomonc2f42542017-07-12 14:11:22 -0400334DRAW_OP_TEST_EXTERN(GrDrawVerticesOp);
Brian Salomon815486c2017-07-11 08:52:13 -0400335DRAW_OP_TEST_EXTERN(NonAAFillRectOp);
336DRAW_OP_TEST_EXTERN(NonAALatticeOp);
Brian Salomonbaaf4392017-06-15 09:59:23 -0400337DRAW_OP_TEST_EXTERN(NonAAStrokeRectOp);
Brian Salomon05969092017-07-13 11:20:51 -0400338DRAW_OP_TEST_EXTERN(ShadowRRectOp);
Brian Salomonfebbd232017-07-11 15:52:02 -0400339DRAW_OP_TEST_EXTERN(SmallPathOp);
Brian Salomonf0366322017-07-11 15:53:05 -0400340DRAW_OP_TEST_EXTERN(RegionOp);
Brian Salomon05441c42017-05-15 16:45:49 -0400341DRAW_OP_TEST_EXTERN(RRectOp);
Brian Salomon9530f7e2017-07-11 09:03:10 -0400342DRAW_OP_TEST_EXTERN(TesselatingPathOp);
Brian Salomon34169692017-08-28 15:32:01 -0400343DRAW_OP_TEST_EXTERN(TextureOp);
Brian Salomon17726632017-05-12 14:09:46 -0400344
345void GrDrawRandomOp(SkRandom* random, GrRenderTargetContext* renderTargetContext, GrPaint&& paint) {
346 GrContext* context = renderTargetContext->surfPriv().getContext();
Brian Salomon17726632017-05-12 14:09:46 -0400347 using MakeDrawOpFn = std::unique_ptr<GrDrawOp>(GrPaint&&, SkRandom*, GrContext*, GrFSAAType);
348 static constexpr MakeDrawOpFn* gFactories[] = {
Brian Salomon34169692017-08-28 15:32:01 -0400349 DRAW_OP_TEST_ENTRY(AAConvexPathOp),
350 DRAW_OP_TEST_ENTRY(AAFillRectOp),
351 DRAW_OP_TEST_ENTRY(AAFlatteningConvexPathOp),
352 DRAW_OP_TEST_ENTRY(AAHairlineOp),
353 DRAW_OP_TEST_ENTRY(AAStrokeRectOp),
354 DRAW_OP_TEST_ENTRY(CircleOp),
355 DRAW_OP_TEST_ENTRY(DashOp),
356 DRAW_OP_TEST_ENTRY(DefaultPathOp),
357 DRAW_OP_TEST_ENTRY(DIEllipseOp),
358 DRAW_OP_TEST_ENTRY(EllipseOp),
359 DRAW_OP_TEST_ENTRY(GrAtlasTextOp),
360 DRAW_OP_TEST_ENTRY(GrDrawAtlasOp),
361 DRAW_OP_TEST_ENTRY(GrDrawVerticesOp),
362 DRAW_OP_TEST_ENTRY(NonAAFillRectOp),
363 DRAW_OP_TEST_ENTRY(NonAALatticeOp),
364 DRAW_OP_TEST_ENTRY(NonAAStrokeRectOp),
365 DRAW_OP_TEST_ENTRY(ShadowRRectOp),
366 DRAW_OP_TEST_ENTRY(SmallPathOp),
367 DRAW_OP_TEST_ENTRY(RegionOp),
368 DRAW_OP_TEST_ENTRY(RRectOp),
369 DRAW_OP_TEST_ENTRY(TesselatingPathOp),
370 DRAW_OP_TEST_ENTRY(TextureOp),
Brian Salomon17726632017-05-12 14:09:46 -0400371 };
372
Brian Salomonfc26f3c2017-07-14 15:27:56 -0400373 static constexpr size_t kTotal = SK_ARRAY_COUNT(gFactories);
Brian Salomon17726632017-05-12 14:09:46 -0400374 uint32_t index = random->nextULessThan(static_cast<uint32_t>(kTotal));
Brian Salomonfc26f3c2017-07-14 15:27:56 -0400375 auto op = gFactories[index](
376 std::move(paint), random, context, renderTargetContext->fsaaType());
377 SkASSERT(op);
378 renderTargetContext->priv().testingOnly_addDrawOp(std::move(op));
Brian Salomon17726632017-05-12 14:09:46 -0400379}