/* * Copyright 2021 Google LLC * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "tools/graphite/GraphiteTestContext.h" #include "include/gpu/graphite/Context.h" #include "include/gpu/graphite/GraphiteTypes.h" #include "include/gpu/graphite/Recording.h" #include "src/core/SkTraceEvent.h" #include "src/gpu/graphite/Caps.h" #include "src/gpu/graphite/ContextPriv.h" #include "tools/gpu/FlushFinishTracker.h" namespace skiatest::graphite { GraphiteTestContext::GraphiteTestContext() {} GraphiteTestContext::~GraphiteTestContext() {} void GraphiteTestContext::submitRecordingAndWaitOnSync(skgpu::graphite::Context* context, skgpu::graphite::Recording* recording) { TRACE_EVENT0("skia.gpu", TRACE_FUNC); SkASSERT(context); SkASSERT(recording); if (fFinishTrackers[fCurrentFlushIdx]) { fFinishTrackers[fCurrentFlushIdx]->waitTillFinished([this] { tick(); }); } fFinishTrackers[fCurrentFlushIdx].reset(new sk_gpu_test::FlushFinishTracker(context)); // We add an additional ref to the current flush tracker here. This ref is owned by the finish // callback on the flush call. The finish callback will unref the tracker when called. fFinishTrackers[fCurrentFlushIdx]->ref(); skgpu::graphite::InsertRecordingInfo info; info.fRecording = recording; info.fFinishedContext = fFinishTrackers[fCurrentFlushIdx].get(); info.fFinishedProc = sk_gpu_test::FlushFinishTracker::FlushFinishedResult; context->insertRecording(info); context->submit(skgpu::graphite::SyncToCpu::kNo); fCurrentFlushIdx = (fCurrentFlushIdx + 1) % std::size(fFinishTrackers); } void GraphiteTestContext::syncedSubmit(skgpu::graphite::Context* context) { skgpu::graphite::SyncToCpu sync = context->priv().caps()->allowCpuSync() ? skgpu::graphite::SyncToCpu::kYes : skgpu::graphite::SyncToCpu::kNo; context->submit(sync); if (sync == skgpu::graphite::SyncToCpu::kNo) { while (context->hasUnfinishedGpuWork()) { this->tick(); context->checkAsyncWorkCompletion(); } } } } // namespace skiatest::graphite