178a1078f17f4f0ae63415298517262a64f706af6commit-bot@chromium.org/*
278a1078f17f4f0ae63415298517262a64f706af6commit-bot@chromium.org * Copyright 2013 Google Inc.
378a1078f17f4f0ae63415298517262a64f706af6commit-bot@chromium.org *
478a1078f17f4f0ae63415298517262a64f706af6commit-bot@chromium.org * Use of this source code is governed by a BSD-style license that can be
578a1078f17f4f0ae63415298517262a64f706af6commit-bot@chromium.org * found in the LICENSE file.
678a1078f17f4f0ae63415298517262a64f706af6commit-bot@chromium.org */
778a1078f17f4f0ae63415298517262a64f706af6commit-bot@chromium.org
878a1078f17f4f0ae63415298517262a64f706af6commit-bot@chromium.org#include "GrTest.h"
9177266339c3aa6dda4fa2912af9eaa8e8206f78fBrian Salomon#include <algorithm>
107ef28f35a2f7d17b90c776f76d4b374ccee6c347Greg Daniel#include "GrBackendSurface.h"
11682c269a1511200322916af83053e26004c0ec40bsalomon#include "GrContextOptions.h"
12fe199b7d512a7cfc56deaaa134260e1d47a1e7e0Chris Dalton#include "GrContextPriv.h"
132ee084e73056b0ad76b721017f576168b7306da3Brian Salomon#include "GrDrawOpAtlas.h"
1477a2e52c7d5c77de73ecab5fec79072ee4460706robertphillips#include "GrDrawingManager.h"
15fbcef6eb8abad142daf45418516550f7635b4a52Robert Phillips#include "GrGpu.h"
163582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon#include "GrGpuResourceCacheAccess.h"
17177266339c3aa6dda4fa2912af9eaa8e8206f78fBrian Salomon#include "GrRenderTargetContext.h"
182ee084e73056b0ad76b721017f576168b7306da3Brian Salomon#include "GrRenderTargetContextPriv.h"
19f9635999a4aa8810d04e8ef04594a9fbcc061e3dcsmartdalton#include "GrRenderTargetProxy.h"
200ea80f43a1af05b8157a4ef387223bb5b0da35edbsalomon#include "GrResourceCache.h"
216be35238855dbbc7575e78d6723936293a4b38e6Greg Daniel#include "GrSemaphore.h"
22177266339c3aa6dda4fa2912af9eaa8e8206f78fBrian Salomon#include "GrSurfaceContextPriv.h"
23646e4293f06d9de6d44dbfa3c32cdc15a6f5906eRobert Phillips#include "GrTexture.h"
243b65598bceb65736486db27ed49a56d787032747Brian Osman#include "SkGr.h"
2522f4a1fd4859aa75133de37a24b3201cce5d6844Robert Phillips#include "SkImage_Gpu.h"
264dbbd04314cc0606f8d3bafe515c97e52c180f73halcanary#include "SkMathPriv.h"
27b9eb4ac0f1c29d6fe10ad7ff81ed8326ac1ea043mtklein#include "SkString.h"
28177266339c3aa6dda4fa2912af9eaa8e8206f78fBrian Salomon#include "ops/GrMeshDrawOp.h"
29c4039ea466d39ede0ea44fc7a18f1174f893f11dRobert Phillips#include "text/GrGlyphCache.h"
30e804292e805917002cc3d7baa7f967fb20d2c7cbjoshualitt#include "text/GrTextBlobCache.h"
31e804292e805917002cc3d7baa7f967fb20d2c7cbjoshualitt
327f9c9eb91e65f2d83474f2b34f9ed0d9525245aejoshualittnamespace GrTest {
33d17f6584df9e48146dac28a1df56fb4978de6ba3Brian Salomon
347f9c9eb91e65f2d83474f2b34f9ed0d9525245aejoshualittvoid SetupAlwaysEvictAtlas(GrContext* context) {
357f9c9eb91e65f2d83474f2b34f9ed0d9525245aejoshualitt    // These sizes were selected because they allow each atlas to hold a single plot and will thus
367f9c9eb91e65f2d83474f2b34f9ed0d9525245aejoshualitt    // stress the atlas
372ee084e73056b0ad76b721017f576168b7306da3Brian Salomon    int dim = GrDrawOpAtlas::kGlyphMaxDim;
382ee084e73056b0ad76b721017f576168b7306da3Brian Salomon    GrDrawOpAtlasConfig configs[3];
397f9c9eb91e65f2d83474f2b34f9ed0d9525245aejoshualitt    configs[kA8_GrMaskFormat].fWidth = dim;
407f9c9eb91e65f2d83474f2b34f9ed0d9525245aejoshualitt    configs[kA8_GrMaskFormat].fHeight = dim;
417f9c9eb91e65f2d83474f2b34f9ed0d9525245aejoshualitt    configs[kA8_GrMaskFormat].fPlotWidth = dim;
427f9c9eb91e65f2d83474f2b34f9ed0d9525245aejoshualitt    configs[kA8_GrMaskFormat].fPlotHeight = dim;
437f9c9eb91e65f2d83474f2b34f9ed0d9525245aejoshualitt
447f9c9eb91e65f2d83474f2b34f9ed0d9525245aejoshualitt    configs[kA565_GrMaskFormat].fWidth = dim;
457f9c9eb91e65f2d83474f2b34f9ed0d9525245aejoshualitt    configs[kA565_GrMaskFormat].fHeight = dim;
467f9c9eb91e65f2d83474f2b34f9ed0d9525245aejoshualitt    configs[kA565_GrMaskFormat].fPlotWidth = dim;
477f9c9eb91e65f2d83474f2b34f9ed0d9525245aejoshualitt    configs[kA565_GrMaskFormat].fPlotHeight = dim;
487f9c9eb91e65f2d83474f2b34f9ed0d9525245aejoshualitt
497f9c9eb91e65f2d83474f2b34f9ed0d9525245aejoshualitt    configs[kARGB_GrMaskFormat].fWidth = dim;
507f9c9eb91e65f2d83474f2b34f9ed0d9525245aejoshualitt    configs[kARGB_GrMaskFormat].fHeight = dim;
517f9c9eb91e65f2d83474f2b34f9ed0d9525245aejoshualitt    configs[kARGB_GrMaskFormat].fPlotWidth = dim;
527f9c9eb91e65f2d83474f2b34f9ed0d9525245aejoshualitt    configs[kARGB_GrMaskFormat].fPlotHeight = dim;
537f9c9eb91e65f2d83474f2b34f9ed0d9525245aejoshualitt
547f9c9eb91e65f2d83474f2b34f9ed0d9525245aejoshualitt    context->setTextContextAtlasSizes_ForTesting(configs);
557f9c9eb91e65f2d83474f2b34f9ed0d9525245aejoshualitt}
567ef28f35a2f7d17b90c776f76d4b374ccee6c347Greg Daniel
577ef28f35a2f7d17b90c776f76d4b374ccee6c347Greg DanielGrBackendTexture CreateBackendTexture(GrBackend backend, int width, int height,
58177e695589edb1f776cc5c28b9d3eee244d48284Greg Daniel                                      GrPixelConfig config, GrMipMapped mipMapped,
59177e695589edb1f776cc5c28b9d3eee244d48284Greg Daniel                                      GrBackendObject handle) {
60d17f6584df9e48146dac28a1df56fb4978de6ba3Brian Salomon    switch (backend) {
61d20b5c489b5709a4d251c0cc68d584ea4514594eMike Reed#ifdef SK_VULKAN
62d17f6584df9e48146dac28a1df56fb4978de6ba3Brian Salomon        case kVulkan_GrBackend: {
63d17f6584df9e48146dac28a1df56fb4978de6ba3Brian Salomon            GrVkImageInfo* vkInfo = (GrVkImageInfo*)(handle);
64177e695589edb1f776cc5c28b9d3eee244d48284Greg Daniel            SkASSERT((GrMipMapped::kYes == mipMapped) == (vkInfo->fLevelCount > 1));
65d17f6584df9e48146dac28a1df56fb4978de6ba3Brian Salomon            return GrBackendTexture(width, height, *vkInfo);
66d17f6584df9e48146dac28a1df56fb4978de6ba3Brian Salomon        }
67fcd5fddb0264d062a461435618ad54a29ff80fc0Robert Phillips#endif
68d17f6584df9e48146dac28a1df56fb4978de6ba3Brian Salomon        case kOpenGL_GrBackend: {
69d17f6584df9e48146dac28a1df56fb4978de6ba3Brian Salomon            GrGLTextureInfo* glInfo = (GrGLTextureInfo*)(handle);
70f5d8758f29390fd5c135df12bc8a5e196854eda2Greg Daniel            SkASSERT(glInfo->fFormat);
71f5d8758f29390fd5c135df12bc8a5e196854eda2Greg Daniel            return GrBackendTexture(width, height, mipMapped, *glInfo);
72d17f6584df9e48146dac28a1df56fb4978de6ba3Brian Salomon        }
73d17f6584df9e48146dac28a1df56fb4978de6ba3Brian Salomon        case kMock_GrBackend: {
74d17f6584df9e48146dac28a1df56fb4978de6ba3Brian Salomon            GrMockTextureInfo* mockInfo = (GrMockTextureInfo*)(handle);
75177e695589edb1f776cc5c28b9d3eee244d48284Greg Daniel            return GrBackendTexture(width, height, config, mipMapped, *mockInfo);
76d17f6584df9e48146dac28a1df56fb4978de6ba3Brian Salomon        }
77d17f6584df9e48146dac28a1df56fb4978de6ba3Brian Salomon        default:
78d17f6584df9e48146dac28a1df56fb4978de6ba3Brian Salomon            return GrBackendTexture();
79d17f6584df9e48146dac28a1df56fb4978de6ba3Brian Salomon    }
807ef28f35a2f7d17b90c776f76d4b374ccee6c347Greg Daniel}
81d17f6584df9e48146dac28a1df56fb4978de6ba3Brian Salomon
82d17f6584df9e48146dac28a1df56fb4978de6ba3Brian Salomon}  // namespace GrTest
837f9c9eb91e65f2d83474f2b34f9ed0d9525245aejoshualitt
84eaa862569dc91d55fc79d057df6e69b139e46888Robert Phillipsbool GrSurfaceProxy::isWrapped_ForTesting() const {
85eaa862569dc91d55fc79d057df6e69b139e46888Robert Phillips    return SkToBool(fTarget);
86eaa862569dc91d55fc79d057df6e69b139e46888Robert Phillips}
87eaa862569dc91d55fc79d057df6e69b139e46888Robert Phillips
88eaa862569dc91d55fc79d057df6e69b139e46888Robert Phillipsbool GrRenderTargetContext::isWrapped_ForTesting() const {
89eaa862569dc91d55fc79d057df6e69b139e46888Robert Phillips    return fRenderTargetProxy->isWrapped_ForTesting();
90eaa862569dc91d55fc79d057df6e69b139e46888Robert Phillips}
91eaa862569dc91d55fc79d057df6e69b139e46888Robert Phillips
9217d833b05b1554fd1c54144b4bd2f4f23946b7b8joshualittvoid GrContext::setTextBlobCacheLimit_ForTesting(size_t bytes) {
9317d833b05b1554fd1c54144b4bd2f4f23946b7b8joshualitt    fTextBlobCache->setBudget(bytes);
9417d833b05b1554fd1c54144b4bd2f4f23946b7b8joshualitt}
9517d833b05b1554fd1c54144b4bd2f4f23946b7b8joshualitt
962ee084e73056b0ad76b721017f576168b7306da3Brian Salomonvoid GrContext::setTextContextAtlasSizes_ForTesting(const GrDrawOpAtlasConfig* configs) {
971056eb821f1f43b034962aa6defb80aeeb75d22dRobert Phillips    GrAtlasManager* atlasManager = this->contextPriv().getFullAtlasManager();
981056eb821f1f43b034962aa6defb80aeeb75d22dRobert Phillips    if (atlasManager) {
991056eb821f1f43b034962aa6defb80aeeb75d22dRobert Phillips        atlasManager->setAtlasSizes_ForTesting(configs);
1001056eb821f1f43b034962aa6defb80aeeb75d22dRobert Phillips    }
101da04e0e80a0113e1d838f7406cd8a8d545b8c02bjoshualitt}
102da04e0e80a0113e1d838f7406cd8a8d545b8c02bjoshualitt
10378a1078f17f4f0ae63415298517262a64f706af6commit-bot@chromium.org///////////////////////////////////////////////////////////////////////////////
10478a1078f17f4f0ae63415298517262a64f706af6commit-bot@chromium.org
10594d8f1ed6116780346ffa39ed683f1977786434arobertphillips@google.comvoid GrContext::purgeAllUnlockedResources() {
1060ea80f43a1af05b8157a4ef387223bb5b0da35edbsalomon    fResourceCache->purgeAllUnlocked();
10794d8f1ed6116780346ffa39ed683f1977786434arobertphillips@google.com}
108334355742137cc238887d4f85856e6c4d9ec8aa8bsalomon
109e45c81c8f3bb62e45f2ff3b8772b4b23f1ddc6cajoshualittvoid GrContext::resetGpuStats() const {
110e45c81c8f3bb62e45f2ff3b8772b4b23f1ddc6cajoshualitt#if GR_GPU_STATS
111e45c81c8f3bb62e45f2ff3b8772b4b23f1ddc6cajoshualitt    fGpu->stats()->reset();
112e45c81c8f3bb62e45f2ff3b8772b4b23f1ddc6cajoshualitt#endif
113e45c81c8f3bb62e45f2ff3b8772b4b23f1ddc6cajoshualitt}
114e45c81c8f3bb62e45f2ff3b8772b4b23f1ddc6cajoshualitt
115b9eb4ac0f1c29d6fe10ad7ff81ed8326ac1ea043mtkleinvoid GrContext::dumpCacheStats(SkString* out) const {
116b9eb4ac0f1c29d6fe10ad7ff81ed8326ac1ea043mtklein#if GR_CACHE_STATS
1170ea80f43a1af05b8157a4ef387223bb5b0da35edbsalomon    fResourceCache->dumpStats(out);
118b9eb4ac0f1c29d6fe10ad7ff81ed8326ac1ea043mtklein#endif
119b9eb4ac0f1c29d6fe10ad7ff81ed8326ac1ea043mtklein}
120b9eb4ac0f1c29d6fe10ad7ff81ed8326ac1ea043mtklein
121dc5685ac3752e90dd68179e9f1675ff6f15ed600joshualittvoid GrContext::dumpCacheStatsKeyValuePairs(SkTArray<SkString>* keys,
122dc5685ac3752e90dd68179e9f1675ff6f15ed600joshualitt                                            SkTArray<double>* values) const {
123dc5685ac3752e90dd68179e9f1675ff6f15ed600joshualitt#if GR_CACHE_STATS
124dc5685ac3752e90dd68179e9f1675ff6f15ed600joshualitt    fResourceCache->dumpStatsKeyValuePairs(keys, values);
125dc5685ac3752e90dd68179e9f1675ff6f15ed600joshualitt#endif
126dc5685ac3752e90dd68179e9f1675ff6f15ed600joshualitt}
127dc5685ac3752e90dd68179e9f1675ff6f15ed600joshualitt
128b9eb4ac0f1c29d6fe10ad7ff81ed8326ac1ea043mtkleinvoid GrContext::printCacheStats() const {
129b9eb4ac0f1c29d6fe10ad7ff81ed8326ac1ea043mtklein    SkString out;
130b9eb4ac0f1c29d6fe10ad7ff81ed8326ac1ea043mtklein    this->dumpCacheStats(&out);
131297aaf97a32ac16a2bc3f4bbc231d5de859ac02dkkinnunen    SkDebugf("%s", out.c_str());
132b9eb4ac0f1c29d6fe10ad7ff81ed8326ac1ea043mtklein}
133b9eb4ac0f1c29d6fe10ad7ff81ed8326ac1ea043mtklein
134b9eb4ac0f1c29d6fe10ad7ff81ed8326ac1ea043mtkleinvoid GrContext::dumpGpuStats(SkString* out) const {
135b9eb4ac0f1c29d6fe10ad7ff81ed8326ac1ea043mtklein#if GR_GPU_STATS
136b9eb4ac0f1c29d6fe10ad7ff81ed8326ac1ea043mtklein    return fGpu->stats()->dump(out);
137b9eb4ac0f1c29d6fe10ad7ff81ed8326ac1ea043mtklein#endif
138b9eb4ac0f1c29d6fe10ad7ff81ed8326ac1ea043mtklein}
139b9eb4ac0f1c29d6fe10ad7ff81ed8326ac1ea043mtklein
140e45c81c8f3bb62e45f2ff3b8772b4b23f1ddc6cajoshualittvoid GrContext::dumpGpuStatsKeyValuePairs(SkTArray<SkString>* keys,
141e45c81c8f3bb62e45f2ff3b8772b4b23f1ddc6cajoshualitt                                          SkTArray<double>* values) const {
142e45c81c8f3bb62e45f2ff3b8772b4b23f1ddc6cajoshualitt#if GR_GPU_STATS
143e45c81c8f3bb62e45f2ff3b8772b4b23f1ddc6cajoshualitt    return fGpu->stats()->dumpKeyValuePairs(keys, values);
144e45c81c8f3bb62e45f2ff3b8772b4b23f1ddc6cajoshualitt#endif
145e45c81c8f3bb62e45f2ff3b8772b4b23f1ddc6cajoshualitt}
146e45c81c8f3bb62e45f2ff3b8772b4b23f1ddc6cajoshualitt
147b9eb4ac0f1c29d6fe10ad7ff81ed8326ac1ea043mtkleinvoid GrContext::printGpuStats() const {
148b9eb4ac0f1c29d6fe10ad7ff81ed8326ac1ea043mtklein    SkString out;
149b9eb4ac0f1c29d6fe10ad7ff81ed8326ac1ea043mtklein    this->dumpGpuStats(&out);
150297aaf97a32ac16a2bc3f4bbc231d5de859ac02dkkinnunen    SkDebugf("%s", out.c_str());
151b9eb4ac0f1c29d6fe10ad7ff81ed8326ac1ea043mtklein}
152b9eb4ac0f1c29d6fe10ad7ff81ed8326ac1ea043mtklein
153c4039ea466d39ede0ea44fc7a18f1174f893f11dRobert Phillipssk_sp<SkImage> GrContext::getFontAtlasImage_ForTesting(GrMaskFormat format, unsigned int index) {
154c4039ea466d39ede0ea44fc7a18f1174f893f11dRobert Phillips    auto restrictedAtlasManager = this->contextPriv().getRestrictedAtlasManager();
155629162dd8ef127f793c9cedf0f47a1d4de4d3a3djvanverth
156f3690dd416a1ff63868dd886c0c08b7698c5dd1fRobert Phillips    unsigned int numProxies;
157c4039ea466d39ede0ea44fc7a18f1174f893f11dRobert Phillips    const sk_sp<GrTextureProxy>* proxies = restrictedAtlasManager->getProxies(format, &numProxies);
158f3690dd416a1ff63868dd886c0c08b7698c5dd1fRobert Phillips    if (index >= numProxies || !proxies[index]) {
15932f2818c9d10090efeea62ccc211d48a33322dfbRobert Phillips        return nullptr;
16032f2818c9d10090efeea62ccc211d48a33322dfbRobert Phillips    }
16132f2818c9d10090efeea62ccc211d48a33322dfbRobert Phillips
16287d18ced0a54c9ed836a82d4276a4f45b27a2943Jim Van Verth    SkASSERT(proxies[index]->priv().isExact());
163b726d58efc91c4eefa5cea0881a823ee108db8fdRobert Phillips    sk_sp<SkImage> image(new SkImage_Gpu(this, kNeedNewImageUniqueID, kPremul_SkAlphaType,
164de9cef2f711e6d1af31557e895825f26b45401caRobert Phillips                                         proxies[index], nullptr, SkBudgeted::kNo));
16522f4a1fd4859aa75133de37a24b3201cce5d6844Robert Phillips    return image;
1660671b967eb02d44c8951dc4dc39df09fac15b097jvanverth}
167629162dd8ef127f793c9cedf0f47a1d4de4d3a3djvanverth
168b9eb4ac0f1c29d6fe10ad7ff81ed8326ac1ea043mtklein#if GR_GPU_STATS
169b9eb4ac0f1c29d6fe10ad7ff81ed8326ac1ea043mtkleinvoid GrGpu::Stats::dump(SkString* out) {
170b9eb4ac0f1c29d6fe10ad7ff81ed8326ac1ea043mtklein    out->appendf("Render Target Binds: %d\n", fRenderTargetBinds);
171b9eb4ac0f1c29d6fe10ad7ff81ed8326ac1ea043mtklein    out->appendf("Shader Compilations: %d\n", fShaderCompilations);
172b12ea41286ce36e085c5a14711da0cf9f240fdf1bsalomon    out->appendf("Textures Created: %d\n", fTextureCreates);
173b12ea41286ce36e085c5a14711da0cf9f240fdf1bsalomon    out->appendf("Texture Uploads: %d\n", fTextureUploads);
17417aa047066eaaa56637c4c2b93c8c4c374127dbfjvanverth    out->appendf("Transfers to Texture: %d\n", fTransfersToTexture);
1758dc7c3a839b38b73af34cc2674a06f49eb1ce527egdaniel    out->appendf("Stencil Buffer Creates: %d\n", fStencilAttachmentCreates);
17687a5c9fa0ff6fdf5225df53666798a2d513ade6djoshualitt    out->appendf("Number of draws: %d\n", fNumDraws);
177b9eb4ac0f1c29d6fe10ad7ff81ed8326ac1ea043mtklein}
178e45c81c8f3bb62e45f2ff3b8772b4b23f1ddc6cajoshualitt
179e45c81c8f3bb62e45f2ff3b8772b4b23f1ddc6cajoshualittvoid GrGpu::Stats::dumpKeyValuePairs(SkTArray<SkString>* keys, SkTArray<double>* values) {
180e45c81c8f3bb62e45f2ff3b8772b4b23f1ddc6cajoshualitt    keys->push_back(SkString("render_target_binds")); values->push_back(fRenderTargetBinds);
181e45c81c8f3bb62e45f2ff3b8772b4b23f1ddc6cajoshualitt    keys->push_back(SkString("shader_compilations")); values->push_back(fShaderCompilations);
182e45c81c8f3bb62e45f2ff3b8772b4b23f1ddc6cajoshualitt    keys->push_back(SkString("texture_uploads")); values->push_back(fTextureUploads);
183e45c81c8f3bb62e45f2ff3b8772b4b23f1ddc6cajoshualitt    keys->push_back(SkString("number_of_draws")); values->push_back(fNumDraws);
1841d417a8738304c115f3547ecc34dda7a7d75b97absalomon    keys->push_back(SkString("number_of_failed_draws")); values->push_back(fNumFailedDraws);
185e45c81c8f3bb62e45f2ff3b8772b4b23f1ddc6cajoshualitt}
186e45c81c8f3bb62e45f2ff3b8772b4b23f1ddc6cajoshualitt
187b9eb4ac0f1c29d6fe10ad7ff81ed8326ac1ea043mtklein#endif
188b9eb4ac0f1c29d6fe10ad7ff81ed8326ac1ea043mtklein
189bdecacfbe47bc7211336bb847bb33c00ef85ea3eBrian SalomonGrBackendTexture GrGpu::createTestingOnlyBackendTexture(void* pixels, int w, int h,
190bdecacfbe47bc7211336bb847bb33c00ef85ea3eBrian Salomon                                                        SkColorType colorType, bool isRenderTarget,
191bdecacfbe47bc7211336bb847bb33c00ef85ea3eBrian Salomon                                                        GrMipMapped mipMapped) {
192bdecacfbe47bc7211336bb847bb33c00ef85ea3eBrian Salomon    GrPixelConfig config = SkImageInfo2GrPixelConfig(colorType, nullptr, *this->caps());
1930a7aa14bf36cbb444b84902a37591d7a9c84fbd0Greg Daniel    if (kUnknown_GrPixelConfig == config) {
1940a7aa14bf36cbb444b84902a37591d7a9c84fbd0Greg Daniel        return GrBackendTexture();
1950a7aa14bf36cbb444b84902a37591d7a9c84fbd0Greg Daniel    }
196bdecacfbe47bc7211336bb847bb33c00ef85ea3eBrian Salomon    return this->createTestingOnlyBackendTexture(pixels, w, h, config, isRenderTarget, mipMapped);
197bdecacfbe47bc7211336bb847bb33c00ef85ea3eBrian Salomon}
198bdecacfbe47bc7211336bb847bb33c00ef85ea3eBrian Salomon
199b9eb4ac0f1c29d6fe10ad7ff81ed8326ac1ea043mtklein#if GR_CACHE_STATS
20060029a5397f75aae4bdb994f26bd297edc3e433crobertphillipsvoid GrResourceCache::getStats(Stats* stats) const {
20160029a5397f75aae4bdb994f26bd297edc3e433crobertphillips    stats->reset();
202b9eb4ac0f1c29d6fe10ad7ff81ed8326ac1ea043mtklein
20360029a5397f75aae4bdb994f26bd297edc3e433crobertphillips    stats->fTotal = this->getResourceCount();
20460029a5397f75aae4bdb994f26bd297edc3e433crobertphillips    stats->fNumNonPurgeable = fNonpurgeableResources.count();
20560029a5397f75aae4bdb994f26bd297edc3e433crobertphillips    stats->fNumPurgeable = fPurgeableQueue.count();
206b9eb4ac0f1c29d6fe10ad7ff81ed8326ac1ea043mtklein
207f320e04c50a1c8a861bc1d8f50bf732044ff9843bsalomon    for (int i = 0; i < fNonpurgeableResources.count(); ++i) {
20860029a5397f75aae4bdb994f26bd297edc3e433crobertphillips        stats->update(fNonpurgeableResources[i]);
209f320e04c50a1c8a861bc1d8f50bf732044ff9843bsalomon    }
210f320e04c50a1c8a861bc1d8f50bf732044ff9843bsalomon    for (int i = 0; i < fPurgeableQueue.count(); ++i) {
21160029a5397f75aae4bdb994f26bd297edc3e433crobertphillips        stats->update(fPurgeableQueue.at(i));
212b9eb4ac0f1c29d6fe10ad7ff81ed8326ac1ea043mtklein    }
21360029a5397f75aae4bdb994f26bd297edc3e433crobertphillips}
21460029a5397f75aae4bdb994f26bd297edc3e433crobertphillips
21560029a5397f75aae4bdb994f26bd297edc3e433crobertphillipsvoid GrResourceCache::dumpStats(SkString* out) const {
21660029a5397f75aae4bdb994f26bd297edc3e433crobertphillips    this->validate();
21760029a5397f75aae4bdb994f26bd297edc3e433crobertphillips
21860029a5397f75aae4bdb994f26bd297edc3e433crobertphillips    Stats stats;
21960029a5397f75aae4bdb994f26bd297edc3e433crobertphillips
22060029a5397f75aae4bdb994f26bd297edc3e433crobertphillips    this->getStats(&stats);
221b9eb4ac0f1c29d6fe10ad7ff81ed8326ac1ea043mtklein
222b9eb4ac0f1c29d6fe10ad7ff81ed8326ac1ea043mtklein    float countUtilization = (100.f * fBudgetedCount) / fMaxCount;
223b9eb4ac0f1c29d6fe10ad7ff81ed8326ac1ea043mtklein    float byteUtilization = (100.f * fBudgetedBytes) / fMaxBytes;
224b9eb4ac0f1c29d6fe10ad7ff81ed8326ac1ea043mtklein
225b9eb4ac0f1c29d6fe10ad7ff81ed8326ac1ea043mtklein    out->appendf("Budget: %d items %d bytes\n", fMaxCount, (int)fMaxBytes);
226b9eb4ac0f1c29d6fe10ad7ff81ed8326ac1ea043mtklein    out->appendf("\t\tEntry Count: current %d"
2272e6055b3ea14a04fcde1ac1974a70bf00b1e295bkkinnunen                 " (%d budgeted, %d wrapped, %d locked, %d scratch %.2g%% full), high %d\n",
2282e6055b3ea14a04fcde1ac1974a70bf00b1e295bkkinnunen                 stats.fTotal, fBudgetedCount, stats.fWrapped, stats.fNumNonPurgeable,
2292e6055b3ea14a04fcde1ac1974a70bf00b1e295bkkinnunen                 stats.fScratch, countUtilization, fHighWaterCount);
230b9eb4ac0f1c29d6fe10ad7ff81ed8326ac1ea043mtklein    out->appendf("\t\tEntry Bytes: current %d (budgeted %d, %.2g%% full, %d unbudgeted) high %d\n",
231f320e04c50a1c8a861bc1d8f50bf732044ff9843bsalomon                 SkToInt(fBytes), SkToInt(fBudgetedBytes), byteUtilization,
232f320e04c50a1c8a861bc1d8f50bf732044ff9843bsalomon                 SkToInt(stats.fUnbudgetedSize), SkToInt(fHighWaterBytes));
233b9eb4ac0f1c29d6fe10ad7ff81ed8326ac1ea043mtklein}
234b9eb4ac0f1c29d6fe10ad7ff81ed8326ac1ea043mtklein
235dc5685ac3752e90dd68179e9f1675ff6f15ed600joshualittvoid GrResourceCache::dumpStatsKeyValuePairs(SkTArray<SkString>* keys,
236dc5685ac3752e90dd68179e9f1675ff6f15ed600joshualitt                                             SkTArray<double>* values) const {
237dc5685ac3752e90dd68179e9f1675ff6f15ed600joshualitt    this->validate();
238dc5685ac3752e90dd68179e9f1675ff6f15ed600joshualitt
239dc5685ac3752e90dd68179e9f1675ff6f15ed600joshualitt    Stats stats;
240dc5685ac3752e90dd68179e9f1675ff6f15ed600joshualitt    this->getStats(&stats);
241dc5685ac3752e90dd68179e9f1675ff6f15ed600joshualitt
242dc5685ac3752e90dd68179e9f1675ff6f15ed600joshualitt    keys->push_back(SkString("gpu_cache_purgable_entries")); values->push_back(stats.fNumPurgeable);
243dc5685ac3752e90dd68179e9f1675ff6f15ed600joshualitt}
244dc5685ac3752e90dd68179e9f1675ff6f15ed600joshualitt
245b9eb4ac0f1c29d6fe10ad7ff81ed8326ac1ea043mtklein#endif
246b9eb4ac0f1c29d6fe10ad7ff81ed8326ac1ea043mtklein
247ddf30e64fe474847b204d7062fad3341d245062cbsalomon///////////////////////////////////////////////////////////////////////////////
248ddf30e64fe474847b204d7062fad3341d245062cbsalomon
249ddf30e64fe474847b204d7062fad3341d245062cbsalomonvoid GrResourceCache::changeTimestamp(uint32_t newTimestamp) { fTimestamp = newTimestamp; }
250b9eb4ac0f1c29d6fe10ad7ff81ed8326ac1ea043mtklein
2511090da6433db575d59b93aec99f6bda49b808b84Brian Salomon#ifdef SK_DEBUG
2521090da6433db575d59b93aec99f6bda49b808b84Brian Salomonint GrResourceCache::countUniqueKeysWithTag(const char* tag) const {
2531090da6433db575d59b93aec99f6bda49b808b84Brian Salomon    int count = 0;
2541090da6433db575d59b93aec99f6bda49b808b84Brian Salomon    UniqueHash::ConstIter iter(&fUniqueHash);
2551090da6433db575d59b93aec99f6bda49b808b84Brian Salomon    while (!iter.done()) {
2561090da6433db575d59b93aec99f6bda49b808b84Brian Salomon        if (0 == strcmp(tag, (*iter).getUniqueKey().tag())) {
2571090da6433db575d59b93aec99f6bda49b808b84Brian Salomon            ++count;
2581090da6433db575d59b93aec99f6bda49b808b84Brian Salomon        }
2591090da6433db575d59b93aec99f6bda49b808b84Brian Salomon        ++iter;
2601090da6433db575d59b93aec99f6bda49b808b84Brian Salomon    }
2611090da6433db575d59b93aec99f6bda49b808b84Brian Salomon    return count;
2621090da6433db575d59b93aec99f6bda49b808b84Brian Salomon}
2631090da6433db575d59b93aec99f6bda49b808b84Brian Salomon#endif
2641090da6433db575d59b93aec99f6bda49b808b84Brian Salomon
265334355742137cc238887d4f85856e6c4d9ec8aa8bsalomon///////////////////////////////////////////////////////////////////////////////
266f5883a6d75a18c581507214d3057b5c721ed1ffcjoshualitt
267f5883a6d75a18c581507214d3057b5c721ed1ffcjoshualitt#define ASSERT_SINGLE_OWNER \
268a90aa2bfd430ca9bc321c3c7b3f1c727927606d1Robert Phillips    SkDEBUGCODE(GrSingleOwner::AutoEnforce debug_SingleOwner(fRenderTargetContext->singleOwner());)
269f5883a6d75a18c581507214d3057b5c721ed1ffcjoshualitt
270706a6ff60c55bee85cff06fc9f8f3764f6e5154bChris Dalton
271a32a3c32c32e02baecffb537f6f26c0a67a1c130Chris Daltonuint32_t GrRenderTargetContextPriv::testingOnly_getOpListID() {
272a32a3c32c32e02baecffb537f6f26c0a67a1c130Chris Dalton    return fRenderTargetContext->getOpList()->uniqueID();
273a32a3c32c32e02baecffb537f6f26c0a67a1c130Chris Dalton}
274a32a3c32c32e02baecffb537f6f26c0a67a1c130Chris Dalton
275ac70f84e7f4fc9ddd344753b92cdf4be540d32bfBrian Salomonuint32_t GrRenderTargetContextPriv::testingOnly_addDrawOp(std::unique_ptr<GrDrawOp> op) {
276706a6ff60c55bee85cff06fc9f8f3764f6e5154bChris Dalton    return this->testingOnly_addDrawOp(GrNoClip(), std::move(op));
277706a6ff60c55bee85cff06fc9f8f3764f6e5154bChris Dalton}
278706a6ff60c55bee85cff06fc9f8f3764f6e5154bChris Dalton
279706a6ff60c55bee85cff06fc9f8f3764f6e5154bChris Daltonuint32_t GrRenderTargetContextPriv::testingOnly_addDrawOp(const GrClip& clip,
280706a6ff60c55bee85cff06fc9f8f3764f6e5154bChris Dalton                                                          std::unique_ptr<GrDrawOp> op) {
281ac70f84e7f4fc9ddd344753b92cdf4be540d32bfBrian Salomon    ASSERT_SINGLE_OWNER
282ac70f84e7f4fc9ddd344753b92cdf4be540d32bfBrian Salomon    if (fRenderTargetContext->drawingManager()->wasAbandoned()) {
283ac70f84e7f4fc9ddd344753b92cdf4be540d32bfBrian Salomon        return SK_InvalidUniqueID;
284ac70f84e7f4fc9ddd344753b92cdf4be540d32bfBrian Salomon    }
285ac70f84e7f4fc9ddd344753b92cdf4be540d32bfBrian Salomon    SkDEBUGCODE(fRenderTargetContext->validate());
286ac70f84e7f4fc9ddd344753b92cdf4be540d32bfBrian Salomon    GR_AUDIT_TRAIL_AUTO_FRAME(fRenderTargetContext->fAuditTrail,
287ac70f84e7f4fc9ddd344753b92cdf4be540d32bfBrian Salomon                              "GrRenderTargetContext::testingOnly_addDrawOp");
288706a6ff60c55bee85cff06fc9f8f3764f6e5154bChris Dalton    return fRenderTargetContext->addDrawOp(clip, std::move(op));
289ac70f84e7f4fc9ddd344753b92cdf4be540d32bfBrian Salomon}
290ac70f84e7f4fc9ddd344753b92cdf4be540d32bfBrian Salomon
291f5883a6d75a18c581507214d3057b5c721ed1ffcjoshualitt#undef ASSERT_SINGLE_OWNER
292f5883a6d75a18c581507214d3057b5c721ed1ffcjoshualitt
293f5883a6d75a18c581507214d3057b5c721ed1ffcjoshualitt///////////////////////////////////////////////////////////////////////////////
294f9635999a4aa8810d04e8ef04594a9fbcc061e3dcsmartdalton
295c4f0a8245ccf0d14f6a6dffc73ff56b563012b69Robert PhillipsGrRenderTargetFlags GrRenderTargetProxy::testingOnly_getFlags() const {
296dac5f6bcbec7130a209a6899444feb022719498dBrian Salomon    return fRenderTargetFlags;
297f9635999a4aa8810d04e8ef04594a9fbcc061e3dcsmartdalton}
298f9635999a4aa8810d04e8ef04594a9fbcc061e3dcsmartdalton
299177266339c3aa6dda4fa2912af9eaa8e8206f78fBrian Salomon//////////////////////////////////////////////////////////////////////////////
300177266339c3aa6dda4fa2912af9eaa8e8206f78fBrian Salomon
301fe199b7d512a7cfc56deaaa134260e1d47a1e7e0Chris Daltonvoid GrContextPriv::testingOnly_flushAndRemoveOnFlushCallbackObject(GrOnFlushCallbackObject* cb) {
302fe199b7d512a7cfc56deaaa134260e1d47a1e7e0Chris Dalton    fContext->flush();
303fe199b7d512a7cfc56deaaa134260e1d47a1e7e0Chris Dalton    fContext->fDrawingManager->testingOnly_removeOnFlushCallbackObject(cb);
304fe199b7d512a7cfc56deaaa134260e1d47a1e7e0Chris Dalton}
305fe199b7d512a7cfc56deaaa134260e1d47a1e7e0Chris Dalton
306fe199b7d512a7cfc56deaaa134260e1d47a1e7e0Chris Daltonvoid GrDrawingManager::testingOnly_removeOnFlushCallbackObject(GrOnFlushCallbackObject* cb) {
307fe199b7d512a7cfc56deaaa134260e1d47a1e7e0Chris Dalton    int n = std::find(fOnFlushCBObjects.begin(), fOnFlushCBObjects.end(), cb) -
308fe199b7d512a7cfc56deaaa134260e1d47a1e7e0Chris Dalton            fOnFlushCBObjects.begin();
309fe199b7d512a7cfc56deaaa134260e1d47a1e7e0Chris Dalton    SkASSERT(n < fOnFlushCBObjects.count());
310fe199b7d512a7cfc56deaaa134260e1d47a1e7e0Chris Dalton    fOnFlushCBObjects.removeShuffle(n);
311fe199b7d512a7cfc56deaaa134260e1d47a1e7e0Chris Dalton}
312177266339c3aa6dda4fa2912af9eaa8e8206f78fBrian Salomon
313177266339c3aa6dda4fa2912af9eaa8e8206f78fBrian Salomon//////////////////////////////////////////////////////////////////////////////
314177266339c3aa6dda4fa2912af9eaa8e8206f78fBrian Salomon
3152a30390ce6130b27c18152edf75d48616adeb934Greg DanielGrPixelConfig GrBackendTexture::testingOnly_getPixelConfig() const {
3162a30390ce6130b27c18152edf75d48616adeb934Greg Daniel    return fConfig;
3172a30390ce6130b27c18152edf75d48616adeb934Greg Daniel}
3182a30390ce6130b27c18152edf75d48616adeb934Greg Daniel
3192a30390ce6130b27c18152edf75d48616adeb934Greg DanielGrPixelConfig GrBackendRenderTarget::testingOnly_getPixelConfig() const {
3202a30390ce6130b27c18152edf75d48616adeb934Greg Daniel    return fConfig;
3212a30390ce6130b27c18152edf75d48616adeb934Greg Daniel}
3222a30390ce6130b27c18152edf75d48616adeb934Greg Daniel
3232a30390ce6130b27c18152edf75d48616adeb934Greg Daniel//////////////////////////////////////////////////////////////////////////////
3242a30390ce6130b27c18152edf75d48616adeb934Greg Daniel
325177266339c3aa6dda4fa2912af9eaa8e8206f78fBrian Salomon#define DRAW_OP_TEST_EXTERN(Op) \
326815486c42f1ca66c81e12d8ccc9fb142e3c10544Brian Salomon    extern std::unique_ptr<GrDrawOp> Op##__Test(GrPaint&&, SkRandom*, GrContext*, GrFSAAType)
327177266339c3aa6dda4fa2912af9eaa8e8206f78fBrian Salomon#define DRAW_OP_TEST_ENTRY(Op) Op##__Test
328177266339c3aa6dda4fa2912af9eaa8e8206f78fBrian Salomon
32910978a6eade1031881bc1793d01ec6d841519778Brian SalomonDRAW_OP_TEST_EXTERN(AAConvexPathOp);
330815486c42f1ca66c81e12d8ccc9fb142e3c10544Brian SalomonDRAW_OP_TEST_EXTERN(AAFillRectOp);
331b295573c93e7a9a78ee736a399c256d7669b79beBrian SalomonDRAW_OP_TEST_EXTERN(AAFlatteningConvexPathOp);
332a531f2502846c4d4eed42b91589d70525c8de0d2Brian SalomonDRAW_OP_TEST_EXTERN(AAHairlineOp);
333baaf439eb5d08097d794f13800e5bf7ce8885f95Brian SalomonDRAW_OP_TEST_EXTERN(AAStrokeRectOp);
334815486c42f1ca66c81e12d8ccc9fb142e3c10544Brian SalomonDRAW_OP_TEST_EXTERN(CircleOp);
33598222ac41db83d060433fba0004acb580c54dfe4Brian SalomonDRAW_OP_TEST_EXTERN(DashOp);
336ee3e0bacc8bedd1e3ebfb52fbc8b1cc3ccdad358Brian SalomonDRAW_OP_TEST_EXTERN(DefaultPathOp);
33705441c40d628f077a92f91bd73bb3ec970ba6f00Brian SalomonDRAW_OP_TEST_EXTERN(DIEllipseOp);
33805441c40d628f077a92f91bd73bb3ec970ba6f00Brian SalomonDRAW_OP_TEST_EXTERN(EllipseOp);
33944acb5b09bb87163bc9c010be915b3f33e3157ebBrian SalomonDRAW_OP_TEST_EXTERN(GrAtlasTextOp);
3400088f948177609bc26ac36734f94186ac9e0541dBrian SalomonDRAW_OP_TEST_EXTERN(GrDrawAtlasOp);
341c2f425440aca5b29b94e5921dbc02e56650ce651Brian SalomonDRAW_OP_TEST_EXTERN(GrDrawVerticesOp);
342815486c42f1ca66c81e12d8ccc9fb142e3c10544Brian SalomonDRAW_OP_TEST_EXTERN(NonAAFillRectOp);
343815486c42f1ca66c81e12d8ccc9fb142e3c10544Brian SalomonDRAW_OP_TEST_EXTERN(NonAALatticeOp);
344baaf439eb5d08097d794f13800e5bf7ce8885f95Brian SalomonDRAW_OP_TEST_EXTERN(NonAAStrokeRectOp);
3450596909b055eb9493ba429cc09eae4a2ec53f158Brian SalomonDRAW_OP_TEST_EXTERN(ShadowRRectOp);
346febbd23eb75d71e5238a607a56450deac85d2e5fBrian SalomonDRAW_OP_TEST_EXTERN(SmallPathOp);
347f0366326cc565c9e1535e4ac4baf273d7ea0d816Brian SalomonDRAW_OP_TEST_EXTERN(RegionOp);
34805441c40d628f077a92f91bd73bb3ec970ba6f00Brian SalomonDRAW_OP_TEST_EXTERN(RRectOp);
3499530f7ebf529acce1d6e99fa40032bbf13826a03Brian SalomonDRAW_OP_TEST_EXTERN(TesselatingPathOp);
3503416969605137214a9e1b1fb85182e5640a655abBrian SalomonDRAW_OP_TEST_EXTERN(TextureOp);
351177266339c3aa6dda4fa2912af9eaa8e8206f78fBrian Salomon
352177266339c3aa6dda4fa2912af9eaa8e8206f78fBrian Salomonvoid GrDrawRandomOp(SkRandom* random, GrRenderTargetContext* renderTargetContext, GrPaint&& paint) {
353177266339c3aa6dda4fa2912af9eaa8e8206f78fBrian Salomon    GrContext* context = renderTargetContext->surfPriv().getContext();
354177266339c3aa6dda4fa2912af9eaa8e8206f78fBrian Salomon    using MakeDrawOpFn = std::unique_ptr<GrDrawOp>(GrPaint&&, SkRandom*, GrContext*, GrFSAAType);
355177266339c3aa6dda4fa2912af9eaa8e8206f78fBrian Salomon    static constexpr MakeDrawOpFn* gFactories[] = {
3563416969605137214a9e1b1fb85182e5640a655abBrian Salomon            DRAW_OP_TEST_ENTRY(AAConvexPathOp),
3573416969605137214a9e1b1fb85182e5640a655abBrian Salomon            DRAW_OP_TEST_ENTRY(AAFillRectOp),
3583416969605137214a9e1b1fb85182e5640a655abBrian Salomon            DRAW_OP_TEST_ENTRY(AAFlatteningConvexPathOp),
3593416969605137214a9e1b1fb85182e5640a655abBrian Salomon            DRAW_OP_TEST_ENTRY(AAHairlineOp),
3603416969605137214a9e1b1fb85182e5640a655abBrian Salomon            DRAW_OP_TEST_ENTRY(AAStrokeRectOp),
3613416969605137214a9e1b1fb85182e5640a655abBrian Salomon            DRAW_OP_TEST_ENTRY(CircleOp),
3623416969605137214a9e1b1fb85182e5640a655abBrian Salomon            DRAW_OP_TEST_ENTRY(DashOp),
3633416969605137214a9e1b1fb85182e5640a655abBrian Salomon            DRAW_OP_TEST_ENTRY(DefaultPathOp),
3643416969605137214a9e1b1fb85182e5640a655abBrian Salomon            DRAW_OP_TEST_ENTRY(DIEllipseOp),
3653416969605137214a9e1b1fb85182e5640a655abBrian Salomon            DRAW_OP_TEST_ENTRY(EllipseOp),
3663416969605137214a9e1b1fb85182e5640a655abBrian Salomon            DRAW_OP_TEST_ENTRY(GrAtlasTextOp),
3673416969605137214a9e1b1fb85182e5640a655abBrian Salomon            DRAW_OP_TEST_ENTRY(GrDrawAtlasOp),
3683416969605137214a9e1b1fb85182e5640a655abBrian Salomon            DRAW_OP_TEST_ENTRY(GrDrawVerticesOp),
3693416969605137214a9e1b1fb85182e5640a655abBrian Salomon            DRAW_OP_TEST_ENTRY(NonAAFillRectOp),
3703416969605137214a9e1b1fb85182e5640a655abBrian Salomon            DRAW_OP_TEST_ENTRY(NonAALatticeOp),
3713416969605137214a9e1b1fb85182e5640a655abBrian Salomon            DRAW_OP_TEST_ENTRY(NonAAStrokeRectOp),
3723416969605137214a9e1b1fb85182e5640a655abBrian Salomon            DRAW_OP_TEST_ENTRY(ShadowRRectOp),
3733416969605137214a9e1b1fb85182e5640a655abBrian Salomon            DRAW_OP_TEST_ENTRY(SmallPathOp),
3743416969605137214a9e1b1fb85182e5640a655abBrian Salomon            DRAW_OP_TEST_ENTRY(RegionOp),
3753416969605137214a9e1b1fb85182e5640a655abBrian Salomon            DRAW_OP_TEST_ENTRY(RRectOp),
3763416969605137214a9e1b1fb85182e5640a655abBrian Salomon            DRAW_OP_TEST_ENTRY(TesselatingPathOp),
3773416969605137214a9e1b1fb85182e5640a655abBrian Salomon            DRAW_OP_TEST_ENTRY(TextureOp),
378177266339c3aa6dda4fa2912af9eaa8e8206f78fBrian Salomon    };
379177266339c3aa6dda4fa2912af9eaa8e8206f78fBrian Salomon
380fc26f3ca5f8f01b4ef47fd7ced4c589205e45ae8Brian Salomon    static constexpr size_t kTotal = SK_ARRAY_COUNT(gFactories);
381177266339c3aa6dda4fa2912af9eaa8e8206f78fBrian Salomon    uint32_t index = random->nextULessThan(static_cast<uint32_t>(kTotal));
382fc26f3ca5f8f01b4ef47fd7ced4c589205e45ae8Brian Salomon    auto op = gFactories[index](
383fc26f3ca5f8f01b4ef47fd7ced4c589205e45ae8Brian Salomon            std::move(paint), random, context, renderTargetContext->fsaaType());
384fc26f3ca5f8f01b4ef47fd7ced4c589205e45ae8Brian Salomon    SkASSERT(op);
385fc26f3ca5f8f01b4ef47fd7ced4c589205e45ae8Brian Salomon    renderTargetContext->priv().testingOnly_addDrawOp(std::move(op));
386177266339c3aa6dda4fa2912af9eaa8e8206f78fBrian Salomon}
387