20class [[maybe_unused]] DawnWorkSubmissionWithAsyncWait final :
public GpuWorkSubmission {
22 DawnWorkSubmissionWithAsyncWait(std::unique_ptr<CommandBuffer> cmdBuffer,
23 DawnQueueManager* queueManager,
24 const DawnSharedContext* sharedContext);
27 bool onIsFinished(
const SharedContext* sharedContext)
override;
28 void onWaitUntilFinished(
const SharedContext* sharedContext)
override;
30 DawnAsyncWait fAsyncWait;
33DawnWorkSubmissionWithAsyncWait::DawnWorkSubmissionWithAsyncWait(
34 std::unique_ptr<CommandBuffer> cmdBuffer,
35 DawnQueueManager* queueManager,
36 const DawnSharedContext* sharedContext)
37 : GpuWorkSubmission(
std::move(cmdBuffer), queueManager), fAsyncWait(sharedContext) {
38 queueManager->dawnQueue().OnSubmittedWorkDone(
39#
if defined(__EMSCRIPTEN__)
44 [](WGPUQueueWorkDoneStatus,
void* userData) {
45 auto asyncWaitPtr =
static_cast<DawnAsyncWait*
>(userData);
46 asyncWaitPtr->signal();
51bool DawnWorkSubmissionWithAsyncWait::onIsFinished(
const SharedContext*) {
52 return fAsyncWait.yieldAndCheck();
55void DawnWorkSubmissionWithAsyncWait::onWaitUntilFinished(
const SharedContext*) {
56 fAsyncWait.busyWait();
59#if !defined(__EMSCRIPTEN__)
63class DawnWorkSubmissionWithFuture final :
public GpuWorkSubmission {
65 DawnWorkSubmissionWithFuture(std::unique_ptr<CommandBuffer> cmdBuffer,
66 DawnQueueManager* queueManager);
69 bool onIsFinished(
const SharedContext* sharedContext)
override;
70 void onWaitUntilFinished(
const SharedContext* sharedContext)
override;
72 wgpu::Future fSubmittedWorkDoneFuture;
75DawnWorkSubmissionWithFuture::DawnWorkSubmissionWithFuture(std::unique_ptr<CommandBuffer> cmdBuffer,
76 DawnQueueManager* queueManager)
77 : GpuWorkSubmission(
std::move(cmdBuffer), queueManager) {
78 wgpu::QueueWorkDoneCallbackInfo callbackInfo{};
79 callbackInfo.mode = wgpu::CallbackMode::WaitAnyOnly;
80 callbackInfo.callback = [](WGPUQueueWorkDoneStatus,
void*) {};
82 fSubmittedWorkDoneFuture = queueManager->dawnQueue().OnSubmittedWorkDone(callbackInfo);
85bool DawnWorkSubmissionWithFuture::onIsFinished(
const SharedContext* sharedContext) {
86 wgpu::FutureWaitInfo waitInfo{};
87 waitInfo.future = fSubmittedWorkDoneFuture;
88 const auto&
instance =
static_cast<const DawnSharedContext*
>(sharedContext)
92 if (
instance.WaitAny(1, &waitInfo, 0) != wgpu::WaitStatus::Success) {
96 return waitInfo.completed;
99void DawnWorkSubmissionWithFuture::onWaitUntilFinished(
const SharedContext* sharedContext) {
100 wgpu::FutureWaitInfo waitInfo{};
101 waitInfo.future = fSubmittedWorkDoneFuture;
102 const auto&
instance =
static_cast<const DawnSharedContext*
>(sharedContext)
106 [[maybe_unused]]
auto status =
107 instance.WaitAny(1, &waitInfo, std::numeric_limits<uint64_t>::max());
108 SkASSERT(status == wgpu::WaitStatus::Success);
116DawnQueueManager::DawnQueueManager(wgpu::Queue queue,
const SharedContext* sharedContext)
135 if (!wgpuCmdBuffer) {
140 fQueue.Submit(1, &wgpuCmdBuffer);
142#if defined(__EMSCRIPTEN__)
143 return std::make_unique<DawnWorkSubmissionWithAsyncWait>(
150#if defined(GRAPHITE_TEST_UTILS)
151void DawnQueueManager::startCapture() {
155void DawnQueueManager::stopCapture() {
wgpu::CommandBuffer finishEncoding()
static std::unique_ptr< DawnCommandBuffer > Make(const DawnSharedContext *, DawnResourceProvider *)
std::unique_ptr< CommandBuffer > getNewCommandBuffer(ResourceProvider *) override
void tick() const override
OutstandingSubmission onSubmitToGpu() override
const SharedContext * fSharedContext
std::unique_ptr< GpuWorkSubmission > OutstandingSubmission
std::unique_ptr< CommandBuffer > fCurrentCommandBuffer