| /* | |
| * 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 |