/* * Copyright 2022 Google LLC * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "src/gpu/graphite/dawn/DawnQueueManager.h" #include "src/gpu/graphite/dawn/DawnAsyncWait.h" #include "src/gpu/graphite/dawn/DawnCommandBuffer.h" #include "src/gpu/graphite/dawn/DawnResourceProvider.h" #include "src/gpu/graphite/dawn/DawnSharedContext.h" namespace skgpu::graphite { namespace { class DawnWorkSubmission final : public GpuWorkSubmission { public: DawnWorkSubmission(std::unique_ptr cmdBuffer, DawnQueueManager* queueManager, wgpu::Device device) : GpuWorkSubmission(std::move(cmdBuffer), queueManager), fAsyncWait(std::move(device)) { queueManager->dawnQueue().OnSubmittedWorkDone( 0, [](WGPUQueueWorkDoneStatus, void* userData) { auto asyncWaitPtr = static_cast(userData); asyncWaitPtr->signal(); }, &fAsyncWait); } ~DawnWorkSubmission() override {} bool isFinished() override { return fAsyncWait.yieldAndCheck(); } void waitUntilFinished() override { fAsyncWait.busyWait(); } private: DawnAsyncWait fAsyncWait; }; } // namespace DawnQueueManager::DawnQueueManager(wgpu::Queue queue, const SharedContext* sharedContext) : QueueManager(sharedContext), fQueue(std::move(queue)) {} const DawnSharedContext* DawnQueueManager::dawnSharedContext() const { return static_cast(fSharedContext); } std::unique_ptr DawnQueueManager::getNewCommandBuffer( ResourceProvider* resourceProvider) { return DawnCommandBuffer::Make(dawnSharedContext(), static_cast(resourceProvider)); } QueueManager::OutstandingSubmission DawnQueueManager::onSubmitToGpu() { SkASSERT(fCurrentCommandBuffer); DawnCommandBuffer* dawnCmdBuffer = static_cast(fCurrentCommandBuffer.get()); auto wgpuCmdBuffer = dawnCmdBuffer->finishEncoding(); if (!wgpuCmdBuffer) { fCurrentCommandBuffer->callFinishedProcs(/*success=*/false); return nullptr; } fQueue.Submit(/*commandCount=*/1, &wgpuCmdBuffer); std::unique_ptr submission(new DawnWorkSubmission( std::move(fCurrentCommandBuffer), this, dawnSharedContext()->device())); return std::move(submission); } #if GRAPHITE_TEST_UTILS void DawnQueueManager::startCapture() { // TODO: Dawn doesn't have capturing feature yet. } void DawnQueueManager::stopCapture() { // TODO: Dawn doesn't have capturing feature yet. } #endif } // namespace skgpu::graphite