1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2019 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/ganesh/GrWaitRenderTask.h" 9*c8dee2aaSAndroid Build Coastguard Worker 10*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkAssert.h" 11*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrGpu.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrOpFlushState.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrResourceAllocator.h" 14*c8dee2aaSAndroid Build Coastguard Worker gatherProxyIntervals(GrResourceAllocator * alloc) const15*c8dee2aaSAndroid Build Coastguard Workervoid GrWaitRenderTask::gatherProxyIntervals(GrResourceAllocator* alloc) const { 16*c8dee2aaSAndroid Build Coastguard Worker // This renderTask doesn't have "normal" ops. In this case we still need to add an interval (so 17*c8dee2aaSAndroid Build Coastguard Worker // fEndOfOpsTaskOpIndices will remain in sync), so we create a fake op# to capture the fact that 18*c8dee2aaSAndroid Build Coastguard Worker // we manipulate our target's proxy. 19*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(0 == this->numTargets()); 20*c8dee2aaSAndroid Build Coastguard Worker auto fakeOp = alloc->curOp(); 21*c8dee2aaSAndroid Build Coastguard Worker alloc->addInterval(fWaitedOn.proxy(), fakeOp, fakeOp, 22*c8dee2aaSAndroid Build Coastguard Worker GrResourceAllocator::ActualUse::kYes, 23*c8dee2aaSAndroid Build Coastguard Worker GrResourceAllocator::AllowRecycling::kYes); 24*c8dee2aaSAndroid Build Coastguard Worker alloc->incOps(); 25*c8dee2aaSAndroid Build Coastguard Worker } 26*c8dee2aaSAndroid Build Coastguard Worker onExecute(GrOpFlushState * flushState)27*c8dee2aaSAndroid Build Coastguard Workerbool GrWaitRenderTask::onExecute(GrOpFlushState* flushState) { 28*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < fNumSemaphores; ++i) { 29*c8dee2aaSAndroid Build Coastguard Worker // If we don't have a semaphore here it means we failed to wrap it. That happens if the 30*c8dee2aaSAndroid Build Coastguard Worker // client didn't give us a valid semaphore to begin with. Therefore, it is fine to not wait 31*c8dee2aaSAndroid Build Coastguard Worker // on it. 32*c8dee2aaSAndroid Build Coastguard Worker if (fSemaphores[i]) { 33*c8dee2aaSAndroid Build Coastguard Worker flushState->gpu()->waitSemaphore(fSemaphores[i].get()); 34*c8dee2aaSAndroid Build Coastguard Worker } 35*c8dee2aaSAndroid Build Coastguard Worker } 36*c8dee2aaSAndroid Build Coastguard Worker return true; 37*c8dee2aaSAndroid Build Coastguard Worker } 38