blob: d31292e2f2a77837c267f4c86cbff2e26a7f9a38 [file] [log] [blame]
/*
* 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"
#include "src/gpu/graphite/dawn/DawnUtilsPriv.h"
namespace skgpu::graphite {
namespace {
class DawnWorkSubmission final : public GpuWorkSubmission {
public:
DawnWorkSubmission(std::unique_ptr<CommandBuffer> cmdBuffer,
DawnQueueManager* queueManager,
const DawnSharedContext* sharedContext)
: GpuWorkSubmission(std::move(cmdBuffer), queueManager), fAsyncWait(sharedContext) {
queueManager->dawnQueue().OnSubmittedWorkDone(
#if defined(__EMSCRIPTEN__)
// This is parameter is being removed:
// https://github.com/webgpu-native/webgpu-headers/issues/130
/*signalValue=*/0,
#endif
[](WGPUQueueWorkDoneStatus, void* userData) {
auto asyncWaitPtr = static_cast<DawnAsyncWait*>(userData);
asyncWaitPtr->signal();
},
&fAsyncWait);
}
~DawnWorkSubmission() override {}
private:
bool onIsFinished() override { return fAsyncWait.yieldAndCheck(); }
void onWaitUntilFinished() override { fAsyncWait.busyWait(); }
DawnAsyncWait fAsyncWait;
};
} // namespace
DawnQueueManager::DawnQueueManager(wgpu::Queue queue, const SharedContext* sharedContext)
: QueueManager(sharedContext), fQueue(std::move(queue)) {}
void DawnQueueManager::tick() const { DawnTickDevice(this->dawnSharedContext()); }
const DawnSharedContext* DawnQueueManager::dawnSharedContext() const {
return static_cast<const DawnSharedContext*>(fSharedContext);
}
std::unique_ptr<CommandBuffer> DawnQueueManager::getNewCommandBuffer(
ResourceProvider* resourceProvider) {
return DawnCommandBuffer::Make(dawnSharedContext(),
static_cast<DawnResourceProvider*>(resourceProvider));
}
QueueManager::OutstandingSubmission DawnQueueManager::onSubmitToGpu() {
SkASSERT(fCurrentCommandBuffer);
DawnCommandBuffer* dawnCmdBuffer = static_cast<DawnCommandBuffer*>(fCurrentCommandBuffer.get());
auto wgpuCmdBuffer = dawnCmdBuffer->finishEncoding();
if (!wgpuCmdBuffer) {
fCurrentCommandBuffer->callFinishedProcs(/*success=*/false);
return nullptr;
}
fQueue.Submit(/*commandCount=*/1, &wgpuCmdBuffer);
return std::make_unique<DawnWorkSubmission>(std::move(fCurrentCommandBuffer),
this,
dawnSharedContext());
}
#if defined(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