1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2018 Google Inc.
3*c8dee2aaSAndroid Build Coastguard Worker *
4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker */
7*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrDirectContext.h"
8*c8dee2aaSAndroid Build Coastguard Worker
9*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkImageInfo.h"
10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPixmap.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSize.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSurface.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTextureCompressionType.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTraceMemoryDump.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/GpuTypes.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrBackendSemaphore.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrBackendSurface.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrContextThreadSafeProxy.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SingleOwner.h"
20*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTArray.h"
21*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTemplates.h"
22*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/gpu/ganesh/GrTypesPriv.h"
23*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkAutoMalloc.h"
24*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkCompressedDataUtils.h"
25*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkMipmap.h"
26*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkTaskGroup.h"
27*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkTraceEvent.h"
28*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/DataUtils.h"
29*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/GpuTypesPriv.h"
30*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/RefCntedCallback.h"
31*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/Swizzle.h"
32*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/Device.h"
33*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrBackendUtils.h"
34*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrCaps.h"
35*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrClientMappedBufferManager.h"
36*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrColorInfo.h"
37*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrContextThreadSafeProxyPriv.h"
38*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrDirectContextPriv.h"
39*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrDrawOpAtlas.h"
40*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrDrawingManager.h"
41*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrGpu.h"
42*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrPixmap.h"
43*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrProxyProvider.h"
44*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrRenderTargetProxy.h"
45*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrResourceCache.h"
46*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrResourceProvider.h"
47*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSemaphore.h" // IWYU pragma: keep
48*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrShaderCaps.h"
49*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSurfaceProxy.h"
50*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSurfaceProxyView.h"
51*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrThreadSafePipelineBuilder.h" // IWYU pragma: keep
52*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/SurfaceContext.h"
53*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/image/SkImage_GaneshBase.h"
54*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/mock/GrMockGpu.h"
55*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/ops/SmallPathAtlasMgr.h"
56*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/surface/SkSurface_Ganesh.h"
57*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/text/GrAtlasManager.h"
58*c8dee2aaSAndroid Build Coastguard Worker #include "src/image/SkImage_Base.h"
59*c8dee2aaSAndroid Build Coastguard Worker #include "src/image/SkSurface_Base.h"
60*c8dee2aaSAndroid Build Coastguard Worker #include "src/text/gpu/StrikeCache.h"
61*c8dee2aaSAndroid Build Coastguard Worker #include "src/text/gpu/TextBlobRedrawCoordinator.h"
62*c8dee2aaSAndroid Build Coastguard Worker
63*c8dee2aaSAndroid Build Coastguard Worker #include <array>
64*c8dee2aaSAndroid Build Coastguard Worker #include <atomic>
65*c8dee2aaSAndroid Build Coastguard Worker #include <forward_list>
66*c8dee2aaSAndroid Build Coastguard Worker #include <memory>
67*c8dee2aaSAndroid Build Coastguard Worker #include <utility>
68*c8dee2aaSAndroid Build Coastguard Worker
69*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_DIRECT3D
70*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/d3d/GrD3DGpu.h"
71*c8dee2aaSAndroid Build Coastguard Worker #endif
72*c8dee2aaSAndroid Build Coastguard Worker
73*c8dee2aaSAndroid Build Coastguard Worker using namespace skia_private;
74*c8dee2aaSAndroid Build Coastguard Worker
75*c8dee2aaSAndroid Build Coastguard Worker #define ASSERT_SINGLE_OWNER SKGPU_ASSERT_SINGLE_OWNER(this->singleOwner())
76*c8dee2aaSAndroid Build Coastguard Worker
77*c8dee2aaSAndroid Build Coastguard Worker using StrikeCache = sktext::gpu::StrikeCache;
78*c8dee2aaSAndroid Build Coastguard Worker
Next()79*c8dee2aaSAndroid Build Coastguard Worker GrDirectContext::DirectContextID GrDirectContext::DirectContextID::Next() {
80*c8dee2aaSAndroid Build Coastguard Worker static std::atomic<uint32_t> nextID{1};
81*c8dee2aaSAndroid Build Coastguard Worker uint32_t id;
82*c8dee2aaSAndroid Build Coastguard Worker do {
83*c8dee2aaSAndroid Build Coastguard Worker id = nextID.fetch_add(1, std::memory_order_relaxed);
84*c8dee2aaSAndroid Build Coastguard Worker } while (id == SK_InvalidUniqueID);
85*c8dee2aaSAndroid Build Coastguard Worker return DirectContextID(id);
86*c8dee2aaSAndroid Build Coastguard Worker }
87*c8dee2aaSAndroid Build Coastguard Worker
GrDirectContext(GrBackendApi backend,const GrContextOptions & options,sk_sp<GrContextThreadSafeProxy> proxy)88*c8dee2aaSAndroid Build Coastguard Worker GrDirectContext::GrDirectContext(GrBackendApi backend,
89*c8dee2aaSAndroid Build Coastguard Worker const GrContextOptions& options,
90*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrContextThreadSafeProxy> proxy)
91*c8dee2aaSAndroid Build Coastguard Worker : GrRecordingContext(std::move(proxy), false)
92*c8dee2aaSAndroid Build Coastguard Worker , fDeleteCallbackHelper(new DeleteCallbackHelper(options.fContextDeleteContext,
93*c8dee2aaSAndroid Build Coastguard Worker options.fContextDeleteProc))
94*c8dee2aaSAndroid Build Coastguard Worker , fDirectContextID(DirectContextID::Next()) {}
95*c8dee2aaSAndroid Build Coastguard Worker
~GrDirectContext()96*c8dee2aaSAndroid Build Coastguard Worker GrDirectContext::~GrDirectContext() {
97*c8dee2aaSAndroid Build Coastguard Worker ASSERT_SINGLE_OWNER
98*c8dee2aaSAndroid Build Coastguard Worker // this if-test protects against the case where the context is being destroyed
99*c8dee2aaSAndroid Build Coastguard Worker // before having been fully created
100*c8dee2aaSAndroid Build Coastguard Worker if (fGpu) {
101*c8dee2aaSAndroid Build Coastguard Worker this->flushAndSubmit();
102*c8dee2aaSAndroid Build Coastguard Worker }
103*c8dee2aaSAndroid Build Coastguard Worker
104*c8dee2aaSAndroid Build Coastguard Worker // We need to make sure all work is finished on the gpu before we start releasing resources.
105*c8dee2aaSAndroid Build Coastguard Worker this->syncAllOutstandingGpuWork(/*shouldExecuteWhileAbandoned=*/false);
106*c8dee2aaSAndroid Build Coastguard Worker
107*c8dee2aaSAndroid Build Coastguard Worker this->destroyDrawingManager();
108*c8dee2aaSAndroid Build Coastguard Worker
109*c8dee2aaSAndroid Build Coastguard Worker // Ideally we could just let the ptr drop, but resource cache queries this ptr in releaseAll.
110*c8dee2aaSAndroid Build Coastguard Worker if (fResourceCache) {
111*c8dee2aaSAndroid Build Coastguard Worker fResourceCache->releaseAll();
112*c8dee2aaSAndroid Build Coastguard Worker }
113*c8dee2aaSAndroid Build Coastguard Worker // This has to be after GrResourceCache::releaseAll so that other threads that are holding
114*c8dee2aaSAndroid Build Coastguard Worker // async pixel result don't try to destroy buffers off thread.
115*c8dee2aaSAndroid Build Coastguard Worker fMappedBufferManager.reset();
116*c8dee2aaSAndroid Build Coastguard Worker }
117*c8dee2aaSAndroid Build Coastguard Worker
threadSafeProxy()118*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrContextThreadSafeProxy> GrDirectContext::threadSafeProxy() {
119*c8dee2aaSAndroid Build Coastguard Worker return GrRecordingContext::threadSafeProxy();
120*c8dee2aaSAndroid Build Coastguard Worker }
121*c8dee2aaSAndroid Build Coastguard Worker
resetGLTextureBindings()122*c8dee2aaSAndroid Build Coastguard Worker void GrDirectContext::resetGLTextureBindings() {
123*c8dee2aaSAndroid Build Coastguard Worker if (this->abandoned() || this->backend() != GrBackendApi::kOpenGL) {
124*c8dee2aaSAndroid Build Coastguard Worker return;
125*c8dee2aaSAndroid Build Coastguard Worker }
126*c8dee2aaSAndroid Build Coastguard Worker fGpu->resetTextureBindings();
127*c8dee2aaSAndroid Build Coastguard Worker }
128*c8dee2aaSAndroid Build Coastguard Worker
resetContext(uint32_t state)129*c8dee2aaSAndroid Build Coastguard Worker void GrDirectContext::resetContext(uint32_t state) {
130*c8dee2aaSAndroid Build Coastguard Worker ASSERT_SINGLE_OWNER
131*c8dee2aaSAndroid Build Coastguard Worker fGpu->markContextDirty(state);
132*c8dee2aaSAndroid Build Coastguard Worker }
133*c8dee2aaSAndroid Build Coastguard Worker
abandonContext()134*c8dee2aaSAndroid Build Coastguard Worker void GrDirectContext::abandonContext() {
135*c8dee2aaSAndroid Build Coastguard Worker if (GrRecordingContext::abandoned()) {
136*c8dee2aaSAndroid Build Coastguard Worker return;
137*c8dee2aaSAndroid Build Coastguard Worker }
138*c8dee2aaSAndroid Build Coastguard Worker
139*c8dee2aaSAndroid Build Coastguard Worker if (fInsideReleaseProcCnt) {
140*c8dee2aaSAndroid Build Coastguard Worker SkDEBUGFAIL("Calling GrDirectContext::abandonContext() while inside a ReleaseProc is not "
141*c8dee2aaSAndroid Build Coastguard Worker "allowed");
142*c8dee2aaSAndroid Build Coastguard Worker return;
143*c8dee2aaSAndroid Build Coastguard Worker }
144*c8dee2aaSAndroid Build Coastguard Worker
145*c8dee2aaSAndroid Build Coastguard Worker GrRecordingContext::abandonContext();
146*c8dee2aaSAndroid Build Coastguard Worker
147*c8dee2aaSAndroid Build Coastguard Worker // We need to make sure all work is finished on the gpu before we start releasing resources.
148*c8dee2aaSAndroid Build Coastguard Worker this->syncAllOutstandingGpuWork(this->caps()->mustSyncGpuDuringAbandon());
149*c8dee2aaSAndroid Build Coastguard Worker
150*c8dee2aaSAndroid Build Coastguard Worker fStrikeCache->freeAll();
151*c8dee2aaSAndroid Build Coastguard Worker
152*c8dee2aaSAndroid Build Coastguard Worker fMappedBufferManager->abandon();
153*c8dee2aaSAndroid Build Coastguard Worker
154*c8dee2aaSAndroid Build Coastguard Worker fResourceProvider->abandon();
155*c8dee2aaSAndroid Build Coastguard Worker
156*c8dee2aaSAndroid Build Coastguard Worker // abandon first so destructors don't try to free the resources in the API.
157*c8dee2aaSAndroid Build Coastguard Worker fResourceCache->abandonAll();
158*c8dee2aaSAndroid Build Coastguard Worker
159*c8dee2aaSAndroid Build Coastguard Worker fGpu->disconnect(GrGpu::DisconnectType::kAbandon);
160*c8dee2aaSAndroid Build Coastguard Worker
161*c8dee2aaSAndroid Build Coastguard Worker #if !defined(SK_ENABLE_OPTIMIZE_SIZE)
162*c8dee2aaSAndroid Build Coastguard Worker if (fSmallPathAtlasMgr) {
163*c8dee2aaSAndroid Build Coastguard Worker fSmallPathAtlasMgr->reset();
164*c8dee2aaSAndroid Build Coastguard Worker }
165*c8dee2aaSAndroid Build Coastguard Worker #endif
166*c8dee2aaSAndroid Build Coastguard Worker fAtlasManager->freeAll();
167*c8dee2aaSAndroid Build Coastguard Worker }
168*c8dee2aaSAndroid Build Coastguard Worker
abandoned()169*c8dee2aaSAndroid Build Coastguard Worker bool GrDirectContext::abandoned() {
170*c8dee2aaSAndroid Build Coastguard Worker if (GrRecordingContext::abandoned()) {
171*c8dee2aaSAndroid Build Coastguard Worker return true;
172*c8dee2aaSAndroid Build Coastguard Worker }
173*c8dee2aaSAndroid Build Coastguard Worker
174*c8dee2aaSAndroid Build Coastguard Worker if (fGpu && fGpu->isDeviceLost()) {
175*c8dee2aaSAndroid Build Coastguard Worker this->abandonContext();
176*c8dee2aaSAndroid Build Coastguard Worker return true;
177*c8dee2aaSAndroid Build Coastguard Worker }
178*c8dee2aaSAndroid Build Coastguard Worker return false;
179*c8dee2aaSAndroid Build Coastguard Worker }
180*c8dee2aaSAndroid Build Coastguard Worker
isDeviceLost()181*c8dee2aaSAndroid Build Coastguard Worker bool GrDirectContext::isDeviceLost() {
182*c8dee2aaSAndroid Build Coastguard Worker if (fGpu && fGpu->isDeviceLost()) {
183*c8dee2aaSAndroid Build Coastguard Worker if (!GrRecordingContext::abandoned()) {
184*c8dee2aaSAndroid Build Coastguard Worker this->abandonContext();
185*c8dee2aaSAndroid Build Coastguard Worker }
186*c8dee2aaSAndroid Build Coastguard Worker return true;
187*c8dee2aaSAndroid Build Coastguard Worker }
188*c8dee2aaSAndroid Build Coastguard Worker return false;
189*c8dee2aaSAndroid Build Coastguard Worker }
190*c8dee2aaSAndroid Build Coastguard Worker
oomed()191*c8dee2aaSAndroid Build Coastguard Worker bool GrDirectContext::oomed() { return fGpu ? fGpu->checkAndResetOOMed() : false; }
192*c8dee2aaSAndroid Build Coastguard Worker
releaseResourcesAndAbandonContext()193*c8dee2aaSAndroid Build Coastguard Worker void GrDirectContext::releaseResourcesAndAbandonContext() {
194*c8dee2aaSAndroid Build Coastguard Worker if (GrRecordingContext::abandoned()) {
195*c8dee2aaSAndroid Build Coastguard Worker return;
196*c8dee2aaSAndroid Build Coastguard Worker }
197*c8dee2aaSAndroid Build Coastguard Worker
198*c8dee2aaSAndroid Build Coastguard Worker GrRecordingContext::abandonContext();
199*c8dee2aaSAndroid Build Coastguard Worker
200*c8dee2aaSAndroid Build Coastguard Worker // We need to make sure all work is finished on the gpu before we start releasing resources.
201*c8dee2aaSAndroid Build Coastguard Worker this->syncAllOutstandingGpuWork(/*shouldExecuteWhileAbandoned=*/true);
202*c8dee2aaSAndroid Build Coastguard Worker
203*c8dee2aaSAndroid Build Coastguard Worker fResourceProvider->abandon();
204*c8dee2aaSAndroid Build Coastguard Worker
205*c8dee2aaSAndroid Build Coastguard Worker // Release all resources in the backend 3D API.
206*c8dee2aaSAndroid Build Coastguard Worker fResourceCache->releaseAll();
207*c8dee2aaSAndroid Build Coastguard Worker
208*c8dee2aaSAndroid Build Coastguard Worker // Must be after GrResourceCache::releaseAll().
209*c8dee2aaSAndroid Build Coastguard Worker fMappedBufferManager.reset();
210*c8dee2aaSAndroid Build Coastguard Worker
211*c8dee2aaSAndroid Build Coastguard Worker fGpu->disconnect(GrGpu::DisconnectType::kCleanup);
212*c8dee2aaSAndroid Build Coastguard Worker #if !defined(SK_ENABLE_OPTIMIZE_SIZE)
213*c8dee2aaSAndroid Build Coastguard Worker if (fSmallPathAtlasMgr) {
214*c8dee2aaSAndroid Build Coastguard Worker fSmallPathAtlasMgr->reset();
215*c8dee2aaSAndroid Build Coastguard Worker }
216*c8dee2aaSAndroid Build Coastguard Worker #endif
217*c8dee2aaSAndroid Build Coastguard Worker fAtlasManager->freeAll();
218*c8dee2aaSAndroid Build Coastguard Worker }
219*c8dee2aaSAndroid Build Coastguard Worker
freeGpuResources()220*c8dee2aaSAndroid Build Coastguard Worker void GrDirectContext::freeGpuResources() {
221*c8dee2aaSAndroid Build Coastguard Worker ASSERT_SINGLE_OWNER
222*c8dee2aaSAndroid Build Coastguard Worker
223*c8dee2aaSAndroid Build Coastguard Worker if (this->abandoned()) {
224*c8dee2aaSAndroid Build Coastguard Worker return;
225*c8dee2aaSAndroid Build Coastguard Worker }
226*c8dee2aaSAndroid Build Coastguard Worker
227*c8dee2aaSAndroid Build Coastguard Worker this->flushAndSubmit();
228*c8dee2aaSAndroid Build Coastguard Worker #if !defined(SK_ENABLE_OPTIMIZE_SIZE)
229*c8dee2aaSAndroid Build Coastguard Worker if (fSmallPathAtlasMgr) {
230*c8dee2aaSAndroid Build Coastguard Worker fSmallPathAtlasMgr->reset();
231*c8dee2aaSAndroid Build Coastguard Worker }
232*c8dee2aaSAndroid Build Coastguard Worker #endif
233*c8dee2aaSAndroid Build Coastguard Worker fAtlasManager->freeAll();
234*c8dee2aaSAndroid Build Coastguard Worker
235*c8dee2aaSAndroid Build Coastguard Worker // TODO: the glyph cache doesn't hold any GpuResources so this call should not be needed here.
236*c8dee2aaSAndroid Build Coastguard Worker // Some slack in the GrTextBlob's implementation requires it though. That could be fixed.
237*c8dee2aaSAndroid Build Coastguard Worker fStrikeCache->freeAll();
238*c8dee2aaSAndroid Build Coastguard Worker
239*c8dee2aaSAndroid Build Coastguard Worker this->drawingManager()->freeGpuResources();
240*c8dee2aaSAndroid Build Coastguard Worker
241*c8dee2aaSAndroid Build Coastguard Worker fResourceCache->purgeUnlockedResources(GrPurgeResourceOptions::kAllResources);
242*c8dee2aaSAndroid Build Coastguard Worker }
243*c8dee2aaSAndroid Build Coastguard Worker
init()244*c8dee2aaSAndroid Build Coastguard Worker bool GrDirectContext::init() {
245*c8dee2aaSAndroid Build Coastguard Worker ASSERT_SINGLE_OWNER
246*c8dee2aaSAndroid Build Coastguard Worker if (!fGpu) {
247*c8dee2aaSAndroid Build Coastguard Worker return false;
248*c8dee2aaSAndroid Build Coastguard Worker }
249*c8dee2aaSAndroid Build Coastguard Worker
250*c8dee2aaSAndroid Build Coastguard Worker fThreadSafeProxy->priv().init(fGpu->refCaps(), fGpu->refPipelineBuilder());
251*c8dee2aaSAndroid Build Coastguard Worker if (!GrRecordingContext::init()) {
252*c8dee2aaSAndroid Build Coastguard Worker return false;
253*c8dee2aaSAndroid Build Coastguard Worker }
254*c8dee2aaSAndroid Build Coastguard Worker
255*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(this->getTextBlobRedrawCoordinator());
256*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(this->threadSafeCache());
257*c8dee2aaSAndroid Build Coastguard Worker
258*c8dee2aaSAndroid Build Coastguard Worker fStrikeCache = std::make_unique<StrikeCache>();
259*c8dee2aaSAndroid Build Coastguard Worker fResourceCache = std::make_unique<GrResourceCache>(this->singleOwner(),
260*c8dee2aaSAndroid Build Coastguard Worker this->directContextID(),
261*c8dee2aaSAndroid Build Coastguard Worker this->contextID());
262*c8dee2aaSAndroid Build Coastguard Worker fResourceCache->setProxyProvider(this->proxyProvider());
263*c8dee2aaSAndroid Build Coastguard Worker fResourceCache->setThreadSafeCache(this->threadSafeCache());
264*c8dee2aaSAndroid Build Coastguard Worker #if defined(GPU_TEST_UTILS)
265*c8dee2aaSAndroid Build Coastguard Worker if (this->options().fResourceCacheLimitOverride != -1) {
266*c8dee2aaSAndroid Build Coastguard Worker this->setResourceCacheLimit(this->options().fResourceCacheLimitOverride);
267*c8dee2aaSAndroid Build Coastguard Worker }
268*c8dee2aaSAndroid Build Coastguard Worker #endif
269*c8dee2aaSAndroid Build Coastguard Worker fResourceProvider = std::make_unique<GrResourceProvider>(fGpu.get(), fResourceCache.get(),
270*c8dee2aaSAndroid Build Coastguard Worker this->singleOwner());
271*c8dee2aaSAndroid Build Coastguard Worker fMappedBufferManager = std::make_unique<GrClientMappedBufferManager>(this->directContextID());
272*c8dee2aaSAndroid Build Coastguard Worker
273*c8dee2aaSAndroid Build Coastguard Worker fDidTestPMConversions = false;
274*c8dee2aaSAndroid Build Coastguard Worker
275*c8dee2aaSAndroid Build Coastguard Worker // DDL TODO: we need to think through how the task group & persistent cache
276*c8dee2aaSAndroid Build Coastguard Worker // get passed on to/shared between all the DDLRecorders created with this context.
277*c8dee2aaSAndroid Build Coastguard Worker if (this->options().fExecutor) {
278*c8dee2aaSAndroid Build Coastguard Worker fTaskGroup = std::make_unique<SkTaskGroup>(*this->options().fExecutor);
279*c8dee2aaSAndroid Build Coastguard Worker }
280*c8dee2aaSAndroid Build Coastguard Worker
281*c8dee2aaSAndroid Build Coastguard Worker fPersistentCache = this->options().fPersistentCache;
282*c8dee2aaSAndroid Build Coastguard Worker
283*c8dee2aaSAndroid Build Coastguard Worker GrDrawOpAtlas::AllowMultitexturing allowMultitexturing;
284*c8dee2aaSAndroid Build Coastguard Worker if (GrContextOptions::Enable::kNo == this->options().fAllowMultipleGlyphCacheTextures ||
285*c8dee2aaSAndroid Build Coastguard Worker // multitexturing supported only if range can represent the index + texcoords fully
286*c8dee2aaSAndroid Build Coastguard Worker !(this->caps()->shaderCaps()->fFloatIs32Bits ||
287*c8dee2aaSAndroid Build Coastguard Worker this->caps()->shaderCaps()->fIntegerSupport)) {
288*c8dee2aaSAndroid Build Coastguard Worker allowMultitexturing = GrDrawOpAtlas::AllowMultitexturing::kNo;
289*c8dee2aaSAndroid Build Coastguard Worker } else {
290*c8dee2aaSAndroid Build Coastguard Worker allowMultitexturing = GrDrawOpAtlas::AllowMultitexturing::kYes;
291*c8dee2aaSAndroid Build Coastguard Worker }
292*c8dee2aaSAndroid Build Coastguard Worker
293*c8dee2aaSAndroid Build Coastguard Worker GrProxyProvider* proxyProvider = this->priv().proxyProvider();
294*c8dee2aaSAndroid Build Coastguard Worker
295*c8dee2aaSAndroid Build Coastguard Worker fAtlasManager = std::make_unique<GrAtlasManager>(proxyProvider,
296*c8dee2aaSAndroid Build Coastguard Worker this->options().fGlyphCacheTextureMaximumBytes,
297*c8dee2aaSAndroid Build Coastguard Worker allowMultitexturing,
298*c8dee2aaSAndroid Build Coastguard Worker this->options().fSupportBilerpFromGlyphAtlas);
299*c8dee2aaSAndroid Build Coastguard Worker this->priv().addOnFlushCallbackObject(fAtlasManager.get());
300*c8dee2aaSAndroid Build Coastguard Worker
301*c8dee2aaSAndroid Build Coastguard Worker return true;
302*c8dee2aaSAndroid Build Coastguard Worker }
303*c8dee2aaSAndroid Build Coastguard Worker
getResourceCacheUsage(int * resourceCount,size_t * resourceBytes) const304*c8dee2aaSAndroid Build Coastguard Worker void GrDirectContext::getResourceCacheUsage(int* resourceCount, size_t* resourceBytes) const {
305*c8dee2aaSAndroid Build Coastguard Worker ASSERT_SINGLE_OWNER
306*c8dee2aaSAndroid Build Coastguard Worker
307*c8dee2aaSAndroid Build Coastguard Worker if (resourceCount) {
308*c8dee2aaSAndroid Build Coastguard Worker *resourceCount = fResourceCache->getBudgetedResourceCount();
309*c8dee2aaSAndroid Build Coastguard Worker }
310*c8dee2aaSAndroid Build Coastguard Worker if (resourceBytes) {
311*c8dee2aaSAndroid Build Coastguard Worker *resourceBytes = fResourceCache->getBudgetedResourceBytes();
312*c8dee2aaSAndroid Build Coastguard Worker }
313*c8dee2aaSAndroid Build Coastguard Worker }
314*c8dee2aaSAndroid Build Coastguard Worker
getResourceCachePurgeableBytes() const315*c8dee2aaSAndroid Build Coastguard Worker size_t GrDirectContext::getResourceCachePurgeableBytes() const {
316*c8dee2aaSAndroid Build Coastguard Worker ASSERT_SINGLE_OWNER
317*c8dee2aaSAndroid Build Coastguard Worker return fResourceCache->getPurgeableBytes();
318*c8dee2aaSAndroid Build Coastguard Worker }
319*c8dee2aaSAndroid Build Coastguard Worker
getResourceCacheLimits(int * maxResources,size_t * maxResourceBytes) const320*c8dee2aaSAndroid Build Coastguard Worker void GrDirectContext::getResourceCacheLimits(int* maxResources, size_t* maxResourceBytes) const {
321*c8dee2aaSAndroid Build Coastguard Worker ASSERT_SINGLE_OWNER
322*c8dee2aaSAndroid Build Coastguard Worker if (maxResources) {
323*c8dee2aaSAndroid Build Coastguard Worker *maxResources = -1;
324*c8dee2aaSAndroid Build Coastguard Worker }
325*c8dee2aaSAndroid Build Coastguard Worker if (maxResourceBytes) {
326*c8dee2aaSAndroid Build Coastguard Worker *maxResourceBytes = this->getResourceCacheLimit();
327*c8dee2aaSAndroid Build Coastguard Worker }
328*c8dee2aaSAndroid Build Coastguard Worker }
329*c8dee2aaSAndroid Build Coastguard Worker
getResourceCacheLimit() const330*c8dee2aaSAndroid Build Coastguard Worker size_t GrDirectContext::getResourceCacheLimit() const {
331*c8dee2aaSAndroid Build Coastguard Worker ASSERT_SINGLE_OWNER
332*c8dee2aaSAndroid Build Coastguard Worker return fResourceCache->getMaxResourceBytes();
333*c8dee2aaSAndroid Build Coastguard Worker }
334*c8dee2aaSAndroid Build Coastguard Worker
setResourceCacheLimits(int unused,size_t maxResourceBytes)335*c8dee2aaSAndroid Build Coastguard Worker void GrDirectContext::setResourceCacheLimits(int unused, size_t maxResourceBytes) {
336*c8dee2aaSAndroid Build Coastguard Worker ASSERT_SINGLE_OWNER
337*c8dee2aaSAndroid Build Coastguard Worker this->setResourceCacheLimit(maxResourceBytes);
338*c8dee2aaSAndroid Build Coastguard Worker }
339*c8dee2aaSAndroid Build Coastguard Worker
setResourceCacheLimit(size_t maxResourceBytes)340*c8dee2aaSAndroid Build Coastguard Worker void GrDirectContext::setResourceCacheLimit(size_t maxResourceBytes) {
341*c8dee2aaSAndroid Build Coastguard Worker ASSERT_SINGLE_OWNER
342*c8dee2aaSAndroid Build Coastguard Worker fResourceCache->setLimit(maxResourceBytes);
343*c8dee2aaSAndroid Build Coastguard Worker }
344*c8dee2aaSAndroid Build Coastguard Worker
purgeUnlockedResources(GrPurgeResourceOptions opts)345*c8dee2aaSAndroid Build Coastguard Worker void GrDirectContext::purgeUnlockedResources(GrPurgeResourceOptions opts) {
346*c8dee2aaSAndroid Build Coastguard Worker ASSERT_SINGLE_OWNER
347*c8dee2aaSAndroid Build Coastguard Worker
348*c8dee2aaSAndroid Build Coastguard Worker if (this->abandoned()) {
349*c8dee2aaSAndroid Build Coastguard Worker return;
350*c8dee2aaSAndroid Build Coastguard Worker }
351*c8dee2aaSAndroid Build Coastguard Worker
352*c8dee2aaSAndroid Build Coastguard Worker fResourceCache->purgeUnlockedResources(opts);
353*c8dee2aaSAndroid Build Coastguard Worker fResourceCache->purgeAsNeeded();
354*c8dee2aaSAndroid Build Coastguard Worker
355*c8dee2aaSAndroid Build Coastguard Worker // The textBlob Cache doesn't actually hold any GPU resource but this is a convenient
356*c8dee2aaSAndroid Build Coastguard Worker // place to purge stale blobs
357*c8dee2aaSAndroid Build Coastguard Worker this->getTextBlobRedrawCoordinator()->purgeStaleBlobs();
358*c8dee2aaSAndroid Build Coastguard Worker
359*c8dee2aaSAndroid Build Coastguard Worker fGpu->releaseUnlockedBackendObjects();
360*c8dee2aaSAndroid Build Coastguard Worker }
361*c8dee2aaSAndroid Build Coastguard Worker
performDeferredCleanup(std::chrono::milliseconds msNotUsed,GrPurgeResourceOptions opts)362*c8dee2aaSAndroid Build Coastguard Worker void GrDirectContext::performDeferredCleanup(std::chrono::milliseconds msNotUsed,
363*c8dee2aaSAndroid Build Coastguard Worker GrPurgeResourceOptions opts) {
364*c8dee2aaSAndroid Build Coastguard Worker TRACE_EVENT0("skia.gpu", TRACE_FUNC);
365*c8dee2aaSAndroid Build Coastguard Worker
366*c8dee2aaSAndroid Build Coastguard Worker ASSERT_SINGLE_OWNER
367*c8dee2aaSAndroid Build Coastguard Worker
368*c8dee2aaSAndroid Build Coastguard Worker if (this->abandoned()) {
369*c8dee2aaSAndroid Build Coastguard Worker return;
370*c8dee2aaSAndroid Build Coastguard Worker }
371*c8dee2aaSAndroid Build Coastguard Worker
372*c8dee2aaSAndroid Build Coastguard Worker this->checkAsyncWorkCompletion();
373*c8dee2aaSAndroid Build Coastguard Worker fMappedBufferManager->process();
374*c8dee2aaSAndroid Build Coastguard Worker auto purgeTime = skgpu::StdSteadyClock::now() - msNotUsed;
375*c8dee2aaSAndroid Build Coastguard Worker
376*c8dee2aaSAndroid Build Coastguard Worker fResourceCache->purgeAsNeeded();
377*c8dee2aaSAndroid Build Coastguard Worker fResourceCache->purgeResourcesNotUsedSince(purgeTime, opts);
378*c8dee2aaSAndroid Build Coastguard Worker
379*c8dee2aaSAndroid Build Coastguard Worker // The textBlob Cache doesn't actually hold any GPU resource but this is a convenient
380*c8dee2aaSAndroid Build Coastguard Worker // place to purge stale blobs
381*c8dee2aaSAndroid Build Coastguard Worker this->getTextBlobRedrawCoordinator()->purgeStaleBlobs();
382*c8dee2aaSAndroid Build Coastguard Worker }
383*c8dee2aaSAndroid Build Coastguard Worker
purgeUnlockedResources(size_t bytesToPurge,bool preferScratchResources)384*c8dee2aaSAndroid Build Coastguard Worker void GrDirectContext::purgeUnlockedResources(size_t bytesToPurge, bool preferScratchResources) {
385*c8dee2aaSAndroid Build Coastguard Worker ASSERT_SINGLE_OWNER
386*c8dee2aaSAndroid Build Coastguard Worker
387*c8dee2aaSAndroid Build Coastguard Worker if (this->abandoned()) {
388*c8dee2aaSAndroid Build Coastguard Worker return;
389*c8dee2aaSAndroid Build Coastguard Worker }
390*c8dee2aaSAndroid Build Coastguard Worker
391*c8dee2aaSAndroid Build Coastguard Worker fResourceCache->purgeUnlockedResources(bytesToPurge, preferScratchResources);
392*c8dee2aaSAndroid Build Coastguard Worker }
393*c8dee2aaSAndroid Build Coastguard Worker
394*c8dee2aaSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
wait(int numSemaphores,const GrBackendSemaphore waitSemaphores[],bool deleteSemaphoresAfterWait)395*c8dee2aaSAndroid Build Coastguard Worker bool GrDirectContext::wait(int numSemaphores, const GrBackendSemaphore waitSemaphores[],
396*c8dee2aaSAndroid Build Coastguard Worker bool deleteSemaphoresAfterWait) {
397*c8dee2aaSAndroid Build Coastguard Worker if (!fGpu || !fGpu->caps()->backendSemaphoreSupport()) {
398*c8dee2aaSAndroid Build Coastguard Worker return false;
399*c8dee2aaSAndroid Build Coastguard Worker }
400*c8dee2aaSAndroid Build Coastguard Worker GrWrapOwnership ownership =
401*c8dee2aaSAndroid Build Coastguard Worker deleteSemaphoresAfterWait ? kAdopt_GrWrapOwnership : kBorrow_GrWrapOwnership;
402*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < numSemaphores; ++i) {
403*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<GrSemaphore> sema = fResourceProvider->wrapBackendSemaphore(
404*c8dee2aaSAndroid Build Coastguard Worker waitSemaphores[i], GrSemaphoreWrapType::kWillWait, ownership);
405*c8dee2aaSAndroid Build Coastguard Worker // If we failed to wrap the semaphore it means the client didn't give us a valid semaphore
406*c8dee2aaSAndroid Build Coastguard Worker // to begin with. Therefore, it is fine to not wait on it.
407*c8dee2aaSAndroid Build Coastguard Worker if (sema) {
408*c8dee2aaSAndroid Build Coastguard Worker fGpu->waitSemaphore(sema.get());
409*c8dee2aaSAndroid Build Coastguard Worker }
410*c8dee2aaSAndroid Build Coastguard Worker }
411*c8dee2aaSAndroid Build Coastguard Worker return true;
412*c8dee2aaSAndroid Build Coastguard Worker }
413*c8dee2aaSAndroid Build Coastguard Worker
414*c8dee2aaSAndroid Build Coastguard Worker #if !defined(SK_ENABLE_OPTIMIZE_SIZE)
onGetSmallPathAtlasMgr()415*c8dee2aaSAndroid Build Coastguard Worker skgpu::ganesh::SmallPathAtlasMgr* GrDirectContext::onGetSmallPathAtlasMgr() {
416*c8dee2aaSAndroid Build Coastguard Worker if (!fSmallPathAtlasMgr) {
417*c8dee2aaSAndroid Build Coastguard Worker fSmallPathAtlasMgr = std::make_unique<skgpu::ganesh::SmallPathAtlasMgr>();
418*c8dee2aaSAndroid Build Coastguard Worker
419*c8dee2aaSAndroid Build Coastguard Worker this->priv().addOnFlushCallbackObject(fSmallPathAtlasMgr.get());
420*c8dee2aaSAndroid Build Coastguard Worker }
421*c8dee2aaSAndroid Build Coastguard Worker
422*c8dee2aaSAndroid Build Coastguard Worker if (!fSmallPathAtlasMgr->initAtlas(this->proxyProvider(), this->caps())) {
423*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
424*c8dee2aaSAndroid Build Coastguard Worker }
425*c8dee2aaSAndroid Build Coastguard Worker
426*c8dee2aaSAndroid Build Coastguard Worker return fSmallPathAtlasMgr.get();
427*c8dee2aaSAndroid Build Coastguard Worker }
428*c8dee2aaSAndroid Build Coastguard Worker #endif
429*c8dee2aaSAndroid Build Coastguard Worker
430*c8dee2aaSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
431*c8dee2aaSAndroid Build Coastguard Worker
supportedGpuStats() const432*c8dee2aaSAndroid Build Coastguard Worker skgpu::GpuStatsFlags GrDirectContext::supportedGpuStats() const {
433*c8dee2aaSAndroid Build Coastguard Worker return this->caps()->supportedGpuStats();
434*c8dee2aaSAndroid Build Coastguard Worker }
435*c8dee2aaSAndroid Build Coastguard Worker
flush(const GrFlushInfo & info)436*c8dee2aaSAndroid Build Coastguard Worker GrSemaphoresSubmitted GrDirectContext::flush(const GrFlushInfo& info) {
437*c8dee2aaSAndroid Build Coastguard Worker ASSERT_SINGLE_OWNER
438*c8dee2aaSAndroid Build Coastguard Worker if (this->abandoned()) {
439*c8dee2aaSAndroid Build Coastguard Worker if (info.fFinishedProc) {
440*c8dee2aaSAndroid Build Coastguard Worker info.fFinishedProc(info.fFinishedContext);
441*c8dee2aaSAndroid Build Coastguard Worker }
442*c8dee2aaSAndroid Build Coastguard Worker if (info.fSubmittedProc) {
443*c8dee2aaSAndroid Build Coastguard Worker info.fSubmittedProc(info.fSubmittedContext, false);
444*c8dee2aaSAndroid Build Coastguard Worker }
445*c8dee2aaSAndroid Build Coastguard Worker return GrSemaphoresSubmitted::kNo;
446*c8dee2aaSAndroid Build Coastguard Worker }
447*c8dee2aaSAndroid Build Coastguard Worker
448*c8dee2aaSAndroid Build Coastguard Worker return this->drawingManager()->flushSurfaces(
449*c8dee2aaSAndroid Build Coastguard Worker {}, SkSurfaces::BackendSurfaceAccess::kNoAccess, info, nullptr);
450*c8dee2aaSAndroid Build Coastguard Worker }
451*c8dee2aaSAndroid Build Coastguard Worker
submit(const GrSubmitInfo & info)452*c8dee2aaSAndroid Build Coastguard Worker bool GrDirectContext::submit(const GrSubmitInfo& info) {
453*c8dee2aaSAndroid Build Coastguard Worker ASSERT_SINGLE_OWNER
454*c8dee2aaSAndroid Build Coastguard Worker if (this->abandoned()) {
455*c8dee2aaSAndroid Build Coastguard Worker return false;
456*c8dee2aaSAndroid Build Coastguard Worker }
457*c8dee2aaSAndroid Build Coastguard Worker
458*c8dee2aaSAndroid Build Coastguard Worker if (!fGpu) {
459*c8dee2aaSAndroid Build Coastguard Worker return false;
460*c8dee2aaSAndroid Build Coastguard Worker }
461*c8dee2aaSAndroid Build Coastguard Worker
462*c8dee2aaSAndroid Build Coastguard Worker return fGpu->submitToGpu(info);
463*c8dee2aaSAndroid Build Coastguard Worker }
464*c8dee2aaSAndroid Build Coastguard Worker
flush(const sk_sp<const SkImage> & image,const GrFlushInfo & flushInfo)465*c8dee2aaSAndroid Build Coastguard Worker GrSemaphoresSubmitted GrDirectContext::flush(const sk_sp<const SkImage>& image,
466*c8dee2aaSAndroid Build Coastguard Worker const GrFlushInfo& flushInfo) {
467*c8dee2aaSAndroid Build Coastguard Worker if (!image) {
468*c8dee2aaSAndroid Build Coastguard Worker return GrSemaphoresSubmitted::kNo;
469*c8dee2aaSAndroid Build Coastguard Worker }
470*c8dee2aaSAndroid Build Coastguard Worker auto ib = as_IB(image);
471*c8dee2aaSAndroid Build Coastguard Worker if (!ib->isGaneshBacked()) {
472*c8dee2aaSAndroid Build Coastguard Worker return GrSemaphoresSubmitted::kNo;
473*c8dee2aaSAndroid Build Coastguard Worker }
474*c8dee2aaSAndroid Build Coastguard Worker auto igb = static_cast<const SkImage_GaneshBase*>(image.get());
475*c8dee2aaSAndroid Build Coastguard Worker return igb->flush(this, flushInfo);
476*c8dee2aaSAndroid Build Coastguard Worker }
477*c8dee2aaSAndroid Build Coastguard Worker
flush(const sk_sp<const SkImage> & image)478*c8dee2aaSAndroid Build Coastguard Worker void GrDirectContext::flush(const sk_sp<const SkImage>& image) {
479*c8dee2aaSAndroid Build Coastguard Worker this->flush(image, {});
480*c8dee2aaSAndroid Build Coastguard Worker }
481*c8dee2aaSAndroid Build Coastguard Worker
flushAndSubmit(const sk_sp<const SkImage> & image)482*c8dee2aaSAndroid Build Coastguard Worker void GrDirectContext::flushAndSubmit(const sk_sp<const SkImage>& image) {
483*c8dee2aaSAndroid Build Coastguard Worker this->flush(image, {});
484*c8dee2aaSAndroid Build Coastguard Worker this->submit();
485*c8dee2aaSAndroid Build Coastguard Worker }
486*c8dee2aaSAndroid Build Coastguard Worker
flush(SkSurface * surface,SkSurfaces::BackendSurfaceAccess access,const GrFlushInfo & info)487*c8dee2aaSAndroid Build Coastguard Worker GrSemaphoresSubmitted GrDirectContext::flush(SkSurface* surface,
488*c8dee2aaSAndroid Build Coastguard Worker SkSurfaces::BackendSurfaceAccess access,
489*c8dee2aaSAndroid Build Coastguard Worker const GrFlushInfo& info) {
490*c8dee2aaSAndroid Build Coastguard Worker if (!surface) {
491*c8dee2aaSAndroid Build Coastguard Worker return GrSemaphoresSubmitted::kNo;
492*c8dee2aaSAndroid Build Coastguard Worker }
493*c8dee2aaSAndroid Build Coastguard Worker auto sb = asSB(surface);
494*c8dee2aaSAndroid Build Coastguard Worker if (!sb->isGaneshBacked()) {
495*c8dee2aaSAndroid Build Coastguard Worker return GrSemaphoresSubmitted::kNo;
496*c8dee2aaSAndroid Build Coastguard Worker }
497*c8dee2aaSAndroid Build Coastguard Worker
498*c8dee2aaSAndroid Build Coastguard Worker auto gs = static_cast<SkSurface_Ganesh*>(surface);
499*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(this->priv().matches(gs->getDevice()->recordingContext()->asDirectContext()));
500*c8dee2aaSAndroid Build Coastguard Worker GrRenderTargetProxy* rtp = gs->getDevice()->targetProxy();
501*c8dee2aaSAndroid Build Coastguard Worker
502*c8dee2aaSAndroid Build Coastguard Worker return this->priv().flushSurface(rtp, access, info, nullptr);
503*c8dee2aaSAndroid Build Coastguard Worker }
504*c8dee2aaSAndroid Build Coastguard Worker
flush(SkSurface * surface,const GrFlushInfo & info,const skgpu::MutableTextureState * newState)505*c8dee2aaSAndroid Build Coastguard Worker GrSemaphoresSubmitted GrDirectContext::flush(SkSurface* surface,
506*c8dee2aaSAndroid Build Coastguard Worker const GrFlushInfo& info,
507*c8dee2aaSAndroid Build Coastguard Worker const skgpu::MutableTextureState* newState) {
508*c8dee2aaSAndroid Build Coastguard Worker if (!surface) {
509*c8dee2aaSAndroid Build Coastguard Worker return GrSemaphoresSubmitted::kNo;
510*c8dee2aaSAndroid Build Coastguard Worker }
511*c8dee2aaSAndroid Build Coastguard Worker auto sb = asSB(surface);
512*c8dee2aaSAndroid Build Coastguard Worker if (!sb->isGaneshBacked()) {
513*c8dee2aaSAndroid Build Coastguard Worker return GrSemaphoresSubmitted::kNo;
514*c8dee2aaSAndroid Build Coastguard Worker }
515*c8dee2aaSAndroid Build Coastguard Worker
516*c8dee2aaSAndroid Build Coastguard Worker auto gs = static_cast<SkSurface_Ganesh*>(surface);
517*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(this->priv().matches(gs->getDevice()->recordingContext()->asDirectContext()));
518*c8dee2aaSAndroid Build Coastguard Worker GrRenderTargetProxy* rtp = gs->getDevice()->targetProxy();
519*c8dee2aaSAndroid Build Coastguard Worker
520*c8dee2aaSAndroid Build Coastguard Worker return this->priv().flushSurface(
521*c8dee2aaSAndroid Build Coastguard Worker rtp, SkSurfaces::BackendSurfaceAccess::kNoAccess, info, newState);
522*c8dee2aaSAndroid Build Coastguard Worker }
523*c8dee2aaSAndroid Build Coastguard Worker
flushAndSubmit(SkSurface * surface,GrSyncCpu sync)524*c8dee2aaSAndroid Build Coastguard Worker void GrDirectContext::flushAndSubmit(SkSurface* surface, GrSyncCpu sync) {
525*c8dee2aaSAndroid Build Coastguard Worker this->flush(surface, SkSurfaces::BackendSurfaceAccess::kNoAccess, GrFlushInfo());
526*c8dee2aaSAndroid Build Coastguard Worker this->submit(sync);
527*c8dee2aaSAndroid Build Coastguard Worker }
528*c8dee2aaSAndroid Build Coastguard Worker
flush(SkSurface * surface)529*c8dee2aaSAndroid Build Coastguard Worker void GrDirectContext::flush(SkSurface* surface) {
530*c8dee2aaSAndroid Build Coastguard Worker this->flush(surface, GrFlushInfo(), nullptr);
531*c8dee2aaSAndroid Build Coastguard Worker }
532*c8dee2aaSAndroid Build Coastguard Worker
533*c8dee2aaSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
534*c8dee2aaSAndroid Build Coastguard Worker
checkAsyncWorkCompletion()535*c8dee2aaSAndroid Build Coastguard Worker void GrDirectContext::checkAsyncWorkCompletion() {
536*c8dee2aaSAndroid Build Coastguard Worker if (fGpu) {
537*c8dee2aaSAndroid Build Coastguard Worker fGpu->checkFinishedCallbacks();
538*c8dee2aaSAndroid Build Coastguard Worker }
539*c8dee2aaSAndroid Build Coastguard Worker }
540*c8dee2aaSAndroid Build Coastguard Worker
syncAllOutstandingGpuWork(bool shouldExecuteWhileAbandoned)541*c8dee2aaSAndroid Build Coastguard Worker void GrDirectContext::syncAllOutstandingGpuWork(bool shouldExecuteWhileAbandoned) {
542*c8dee2aaSAndroid Build Coastguard Worker if (fGpu && (!this->abandoned() || shouldExecuteWhileAbandoned)) {
543*c8dee2aaSAndroid Build Coastguard Worker fGpu->finishOutstandingGpuWork();
544*c8dee2aaSAndroid Build Coastguard Worker this->checkAsyncWorkCompletion();
545*c8dee2aaSAndroid Build Coastguard Worker }
546*c8dee2aaSAndroid Build Coastguard Worker }
547*c8dee2aaSAndroid Build Coastguard Worker
548*c8dee2aaSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
549*c8dee2aaSAndroid Build Coastguard Worker
storeVkPipelineCacheData()550*c8dee2aaSAndroid Build Coastguard Worker void GrDirectContext::storeVkPipelineCacheData() {
551*c8dee2aaSAndroid Build Coastguard Worker if (fGpu) {
552*c8dee2aaSAndroid Build Coastguard Worker fGpu->storeVkPipelineCacheData();
553*c8dee2aaSAndroid Build Coastguard Worker }
554*c8dee2aaSAndroid Build Coastguard Worker }
555*c8dee2aaSAndroid Build Coastguard Worker
556*c8dee2aaSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
557*c8dee2aaSAndroid Build Coastguard Worker
supportsDistanceFieldText() const558*c8dee2aaSAndroid Build Coastguard Worker bool GrDirectContext::supportsDistanceFieldText() const {
559*c8dee2aaSAndroid Build Coastguard Worker return this->caps()->shaderCaps()->supportsDistanceFieldText();
560*c8dee2aaSAndroid Build Coastguard Worker }
561*c8dee2aaSAndroid Build Coastguard Worker
562*c8dee2aaSAndroid Build Coastguard Worker //////////////////////////////////////////////////////////////////////////////
563*c8dee2aaSAndroid Build Coastguard Worker
dumpMemoryStatistics(SkTraceMemoryDump * traceMemoryDump) const564*c8dee2aaSAndroid Build Coastguard Worker void GrDirectContext::dumpMemoryStatistics(SkTraceMemoryDump* traceMemoryDump) const {
565*c8dee2aaSAndroid Build Coastguard Worker ASSERT_SINGLE_OWNER
566*c8dee2aaSAndroid Build Coastguard Worker fResourceCache->dumpMemoryStatistics(traceMemoryDump);
567*c8dee2aaSAndroid Build Coastguard Worker traceMemoryDump->dumpNumericValue("skia/gr_text_blob_cache", "size", "bytes",
568*c8dee2aaSAndroid Build Coastguard Worker this->getTextBlobRedrawCoordinator()->usedBytes());
569*c8dee2aaSAndroid Build Coastguard Worker }
570*c8dee2aaSAndroid Build Coastguard Worker
createBackendTexture(int width,int height,const GrBackendFormat & backendFormat,skgpu::Mipmapped mipmapped,GrRenderable renderable,GrProtected isProtected,std::string_view label)571*c8dee2aaSAndroid Build Coastguard Worker GrBackendTexture GrDirectContext::createBackendTexture(int width,
572*c8dee2aaSAndroid Build Coastguard Worker int height,
573*c8dee2aaSAndroid Build Coastguard Worker const GrBackendFormat& backendFormat,
574*c8dee2aaSAndroid Build Coastguard Worker skgpu::Mipmapped mipmapped,
575*c8dee2aaSAndroid Build Coastguard Worker GrRenderable renderable,
576*c8dee2aaSAndroid Build Coastguard Worker GrProtected isProtected,
577*c8dee2aaSAndroid Build Coastguard Worker std::string_view label) {
578*c8dee2aaSAndroid Build Coastguard Worker TRACE_EVENT0("skia.gpu", TRACE_FUNC);
579*c8dee2aaSAndroid Build Coastguard Worker if (this->abandoned()) {
580*c8dee2aaSAndroid Build Coastguard Worker return GrBackendTexture();
581*c8dee2aaSAndroid Build Coastguard Worker }
582*c8dee2aaSAndroid Build Coastguard Worker
583*c8dee2aaSAndroid Build Coastguard Worker return fGpu->createBackendTexture({width, height}, backendFormat, renderable,
584*c8dee2aaSAndroid Build Coastguard Worker mipmapped, isProtected, label);
585*c8dee2aaSAndroid Build Coastguard Worker }
586*c8dee2aaSAndroid Build Coastguard Worker
createBackendTexture(const SkPixmap & srcData,GrSurfaceOrigin textureOrigin,GrRenderable renderable,GrProtected isProtected,GrGpuFinishedProc finishedProc,GrGpuFinishedContext finishedContext,std::string_view label)587*c8dee2aaSAndroid Build Coastguard Worker GrBackendTexture GrDirectContext::createBackendTexture(const SkPixmap& srcData,
588*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceOrigin textureOrigin,
589*c8dee2aaSAndroid Build Coastguard Worker GrRenderable renderable,
590*c8dee2aaSAndroid Build Coastguard Worker GrProtected isProtected,
591*c8dee2aaSAndroid Build Coastguard Worker GrGpuFinishedProc finishedProc,
592*c8dee2aaSAndroid Build Coastguard Worker GrGpuFinishedContext finishedContext,
593*c8dee2aaSAndroid Build Coastguard Worker std::string_view label) {
594*c8dee2aaSAndroid Build Coastguard Worker return this->createBackendTexture(&srcData, 1, textureOrigin, renderable, isProtected,
595*c8dee2aaSAndroid Build Coastguard Worker finishedProc, finishedContext, label);
596*c8dee2aaSAndroid Build Coastguard Worker }
597*c8dee2aaSAndroid Build Coastguard Worker
createBackendTexture(const SkPixmap & srcData,GrRenderable renderable,GrProtected isProtected,GrGpuFinishedProc finishedProc,GrGpuFinishedContext finishedContext,std::string_view label)598*c8dee2aaSAndroid Build Coastguard Worker GrBackendTexture GrDirectContext::createBackendTexture(const SkPixmap& srcData,
599*c8dee2aaSAndroid Build Coastguard Worker GrRenderable renderable,
600*c8dee2aaSAndroid Build Coastguard Worker GrProtected isProtected,
601*c8dee2aaSAndroid Build Coastguard Worker GrGpuFinishedProc finishedProc,
602*c8dee2aaSAndroid Build Coastguard Worker GrGpuFinishedContext finishedContext,
603*c8dee2aaSAndroid Build Coastguard Worker std::string_view label) {
604*c8dee2aaSAndroid Build Coastguard Worker return this->createBackendTexture(&srcData,
605*c8dee2aaSAndroid Build Coastguard Worker 1,
606*c8dee2aaSAndroid Build Coastguard Worker renderable,
607*c8dee2aaSAndroid Build Coastguard Worker isProtected,
608*c8dee2aaSAndroid Build Coastguard Worker finishedProc,
609*c8dee2aaSAndroid Build Coastguard Worker finishedContext,
610*c8dee2aaSAndroid Build Coastguard Worker label);
611*c8dee2aaSAndroid Build Coastguard Worker }
612*c8dee2aaSAndroid Build Coastguard Worker
createBackendTexture(const SkPixmap srcData[],int numLevels,GrRenderable renderable,GrProtected isProtected,GrGpuFinishedProc finishedProc,GrGpuFinishedContext finishedContext,std::string_view label)613*c8dee2aaSAndroid Build Coastguard Worker GrBackendTexture GrDirectContext::createBackendTexture(const SkPixmap srcData[],
614*c8dee2aaSAndroid Build Coastguard Worker int numLevels,
615*c8dee2aaSAndroid Build Coastguard Worker GrRenderable renderable,
616*c8dee2aaSAndroid Build Coastguard Worker GrProtected isProtected,
617*c8dee2aaSAndroid Build Coastguard Worker GrGpuFinishedProc finishedProc,
618*c8dee2aaSAndroid Build Coastguard Worker GrGpuFinishedContext finishedContext,
619*c8dee2aaSAndroid Build Coastguard Worker std::string_view label) {
620*c8dee2aaSAndroid Build Coastguard Worker return this->createBackendTexture(srcData,
621*c8dee2aaSAndroid Build Coastguard Worker numLevels,
622*c8dee2aaSAndroid Build Coastguard Worker kTopLeft_GrSurfaceOrigin,
623*c8dee2aaSAndroid Build Coastguard Worker renderable,
624*c8dee2aaSAndroid Build Coastguard Worker isProtected,
625*c8dee2aaSAndroid Build Coastguard Worker finishedProc,
626*c8dee2aaSAndroid Build Coastguard Worker finishedContext,
627*c8dee2aaSAndroid Build Coastguard Worker label);
628*c8dee2aaSAndroid Build Coastguard Worker }
629*c8dee2aaSAndroid Build Coastguard Worker
createBackendTexture(int width,int height,SkColorType skColorType,skgpu::Mipmapped mipmapped,GrRenderable renderable,GrProtected isProtected,std::string_view label)630*c8dee2aaSAndroid Build Coastguard Worker GrBackendTexture GrDirectContext::createBackendTexture(int width,
631*c8dee2aaSAndroid Build Coastguard Worker int height,
632*c8dee2aaSAndroid Build Coastguard Worker SkColorType skColorType,
633*c8dee2aaSAndroid Build Coastguard Worker skgpu::Mipmapped mipmapped,
634*c8dee2aaSAndroid Build Coastguard Worker GrRenderable renderable,
635*c8dee2aaSAndroid Build Coastguard Worker GrProtected isProtected,
636*c8dee2aaSAndroid Build Coastguard Worker std::string_view label) {
637*c8dee2aaSAndroid Build Coastguard Worker if (this->abandoned()) {
638*c8dee2aaSAndroid Build Coastguard Worker return GrBackendTexture();
639*c8dee2aaSAndroid Build Coastguard Worker }
640*c8dee2aaSAndroid Build Coastguard Worker
641*c8dee2aaSAndroid Build Coastguard Worker const GrBackendFormat format = this->defaultBackendFormat(skColorType, renderable);
642*c8dee2aaSAndroid Build Coastguard Worker
643*c8dee2aaSAndroid Build Coastguard Worker return this->createBackendTexture(
644*c8dee2aaSAndroid Build Coastguard Worker width, height, format, mipmapped, renderable, isProtected, label);
645*c8dee2aaSAndroid Build Coastguard Worker }
646*c8dee2aaSAndroid Build Coastguard Worker
create_and_clear_backend_texture(GrDirectContext * dContext,SkISize dimensions,const GrBackendFormat & backendFormat,skgpu::Mipmapped mipmapped,GrRenderable renderable,GrProtected isProtected,sk_sp<skgpu::RefCntedCallback> finishedCallback,std::array<float,4> color,std::string_view label)647*c8dee2aaSAndroid Build Coastguard Worker static GrBackendTexture create_and_clear_backend_texture(
648*c8dee2aaSAndroid Build Coastguard Worker GrDirectContext* dContext,
649*c8dee2aaSAndroid Build Coastguard Worker SkISize dimensions,
650*c8dee2aaSAndroid Build Coastguard Worker const GrBackendFormat& backendFormat,
651*c8dee2aaSAndroid Build Coastguard Worker skgpu::Mipmapped mipmapped,
652*c8dee2aaSAndroid Build Coastguard Worker GrRenderable renderable,
653*c8dee2aaSAndroid Build Coastguard Worker GrProtected isProtected,
654*c8dee2aaSAndroid Build Coastguard Worker sk_sp<skgpu::RefCntedCallback> finishedCallback,
655*c8dee2aaSAndroid Build Coastguard Worker std::array<float, 4> color,
656*c8dee2aaSAndroid Build Coastguard Worker std::string_view label) {
657*c8dee2aaSAndroid Build Coastguard Worker GrGpu* gpu = dContext->priv().getGpu();
658*c8dee2aaSAndroid Build Coastguard Worker GrBackendTexture beTex = gpu->createBackendTexture(dimensions, backendFormat, renderable,
659*c8dee2aaSAndroid Build Coastguard Worker mipmapped, isProtected, label);
660*c8dee2aaSAndroid Build Coastguard Worker if (!beTex.isValid()) {
661*c8dee2aaSAndroid Build Coastguard Worker return {};
662*c8dee2aaSAndroid Build Coastguard Worker }
663*c8dee2aaSAndroid Build Coastguard Worker
664*c8dee2aaSAndroid Build Coastguard Worker if (!dContext->priv().getGpu()->clearBackendTexture(beTex,
665*c8dee2aaSAndroid Build Coastguard Worker std::move(finishedCallback),
666*c8dee2aaSAndroid Build Coastguard Worker color)) {
667*c8dee2aaSAndroid Build Coastguard Worker dContext->deleteBackendTexture(beTex);
668*c8dee2aaSAndroid Build Coastguard Worker return {};
669*c8dee2aaSAndroid Build Coastguard Worker }
670*c8dee2aaSAndroid Build Coastguard Worker return beTex;
671*c8dee2aaSAndroid Build Coastguard Worker }
672*c8dee2aaSAndroid Build Coastguard Worker
update_texture_with_pixmaps(GrDirectContext * context,const SkPixmap src[],int numLevels,const GrBackendTexture & backendTexture,GrSurfaceOrigin textureOrigin,sk_sp<skgpu::RefCntedCallback> finishedCallback)673*c8dee2aaSAndroid Build Coastguard Worker static bool update_texture_with_pixmaps(GrDirectContext* context,
674*c8dee2aaSAndroid Build Coastguard Worker const SkPixmap src[],
675*c8dee2aaSAndroid Build Coastguard Worker int numLevels,
676*c8dee2aaSAndroid Build Coastguard Worker const GrBackendTexture& backendTexture,
677*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceOrigin textureOrigin,
678*c8dee2aaSAndroid Build Coastguard Worker sk_sp<skgpu::RefCntedCallback> finishedCallback) {
679*c8dee2aaSAndroid Build Coastguard Worker GrColorType ct = SkColorTypeToGrColorType(src[0].colorType());
680*c8dee2aaSAndroid Build Coastguard Worker const GrBackendFormat& format = backendTexture.getBackendFormat();
681*c8dee2aaSAndroid Build Coastguard Worker
682*c8dee2aaSAndroid Build Coastguard Worker if (!context->priv().caps()->areColorTypeAndFormatCompatible(ct, format)) {
683*c8dee2aaSAndroid Build Coastguard Worker return false;
684*c8dee2aaSAndroid Build Coastguard Worker }
685*c8dee2aaSAndroid Build Coastguard Worker
686*c8dee2aaSAndroid Build Coastguard Worker auto proxy = context->priv().proxyProvider()->wrapBackendTexture(backendTexture,
687*c8dee2aaSAndroid Build Coastguard Worker kBorrow_GrWrapOwnership,
688*c8dee2aaSAndroid Build Coastguard Worker GrWrapCacheable::kNo,
689*c8dee2aaSAndroid Build Coastguard Worker kRW_GrIOType,
690*c8dee2aaSAndroid Build Coastguard Worker std::move(finishedCallback));
691*c8dee2aaSAndroid Build Coastguard Worker if (!proxy) {
692*c8dee2aaSAndroid Build Coastguard Worker return false;
693*c8dee2aaSAndroid Build Coastguard Worker }
694*c8dee2aaSAndroid Build Coastguard Worker
695*c8dee2aaSAndroid Build Coastguard Worker skgpu::Swizzle swizzle = context->priv().caps()->getReadSwizzle(format, ct);
696*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceProxyView view(std::move(proxy), textureOrigin, swizzle);
697*c8dee2aaSAndroid Build Coastguard Worker skgpu::ganesh::SurfaceContext surfaceContext(
698*c8dee2aaSAndroid Build Coastguard Worker context, std::move(view), src[0].info().colorInfo());
699*c8dee2aaSAndroid Build Coastguard Worker AutoSTArray<15, GrCPixmap> tmpSrc(numLevels);
700*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < numLevels; ++i) {
701*c8dee2aaSAndroid Build Coastguard Worker tmpSrc[i] = src[i];
702*c8dee2aaSAndroid Build Coastguard Worker }
703*c8dee2aaSAndroid Build Coastguard Worker if (!surfaceContext.writePixels(context, tmpSrc.get(), numLevels)) {
704*c8dee2aaSAndroid Build Coastguard Worker return false;
705*c8dee2aaSAndroid Build Coastguard Worker }
706*c8dee2aaSAndroid Build Coastguard Worker
707*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceProxy* p = surfaceContext.asSurfaceProxy();
708*c8dee2aaSAndroid Build Coastguard Worker GrFlushInfo info;
709*c8dee2aaSAndroid Build Coastguard Worker context->priv().drawingManager()->flushSurfaces(
710*c8dee2aaSAndroid Build Coastguard Worker {&p, 1}, SkSurfaces::BackendSurfaceAccess::kNoAccess, info, nullptr);
711*c8dee2aaSAndroid Build Coastguard Worker return true;
712*c8dee2aaSAndroid Build Coastguard Worker }
713*c8dee2aaSAndroid Build Coastguard Worker
createBackendTexture(int width,int height,const GrBackendFormat & backendFormat,const SkColor4f & color,skgpu::Mipmapped mipmapped,GrRenderable renderable,GrProtected isProtected,GrGpuFinishedProc finishedProc,GrGpuFinishedContext finishedContext,std::string_view label)714*c8dee2aaSAndroid Build Coastguard Worker GrBackendTexture GrDirectContext::createBackendTexture(int width,
715*c8dee2aaSAndroid Build Coastguard Worker int height,
716*c8dee2aaSAndroid Build Coastguard Worker const GrBackendFormat& backendFormat,
717*c8dee2aaSAndroid Build Coastguard Worker const SkColor4f& color,
718*c8dee2aaSAndroid Build Coastguard Worker skgpu::Mipmapped mipmapped,
719*c8dee2aaSAndroid Build Coastguard Worker GrRenderable renderable,
720*c8dee2aaSAndroid Build Coastguard Worker GrProtected isProtected,
721*c8dee2aaSAndroid Build Coastguard Worker GrGpuFinishedProc finishedProc,
722*c8dee2aaSAndroid Build Coastguard Worker GrGpuFinishedContext finishedContext,
723*c8dee2aaSAndroid Build Coastguard Worker std::string_view label) {
724*c8dee2aaSAndroid Build Coastguard Worker auto finishedCallback = skgpu::RefCntedCallback::Make(finishedProc, finishedContext);
725*c8dee2aaSAndroid Build Coastguard Worker
726*c8dee2aaSAndroid Build Coastguard Worker TRACE_EVENT0("skia.gpu", TRACE_FUNC);
727*c8dee2aaSAndroid Build Coastguard Worker if (this->abandoned()) {
728*c8dee2aaSAndroid Build Coastguard Worker return {};
729*c8dee2aaSAndroid Build Coastguard Worker }
730*c8dee2aaSAndroid Build Coastguard Worker
731*c8dee2aaSAndroid Build Coastguard Worker return create_and_clear_backend_texture(this,
732*c8dee2aaSAndroid Build Coastguard Worker {width, height},
733*c8dee2aaSAndroid Build Coastguard Worker backendFormat,
734*c8dee2aaSAndroid Build Coastguard Worker mipmapped,
735*c8dee2aaSAndroid Build Coastguard Worker renderable,
736*c8dee2aaSAndroid Build Coastguard Worker isProtected,
737*c8dee2aaSAndroid Build Coastguard Worker std::move(finishedCallback),
738*c8dee2aaSAndroid Build Coastguard Worker color.array(),
739*c8dee2aaSAndroid Build Coastguard Worker label);
740*c8dee2aaSAndroid Build Coastguard Worker }
741*c8dee2aaSAndroid Build Coastguard Worker
createBackendTexture(int width,int height,SkColorType skColorType,const SkColor4f & color,skgpu::Mipmapped mipmapped,GrRenderable renderable,GrProtected isProtected,GrGpuFinishedProc finishedProc,GrGpuFinishedContext finishedContext,std::string_view label)742*c8dee2aaSAndroid Build Coastguard Worker GrBackendTexture GrDirectContext::createBackendTexture(int width,
743*c8dee2aaSAndroid Build Coastguard Worker int height,
744*c8dee2aaSAndroid Build Coastguard Worker SkColorType skColorType,
745*c8dee2aaSAndroid Build Coastguard Worker const SkColor4f& color,
746*c8dee2aaSAndroid Build Coastguard Worker skgpu::Mipmapped mipmapped,
747*c8dee2aaSAndroid Build Coastguard Worker GrRenderable renderable,
748*c8dee2aaSAndroid Build Coastguard Worker GrProtected isProtected,
749*c8dee2aaSAndroid Build Coastguard Worker GrGpuFinishedProc finishedProc,
750*c8dee2aaSAndroid Build Coastguard Worker GrGpuFinishedContext finishedContext,
751*c8dee2aaSAndroid Build Coastguard Worker std::string_view label) {
752*c8dee2aaSAndroid Build Coastguard Worker auto finishedCallback = skgpu::RefCntedCallback::Make(finishedProc, finishedContext);
753*c8dee2aaSAndroid Build Coastguard Worker
754*c8dee2aaSAndroid Build Coastguard Worker if (this->abandoned()) {
755*c8dee2aaSAndroid Build Coastguard Worker return {};
756*c8dee2aaSAndroid Build Coastguard Worker }
757*c8dee2aaSAndroid Build Coastguard Worker
758*c8dee2aaSAndroid Build Coastguard Worker GrBackendFormat format = this->defaultBackendFormat(skColorType, renderable);
759*c8dee2aaSAndroid Build Coastguard Worker if (!format.isValid()) {
760*c8dee2aaSAndroid Build Coastguard Worker return {};
761*c8dee2aaSAndroid Build Coastguard Worker }
762*c8dee2aaSAndroid Build Coastguard Worker
763*c8dee2aaSAndroid Build Coastguard Worker GrColorType grColorType = SkColorTypeToGrColorType(skColorType);
764*c8dee2aaSAndroid Build Coastguard Worker SkColor4f swizzledColor = this->caps()->getWriteSwizzle(format, grColorType).applyTo(color);
765*c8dee2aaSAndroid Build Coastguard Worker
766*c8dee2aaSAndroid Build Coastguard Worker return create_and_clear_backend_texture(this,
767*c8dee2aaSAndroid Build Coastguard Worker {width, height},
768*c8dee2aaSAndroid Build Coastguard Worker format,
769*c8dee2aaSAndroid Build Coastguard Worker mipmapped,
770*c8dee2aaSAndroid Build Coastguard Worker renderable,
771*c8dee2aaSAndroid Build Coastguard Worker isProtected,
772*c8dee2aaSAndroid Build Coastguard Worker std::move(finishedCallback),
773*c8dee2aaSAndroid Build Coastguard Worker swizzledColor.array(),
774*c8dee2aaSAndroid Build Coastguard Worker label);
775*c8dee2aaSAndroid Build Coastguard Worker }
776*c8dee2aaSAndroid Build Coastguard Worker
createBackendTexture(const SkPixmap srcData[],int numProvidedLevels,GrSurfaceOrigin textureOrigin,GrRenderable renderable,GrProtected isProtected,GrGpuFinishedProc finishedProc,GrGpuFinishedContext finishedContext,std::string_view label)777*c8dee2aaSAndroid Build Coastguard Worker GrBackendTexture GrDirectContext::createBackendTexture(const SkPixmap srcData[],
778*c8dee2aaSAndroid Build Coastguard Worker int numProvidedLevels,
779*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceOrigin textureOrigin,
780*c8dee2aaSAndroid Build Coastguard Worker GrRenderable renderable,
781*c8dee2aaSAndroid Build Coastguard Worker GrProtected isProtected,
782*c8dee2aaSAndroid Build Coastguard Worker GrGpuFinishedProc finishedProc,
783*c8dee2aaSAndroid Build Coastguard Worker GrGpuFinishedContext finishedContext,
784*c8dee2aaSAndroid Build Coastguard Worker std::string_view label) {
785*c8dee2aaSAndroid Build Coastguard Worker TRACE_EVENT0("skia.gpu", TRACE_FUNC);
786*c8dee2aaSAndroid Build Coastguard Worker
787*c8dee2aaSAndroid Build Coastguard Worker auto finishedCallback = skgpu::RefCntedCallback::Make(finishedProc, finishedContext);
788*c8dee2aaSAndroid Build Coastguard Worker
789*c8dee2aaSAndroid Build Coastguard Worker if (this->abandoned()) {
790*c8dee2aaSAndroid Build Coastguard Worker return {};
791*c8dee2aaSAndroid Build Coastguard Worker }
792*c8dee2aaSAndroid Build Coastguard Worker
793*c8dee2aaSAndroid Build Coastguard Worker if (!srcData || numProvidedLevels <= 0) {
794*c8dee2aaSAndroid Build Coastguard Worker return {};
795*c8dee2aaSAndroid Build Coastguard Worker }
796*c8dee2aaSAndroid Build Coastguard Worker
797*c8dee2aaSAndroid Build Coastguard Worker SkColorType colorType = srcData[0].colorType();
798*c8dee2aaSAndroid Build Coastguard Worker
799*c8dee2aaSAndroid Build Coastguard Worker skgpu::Mipmapped mipmapped = skgpu::Mipmapped::kNo;
800*c8dee2aaSAndroid Build Coastguard Worker if (numProvidedLevels > 1) {
801*c8dee2aaSAndroid Build Coastguard Worker mipmapped = skgpu::Mipmapped::kYes;
802*c8dee2aaSAndroid Build Coastguard Worker }
803*c8dee2aaSAndroid Build Coastguard Worker
804*c8dee2aaSAndroid Build Coastguard Worker GrBackendFormat backendFormat = this->defaultBackendFormat(colorType, renderable);
805*c8dee2aaSAndroid Build Coastguard Worker GrBackendTexture beTex = this->createBackendTexture(srcData[0].width(),
806*c8dee2aaSAndroid Build Coastguard Worker srcData[0].height(),
807*c8dee2aaSAndroid Build Coastguard Worker backendFormat,
808*c8dee2aaSAndroid Build Coastguard Worker mipmapped,
809*c8dee2aaSAndroid Build Coastguard Worker renderable,
810*c8dee2aaSAndroid Build Coastguard Worker isProtected,
811*c8dee2aaSAndroid Build Coastguard Worker label);
812*c8dee2aaSAndroid Build Coastguard Worker if (!beTex.isValid()) {
813*c8dee2aaSAndroid Build Coastguard Worker return {};
814*c8dee2aaSAndroid Build Coastguard Worker }
815*c8dee2aaSAndroid Build Coastguard Worker if (!update_texture_with_pixmaps(this,
816*c8dee2aaSAndroid Build Coastguard Worker srcData,
817*c8dee2aaSAndroid Build Coastguard Worker numProvidedLevels,
818*c8dee2aaSAndroid Build Coastguard Worker beTex,
819*c8dee2aaSAndroid Build Coastguard Worker textureOrigin,
820*c8dee2aaSAndroid Build Coastguard Worker std::move(finishedCallback))) {
821*c8dee2aaSAndroid Build Coastguard Worker this->deleteBackendTexture(beTex);
822*c8dee2aaSAndroid Build Coastguard Worker return {};
823*c8dee2aaSAndroid Build Coastguard Worker }
824*c8dee2aaSAndroid Build Coastguard Worker return beTex;
825*c8dee2aaSAndroid Build Coastguard Worker }
826*c8dee2aaSAndroid Build Coastguard Worker
updateBackendTexture(const GrBackendTexture & texture,const SkPixmap srcData[],int numLevels,GrGpuFinishedProc finishedProc,GrGpuFinishedContext finishedContext)827*c8dee2aaSAndroid Build Coastguard Worker bool GrDirectContext::updateBackendTexture(const GrBackendTexture& texture,
828*c8dee2aaSAndroid Build Coastguard Worker const SkPixmap srcData[],
829*c8dee2aaSAndroid Build Coastguard Worker int numLevels,
830*c8dee2aaSAndroid Build Coastguard Worker GrGpuFinishedProc finishedProc,
831*c8dee2aaSAndroid Build Coastguard Worker GrGpuFinishedContext finishedContext) {
832*c8dee2aaSAndroid Build Coastguard Worker return this->updateBackendTexture(texture,
833*c8dee2aaSAndroid Build Coastguard Worker srcData,
834*c8dee2aaSAndroid Build Coastguard Worker numLevels,
835*c8dee2aaSAndroid Build Coastguard Worker kTopLeft_GrSurfaceOrigin,
836*c8dee2aaSAndroid Build Coastguard Worker finishedProc,
837*c8dee2aaSAndroid Build Coastguard Worker finishedContext);
838*c8dee2aaSAndroid Build Coastguard Worker }
839*c8dee2aaSAndroid Build Coastguard Worker
updateBackendTexture(const GrBackendTexture & backendTexture,const SkColor4f & color,GrGpuFinishedProc finishedProc,GrGpuFinishedContext finishedContext)840*c8dee2aaSAndroid Build Coastguard Worker bool GrDirectContext::updateBackendTexture(const GrBackendTexture& backendTexture,
841*c8dee2aaSAndroid Build Coastguard Worker const SkColor4f& color,
842*c8dee2aaSAndroid Build Coastguard Worker GrGpuFinishedProc finishedProc,
843*c8dee2aaSAndroid Build Coastguard Worker GrGpuFinishedContext finishedContext) {
844*c8dee2aaSAndroid Build Coastguard Worker auto finishedCallback = skgpu::RefCntedCallback::Make(finishedProc, finishedContext);
845*c8dee2aaSAndroid Build Coastguard Worker
846*c8dee2aaSAndroid Build Coastguard Worker if (this->abandoned()) {
847*c8dee2aaSAndroid Build Coastguard Worker return false;
848*c8dee2aaSAndroid Build Coastguard Worker }
849*c8dee2aaSAndroid Build Coastguard Worker
850*c8dee2aaSAndroid Build Coastguard Worker return fGpu->clearBackendTexture(backendTexture, std::move(finishedCallback), color.array());
851*c8dee2aaSAndroid Build Coastguard Worker }
852*c8dee2aaSAndroid Build Coastguard Worker
updateBackendTexture(const GrBackendTexture & backendTexture,SkColorType skColorType,const SkColor4f & color,GrGpuFinishedProc finishedProc,GrGpuFinishedContext finishedContext)853*c8dee2aaSAndroid Build Coastguard Worker bool GrDirectContext::updateBackendTexture(const GrBackendTexture& backendTexture,
854*c8dee2aaSAndroid Build Coastguard Worker SkColorType skColorType,
855*c8dee2aaSAndroid Build Coastguard Worker const SkColor4f& color,
856*c8dee2aaSAndroid Build Coastguard Worker GrGpuFinishedProc finishedProc,
857*c8dee2aaSAndroid Build Coastguard Worker GrGpuFinishedContext finishedContext) {
858*c8dee2aaSAndroid Build Coastguard Worker auto finishedCallback = skgpu::RefCntedCallback::Make(finishedProc, finishedContext);
859*c8dee2aaSAndroid Build Coastguard Worker
860*c8dee2aaSAndroid Build Coastguard Worker if (this->abandoned()) {
861*c8dee2aaSAndroid Build Coastguard Worker return false;
862*c8dee2aaSAndroid Build Coastguard Worker }
863*c8dee2aaSAndroid Build Coastguard Worker
864*c8dee2aaSAndroid Build Coastguard Worker GrBackendFormat format = backendTexture.getBackendFormat();
865*c8dee2aaSAndroid Build Coastguard Worker GrColorType grColorType = SkColorTypeToGrColorType(skColorType);
866*c8dee2aaSAndroid Build Coastguard Worker
867*c8dee2aaSAndroid Build Coastguard Worker if (!this->caps()->areColorTypeAndFormatCompatible(grColorType, format)) {
868*c8dee2aaSAndroid Build Coastguard Worker return false;
869*c8dee2aaSAndroid Build Coastguard Worker }
870*c8dee2aaSAndroid Build Coastguard Worker
871*c8dee2aaSAndroid Build Coastguard Worker skgpu::Swizzle swizzle = this->caps()->getWriteSwizzle(format, grColorType);
872*c8dee2aaSAndroid Build Coastguard Worker SkColor4f swizzledColor = swizzle.applyTo(color);
873*c8dee2aaSAndroid Build Coastguard Worker
874*c8dee2aaSAndroid Build Coastguard Worker return fGpu->clearBackendTexture(backendTexture,
875*c8dee2aaSAndroid Build Coastguard Worker std::move(finishedCallback),
876*c8dee2aaSAndroid Build Coastguard Worker swizzledColor.array());
877*c8dee2aaSAndroid Build Coastguard Worker }
878*c8dee2aaSAndroid Build Coastguard Worker
updateBackendTexture(const GrBackendTexture & backendTexture,const SkPixmap srcData[],int numLevels,GrSurfaceOrigin textureOrigin,GrGpuFinishedProc finishedProc,GrGpuFinishedContext finishedContext)879*c8dee2aaSAndroid Build Coastguard Worker bool GrDirectContext::updateBackendTexture(const GrBackendTexture& backendTexture,
880*c8dee2aaSAndroid Build Coastguard Worker const SkPixmap srcData[],
881*c8dee2aaSAndroid Build Coastguard Worker int numLevels,
882*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceOrigin textureOrigin,
883*c8dee2aaSAndroid Build Coastguard Worker GrGpuFinishedProc finishedProc,
884*c8dee2aaSAndroid Build Coastguard Worker GrGpuFinishedContext finishedContext) {
885*c8dee2aaSAndroid Build Coastguard Worker auto finishedCallback = skgpu::RefCntedCallback::Make(finishedProc, finishedContext);
886*c8dee2aaSAndroid Build Coastguard Worker
887*c8dee2aaSAndroid Build Coastguard Worker if (this->abandoned()) {
888*c8dee2aaSAndroid Build Coastguard Worker return false;
889*c8dee2aaSAndroid Build Coastguard Worker }
890*c8dee2aaSAndroid Build Coastguard Worker
891*c8dee2aaSAndroid Build Coastguard Worker if (!srcData || numLevels <= 0) {
892*c8dee2aaSAndroid Build Coastguard Worker return false;
893*c8dee2aaSAndroid Build Coastguard Worker }
894*c8dee2aaSAndroid Build Coastguard Worker
895*c8dee2aaSAndroid Build Coastguard Worker // If the texture has MIP levels then we require that the full set is overwritten.
896*c8dee2aaSAndroid Build Coastguard Worker int numExpectedLevels = 1;
897*c8dee2aaSAndroid Build Coastguard Worker if (backendTexture.hasMipmaps()) {
898*c8dee2aaSAndroid Build Coastguard Worker numExpectedLevels = SkMipmap::ComputeLevelCount(backendTexture.width(),
899*c8dee2aaSAndroid Build Coastguard Worker backendTexture.height()) + 1;
900*c8dee2aaSAndroid Build Coastguard Worker }
901*c8dee2aaSAndroid Build Coastguard Worker if (numLevels != numExpectedLevels) {
902*c8dee2aaSAndroid Build Coastguard Worker return false;
903*c8dee2aaSAndroid Build Coastguard Worker }
904*c8dee2aaSAndroid Build Coastguard Worker return update_texture_with_pixmaps(this,
905*c8dee2aaSAndroid Build Coastguard Worker srcData,
906*c8dee2aaSAndroid Build Coastguard Worker numLevels,
907*c8dee2aaSAndroid Build Coastguard Worker backendTexture,
908*c8dee2aaSAndroid Build Coastguard Worker textureOrigin,
909*c8dee2aaSAndroid Build Coastguard Worker std::move(finishedCallback));
910*c8dee2aaSAndroid Build Coastguard Worker }
911*c8dee2aaSAndroid Build Coastguard Worker
912*c8dee2aaSAndroid Build Coastguard Worker //////////////////////////////////////////////////////////////////////////////
913*c8dee2aaSAndroid Build Coastguard Worker
create_and_update_compressed_backend_texture(GrDirectContext * dContext,SkISize dimensions,const GrBackendFormat & backendFormat,skgpu::Mipmapped mipmapped,GrProtected isProtected,sk_sp<skgpu::RefCntedCallback> finishedCallback,const void * data,size_t size)914*c8dee2aaSAndroid Build Coastguard Worker static GrBackendTexture create_and_update_compressed_backend_texture(
915*c8dee2aaSAndroid Build Coastguard Worker GrDirectContext* dContext,
916*c8dee2aaSAndroid Build Coastguard Worker SkISize dimensions,
917*c8dee2aaSAndroid Build Coastguard Worker const GrBackendFormat& backendFormat,
918*c8dee2aaSAndroid Build Coastguard Worker skgpu::Mipmapped mipmapped,
919*c8dee2aaSAndroid Build Coastguard Worker GrProtected isProtected,
920*c8dee2aaSAndroid Build Coastguard Worker sk_sp<skgpu::RefCntedCallback> finishedCallback,
921*c8dee2aaSAndroid Build Coastguard Worker const void* data,
922*c8dee2aaSAndroid Build Coastguard Worker size_t size) {
923*c8dee2aaSAndroid Build Coastguard Worker GrGpu* gpu = dContext->priv().getGpu();
924*c8dee2aaSAndroid Build Coastguard Worker
925*c8dee2aaSAndroid Build Coastguard Worker GrBackendTexture beTex = gpu->createCompressedBackendTexture(dimensions, backendFormat,
926*c8dee2aaSAndroid Build Coastguard Worker mipmapped, isProtected);
927*c8dee2aaSAndroid Build Coastguard Worker if (!beTex.isValid()) {
928*c8dee2aaSAndroid Build Coastguard Worker return {};
929*c8dee2aaSAndroid Build Coastguard Worker }
930*c8dee2aaSAndroid Build Coastguard Worker
931*c8dee2aaSAndroid Build Coastguard Worker if (!dContext->priv().getGpu()->updateCompressedBackendTexture(
932*c8dee2aaSAndroid Build Coastguard Worker beTex, std::move(finishedCallback), data, size)) {
933*c8dee2aaSAndroid Build Coastguard Worker dContext->deleteBackendTexture(beTex);
934*c8dee2aaSAndroid Build Coastguard Worker return {};
935*c8dee2aaSAndroid Build Coastguard Worker }
936*c8dee2aaSAndroid Build Coastguard Worker return beTex;
937*c8dee2aaSAndroid Build Coastguard Worker }
938*c8dee2aaSAndroid Build Coastguard Worker
createCompressedBackendTexture(int width,int height,const GrBackendFormat & backendFormat,const SkColor4f & color,skgpu::Mipmapped mipmapped,GrProtected isProtected,GrGpuFinishedProc finishedProc,GrGpuFinishedContext finishedContext)939*c8dee2aaSAndroid Build Coastguard Worker GrBackendTexture GrDirectContext::createCompressedBackendTexture(
940*c8dee2aaSAndroid Build Coastguard Worker int width,
941*c8dee2aaSAndroid Build Coastguard Worker int height,
942*c8dee2aaSAndroid Build Coastguard Worker const GrBackendFormat& backendFormat,
943*c8dee2aaSAndroid Build Coastguard Worker const SkColor4f& color,
944*c8dee2aaSAndroid Build Coastguard Worker skgpu::Mipmapped mipmapped,
945*c8dee2aaSAndroid Build Coastguard Worker GrProtected isProtected,
946*c8dee2aaSAndroid Build Coastguard Worker GrGpuFinishedProc finishedProc,
947*c8dee2aaSAndroid Build Coastguard Worker GrGpuFinishedContext finishedContext) {
948*c8dee2aaSAndroid Build Coastguard Worker TRACE_EVENT0("skia.gpu", TRACE_FUNC);
949*c8dee2aaSAndroid Build Coastguard Worker auto finishedCallback = skgpu::RefCntedCallback::Make(finishedProc, finishedContext);
950*c8dee2aaSAndroid Build Coastguard Worker
951*c8dee2aaSAndroid Build Coastguard Worker if (this->abandoned()) {
952*c8dee2aaSAndroid Build Coastguard Worker return {};
953*c8dee2aaSAndroid Build Coastguard Worker }
954*c8dee2aaSAndroid Build Coastguard Worker
955*c8dee2aaSAndroid Build Coastguard Worker SkTextureCompressionType compression = GrBackendFormatToCompressionType(backendFormat);
956*c8dee2aaSAndroid Build Coastguard Worker if (compression == SkTextureCompressionType::kNone) {
957*c8dee2aaSAndroid Build Coastguard Worker return {};
958*c8dee2aaSAndroid Build Coastguard Worker }
959*c8dee2aaSAndroid Build Coastguard Worker
960*c8dee2aaSAndroid Build Coastguard Worker size_t size = SkCompressedDataSize(
961*c8dee2aaSAndroid Build Coastguard Worker compression, {width, height}, nullptr, mipmapped == skgpu::Mipmapped::kYes);
962*c8dee2aaSAndroid Build Coastguard Worker auto storage = std::make_unique<char[]>(size);
963*c8dee2aaSAndroid Build Coastguard Worker skgpu::FillInCompressedData(compression, {width, height}, mipmapped, storage.get(), color);
964*c8dee2aaSAndroid Build Coastguard Worker return create_and_update_compressed_backend_texture(this,
965*c8dee2aaSAndroid Build Coastguard Worker {width, height},
966*c8dee2aaSAndroid Build Coastguard Worker backendFormat,
967*c8dee2aaSAndroid Build Coastguard Worker mipmapped,
968*c8dee2aaSAndroid Build Coastguard Worker isProtected,
969*c8dee2aaSAndroid Build Coastguard Worker std::move(finishedCallback),
970*c8dee2aaSAndroid Build Coastguard Worker storage.get(),
971*c8dee2aaSAndroid Build Coastguard Worker size);
972*c8dee2aaSAndroid Build Coastguard Worker }
973*c8dee2aaSAndroid Build Coastguard Worker
createCompressedBackendTexture(int width,int height,SkTextureCompressionType compression,const SkColor4f & color,skgpu::Mipmapped mipmapped,GrProtected isProtected,GrGpuFinishedProc finishedProc,GrGpuFinishedContext finishedContext)974*c8dee2aaSAndroid Build Coastguard Worker GrBackendTexture GrDirectContext::createCompressedBackendTexture(
975*c8dee2aaSAndroid Build Coastguard Worker int width,
976*c8dee2aaSAndroid Build Coastguard Worker int height,
977*c8dee2aaSAndroid Build Coastguard Worker SkTextureCompressionType compression,
978*c8dee2aaSAndroid Build Coastguard Worker const SkColor4f& color,
979*c8dee2aaSAndroid Build Coastguard Worker skgpu::Mipmapped mipmapped,
980*c8dee2aaSAndroid Build Coastguard Worker GrProtected isProtected,
981*c8dee2aaSAndroid Build Coastguard Worker GrGpuFinishedProc finishedProc,
982*c8dee2aaSAndroid Build Coastguard Worker GrGpuFinishedContext finishedContext) {
983*c8dee2aaSAndroid Build Coastguard Worker TRACE_EVENT0("skia.gpu", TRACE_FUNC);
984*c8dee2aaSAndroid Build Coastguard Worker GrBackendFormat format = this->compressedBackendFormat(compression);
985*c8dee2aaSAndroid Build Coastguard Worker return this->createCompressedBackendTexture(width, height, format, color,
986*c8dee2aaSAndroid Build Coastguard Worker mipmapped, isProtected, finishedProc,
987*c8dee2aaSAndroid Build Coastguard Worker finishedContext);
988*c8dee2aaSAndroid Build Coastguard Worker }
989*c8dee2aaSAndroid Build Coastguard Worker
createCompressedBackendTexture(int width,int height,const GrBackendFormat & backendFormat,const void * compressedData,size_t dataSize,skgpu::Mipmapped mipmapped,GrProtected isProtected,GrGpuFinishedProc finishedProc,GrGpuFinishedContext finishedContext)990*c8dee2aaSAndroid Build Coastguard Worker GrBackendTexture GrDirectContext::createCompressedBackendTexture(
991*c8dee2aaSAndroid Build Coastguard Worker int width,
992*c8dee2aaSAndroid Build Coastguard Worker int height,
993*c8dee2aaSAndroid Build Coastguard Worker const GrBackendFormat& backendFormat,
994*c8dee2aaSAndroid Build Coastguard Worker const void* compressedData,
995*c8dee2aaSAndroid Build Coastguard Worker size_t dataSize,
996*c8dee2aaSAndroid Build Coastguard Worker skgpu::Mipmapped mipmapped,
997*c8dee2aaSAndroid Build Coastguard Worker GrProtected isProtected,
998*c8dee2aaSAndroid Build Coastguard Worker GrGpuFinishedProc finishedProc,
999*c8dee2aaSAndroid Build Coastguard Worker GrGpuFinishedContext finishedContext) {
1000*c8dee2aaSAndroid Build Coastguard Worker TRACE_EVENT0("skia.gpu", TRACE_FUNC);
1001*c8dee2aaSAndroid Build Coastguard Worker auto finishedCallback = skgpu::RefCntedCallback::Make(finishedProc, finishedContext);
1002*c8dee2aaSAndroid Build Coastguard Worker
1003*c8dee2aaSAndroid Build Coastguard Worker if (this->abandoned()) {
1004*c8dee2aaSAndroid Build Coastguard Worker return {};
1005*c8dee2aaSAndroid Build Coastguard Worker }
1006*c8dee2aaSAndroid Build Coastguard Worker
1007*c8dee2aaSAndroid Build Coastguard Worker return create_and_update_compressed_backend_texture(this,
1008*c8dee2aaSAndroid Build Coastguard Worker {width, height},
1009*c8dee2aaSAndroid Build Coastguard Worker backendFormat,
1010*c8dee2aaSAndroid Build Coastguard Worker mipmapped,
1011*c8dee2aaSAndroid Build Coastguard Worker isProtected,
1012*c8dee2aaSAndroid Build Coastguard Worker std::move(finishedCallback),
1013*c8dee2aaSAndroid Build Coastguard Worker compressedData,
1014*c8dee2aaSAndroid Build Coastguard Worker dataSize);
1015*c8dee2aaSAndroid Build Coastguard Worker }
1016*c8dee2aaSAndroid Build Coastguard Worker
createCompressedBackendTexture(int width,int height,SkTextureCompressionType compression,const void * data,size_t dataSize,skgpu::Mipmapped mipmapped,GrProtected isProtected,GrGpuFinishedProc finishedProc,GrGpuFinishedContext finishedContext)1017*c8dee2aaSAndroid Build Coastguard Worker GrBackendTexture GrDirectContext::createCompressedBackendTexture(
1018*c8dee2aaSAndroid Build Coastguard Worker int width,
1019*c8dee2aaSAndroid Build Coastguard Worker int height,
1020*c8dee2aaSAndroid Build Coastguard Worker SkTextureCompressionType compression,
1021*c8dee2aaSAndroid Build Coastguard Worker const void* data,
1022*c8dee2aaSAndroid Build Coastguard Worker size_t dataSize,
1023*c8dee2aaSAndroid Build Coastguard Worker skgpu::Mipmapped mipmapped,
1024*c8dee2aaSAndroid Build Coastguard Worker GrProtected isProtected,
1025*c8dee2aaSAndroid Build Coastguard Worker GrGpuFinishedProc finishedProc,
1026*c8dee2aaSAndroid Build Coastguard Worker GrGpuFinishedContext finishedContext) {
1027*c8dee2aaSAndroid Build Coastguard Worker TRACE_EVENT0("skia.gpu", TRACE_FUNC);
1028*c8dee2aaSAndroid Build Coastguard Worker GrBackendFormat format = this->compressedBackendFormat(compression);
1029*c8dee2aaSAndroid Build Coastguard Worker return this->createCompressedBackendTexture(width, height, format, data, dataSize, mipmapped,
1030*c8dee2aaSAndroid Build Coastguard Worker isProtected, finishedProc, finishedContext);
1031*c8dee2aaSAndroid Build Coastguard Worker }
1032*c8dee2aaSAndroid Build Coastguard Worker
updateCompressedBackendTexture(const GrBackendTexture & backendTexture,const SkColor4f & color,GrGpuFinishedProc finishedProc,GrGpuFinishedContext finishedContext)1033*c8dee2aaSAndroid Build Coastguard Worker bool GrDirectContext::updateCompressedBackendTexture(const GrBackendTexture& backendTexture,
1034*c8dee2aaSAndroid Build Coastguard Worker const SkColor4f& color,
1035*c8dee2aaSAndroid Build Coastguard Worker GrGpuFinishedProc finishedProc,
1036*c8dee2aaSAndroid Build Coastguard Worker GrGpuFinishedContext finishedContext) {
1037*c8dee2aaSAndroid Build Coastguard Worker auto finishedCallback = skgpu::RefCntedCallback::Make(finishedProc, finishedContext);
1038*c8dee2aaSAndroid Build Coastguard Worker
1039*c8dee2aaSAndroid Build Coastguard Worker if (this->abandoned()) {
1040*c8dee2aaSAndroid Build Coastguard Worker return false;
1041*c8dee2aaSAndroid Build Coastguard Worker }
1042*c8dee2aaSAndroid Build Coastguard Worker
1043*c8dee2aaSAndroid Build Coastguard Worker SkTextureCompressionType compression =
1044*c8dee2aaSAndroid Build Coastguard Worker GrBackendFormatToCompressionType(backendTexture.getBackendFormat());
1045*c8dee2aaSAndroid Build Coastguard Worker if (compression == SkTextureCompressionType::kNone) {
1046*c8dee2aaSAndroid Build Coastguard Worker return {};
1047*c8dee2aaSAndroid Build Coastguard Worker }
1048*c8dee2aaSAndroid Build Coastguard Worker size_t size = SkCompressedDataSize(compression,
1049*c8dee2aaSAndroid Build Coastguard Worker backendTexture.dimensions(),
1050*c8dee2aaSAndroid Build Coastguard Worker nullptr,
1051*c8dee2aaSAndroid Build Coastguard Worker backendTexture.hasMipmaps());
1052*c8dee2aaSAndroid Build Coastguard Worker SkAutoMalloc storage(size);
1053*c8dee2aaSAndroid Build Coastguard Worker skgpu::FillInCompressedData(compression,
1054*c8dee2aaSAndroid Build Coastguard Worker backendTexture.dimensions(),
1055*c8dee2aaSAndroid Build Coastguard Worker backendTexture.mipmapped(),
1056*c8dee2aaSAndroid Build Coastguard Worker static_cast<char*>(storage.get()),
1057*c8dee2aaSAndroid Build Coastguard Worker color);
1058*c8dee2aaSAndroid Build Coastguard Worker return fGpu->updateCompressedBackendTexture(backendTexture,
1059*c8dee2aaSAndroid Build Coastguard Worker std::move(finishedCallback),
1060*c8dee2aaSAndroid Build Coastguard Worker storage.get(),
1061*c8dee2aaSAndroid Build Coastguard Worker size);
1062*c8dee2aaSAndroid Build Coastguard Worker }
1063*c8dee2aaSAndroid Build Coastguard Worker
updateCompressedBackendTexture(const GrBackendTexture & backendTexture,const void * compressedData,size_t dataSize,GrGpuFinishedProc finishedProc,GrGpuFinishedContext finishedContext)1064*c8dee2aaSAndroid Build Coastguard Worker bool GrDirectContext::updateCompressedBackendTexture(const GrBackendTexture& backendTexture,
1065*c8dee2aaSAndroid Build Coastguard Worker const void* compressedData,
1066*c8dee2aaSAndroid Build Coastguard Worker size_t dataSize,
1067*c8dee2aaSAndroid Build Coastguard Worker GrGpuFinishedProc finishedProc,
1068*c8dee2aaSAndroid Build Coastguard Worker GrGpuFinishedContext finishedContext) {
1069*c8dee2aaSAndroid Build Coastguard Worker auto finishedCallback = skgpu::RefCntedCallback::Make(finishedProc, finishedContext);
1070*c8dee2aaSAndroid Build Coastguard Worker
1071*c8dee2aaSAndroid Build Coastguard Worker if (this->abandoned()) {
1072*c8dee2aaSAndroid Build Coastguard Worker return false;
1073*c8dee2aaSAndroid Build Coastguard Worker }
1074*c8dee2aaSAndroid Build Coastguard Worker
1075*c8dee2aaSAndroid Build Coastguard Worker if (!compressedData) {
1076*c8dee2aaSAndroid Build Coastguard Worker return false;
1077*c8dee2aaSAndroid Build Coastguard Worker }
1078*c8dee2aaSAndroid Build Coastguard Worker
1079*c8dee2aaSAndroid Build Coastguard Worker return fGpu->updateCompressedBackendTexture(backendTexture,
1080*c8dee2aaSAndroid Build Coastguard Worker std::move(finishedCallback),
1081*c8dee2aaSAndroid Build Coastguard Worker compressedData,
1082*c8dee2aaSAndroid Build Coastguard Worker dataSize);
1083*c8dee2aaSAndroid Build Coastguard Worker }
1084*c8dee2aaSAndroid Build Coastguard Worker
1085*c8dee2aaSAndroid Build Coastguard Worker //////////////////////////////////////////////////////////////////////////////
1086*c8dee2aaSAndroid Build Coastguard Worker
setBackendTextureState(const GrBackendTexture & backendTexture,const skgpu::MutableTextureState & state,skgpu::MutableTextureState * previousState,GrGpuFinishedProc finishedProc,GrGpuFinishedContext finishedContext)1087*c8dee2aaSAndroid Build Coastguard Worker bool GrDirectContext::setBackendTextureState(const GrBackendTexture& backendTexture,
1088*c8dee2aaSAndroid Build Coastguard Worker const skgpu::MutableTextureState& state,
1089*c8dee2aaSAndroid Build Coastguard Worker skgpu::MutableTextureState* previousState,
1090*c8dee2aaSAndroid Build Coastguard Worker GrGpuFinishedProc finishedProc,
1091*c8dee2aaSAndroid Build Coastguard Worker GrGpuFinishedContext finishedContext) {
1092*c8dee2aaSAndroid Build Coastguard Worker auto callback = skgpu::RefCntedCallback::Make(finishedProc, finishedContext);
1093*c8dee2aaSAndroid Build Coastguard Worker
1094*c8dee2aaSAndroid Build Coastguard Worker if (this->abandoned()) {
1095*c8dee2aaSAndroid Build Coastguard Worker return false;
1096*c8dee2aaSAndroid Build Coastguard Worker }
1097*c8dee2aaSAndroid Build Coastguard Worker
1098*c8dee2aaSAndroid Build Coastguard Worker return fGpu->setBackendTextureState(backendTexture, state, previousState, std::move(callback));
1099*c8dee2aaSAndroid Build Coastguard Worker }
1100*c8dee2aaSAndroid Build Coastguard Worker
1101*c8dee2aaSAndroid Build Coastguard Worker
setBackendRenderTargetState(const GrBackendRenderTarget & backendRenderTarget,const skgpu::MutableTextureState & state,skgpu::MutableTextureState * previousState,GrGpuFinishedProc finishedProc,GrGpuFinishedContext finishedContext)1102*c8dee2aaSAndroid Build Coastguard Worker bool GrDirectContext::setBackendRenderTargetState(const GrBackendRenderTarget& backendRenderTarget,
1103*c8dee2aaSAndroid Build Coastguard Worker const skgpu::MutableTextureState& state,
1104*c8dee2aaSAndroid Build Coastguard Worker skgpu::MutableTextureState* previousState,
1105*c8dee2aaSAndroid Build Coastguard Worker GrGpuFinishedProc finishedProc,
1106*c8dee2aaSAndroid Build Coastguard Worker GrGpuFinishedContext finishedContext) {
1107*c8dee2aaSAndroid Build Coastguard Worker auto callback = skgpu::RefCntedCallback::Make(finishedProc, finishedContext);
1108*c8dee2aaSAndroid Build Coastguard Worker
1109*c8dee2aaSAndroid Build Coastguard Worker if (this->abandoned()) {
1110*c8dee2aaSAndroid Build Coastguard Worker return false;
1111*c8dee2aaSAndroid Build Coastguard Worker }
1112*c8dee2aaSAndroid Build Coastguard Worker
1113*c8dee2aaSAndroid Build Coastguard Worker return fGpu->setBackendRenderTargetState(backendRenderTarget, state, previousState,
1114*c8dee2aaSAndroid Build Coastguard Worker std::move(callback));
1115*c8dee2aaSAndroid Build Coastguard Worker }
1116*c8dee2aaSAndroid Build Coastguard Worker
deleteBackendTexture(const GrBackendTexture & backendTex)1117*c8dee2aaSAndroid Build Coastguard Worker void GrDirectContext::deleteBackendTexture(const GrBackendTexture& backendTex) {
1118*c8dee2aaSAndroid Build Coastguard Worker TRACE_EVENT0("skia.gpu", TRACE_FUNC);
1119*c8dee2aaSAndroid Build Coastguard Worker // For the Vulkan backend we still must destroy the backend texture when the context is
1120*c8dee2aaSAndroid Build Coastguard Worker // abandoned.
1121*c8dee2aaSAndroid Build Coastguard Worker if ((this->abandoned() && this->backend() != GrBackendApi::kVulkan) || !backendTex.isValid()) {
1122*c8dee2aaSAndroid Build Coastguard Worker return;
1123*c8dee2aaSAndroid Build Coastguard Worker }
1124*c8dee2aaSAndroid Build Coastguard Worker
1125*c8dee2aaSAndroid Build Coastguard Worker fGpu->deleteBackendTexture(backendTex);
1126*c8dee2aaSAndroid Build Coastguard Worker }
1127*c8dee2aaSAndroid Build Coastguard Worker
1128*c8dee2aaSAndroid Build Coastguard Worker //////////////////////////////////////////////////////////////////////////////
1129*c8dee2aaSAndroid Build Coastguard Worker
precompileShader(const SkData & key,const SkData & data)1130*c8dee2aaSAndroid Build Coastguard Worker bool GrDirectContext::precompileShader(const SkData& key, const SkData& data) {
1131*c8dee2aaSAndroid Build Coastguard Worker return fGpu->precompileShader(key, data);
1132*c8dee2aaSAndroid Build Coastguard Worker }
1133*c8dee2aaSAndroid Build Coastguard Worker
1134*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_ENABLE_DUMP_GPU)
1135*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkString.h"
1136*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrUtil.h"
1137*c8dee2aaSAndroid Build Coastguard Worker #include "src/utils/SkJSONWriter.h"
1138*c8dee2aaSAndroid Build Coastguard Worker
dump() const1139*c8dee2aaSAndroid Build Coastguard Worker SkString GrDirectContext::dump() const {
1140*c8dee2aaSAndroid Build Coastguard Worker SkDynamicMemoryWStream stream;
1141*c8dee2aaSAndroid Build Coastguard Worker SkJSONWriter writer(&stream, SkJSONWriter::Mode::kPretty);
1142*c8dee2aaSAndroid Build Coastguard Worker writer.beginObject();
1143*c8dee2aaSAndroid Build Coastguard Worker
1144*c8dee2aaSAndroid Build Coastguard Worker writer.appendCString("backend", GrBackendApiToStr(this->backend()));
1145*c8dee2aaSAndroid Build Coastguard Worker
1146*c8dee2aaSAndroid Build Coastguard Worker writer.appendName("caps");
1147*c8dee2aaSAndroid Build Coastguard Worker this->caps()->dumpJSON(&writer);
1148*c8dee2aaSAndroid Build Coastguard Worker
1149*c8dee2aaSAndroid Build Coastguard Worker writer.appendName("gpu");
1150*c8dee2aaSAndroid Build Coastguard Worker this->fGpu->dumpJSON(&writer);
1151*c8dee2aaSAndroid Build Coastguard Worker
1152*c8dee2aaSAndroid Build Coastguard Worker writer.appendName("context");
1153*c8dee2aaSAndroid Build Coastguard Worker this->dumpJSON(&writer);
1154*c8dee2aaSAndroid Build Coastguard Worker
1155*c8dee2aaSAndroid Build Coastguard Worker // Flush JSON to the memory stream
1156*c8dee2aaSAndroid Build Coastguard Worker writer.endObject();
1157*c8dee2aaSAndroid Build Coastguard Worker writer.flush();
1158*c8dee2aaSAndroid Build Coastguard Worker
1159*c8dee2aaSAndroid Build Coastguard Worker // Null terminate the JSON data in the memory stream
1160*c8dee2aaSAndroid Build Coastguard Worker stream.write8(0);
1161*c8dee2aaSAndroid Build Coastguard Worker
1162*c8dee2aaSAndroid Build Coastguard Worker // Allocate a string big enough to hold all the data, then copy out of the stream
1163*c8dee2aaSAndroid Build Coastguard Worker SkString result(stream.bytesWritten());
1164*c8dee2aaSAndroid Build Coastguard Worker stream.copyToAndReset(result.data());
1165*c8dee2aaSAndroid Build Coastguard Worker return result;
1166*c8dee2aaSAndroid Build Coastguard Worker }
1167*c8dee2aaSAndroid Build Coastguard Worker #endif
1168*c8dee2aaSAndroid Build Coastguard Worker
1169*c8dee2aaSAndroid Build Coastguard Worker /*************************************************************************************************/
MakeMock(const GrMockOptions * mockOptions)1170*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrDirectContext> GrDirectContext::MakeMock(const GrMockOptions* mockOptions) {
1171*c8dee2aaSAndroid Build Coastguard Worker GrContextOptions defaultOptions;
1172*c8dee2aaSAndroid Build Coastguard Worker return MakeMock(mockOptions, defaultOptions);
1173*c8dee2aaSAndroid Build Coastguard Worker }
1174*c8dee2aaSAndroid Build Coastguard Worker
MakeMock(const GrMockOptions * mockOptions,const GrContextOptions & options)1175*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrDirectContext> GrDirectContext::MakeMock(const GrMockOptions* mockOptions,
1176*c8dee2aaSAndroid Build Coastguard Worker const GrContextOptions& options) {
1177*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrDirectContext> direct(
1178*c8dee2aaSAndroid Build Coastguard Worker new GrDirectContext(GrBackendApi::kMock,
1179*c8dee2aaSAndroid Build Coastguard Worker options,
1180*c8dee2aaSAndroid Build Coastguard Worker GrContextThreadSafeProxyPriv::Make(GrBackendApi::kMock, options)));
1181*c8dee2aaSAndroid Build Coastguard Worker
1182*c8dee2aaSAndroid Build Coastguard Worker direct->fGpu = GrMockGpu::Make(mockOptions, options, direct.get());
1183*c8dee2aaSAndroid Build Coastguard Worker if (!direct->init()) {
1184*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
1185*c8dee2aaSAndroid Build Coastguard Worker }
1186*c8dee2aaSAndroid Build Coastguard Worker
1187*c8dee2aaSAndroid Build Coastguard Worker return direct;
1188*c8dee2aaSAndroid Build Coastguard Worker }
1189*c8dee2aaSAndroid Build Coastguard Worker
1190*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_DIRECT3D
1191*c8dee2aaSAndroid Build Coastguard Worker /*************************************************************************************************/
MakeDirect3D(const GrD3DBackendContext & backendContext)1192*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrDirectContext> GrDirectContext::MakeDirect3D(const GrD3DBackendContext& backendContext) {
1193*c8dee2aaSAndroid Build Coastguard Worker GrContextOptions defaultOptions;
1194*c8dee2aaSAndroid Build Coastguard Worker return MakeDirect3D(backendContext, defaultOptions);
1195*c8dee2aaSAndroid Build Coastguard Worker }
1196*c8dee2aaSAndroid Build Coastguard Worker
MakeDirect3D(const GrD3DBackendContext & backendContext,const GrContextOptions & options)1197*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrDirectContext> GrDirectContext::MakeDirect3D(const GrD3DBackendContext& backendContext,
1198*c8dee2aaSAndroid Build Coastguard Worker const GrContextOptions& options) {
1199*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrDirectContext> direct(new GrDirectContext(
1200*c8dee2aaSAndroid Build Coastguard Worker GrBackendApi::kDirect3D,
1201*c8dee2aaSAndroid Build Coastguard Worker options,
1202*c8dee2aaSAndroid Build Coastguard Worker GrContextThreadSafeProxyPriv::Make(GrBackendApi::kDirect3D, options)));
1203*c8dee2aaSAndroid Build Coastguard Worker
1204*c8dee2aaSAndroid Build Coastguard Worker direct->fGpu = GrD3DGpu::Make(backendContext, options, direct.get());
1205*c8dee2aaSAndroid Build Coastguard Worker if (!direct->init()) {
1206*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
1207*c8dee2aaSAndroid Build Coastguard Worker }
1208*c8dee2aaSAndroid Build Coastguard Worker
1209*c8dee2aaSAndroid Build Coastguard Worker return direct;
1210*c8dee2aaSAndroid Build Coastguard Worker }
1211*c8dee2aaSAndroid Build Coastguard Worker #endif
1212