blob: 00abd957e0658556dbcac8927fbde3361ce98dee [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
Greg Daniel7ef28f32017-04-20 16:41:55 +00008#include "GrBackendSurface.h"
bsalomon682c2692015-05-22 14:01:46 -07009#include "GrContextOptions.h"
Chris Daltonfe199b72017-05-05 11:26:15 -040010#include "GrContextPriv.h"
Brian Salomon2ee084e2016-12-16 18:59:19 -050011#include "GrDrawOpAtlas.h"
robertphillips77a2e522015-10-17 07:43:27 -070012#include "GrDrawingManager.h"
Robert Phillipsfbcef6e2017-06-15 12:07:18 -040013#include "GrGpu.h"
bsalomon3582d3e2015-02-13 14:20:05 -080014#include "GrGpuResourceCacheAccess.h"
Brian Salomon17726632017-05-12 14:09:46 -040015#include "GrRenderTargetContext.h"
Brian Salomon2ee084e2016-12-16 18:59:19 -050016#include "GrRenderTargetContextPriv.h"
csmartdaltonf9635992016-08-10 11:09:07 -070017#include "GrRenderTargetProxy.h"
bsalomon0ea80f42015-02-11 10:49:59 -080018#include "GrResourceCache.h"
Greg Daniel6be35232017-03-01 17:01:09 -050019#include "GrSemaphore.h"
Brian Salomon17726632017-05-12 14:09:46 -040020#include "GrSurfaceContextPriv.h"
Hal Canaryc640d0d2018-06-13 09:59:02 -040021#include "GrTest.h"
Robert Phillips646e4292017-06-13 12:44:56 -040022#include "GrTexture.h"
Brian Osman3b655982017-03-07 16:58:08 -050023#include "SkGr.h"
Robert Phillips22f4a1f2016-12-20 08:57:26 -050024#include "SkImage_Gpu.h"
halcanary4dbbd042016-06-07 17:21:10 -070025#include "SkMathPriv.h"
mtkleinb9eb4ac2015-02-02 18:26:03 -080026#include "SkString.h"
Hal Canaryc640d0d2018-06-13 09:59:02 -040027#include "SkTo.h"
Brian Salomon17726632017-05-12 14:09:46 -040028#include "ops/GrMeshDrawOp.h"
Robert Phillipsc4039ea2018-03-01 11:36:45 -050029#include "text/GrGlyphCache.h"
joshualitte8042922015-12-11 06:11:21 -080030#include "text/GrTextBlobCache.h"
Hal Canaryc640d0d2018-06-13 09:59:02 -040031#include <algorithm>
joshualitte8042922015-12-11 06:11:21 -080032
joshualitt7f9c9eb2015-08-21 11:08:00 -070033namespace GrTest {
Brian Salomond17f6582017-07-19 18:28:58 -040034
Robert Phillipsd2e9f762018-03-07 11:54:37 -050035void SetupAlwaysEvictAtlas(GrContext* context, int dim) {
joshualitt7f9c9eb2015-08-21 11:08:00 -070036 // These sizes were selected because they allow each atlas to hold a single plot and will thus
37 // stress the atlas
Brian Salomon2ee084e2016-12-16 18:59:19 -050038 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
Robert Phillips0c4b7b12018-03-06 08:20:37 -050054 context->contextPriv().setTextContextAtlasSizes_ForTesting(configs);
joshualitt7f9c9eb2015-08-21 11:08:00 -070055}
Greg Daniel7ef28f32017-04-20 16:41:55 +000056
Brian Salomond17f6582017-07-19 18:28:58 -040057} // namespace GrTest
joshualitt7f9c9eb2015-08-21 11:08:00 -070058
Robert Phillipseaa86252016-11-08 13:49:39 +000059bool GrSurfaceProxy::isWrapped_ForTesting() const {
60 return SkToBool(fTarget);
61}
62
63bool GrRenderTargetContext::isWrapped_ForTesting() const {
64 return fRenderTargetProxy->isWrapped_ForTesting();
65}
66
Robert Phillips0c4b7b12018-03-06 08:20:37 -050067void GrContextPriv::setTextBlobCacheLimit_ForTesting(size_t bytes) {
68 fContext->fTextBlobCache->setBudget(bytes);
joshualitt17d833b2015-08-03 10:17:44 -070069}
70
Robert Phillips0c4b7b12018-03-06 08:20:37 -050071void GrContextPriv::setTextContextAtlasSizes_ForTesting(const GrDrawOpAtlasConfig* configs) {
Robert Phillips5a66efb2018-03-07 15:13:18 -050072 GrAtlasManager* atlasManager = this->getAtlasManager();
Robert Phillips1056eb82018-03-01 14:16:41 -050073 if (atlasManager) {
74 atlasManager->setAtlasSizes_ForTesting(configs);
75 }
joshualittda04e0e2015-08-19 08:16:43 -070076}
77
commit-bot@chromium.org78a10782013-08-21 19:27:48 +000078///////////////////////////////////////////////////////////////////////////////
79
Robert Phillips0c4b7b12018-03-06 08:20:37 -050080void GrContextPriv::purgeAllUnlockedResources_ForTesting() {
81 fContext->fResourceCache->purgeAllUnlocked();
robertphillips@google.com94d8f1e2013-12-18 17:25:33 +000082}
bsalomon33435572014-11-05 14:47:41 -080083
Robert Phillips0c4b7b12018-03-06 08:20:37 -050084void GrContextPriv::resetGpuStats() const {
joshualitte45c81c2015-12-02 09:05:37 -080085#if GR_GPU_STATS
Robert Phillips0c4b7b12018-03-06 08:20:37 -050086 fContext->fGpu->stats()->reset();
joshualitte45c81c2015-12-02 09:05:37 -080087#endif
88}
89
Robert Phillips0c4b7b12018-03-06 08:20:37 -050090void GrContextPriv::dumpCacheStats(SkString* out) const {
mtkleinb9eb4ac2015-02-02 18:26:03 -080091#if GR_CACHE_STATS
Robert Phillips0c4b7b12018-03-06 08:20:37 -050092 fContext->fResourceCache->dumpStats(out);
mtkleinb9eb4ac2015-02-02 18:26:03 -080093#endif
94}
95
Robert Phillips0c4b7b12018-03-06 08:20:37 -050096void GrContextPriv::dumpCacheStatsKeyValuePairs(SkTArray<SkString>* keys,
97 SkTArray<double>* values) const {
joshualittdc5685a2015-12-02 14:08:25 -080098#if GR_CACHE_STATS
Robert Phillips0c4b7b12018-03-06 08:20:37 -050099 fContext->fResourceCache->dumpStatsKeyValuePairs(keys, values);
joshualittdc5685a2015-12-02 14:08:25 -0800100#endif
101}
102
Robert Phillips0c4b7b12018-03-06 08:20:37 -0500103void GrContextPriv::printCacheStats() const {
mtkleinb9eb4ac2015-02-02 18:26:03 -0800104 SkString out;
105 this->dumpCacheStats(&out);
kkinnunen297aaf92015-02-19 06:32:12 -0800106 SkDebugf("%s", out.c_str());
mtkleinb9eb4ac2015-02-02 18:26:03 -0800107}
108
Robert Phillips0c4b7b12018-03-06 08:20:37 -0500109void GrContextPriv::dumpGpuStats(SkString* out) const {
mtkleinb9eb4ac2015-02-02 18:26:03 -0800110#if GR_GPU_STATS
Robert Phillips0c4b7b12018-03-06 08:20:37 -0500111 return fContext->fGpu->stats()->dump(out);
mtkleinb9eb4ac2015-02-02 18:26:03 -0800112#endif
113}
114
Robert Phillips0c4b7b12018-03-06 08:20:37 -0500115void GrContextPriv::dumpGpuStatsKeyValuePairs(SkTArray<SkString>* keys,
116 SkTArray<double>* values) const {
joshualitte45c81c2015-12-02 09:05:37 -0800117#if GR_GPU_STATS
Robert Phillips0c4b7b12018-03-06 08:20:37 -0500118 return fContext->fGpu->stats()->dumpKeyValuePairs(keys, values);
joshualitte45c81c2015-12-02 09:05:37 -0800119#endif
120}
121
Robert Phillips0c4b7b12018-03-06 08:20:37 -0500122void GrContextPriv::printGpuStats() const {
mtkleinb9eb4ac2015-02-02 18:26:03 -0800123 SkString out;
124 this->dumpGpuStats(&out);
kkinnunen297aaf92015-02-19 06:32:12 -0800125 SkDebugf("%s", out.c_str());
mtkleinb9eb4ac2015-02-02 18:26:03 -0800126}
127
Robert Phillips0c4b7b12018-03-06 08:20:37 -0500128sk_sp<SkImage> GrContextPriv::getFontAtlasImage_ForTesting(GrMaskFormat format, unsigned int index) {
Robert Phillips5a66efb2018-03-07 15:13:18 -0500129 auto atlasManager = this->getAtlasManager();
130 if (!atlasManager) {
131 return nullptr;
132 }
jvanverth629162d2015-11-08 08:07:24 -0800133
Jim Van Verthcbeae032018-05-16 14:54:41 -0400134 unsigned int numActiveProxies;
135 const sk_sp<GrTextureProxy>* proxies = atlasManager->getProxies(format, &numActiveProxies);
136 if (index >= numActiveProxies || !proxies || !proxies[index]) {
Robert Phillips32f28182017-02-28 16:20:03 -0500137 return nullptr;
138 }
139
Jim Van Verth87d18ce2018-01-22 12:45:47 -0500140 SkASSERT(proxies[index]->priv().isExact());
Brian Salomon8a8dd332018-05-24 14:08:31 -0400141 sk_sp<SkImage> image(new SkImage_Gpu(sk_ref_sp(fContext), kNeedNewImageUniqueID,
142 kPremul_SkAlphaType, proxies[index], nullptr,
143 SkBudgeted::kNo));
Robert Phillips22f4a1f2016-12-20 08:57:26 -0500144 return image;
jvanverth0671b962015-12-08 18:53:44 -0800145}
jvanverth629162d2015-11-08 08:07:24 -0800146
mtkleinb9eb4ac2015-02-02 18:26:03 -0800147#if GR_GPU_STATS
148void GrGpu::Stats::dump(SkString* out) {
149 out->appendf("Render Target Binds: %d\n", fRenderTargetBinds);
150 out->appendf("Shader Compilations: %d\n", fShaderCompilations);
bsalomonb12ea412015-02-02 21:19:50 -0800151 out->appendf("Textures Created: %d\n", fTextureCreates);
152 out->appendf("Texture Uploads: %d\n", fTextureUploads);
jvanverth17aa0472016-01-05 10:41:27 -0800153 out->appendf("Transfers to Texture: %d\n", fTransfersToTexture);
egdaniel8dc7c3a2015-04-16 11:22:42 -0700154 out->appendf("Stencil Buffer Creates: %d\n", fStencilAttachmentCreates);
joshualitt87a5c9f2015-09-08 13:42:05 -0700155 out->appendf("Number of draws: %d\n", fNumDraws);
mtkleinb9eb4ac2015-02-02 18:26:03 -0800156}
joshualitte45c81c2015-12-02 09:05:37 -0800157
158void GrGpu::Stats::dumpKeyValuePairs(SkTArray<SkString>* keys, SkTArray<double>* values) {
159 keys->push_back(SkString("render_target_binds")); values->push_back(fRenderTargetBinds);
160 keys->push_back(SkString("shader_compilations")); values->push_back(fShaderCompilations);
joshualitte45c81c2015-12-02 09:05:37 -0800161 keys->push_back(SkString("texture_uploads")); values->push_back(fTextureUploads);
joshualitte45c81c2015-12-02 09:05:37 -0800162 keys->push_back(SkString("number_of_draws")); values->push_back(fNumDraws);
bsalomon1d417a82016-03-23 11:50:26 -0700163 keys->push_back(SkString("number_of_failed_draws")); values->push_back(fNumFailedDraws);
joshualitte45c81c2015-12-02 09:05:37 -0800164}
165
mtkleinb9eb4ac2015-02-02 18:26:03 -0800166#endif
167
Brian Salomon52e943a2018-03-13 09:32:39 -0400168GrBackendTexture GrGpu::createTestingOnlyBackendTexture(const void* pixels, int w, int h,
Brian Osman2b23c4b2018-06-01 12:25:08 -0400169 SkColorType colorType, bool isRenderTarget,
Brian Salomonbdecacf2018-02-02 20:32:49 -0500170 GrMipMapped mipMapped) {
Brian Osman2b23c4b2018-06-01 12:25:08 -0400171 GrPixelConfig config = SkColorType2GrPixelConfig(colorType);
Greg Daniel0a7aa142018-02-21 13:02:32 -0500172 if (kUnknown_GrPixelConfig == config) {
173 return GrBackendTexture();
174 }
Brian Salomonbdecacf2018-02-02 20:32:49 -0500175 return this->createTestingOnlyBackendTexture(pixels, w, h, config, isRenderTarget, mipMapped);
176}
177
mtkleinb9eb4ac2015-02-02 18:26:03 -0800178#if GR_CACHE_STATS
robertphillips60029a52015-11-09 13:51:06 -0800179void GrResourceCache::getStats(Stats* stats) const {
180 stats->reset();
181
182 stats->fTotal = this->getResourceCount();
183 stats->fNumNonPurgeable = fNonpurgeableResources.count();
184 stats->fNumPurgeable = fPurgeableQueue.count();
185
186 for (int i = 0; i < fNonpurgeableResources.count(); ++i) {
187 stats->update(fNonpurgeableResources[i]);
188 }
189 for (int i = 0; i < fPurgeableQueue.count(); ++i) {
190 stats->update(fPurgeableQueue.at(i));
191 }
192}
193
bsalomon0ea80f42015-02-11 10:49:59 -0800194void GrResourceCache::dumpStats(SkString* out) const {
mtkleinb9eb4ac2015-02-02 18:26:03 -0800195 this->validate();
196
bsalomonf320e042015-02-17 15:09:34 -0800197 Stats stats;
198
robertphillips60029a52015-11-09 13:51:06 -0800199 this->getStats(&stats);
mtkleinb9eb4ac2015-02-02 18:26:03 -0800200
201 float countUtilization = (100.f * fBudgetedCount) / fMaxCount;
202 float byteUtilization = (100.f * fBudgetedBytes) / fMaxBytes;
203
204 out->appendf("Budget: %d items %d bytes\n", fMaxCount, (int)fMaxBytes);
205 out->appendf("\t\tEntry Count: current %d"
kkinnunen2e6055b2016-04-22 01:48:29 -0700206 " (%d budgeted, %d wrapped, %d locked, %d scratch %.2g%% full), high %d\n",
207 stats.fTotal, fBudgetedCount, stats.fWrapped, stats.fNumNonPurgeable,
208 stats.fScratch, countUtilization, fHighWaterCount);
mtkleinb9eb4ac2015-02-02 18:26:03 -0800209 out->appendf("\t\tEntry Bytes: current %d (budgeted %d, %.2g%% full, %d unbudgeted) high %d\n",
bsalomonf320e042015-02-17 15:09:34 -0800210 SkToInt(fBytes), SkToInt(fBudgetedBytes), byteUtilization,
211 SkToInt(stats.fUnbudgetedSize), SkToInt(fHighWaterBytes));
mtkleinb9eb4ac2015-02-02 18:26:03 -0800212}
213
joshualittdc5685a2015-12-02 14:08:25 -0800214void GrResourceCache::dumpStatsKeyValuePairs(SkTArray<SkString>* keys,
215 SkTArray<double>* values) const {
216 this->validate();
217
218 Stats stats;
219 this->getStats(&stats);
220
joshualittdc5685a2015-12-02 14:08:25 -0800221 keys->push_back(SkString("gpu_cache_purgable_entries")); values->push_back(stats.fNumPurgeable);
joshualittdc5685a2015-12-02 14:08:25 -0800222}
223
mtkleinb9eb4ac2015-02-02 18:26:03 -0800224#endif
225
bsalomonddf30e62015-02-19 11:38:44 -0800226///////////////////////////////////////////////////////////////////////////////
227
228void GrResourceCache::changeTimestamp(uint32_t newTimestamp) { fTimestamp = newTimestamp; }
mtkleinb9eb4ac2015-02-02 18:26:03 -0800229
Brian Salomon1090da62017-01-06 12:04:19 -0500230#ifdef SK_DEBUG
231int GrResourceCache::countUniqueKeysWithTag(const char* tag) const {
232 int count = 0;
233 UniqueHash::ConstIter iter(&fUniqueHash);
234 while (!iter.done()) {
235 if (0 == strcmp(tag, (*iter).getUniqueKey().tag())) {
236 ++count;
237 }
238 ++iter;
239 }
240 return count;
241}
242#endif
243
bsalomon33435572014-11-05 14:47:41 -0800244///////////////////////////////////////////////////////////////////////////////
joshualittf5883a62016-01-13 07:47:38 -0800245
246#define ASSERT_SINGLE_OWNER \
Robert Phillipsa90aa2b2017-04-10 08:19:26 -0400247 SkDEBUGCODE(GrSingleOwner::AutoEnforce debug_SingleOwner(fRenderTargetContext->singleOwner());)
joshualittf5883a62016-01-13 07:47:38 -0800248
Chris Dalton706a6ff2017-11-29 22:01:06 -0700249
Chris Daltona32a3c32017-12-05 10:05:21 -0700250uint32_t GrRenderTargetContextPriv::testingOnly_getOpListID() {
251 return fRenderTargetContext->getOpList()->uniqueID();
252}
253
Brian Salomonac70f842017-05-08 10:43:33 -0400254uint32_t GrRenderTargetContextPriv::testingOnly_addDrawOp(std::unique_ptr<GrDrawOp> op) {
Chris Dalton706a6ff2017-11-29 22:01:06 -0700255 return this->testingOnly_addDrawOp(GrNoClip(), std::move(op));
256}
257
258uint32_t GrRenderTargetContextPriv::testingOnly_addDrawOp(const GrClip& clip,
259 std::unique_ptr<GrDrawOp> op) {
Brian Salomonac70f842017-05-08 10:43:33 -0400260 ASSERT_SINGLE_OWNER
261 if (fRenderTargetContext->drawingManager()->wasAbandoned()) {
262 return SK_InvalidUniqueID;
263 }
264 SkDEBUGCODE(fRenderTargetContext->validate());
265 GR_AUDIT_TRAIL_AUTO_FRAME(fRenderTargetContext->fAuditTrail,
266 "GrRenderTargetContext::testingOnly_addDrawOp");
Chris Dalton706a6ff2017-11-29 22:01:06 -0700267 return fRenderTargetContext->addDrawOp(clip, std::move(op));
Brian Salomonac70f842017-05-08 10:43:33 -0400268}
269
joshualittf5883a62016-01-13 07:47:38 -0800270#undef ASSERT_SINGLE_OWNER
joshualittf5883a62016-01-13 07:47:38 -0800271
272///////////////////////////////////////////////////////////////////////////////
csmartdaltonf9635992016-08-10 11:09:07 -0700273
Robert Phillipsfe0253f2018-03-16 16:47:25 -0400274GrInternalSurfaceFlags GrSurfaceProxy::testingOnly_getFlags() const {
275 return fSurfaceFlags;
csmartdaltonf9635992016-08-10 11:09:07 -0700276}
277
Brian Salomon17726632017-05-12 14:09:46 -0400278//////////////////////////////////////////////////////////////////////////////
279
Chris Daltonfe199b72017-05-05 11:26:15 -0400280void GrContextPriv::testingOnly_flushAndRemoveOnFlushCallbackObject(GrOnFlushCallbackObject* cb) {
281 fContext->flush();
282 fContext->fDrawingManager->testingOnly_removeOnFlushCallbackObject(cb);
283}
284
285void GrDrawingManager::testingOnly_removeOnFlushCallbackObject(GrOnFlushCallbackObject* cb) {
286 int n = std::find(fOnFlushCBObjects.begin(), fOnFlushCBObjects.end(), cb) -
287 fOnFlushCBObjects.begin();
288 SkASSERT(n < fOnFlushCBObjects.count());
289 fOnFlushCBObjects.removeShuffle(n);
290}
Brian Salomon17726632017-05-12 14:09:46 -0400291
292//////////////////////////////////////////////////////////////////////////////
293
Greg Daniel8a3f55c2018-03-14 17:32:12 +0000294GrPixelConfig GrBackendTexture::testingOnly_getPixelConfig() const {
295 return fConfig;
296}
297
298GrPixelConfig GrBackendRenderTarget::testingOnly_getPixelConfig() const {
299 return fConfig;
300}
301
302//////////////////////////////////////////////////////////////////////////////
303
Brian Salomon17726632017-05-12 14:09:46 -0400304#define DRAW_OP_TEST_EXTERN(Op) \
Brian Salomon815486c2017-07-11 08:52:13 -0400305 extern std::unique_ptr<GrDrawOp> Op##__Test(GrPaint&&, SkRandom*, GrContext*, GrFSAAType)
Brian Salomon17726632017-05-12 14:09:46 -0400306#define DRAW_OP_TEST_ENTRY(Op) Op##__Test
307
Brian Salomon10978a62017-06-15 16:21:49 -0400308DRAW_OP_TEST_EXTERN(AAConvexPathOp);
Brian Salomon815486c2017-07-11 08:52:13 -0400309DRAW_OP_TEST_EXTERN(AAFillRectOp);
Brian Salomonb2955732017-07-13 16:42:55 -0400310DRAW_OP_TEST_EXTERN(AAFlatteningConvexPathOp);
Brian Salomona531f252017-07-07 13:29:28 -0400311DRAW_OP_TEST_EXTERN(AAHairlineOp);
Brian Salomonbaaf4392017-06-15 09:59:23 -0400312DRAW_OP_TEST_EXTERN(AAStrokeRectOp);
Brian Salomon815486c2017-07-11 08:52:13 -0400313DRAW_OP_TEST_EXTERN(CircleOp);
Brian Salomon98222ac2017-07-12 15:27:54 -0400314DRAW_OP_TEST_EXTERN(DashOp);
Brian Salomonee3e0ba2017-07-13 16:40:46 -0400315DRAW_OP_TEST_EXTERN(DefaultPathOp);
Brian Salomon05441c42017-05-15 16:45:49 -0400316DRAW_OP_TEST_EXTERN(DIEllipseOp);
317DRAW_OP_TEST_EXTERN(EllipseOp);
Brian Salomon44acb5b2017-07-18 19:59:24 -0400318DRAW_OP_TEST_EXTERN(GrAtlasTextOp);
Brian Salomon0088f942017-07-12 11:51:27 -0400319DRAW_OP_TEST_EXTERN(GrDrawAtlasOp);
Brian Salomonc2f42542017-07-12 14:11:22 -0400320DRAW_OP_TEST_EXTERN(GrDrawVerticesOp);
Brian Salomon815486c2017-07-11 08:52:13 -0400321DRAW_OP_TEST_EXTERN(NonAAFillRectOp);
322DRAW_OP_TEST_EXTERN(NonAALatticeOp);
Brian Salomonbaaf4392017-06-15 09:59:23 -0400323DRAW_OP_TEST_EXTERN(NonAAStrokeRectOp);
Brian Salomon05969092017-07-13 11:20:51 -0400324DRAW_OP_TEST_EXTERN(ShadowRRectOp);
Brian Salomonfebbd232017-07-11 15:52:02 -0400325DRAW_OP_TEST_EXTERN(SmallPathOp);
Brian Salomonf0366322017-07-11 15:53:05 -0400326DRAW_OP_TEST_EXTERN(RegionOp);
Brian Salomon05441c42017-05-15 16:45:49 -0400327DRAW_OP_TEST_EXTERN(RRectOp);
Brian Salomon9530f7e2017-07-11 09:03:10 -0400328DRAW_OP_TEST_EXTERN(TesselatingPathOp);
Brian Salomon34169692017-08-28 15:32:01 -0400329DRAW_OP_TEST_EXTERN(TextureOp);
Brian Salomon17726632017-05-12 14:09:46 -0400330
331void GrDrawRandomOp(SkRandom* random, GrRenderTargetContext* renderTargetContext, GrPaint&& paint) {
332 GrContext* context = renderTargetContext->surfPriv().getContext();
Brian Salomon17726632017-05-12 14:09:46 -0400333 using MakeDrawOpFn = std::unique_ptr<GrDrawOp>(GrPaint&&, SkRandom*, GrContext*, GrFSAAType);
334 static constexpr MakeDrawOpFn* gFactories[] = {
Brian Salomon34169692017-08-28 15:32:01 -0400335 DRAW_OP_TEST_ENTRY(AAConvexPathOp),
336 DRAW_OP_TEST_ENTRY(AAFillRectOp),
337 DRAW_OP_TEST_ENTRY(AAFlatteningConvexPathOp),
338 DRAW_OP_TEST_ENTRY(AAHairlineOp),
339 DRAW_OP_TEST_ENTRY(AAStrokeRectOp),
340 DRAW_OP_TEST_ENTRY(CircleOp),
341 DRAW_OP_TEST_ENTRY(DashOp),
342 DRAW_OP_TEST_ENTRY(DefaultPathOp),
343 DRAW_OP_TEST_ENTRY(DIEllipseOp),
344 DRAW_OP_TEST_ENTRY(EllipseOp),
345 DRAW_OP_TEST_ENTRY(GrAtlasTextOp),
346 DRAW_OP_TEST_ENTRY(GrDrawAtlasOp),
347 DRAW_OP_TEST_ENTRY(GrDrawVerticesOp),
348 DRAW_OP_TEST_ENTRY(NonAAFillRectOp),
349 DRAW_OP_TEST_ENTRY(NonAALatticeOp),
350 DRAW_OP_TEST_ENTRY(NonAAStrokeRectOp),
351 DRAW_OP_TEST_ENTRY(ShadowRRectOp),
352 DRAW_OP_TEST_ENTRY(SmallPathOp),
353 DRAW_OP_TEST_ENTRY(RegionOp),
354 DRAW_OP_TEST_ENTRY(RRectOp),
355 DRAW_OP_TEST_ENTRY(TesselatingPathOp),
356 DRAW_OP_TEST_ENTRY(TextureOp),
Brian Salomon17726632017-05-12 14:09:46 -0400357 };
358
Brian Salomonfc26f3c2017-07-14 15:27:56 -0400359 static constexpr size_t kTotal = SK_ARRAY_COUNT(gFactories);
Brian Salomon17726632017-05-12 14:09:46 -0400360 uint32_t index = random->nextULessThan(static_cast<uint32_t>(kTotal));
Brian Salomonfc26f3c2017-07-14 15:27:56 -0400361 auto op = gFactories[index](
362 std::move(paint), random, context, renderTargetContext->fsaaType());
363 SkASSERT(op);
364 renderTargetContext->priv().testingOnly_addDrawOp(std::move(op));
Brian Salomon17726632017-05-12 14:09:46 -0400365}