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