1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2022 Google LLC 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 8*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/GpuWorkSubmission.h" 9*c8dee2aaSAndroid Build Coastguard Worker 10*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/Buffer.h" 11*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/CommandBuffer.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/QueueManager.h" 13*c8dee2aaSAndroid Build Coastguard Worker 14*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu::graphite { 15*c8dee2aaSAndroid Build Coastguard Worker GpuWorkSubmission(std::unique_ptr<CommandBuffer> cmdBuffer,QueueManager * queueManager)16*c8dee2aaSAndroid Build Coastguard WorkerGpuWorkSubmission::GpuWorkSubmission(std::unique_ptr<CommandBuffer> cmdBuffer, 17*c8dee2aaSAndroid Build Coastguard Worker QueueManager* queueManager) 18*c8dee2aaSAndroid Build Coastguard Worker : fCommandBuffer(std::move(cmdBuffer)) 19*c8dee2aaSAndroid Build Coastguard Worker , fQueueManager(queueManager) { 20*c8dee2aaSAndroid Build Coastguard Worker SkSpan<const sk_sp<Buffer>> buffers = fCommandBuffer->buffersToAsyncMapOnSubmit(); 21*c8dee2aaSAndroid Build Coastguard Worker if (!buffers.empty()) { 22*c8dee2aaSAndroid Build Coastguard Worker fOutstandingAsyncMapCounter = sk_make_sp<SkRefCnt>(); 23*c8dee2aaSAndroid Build Coastguard Worker for (auto& buffer : fCommandBuffer->buffersToAsyncMapOnSubmit()) { 24*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(!buffer->isUnmappable()); 25*c8dee2aaSAndroid Build Coastguard Worker fOutstandingAsyncMapCounter->ref(); 26*c8dee2aaSAndroid Build Coastguard Worker buffer->asyncMap([](GpuFinishedContext c, CallbackResult) { 27*c8dee2aaSAndroid Build Coastguard Worker static_cast<SkRefCnt*>(c)->unref(); 28*c8dee2aaSAndroid Build Coastguard Worker }, 29*c8dee2aaSAndroid Build Coastguard Worker fOutstandingAsyncMapCounter.get()); 30*c8dee2aaSAndroid Build Coastguard Worker } 31*c8dee2aaSAndroid Build Coastguard Worker } 32*c8dee2aaSAndroid Build Coastguard Worker } 33*c8dee2aaSAndroid Build Coastguard Worker ~GpuWorkSubmission()34*c8dee2aaSAndroid Build Coastguard WorkerGpuWorkSubmission::~GpuWorkSubmission() { 35*c8dee2aaSAndroid Build Coastguard Worker fCommandBuffer->callFinishedProcs(/*success=*/true); 36*c8dee2aaSAndroid Build Coastguard Worker fCommandBuffer->resetCommandBuffer(); 37*c8dee2aaSAndroid Build Coastguard Worker fQueueManager->returnCommandBuffer(std::move(fCommandBuffer)); 38*c8dee2aaSAndroid Build Coastguard Worker } 39*c8dee2aaSAndroid Build Coastguard Worker isFinished(const SharedContext * sharedContext)40*c8dee2aaSAndroid Build Coastguard Workerbool GpuWorkSubmission::isFinished(const SharedContext* sharedContext) { 41*c8dee2aaSAndroid Build Coastguard Worker return this->onIsFinished(sharedContext) && 42*c8dee2aaSAndroid Build Coastguard Worker (!fOutstandingAsyncMapCounter || fOutstandingAsyncMapCounter->unique()); 43*c8dee2aaSAndroid Build Coastguard Worker } 44*c8dee2aaSAndroid Build Coastguard Worker waitUntilFinished(const SharedContext * sharedContext)45*c8dee2aaSAndroid Build Coastguard Workervoid GpuWorkSubmission::waitUntilFinished(const SharedContext* sharedContext) { 46*c8dee2aaSAndroid Build Coastguard Worker this->onWaitUntilFinished(sharedContext); 47*c8dee2aaSAndroid Build Coastguard Worker if (fOutstandingAsyncMapCounter) { 48*c8dee2aaSAndroid Build Coastguard Worker while (!fOutstandingAsyncMapCounter->unique()) { 49*c8dee2aaSAndroid Build Coastguard Worker fQueueManager->tick(); 50*c8dee2aaSAndroid Build Coastguard Worker } 51*c8dee2aaSAndroid Build Coastguard Worker } 52*c8dee2aaSAndroid Build Coastguard Worker } 53*c8dee2aaSAndroid Build Coastguard Worker 54*c8dee2aaSAndroid Build Coastguard Worker } // namespace skgpu::graphite 55*c8dee2aaSAndroid Build Coastguard Worker 56