1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2022 Google LLC
3*c8dee2aaSAndroid Build Coastguard Worker *
4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker */
7*c8dee2aaSAndroid Build Coastguard Worker
8*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/dawn/DawnSharedContext.h"
9*c8dee2aaSAndroid Build Coastguard Worker
10*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/graphite/Context.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/graphite/ContextOptions.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/graphite/dawn/DawnBackendContext.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/Log.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/dawn/DawnResourceProvider.h"
15*c8dee2aaSAndroid Build Coastguard Worker
16*c8dee2aaSAndroid Build Coastguard Worker #include "webgpu/webgpu_cpp.h" // NO_G3_REWRITE
17*c8dee2aaSAndroid Build Coastguard Worker
18*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu::graphite {
19*c8dee2aaSAndroid Build Coastguard Worker namespace {
20*c8dee2aaSAndroid Build Coastguard Worker
CreateNoopFragment(const wgpu::Device & device)21*c8dee2aaSAndroid Build Coastguard Worker wgpu::ShaderModule CreateNoopFragment(const wgpu::Device& device) {
22*c8dee2aaSAndroid Build Coastguard Worker #ifdef WGPU_BREAKING_CHANGE_DROP_DESCRIPTOR
23*c8dee2aaSAndroid Build Coastguard Worker wgpu::ShaderSourceWGSL wgslDesc;
24*c8dee2aaSAndroid Build Coastguard Worker #else
25*c8dee2aaSAndroid Build Coastguard Worker wgpu::ShaderModuleWGSLDescriptor wgslDesc;
26*c8dee2aaSAndroid Build Coastguard Worker #endif
27*c8dee2aaSAndroid Build Coastguard Worker wgslDesc.code =
28*c8dee2aaSAndroid Build Coastguard Worker "@fragment\n"
29*c8dee2aaSAndroid Build Coastguard Worker "fn main() {}\n";
30*c8dee2aaSAndroid Build Coastguard Worker wgpu::ShaderModuleDescriptor smDesc;
31*c8dee2aaSAndroid Build Coastguard Worker smDesc.nextInChain = &wgslDesc;
32*c8dee2aaSAndroid Build Coastguard Worker smDesc.label = "no-op";
33*c8dee2aaSAndroid Build Coastguard Worker auto fsModule = device.CreateShaderModule(&smDesc);
34*c8dee2aaSAndroid Build Coastguard Worker return fsModule;
35*c8dee2aaSAndroid Build Coastguard Worker }
36*c8dee2aaSAndroid Build Coastguard Worker
37*c8dee2aaSAndroid Build Coastguard Worker }
38*c8dee2aaSAndroid Build Coastguard Worker
Make(const DawnBackendContext & backendContext,const ContextOptions & options)39*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SharedContext> DawnSharedContext::Make(const DawnBackendContext& backendContext,
40*c8dee2aaSAndroid Build Coastguard Worker const ContextOptions& options) {
41*c8dee2aaSAndroid Build Coastguard Worker if (!backendContext.fDevice || !backendContext.fQueue) {
42*c8dee2aaSAndroid Build Coastguard Worker return {};
43*c8dee2aaSAndroid Build Coastguard Worker }
44*c8dee2aaSAndroid Build Coastguard Worker
45*c8dee2aaSAndroid Build Coastguard Worker auto noopFragment = CreateNoopFragment(backendContext.fDevice);
46*c8dee2aaSAndroid Build Coastguard Worker if (!noopFragment) {
47*c8dee2aaSAndroid Build Coastguard Worker return {};
48*c8dee2aaSAndroid Build Coastguard Worker }
49*c8dee2aaSAndroid Build Coastguard Worker
50*c8dee2aaSAndroid Build Coastguard Worker auto caps = std::make_unique<const DawnCaps>(backendContext, options);
51*c8dee2aaSAndroid Build Coastguard Worker
52*c8dee2aaSAndroid Build Coastguard Worker return sk_sp<SharedContext>(new DawnSharedContext(backendContext,
53*c8dee2aaSAndroid Build Coastguard Worker std::move(caps),
54*c8dee2aaSAndroid Build Coastguard Worker std::move(noopFragment)));
55*c8dee2aaSAndroid Build Coastguard Worker }
56*c8dee2aaSAndroid Build Coastguard Worker
DawnSharedContext(const DawnBackendContext & backendContext,std::unique_ptr<const DawnCaps> caps,wgpu::ShaderModule noopFragment)57*c8dee2aaSAndroid Build Coastguard Worker DawnSharedContext::DawnSharedContext(const DawnBackendContext& backendContext,
58*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<const DawnCaps> caps,
59*c8dee2aaSAndroid Build Coastguard Worker wgpu::ShaderModule noopFragment)
60*c8dee2aaSAndroid Build Coastguard Worker : skgpu::graphite::SharedContext(std::move(caps), BackendApi::kDawn)
61*c8dee2aaSAndroid Build Coastguard Worker , fInstance(backendContext.fInstance)
62*c8dee2aaSAndroid Build Coastguard Worker , fDevice(backendContext.fDevice)
63*c8dee2aaSAndroid Build Coastguard Worker , fQueue(backendContext.fQueue)
64*c8dee2aaSAndroid Build Coastguard Worker , fTick(backendContext.fTick)
65*c8dee2aaSAndroid Build Coastguard Worker , fNoopFragment(std::move(noopFragment)) {}
66*c8dee2aaSAndroid Build Coastguard Worker
~DawnSharedContext()67*c8dee2aaSAndroid Build Coastguard Worker DawnSharedContext::~DawnSharedContext() {
68*c8dee2aaSAndroid Build Coastguard Worker // need to clear out resources before any allocator is removed
69*c8dee2aaSAndroid Build Coastguard Worker this->globalCache()->deleteResources();
70*c8dee2aaSAndroid Build Coastguard Worker }
71*c8dee2aaSAndroid Build Coastguard Worker
makeResourceProvider(SingleOwner * singleOwner,uint32_t recorderID,size_t resourceBudget,bool)72*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<ResourceProvider> DawnSharedContext::makeResourceProvider(
73*c8dee2aaSAndroid Build Coastguard Worker SingleOwner* singleOwner,
74*c8dee2aaSAndroid Build Coastguard Worker uint32_t recorderID,
75*c8dee2aaSAndroid Build Coastguard Worker size_t resourceBudget,
76*c8dee2aaSAndroid Build Coastguard Worker bool /* avoidBufferAlloc */) {
77*c8dee2aaSAndroid Build Coastguard Worker return std::unique_ptr<ResourceProvider>(new DawnResourceProvider(this,
78*c8dee2aaSAndroid Build Coastguard Worker singleOwner,
79*c8dee2aaSAndroid Build Coastguard Worker recorderID,
80*c8dee2aaSAndroid Build Coastguard Worker resourceBudget));
81*c8dee2aaSAndroid Build Coastguard Worker }
82*c8dee2aaSAndroid Build Coastguard Worker
deviceTick(Context * context)83*c8dee2aaSAndroid Build Coastguard Worker void DawnSharedContext::deviceTick(Context* context) {
84*c8dee2aaSAndroid Build Coastguard Worker #if !defined(__EMSCRIPTEN__)
85*c8dee2aaSAndroid Build Coastguard Worker this->device().Tick();
86*c8dee2aaSAndroid Build Coastguard Worker #endif
87*c8dee2aaSAndroid Build Coastguard Worker context->checkAsyncWorkCompletion();
88*c8dee2aaSAndroid Build Coastguard Worker };
89*c8dee2aaSAndroid Build Coastguard Worker
90*c8dee2aaSAndroid Build Coastguard Worker } // namespace skgpu::graphite
91