1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2019 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "include/gpu/GrRecordingContext.h" 9cb93a386Sopenharmony_ci 10cb93a386Sopenharmony_ci#include "include/gpu/GrContextThreadSafeProxy.h" 11cb93a386Sopenharmony_ci#include "src/core/SkArenaAlloc.h" 12cb93a386Sopenharmony_ci#include "src/gpu/GrAuditTrail.h" 13cb93a386Sopenharmony_ci#include "src/gpu/GrCaps.h" 14cb93a386Sopenharmony_ci#include "src/gpu/GrContextThreadSafeProxyPriv.h" 15cb93a386Sopenharmony_ci#include "src/gpu/GrDrawingManager.h" 16cb93a386Sopenharmony_ci#include "src/gpu/GrMemoryPool.h" 17cb93a386Sopenharmony_ci#include "src/gpu/GrProgramDesc.h" 18cb93a386Sopenharmony_ci#include "src/gpu/GrProxyProvider.h" 19cb93a386Sopenharmony_ci#include "src/gpu/GrRecordingContextPriv.h" 20cb93a386Sopenharmony_ci#include "src/gpu/SkGr.h" 21cb93a386Sopenharmony_ci#include "src/gpu/SurfaceContext.h" 22cb93a386Sopenharmony_ci#include "src/gpu/effects/GrSkSLFP.h" 23cb93a386Sopenharmony_ci#include "src/gpu/text/GrTextBlob.h" 24cb93a386Sopenharmony_ci#include "src/gpu/text/GrTextBlobCache.h" 25cb93a386Sopenharmony_ci 26cb93a386Sopenharmony_ci#if SK_GPU_V1 27cb93a386Sopenharmony_ci#include "src/gpu/ops/AtlasTextOp.h" 28cb93a386Sopenharmony_ci#endif 29cb93a386Sopenharmony_ci 30cb93a386Sopenharmony_ciGrRecordingContext::ProgramData::ProgramData(std::unique_ptr<const GrProgramDesc> desc, 31cb93a386Sopenharmony_ci const GrProgramInfo* info) 32cb93a386Sopenharmony_ci : fDesc(std::move(desc)) 33cb93a386Sopenharmony_ci , fInfo(info) { 34cb93a386Sopenharmony_ci} 35cb93a386Sopenharmony_ci 36cb93a386Sopenharmony_ciGrRecordingContext::ProgramData::ProgramData(ProgramData&& other) 37cb93a386Sopenharmony_ci : fDesc(std::move(other.fDesc)) 38cb93a386Sopenharmony_ci , fInfo(other.fInfo) { 39cb93a386Sopenharmony_ci} 40cb93a386Sopenharmony_ci 41cb93a386Sopenharmony_ciGrRecordingContext::ProgramData::~ProgramData() = default; 42cb93a386Sopenharmony_ci 43cb93a386Sopenharmony_ciGrRecordingContext::GrRecordingContext(sk_sp<GrContextThreadSafeProxy> proxy, bool ddlRecording) 44cb93a386Sopenharmony_ci : INHERITED(std::move(proxy)) 45cb93a386Sopenharmony_ci , fAuditTrail(new GrAuditTrail()) 46cb93a386Sopenharmony_ci , fArenas(ddlRecording) { 47cb93a386Sopenharmony_ci fProxyProvider = std::make_unique<GrProxyProvider>(this); 48cb93a386Sopenharmony_ci} 49cb93a386Sopenharmony_ci 50cb93a386Sopenharmony_ciGrRecordingContext::~GrRecordingContext() { 51cb93a386Sopenharmony_ci#if SK_GPU_V1 52cb93a386Sopenharmony_ci skgpu::v1::AtlasTextOp::ClearCache(); 53cb93a386Sopenharmony_ci#endif 54cb93a386Sopenharmony_ci} 55cb93a386Sopenharmony_ci 56cb93a386Sopenharmony_ciint GrRecordingContext::maxSurfaceSampleCountForColorType(SkColorType colorType) const { 57cb93a386Sopenharmony_ci GrBackendFormat format = 58cb93a386Sopenharmony_ci this->caps()->getDefaultBackendFormat(SkColorTypeToGrColorType(colorType), 59cb93a386Sopenharmony_ci GrRenderable::kYes); 60cb93a386Sopenharmony_ci return this->caps()->maxRenderTargetSampleCount(format); 61cb93a386Sopenharmony_ci} 62cb93a386Sopenharmony_ci 63cb93a386Sopenharmony_cibool GrRecordingContext::init() { 64cb93a386Sopenharmony_ci if (!INHERITED::init()) { 65cb93a386Sopenharmony_ci return false; 66cb93a386Sopenharmony_ci } 67cb93a386Sopenharmony_ci 68cb93a386Sopenharmony_ci#if SK_GPU_V1 69cb93a386Sopenharmony_ci skgpu::v1::PathRendererChain::Options prcOptions; 70cb93a386Sopenharmony_ci prcOptions.fAllowPathMaskCaching = this->options().fAllowPathMaskCaching; 71cb93a386Sopenharmony_ci#if GR_TEST_UTILS 72cb93a386Sopenharmony_ci prcOptions.fGpuPathRenderers = this->options().fGpuPathRenderers; 73cb93a386Sopenharmony_ci#endif 74cb93a386Sopenharmony_ci // FIXME: Once this is removed from Chrome and Android, rename to fEnable"". 75cb93a386Sopenharmony_ci if (this->options().fDisableDistanceFieldPaths) { 76cb93a386Sopenharmony_ci prcOptions.fGpuPathRenderers &= ~GpuPathRenderers::kSmall; 77cb93a386Sopenharmony_ci } 78cb93a386Sopenharmony_ci#endif 79cb93a386Sopenharmony_ci 80cb93a386Sopenharmony_ci bool reduceOpsTaskSplitting = true; 81cb93a386Sopenharmony_ci if (this->caps()->avoidReorderingRenderTasks()) { 82cb93a386Sopenharmony_ci reduceOpsTaskSplitting = false; 83cb93a386Sopenharmony_ci } else if (GrContextOptions::Enable::kYes == this->options().fReduceOpsTaskSplitting) { 84cb93a386Sopenharmony_ci reduceOpsTaskSplitting = true; 85cb93a386Sopenharmony_ci } else if (GrContextOptions::Enable::kNo == this->options().fReduceOpsTaskSplitting) { 86cb93a386Sopenharmony_ci reduceOpsTaskSplitting = false; 87cb93a386Sopenharmony_ci } 88cb93a386Sopenharmony_ci fDrawingManager.reset(new GrDrawingManager(this, 89cb93a386Sopenharmony_ci#if SK_GPU_V1 90cb93a386Sopenharmony_ci prcOptions, 91cb93a386Sopenharmony_ci#endif 92cb93a386Sopenharmony_ci reduceOpsTaskSplitting)); 93cb93a386Sopenharmony_ci return true; 94cb93a386Sopenharmony_ci} 95cb93a386Sopenharmony_ci 96cb93a386Sopenharmony_civoid GrRecordingContext::abandonContext() { 97cb93a386Sopenharmony_ci INHERITED::abandonContext(); 98cb93a386Sopenharmony_ci 99cb93a386Sopenharmony_ci this->destroyDrawingManager(); 100cb93a386Sopenharmony_ci} 101cb93a386Sopenharmony_ci 102cb93a386Sopenharmony_ciGrDrawingManager* GrRecordingContext::drawingManager() { 103cb93a386Sopenharmony_ci return fDrawingManager.get(); 104cb93a386Sopenharmony_ci} 105cb93a386Sopenharmony_ci 106cb93a386Sopenharmony_civoid GrRecordingContext::destroyDrawingManager() { 107cb93a386Sopenharmony_ci fDrawingManager.reset(); 108cb93a386Sopenharmony_ci} 109cb93a386Sopenharmony_ci 110cb93a386Sopenharmony_ciGrRecordingContext::Arenas::Arenas(SkArenaAlloc* recordTimeAllocator, 111cb93a386Sopenharmony_ci GrSubRunAllocator* subRunAllocator) 112cb93a386Sopenharmony_ci : fRecordTimeAllocator(recordTimeAllocator) 113cb93a386Sopenharmony_ci , fRecordTimeSubRunAllocator(subRunAllocator) { 114cb93a386Sopenharmony_ci // OwnedArenas should instantiate these before passing the bare pointer off to this struct. 115cb93a386Sopenharmony_ci SkASSERT(subRunAllocator); 116cb93a386Sopenharmony_ci} 117cb93a386Sopenharmony_ci 118cb93a386Sopenharmony_ci// Must be defined here so that std::unique_ptr can see the sizes of the various pools, otherwise 119cb93a386Sopenharmony_ci// it can't generate a default destructor for them. 120cb93a386Sopenharmony_ciGrRecordingContext::OwnedArenas::OwnedArenas(bool ddlRecording) : fDDLRecording(ddlRecording) {} 121cb93a386Sopenharmony_ciGrRecordingContext::OwnedArenas::~OwnedArenas() {} 122cb93a386Sopenharmony_ci 123cb93a386Sopenharmony_ciGrRecordingContext::OwnedArenas& GrRecordingContext::OwnedArenas::operator=(OwnedArenas&& a) { 124cb93a386Sopenharmony_ci fDDLRecording = a.fDDLRecording; 125cb93a386Sopenharmony_ci fRecordTimeAllocator = std::move(a.fRecordTimeAllocator); 126cb93a386Sopenharmony_ci fRecordTimeSubRunAllocator = std::move(a.fRecordTimeSubRunAllocator); 127cb93a386Sopenharmony_ci return *this; 128cb93a386Sopenharmony_ci} 129cb93a386Sopenharmony_ci 130cb93a386Sopenharmony_ciGrRecordingContext::Arenas GrRecordingContext::OwnedArenas::get() { 131cb93a386Sopenharmony_ci if (!fRecordTimeAllocator && fDDLRecording) { 132cb93a386Sopenharmony_ci // TODO: empirically determine a better number for SkArenaAlloc's firstHeapAllocation param 133cb93a386Sopenharmony_ci fRecordTimeAllocator = std::make_unique<SkArenaAlloc>(1024); 134cb93a386Sopenharmony_ci } 135cb93a386Sopenharmony_ci 136cb93a386Sopenharmony_ci if (!fRecordTimeSubRunAllocator) { 137cb93a386Sopenharmony_ci fRecordTimeSubRunAllocator = std::make_unique<GrSubRunAllocator>(); 138cb93a386Sopenharmony_ci } 139cb93a386Sopenharmony_ci 140cb93a386Sopenharmony_ci return {fRecordTimeAllocator.get(), fRecordTimeSubRunAllocator.get()}; 141cb93a386Sopenharmony_ci} 142cb93a386Sopenharmony_ci 143cb93a386Sopenharmony_ciGrRecordingContext::OwnedArenas&& GrRecordingContext::detachArenas() { 144cb93a386Sopenharmony_ci return std::move(fArenas); 145cb93a386Sopenharmony_ci} 146cb93a386Sopenharmony_ci 147cb93a386Sopenharmony_ciGrTextBlobCache* GrRecordingContext::getTextBlobCache() { 148cb93a386Sopenharmony_ci return fThreadSafeProxy->priv().getTextBlobCache(); 149cb93a386Sopenharmony_ci} 150cb93a386Sopenharmony_ci 151cb93a386Sopenharmony_ciconst GrTextBlobCache* GrRecordingContext::getTextBlobCache() const { 152cb93a386Sopenharmony_ci return fThreadSafeProxy->priv().getTextBlobCache(); 153cb93a386Sopenharmony_ci} 154cb93a386Sopenharmony_ci 155cb93a386Sopenharmony_ciGrThreadSafeCache* GrRecordingContext::threadSafeCache() { 156cb93a386Sopenharmony_ci return fThreadSafeProxy->priv().threadSafeCache(); 157cb93a386Sopenharmony_ci} 158cb93a386Sopenharmony_ci 159cb93a386Sopenharmony_ciconst GrThreadSafeCache* GrRecordingContext::threadSafeCache() const { 160cb93a386Sopenharmony_ci return fThreadSafeProxy->priv().threadSafeCache(); 161cb93a386Sopenharmony_ci} 162cb93a386Sopenharmony_ci 163cb93a386Sopenharmony_civoid GrRecordingContext::addOnFlushCallbackObject(GrOnFlushCallbackObject* onFlushCBObject) { 164cb93a386Sopenharmony_ci this->drawingManager()->addOnFlushCallbackObject(onFlushCBObject); 165cb93a386Sopenharmony_ci} 166cb93a386Sopenharmony_ci 167cb93a386Sopenharmony_ci//////////////////////////////////////////////////////////////////////////////// 168cb93a386Sopenharmony_ci 169cb93a386Sopenharmony_ciint GrRecordingContext::maxTextureSize() const { return this->caps()->maxTextureSize(); } 170cb93a386Sopenharmony_ci 171cb93a386Sopenharmony_ciint GrRecordingContext::maxRenderTargetSize() const { return this->caps()->maxRenderTargetSize(); } 172cb93a386Sopenharmony_ci 173cb93a386Sopenharmony_cibool GrRecordingContext::colorTypeSupportedAsImage(SkColorType colorType) const { 174cb93a386Sopenharmony_ci GrBackendFormat format = 175cb93a386Sopenharmony_ci this->caps()->getDefaultBackendFormat(SkColorTypeToGrColorType(colorType), 176cb93a386Sopenharmony_ci GrRenderable::kNo); 177cb93a386Sopenharmony_ci return format.isValid(); 178cb93a386Sopenharmony_ci} 179cb93a386Sopenharmony_ci 180cb93a386Sopenharmony_ci/////////////////////////////////////////////////////////////////////////////////////////////////// 181cb93a386Sopenharmony_ci 182cb93a386Sopenharmony_ci#ifdef SK_ENABLE_DUMP_GPU 183cb93a386Sopenharmony_ci#include "src/utils/SkJSONWriter.h" 184cb93a386Sopenharmony_ci 185cb93a386Sopenharmony_civoid GrRecordingContext::dumpJSON(SkJSONWriter* writer) const { 186cb93a386Sopenharmony_ci writer->beginObject(); 187cb93a386Sopenharmony_ci 188cb93a386Sopenharmony_ci#if GR_GPU_STATS 189cb93a386Sopenharmony_ci writer->appendS32("path_masks_generated", this->stats()->numPathMasksGenerated()); 190cb93a386Sopenharmony_ci writer->appendS32("path_mask_cache_hits", this->stats()->numPathMaskCacheHits()); 191cb93a386Sopenharmony_ci#endif 192cb93a386Sopenharmony_ci 193cb93a386Sopenharmony_ci writer->endObject(); 194cb93a386Sopenharmony_ci} 195cb93a386Sopenharmony_ci#else 196cb93a386Sopenharmony_civoid GrRecordingContext::dumpJSON(SkJSONWriter*) const { } 197cb93a386Sopenharmony_ci#endif 198cb93a386Sopenharmony_ci 199cb93a386Sopenharmony_ci#if GR_TEST_UTILS 200cb93a386Sopenharmony_ci 201cb93a386Sopenharmony_ci#if GR_GPU_STATS 202cb93a386Sopenharmony_ci 203cb93a386Sopenharmony_civoid GrRecordingContext::Stats::dump(SkString* out) const { 204cb93a386Sopenharmony_ci out->appendf("Num Path Masks Generated: %d\n", fNumPathMasksGenerated); 205cb93a386Sopenharmony_ci out->appendf("Num Path Mask Cache Hits: %d\n", fNumPathMaskCacheHits); 206cb93a386Sopenharmony_ci} 207cb93a386Sopenharmony_ci 208cb93a386Sopenharmony_civoid GrRecordingContext::Stats::dumpKeyValuePairs(SkTArray<SkString>* keys, 209cb93a386Sopenharmony_ci SkTArray<double>* values) const { 210cb93a386Sopenharmony_ci keys->push_back(SkString("path_masks_generated")); 211cb93a386Sopenharmony_ci values->push_back(fNumPathMasksGenerated); 212cb93a386Sopenharmony_ci 213cb93a386Sopenharmony_ci keys->push_back(SkString("path_mask_cache_hits")); 214cb93a386Sopenharmony_ci values->push_back(fNumPathMaskCacheHits); 215cb93a386Sopenharmony_ci} 216cb93a386Sopenharmony_ci 217cb93a386Sopenharmony_civoid GrRecordingContext::DMSAAStats::dumpKeyValuePairs(SkTArray<SkString>* keys, 218cb93a386Sopenharmony_ci SkTArray<double>* values) const { 219cb93a386Sopenharmony_ci keys->push_back(SkString("dmsaa_render_passes")); 220cb93a386Sopenharmony_ci values->push_back(fNumRenderPasses); 221cb93a386Sopenharmony_ci 222cb93a386Sopenharmony_ci keys->push_back(SkString("dmsaa_multisample_render_passes")); 223cb93a386Sopenharmony_ci values->push_back(fNumMultisampleRenderPasses); 224cb93a386Sopenharmony_ci 225cb93a386Sopenharmony_ci for (const auto& [name, count] : fTriggerCounts) { 226cb93a386Sopenharmony_ci keys->push_back(SkStringPrintf("dmsaa_trigger_%s", name.c_str())); 227cb93a386Sopenharmony_ci values->push_back(count); 228cb93a386Sopenharmony_ci } 229cb93a386Sopenharmony_ci} 230cb93a386Sopenharmony_ci 231cb93a386Sopenharmony_civoid GrRecordingContext::DMSAAStats::dump() const { 232cb93a386Sopenharmony_ci SkDebugf("DMSAA Render Passes: %d\n", fNumRenderPasses); 233cb93a386Sopenharmony_ci SkDebugf("DMSAA Multisample Render Passes: %d\n", fNumMultisampleRenderPasses); 234cb93a386Sopenharmony_ci if (!fTriggerCounts.empty()) { 235cb93a386Sopenharmony_ci SkDebugf("DMSAA Triggers:\n"); 236cb93a386Sopenharmony_ci for (const auto& [name, count] : fTriggerCounts) { 237cb93a386Sopenharmony_ci SkDebugf(" %s: %d\n", name.c_str(), count); 238cb93a386Sopenharmony_ci } 239cb93a386Sopenharmony_ci } 240cb93a386Sopenharmony_ci} 241cb93a386Sopenharmony_ci 242cb93a386Sopenharmony_civoid GrRecordingContext::DMSAAStats::merge(const DMSAAStats& stats) { 243cb93a386Sopenharmony_ci fNumRenderPasses += stats.fNumRenderPasses; 244cb93a386Sopenharmony_ci fNumMultisampleRenderPasses += stats.fNumMultisampleRenderPasses; 245cb93a386Sopenharmony_ci for (const auto& [name, count] : stats.fTriggerCounts) { 246cb93a386Sopenharmony_ci fTriggerCounts[name] += count; 247cb93a386Sopenharmony_ci } 248cb93a386Sopenharmony_ci} 249cb93a386Sopenharmony_ci 250cb93a386Sopenharmony_ci#endif // GR_GPU_STATS 251cb93a386Sopenharmony_ci#endif // GR_TEST_UTILS 252cb93a386Sopenharmony_ci 253