Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
DawnBackendContext.h
Go to the documentation of this file.
1/*
2 * Copyright 2022 Google LLC
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#ifndef skgpu_graphite_DawnBackendContext_DEFINED
9#define skgpu_graphite_DawnBackendContext_DEFINED
10
12#include "webgpu/webgpu_cpp.h" // NO_G3_REWRITE
13
14namespace skgpu::graphite {
15
16/**
17 * WebGPU needs to allow the main thread loop to run to detect GPU progress. Dawn native has a
18 * function wgpu::Instance::ProcessEvents, not (currently) present in WebGPU, that can be used to
19 * detect GPU progress.
20 *
21 * When compiling using Emscripten/WASM the -s ASYNCIFY option can be used to yield. E.g.:
22 *
23 * EM_ASYNC_JS(void, asyncSleep, (), {
24 * await new Promise((resolve, _) = > {
25 * setTimeout(resolve, 0);
26 * })
27 * });
28 *
29 * WebGPUTickFunction(wgpu::Device&) { asyncSleep(); }
30 *
31 * If no DawnTickFunction is provided then the graphite::Context will be "non-yielding". This
32 * implies the following restrictions on the Context:
33 *
34 * 1) SyncToCpu::kYes is disallowed as a parameter to Context::submit.
35 * 2) The client must guarantee that GPU work has completed before destroying Context as Context
36 * cannot await the work completion in its destructor. Context reports whether it is awaiting
37 * GPU work completion via Context::hasUnfinishedGpuWork().
38 *
39 * Using a non-yielding Context makes it possible to build and run Graphite/Dawn on WebGPU without
40 * -s ASYNCIFY.
41 */
42using DawnTickFunction = void(const wgpu::Instance& device);
43
44#if !defined(__EMSCRIPTEN__)
45SK_API inline void DawnNativeProcessEventsFunction(const wgpu::Instance& instance) {
46 instance.ProcessEvents();
47}
48#endif
49
50// The DawnBackendContext contains all of the base Dawn objects needed by the graphite Dawn
51// backend. The client will create this object and pass it into the Context::MakeDawn factory call
52// when setting up Skia.
54 wgpu::Instance fInstance;
55 wgpu::Device fDevice;
56 wgpu::Queue fQueue;
57 // See comment on DawnTickFunction.
59#if defined(__EMSCRIPTEN__)
60 nullptr;
61#else
63#endif
64};
65
66} // namespace skgpu::graphite
67
68#endif // skgpu_graphite_DawnBackendContext_DEFINED
#define SK_API
Definition SkAPI.h:35
VkDevice device
Definition main.cc:53
VkInstance instance
Definition main.cc:48
void(const wgpu::Instance &device) DawnTickFunction
SK_API void DawnNativeProcessEventsFunction(const wgpu::Instance &instance)