xref: /aosp_15_r20/external/skia/tools/window/GraphiteDawnWindowContext.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2022 Google Inc.
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 "tools/window/GraphiteDawnWindowContext.h"
9*c8dee2aaSAndroid Build Coastguard Worker 
10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSurface.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/graphite/BackendTexture.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/graphite/Context.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/graphite/ContextOptions.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/graphite/GraphiteTypes.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/graphite/Recorder.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/graphite/Recording.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/graphite/Surface.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/graphite/dawn/DawnBackendContext.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/graphite/dawn/DawnTypes.h"
20*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/graphite/dawn/DawnUtils.h"
21*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/ContextOptionsPriv.h"
22*c8dee2aaSAndroid Build Coastguard Worker #include "tools/ToolUtils.h"
23*c8dee2aaSAndroid Build Coastguard Worker #include "tools/graphite/GraphiteToolUtils.h"
24*c8dee2aaSAndroid Build Coastguard Worker #include "tools/graphite/TestOptions.h"
25*c8dee2aaSAndroid Build Coastguard Worker #include "tools/window/GraphiteDisplayParams.h"
26*c8dee2aaSAndroid Build Coastguard Worker 
27*c8dee2aaSAndroid Build Coastguard Worker #include "dawn/dawn_proc.h"
28*c8dee2aaSAndroid Build Coastguard Worker 
29*c8dee2aaSAndroid Build Coastguard Worker namespace skwindow::internal {
30*c8dee2aaSAndroid Build Coastguard Worker 
GraphiteDawnWindowContext(std::unique_ptr<const DisplayParams> params,wgpu::TextureFormat surfaceFormat)31*c8dee2aaSAndroid Build Coastguard Worker GraphiteDawnWindowContext::GraphiteDawnWindowContext(std::unique_ptr<const DisplayParams> params,
32*c8dee2aaSAndroid Build Coastguard Worker                                                      wgpu::TextureFormat surfaceFormat)
33*c8dee2aaSAndroid Build Coastguard Worker         : WindowContext(std::move(params)), fSurfaceFormat(surfaceFormat) {
34*c8dee2aaSAndroid Build Coastguard Worker     WGPUInstanceDescriptor desc{};
35*c8dee2aaSAndroid Build Coastguard Worker     // need for WaitAny with timeout > 0
36*c8dee2aaSAndroid Build Coastguard Worker     desc.features.timedWaitAnyEnable = true;
37*c8dee2aaSAndroid Build Coastguard Worker     fInstance = std::make_unique<dawn::native::Instance>(&desc);
38*c8dee2aaSAndroid Build Coastguard Worker }
39*c8dee2aaSAndroid Build Coastguard Worker 
initializeContext(int width,int height)40*c8dee2aaSAndroid Build Coastguard Worker void GraphiteDawnWindowContext::initializeContext(int width, int height) {
41*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(!fContext);
42*c8dee2aaSAndroid Build Coastguard Worker 
43*c8dee2aaSAndroid Build Coastguard Worker     fWidth = width;
44*c8dee2aaSAndroid Build Coastguard Worker     fHeight = height;
45*c8dee2aaSAndroid Build Coastguard Worker 
46*c8dee2aaSAndroid Build Coastguard Worker     if (!this->onInitializeContext())
47*c8dee2aaSAndroid Build Coastguard Worker         return;
48*c8dee2aaSAndroid Build Coastguard Worker 
49*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(fDevice);
50*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(fSurface);
51*c8dee2aaSAndroid Build Coastguard Worker 
52*c8dee2aaSAndroid Build Coastguard Worker     skgpu::graphite::DawnBackendContext backendContext;
53*c8dee2aaSAndroid Build Coastguard Worker     backendContext.fInstance = wgpu::Instance(fInstance->Get());
54*c8dee2aaSAndroid Build Coastguard Worker     backendContext.fDevice = fDevice;
55*c8dee2aaSAndroid Build Coastguard Worker     backendContext.fQueue = fDevice.GetQueue();
56*c8dee2aaSAndroid Build Coastguard Worker 
57*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(fDisplayParams->graphiteTestOptions());
58*c8dee2aaSAndroid Build Coastguard Worker     skwindow::GraphiteTestOptions opts = *fDisplayParams->graphiteTestOptions();
59*c8dee2aaSAndroid Build Coastguard Worker 
60*c8dee2aaSAndroid Build Coastguard Worker     // Needed to make synchronous readPixels work:
61*c8dee2aaSAndroid Build Coastguard Worker     opts.fPriv.fStoreContextRefInRecorder = true;
62*c8dee2aaSAndroid Build Coastguard Worker     fDisplayParams =
63*c8dee2aaSAndroid Build Coastguard Worker             GraphiteDisplayParamsBuilder(fDisplayParams.get()).graphiteTestOptions(opts).build();
64*c8dee2aaSAndroid Build Coastguard Worker 
65*c8dee2aaSAndroid Build Coastguard Worker     fGraphiteContext = skgpu::graphite::ContextFactory::MakeDawn(backendContext,
66*c8dee2aaSAndroid Build Coastguard Worker                                                                  opts.fTestOptions.fContextOptions);
67*c8dee2aaSAndroid Build Coastguard Worker     if (!fGraphiteContext) {
68*c8dee2aaSAndroid Build Coastguard Worker         SkASSERT(false);
69*c8dee2aaSAndroid Build Coastguard Worker         return;
70*c8dee2aaSAndroid Build Coastguard Worker     }
71*c8dee2aaSAndroid Build Coastguard Worker 
72*c8dee2aaSAndroid Build Coastguard Worker     fGraphiteRecorder = fGraphiteContext->makeRecorder(ToolUtils::CreateTestingRecorderOptions());
73*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(fGraphiteRecorder);
74*c8dee2aaSAndroid Build Coastguard Worker }
75*c8dee2aaSAndroid Build Coastguard Worker 
76*c8dee2aaSAndroid Build Coastguard Worker GraphiteDawnWindowContext::~GraphiteDawnWindowContext() = default;
77*c8dee2aaSAndroid Build Coastguard Worker 
destroyContext()78*c8dee2aaSAndroid Build Coastguard Worker void GraphiteDawnWindowContext::destroyContext() {
79*c8dee2aaSAndroid Build Coastguard Worker     if (!fDevice.Get()) {
80*c8dee2aaSAndroid Build Coastguard Worker         return;
81*c8dee2aaSAndroid Build Coastguard Worker     }
82*c8dee2aaSAndroid Build Coastguard Worker 
83*c8dee2aaSAndroid Build Coastguard Worker     this->onDestroyContext();
84*c8dee2aaSAndroid Build Coastguard Worker 
85*c8dee2aaSAndroid Build Coastguard Worker     fGraphiteRecorder = nullptr;
86*c8dee2aaSAndroid Build Coastguard Worker     fGraphiteContext = nullptr;
87*c8dee2aaSAndroid Build Coastguard Worker     fSurface = nullptr;
88*c8dee2aaSAndroid Build Coastguard Worker     fDevice = nullptr;
89*c8dee2aaSAndroid Build Coastguard Worker }
90*c8dee2aaSAndroid Build Coastguard Worker 
getBackbufferSurface()91*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkSurface> GraphiteDawnWindowContext::getBackbufferSurface() {
92*c8dee2aaSAndroid Build Coastguard Worker     wgpu::SurfaceTexture surfaceTexture;
93*c8dee2aaSAndroid Build Coastguard Worker     fSurface.GetCurrentTexture(&surfaceTexture);
94*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(surfaceTexture.texture);
95*c8dee2aaSAndroid Build Coastguard Worker     auto texture = surfaceTexture.texture;
96*c8dee2aaSAndroid Build Coastguard Worker 
97*c8dee2aaSAndroid Build Coastguard Worker     skgpu::graphite::DawnTextureInfo info(/*sampleCount=*/1,
98*c8dee2aaSAndroid Build Coastguard Worker                                           skgpu::Mipmapped::kNo,
99*c8dee2aaSAndroid Build Coastguard Worker                                           fSurfaceFormat,
100*c8dee2aaSAndroid Build Coastguard Worker                                           texture.GetUsage(),
101*c8dee2aaSAndroid Build Coastguard Worker                                           wgpu::TextureAspect::All);
102*c8dee2aaSAndroid Build Coastguard Worker     auto backendTex = skgpu::graphite::BackendTextures::MakeDawn(texture.Get());
103*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(this->graphiteRecorder());
104*c8dee2aaSAndroid Build Coastguard Worker     auto surface = SkSurfaces::WrapBackendTexture(this->graphiteRecorder(),
105*c8dee2aaSAndroid Build Coastguard Worker                                                   backendTex,
106*c8dee2aaSAndroid Build Coastguard Worker                                                   kBGRA_8888_SkColorType,
107*c8dee2aaSAndroid Build Coastguard Worker                                                   fDisplayParams->colorSpace(),
108*c8dee2aaSAndroid Build Coastguard Worker                                                   &fDisplayParams->surfaceProps());
109*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(surface);
110*c8dee2aaSAndroid Build Coastguard Worker     return surface;
111*c8dee2aaSAndroid Build Coastguard Worker }
112*c8dee2aaSAndroid Build Coastguard Worker 
onSwapBuffers()113*c8dee2aaSAndroid Build Coastguard Worker void GraphiteDawnWindowContext::onSwapBuffers() {
114*c8dee2aaSAndroid Build Coastguard Worker     this->submitToGpu();
115*c8dee2aaSAndroid Build Coastguard Worker     fSurface.Present();
116*c8dee2aaSAndroid Build Coastguard Worker }
117*c8dee2aaSAndroid Build Coastguard Worker 
setDisplayParams(std::unique_ptr<const DisplayParams> params)118*c8dee2aaSAndroid Build Coastguard Worker void GraphiteDawnWindowContext::setDisplayParams(std::unique_ptr<const DisplayParams> params) {
119*c8dee2aaSAndroid Build Coastguard Worker     this->destroyContext();
120*c8dee2aaSAndroid Build Coastguard Worker     fDisplayParams = std::move(params);
121*c8dee2aaSAndroid Build Coastguard Worker     this->initializeContext(fWidth, fHeight);
122*c8dee2aaSAndroid Build Coastguard Worker }
123*c8dee2aaSAndroid Build Coastguard Worker 
createDevice(wgpu::BackendType type)124*c8dee2aaSAndroid Build Coastguard Worker wgpu::Device GraphiteDawnWindowContext::createDevice(wgpu::BackendType type) {
125*c8dee2aaSAndroid Build Coastguard Worker     DawnProcTable backendProcs = dawn::native::GetProcs();
126*c8dee2aaSAndroid Build Coastguard Worker     dawnProcSetProcs(&backendProcs);
127*c8dee2aaSAndroid Build Coastguard Worker 
128*c8dee2aaSAndroid Build Coastguard Worker     static constexpr const char* kToggles[] = {
129*c8dee2aaSAndroid Build Coastguard Worker         "allow_unsafe_apis",  // Needed for dual-source blending, BufferMapExtendedUsages.
130*c8dee2aaSAndroid Build Coastguard Worker         "use_user_defined_labels_in_backend",
131*c8dee2aaSAndroid Build Coastguard Worker         // Robustness impacts performance and is always disabled when running Graphite in Chrome,
132*c8dee2aaSAndroid Build Coastguard Worker         // so this keeps Skia's tests operating closer to real-use behavior.
133*c8dee2aaSAndroid Build Coastguard Worker         "disable_robustness",
134*c8dee2aaSAndroid Build Coastguard Worker         // Must be last to correctly respond to `fUseTintIR` option.
135*c8dee2aaSAndroid Build Coastguard Worker         "use_tint_ir",
136*c8dee2aaSAndroid Build Coastguard Worker     };
137*c8dee2aaSAndroid Build Coastguard Worker     wgpu::DawnTogglesDescriptor togglesDesc;
138*c8dee2aaSAndroid Build Coastguard Worker     togglesDesc.enabledToggleCount =
139*c8dee2aaSAndroid Build Coastguard Worker             std::size(kToggles) -
140*c8dee2aaSAndroid Build Coastguard Worker             (fDisplayParams->graphiteTestOptions()->fTestOptions.fUseTintIR ? 0 : 1);
141*c8dee2aaSAndroid Build Coastguard Worker     togglesDesc.enabledToggles      = kToggles;
142*c8dee2aaSAndroid Build Coastguard Worker 
143*c8dee2aaSAndroid Build Coastguard Worker     wgpu::RequestAdapterOptions adapterOptions;
144*c8dee2aaSAndroid Build Coastguard Worker     adapterOptions.backendType = type;
145*c8dee2aaSAndroid Build Coastguard Worker     adapterOptions.compatibilityMode =
146*c8dee2aaSAndroid Build Coastguard Worker             type == wgpu::BackendType::OpenGL || type == wgpu::BackendType::OpenGLES;
147*c8dee2aaSAndroid Build Coastguard Worker     adapterOptions.nextInChain = &togglesDesc;
148*c8dee2aaSAndroid Build Coastguard Worker 
149*c8dee2aaSAndroid Build Coastguard Worker     std::vector<dawn::native::Adapter> adapters = fInstance->EnumerateAdapters(&adapterOptions);
150*c8dee2aaSAndroid Build Coastguard Worker     if (adapters.empty()) {
151*c8dee2aaSAndroid Build Coastguard Worker         return nullptr;
152*c8dee2aaSAndroid Build Coastguard Worker     }
153*c8dee2aaSAndroid Build Coastguard Worker 
154*c8dee2aaSAndroid Build Coastguard Worker     wgpu::Adapter adapter = adapters[0].Get();
155*c8dee2aaSAndroid Build Coastguard Worker 
156*c8dee2aaSAndroid Build Coastguard Worker     std::vector<wgpu::FeatureName> features;
157*c8dee2aaSAndroid Build Coastguard Worker     if (adapter.HasFeature(wgpu::FeatureName::MSAARenderToSingleSampled)) {
158*c8dee2aaSAndroid Build Coastguard Worker         features.push_back(wgpu::FeatureName::MSAARenderToSingleSampled);
159*c8dee2aaSAndroid Build Coastguard Worker     }
160*c8dee2aaSAndroid Build Coastguard Worker     if (adapter.HasFeature(wgpu::FeatureName::TransientAttachments)) {
161*c8dee2aaSAndroid Build Coastguard Worker         features.push_back(wgpu::FeatureName::TransientAttachments);
162*c8dee2aaSAndroid Build Coastguard Worker     }
163*c8dee2aaSAndroid Build Coastguard Worker     if (adapter.HasFeature(wgpu::FeatureName::Unorm16TextureFormats)) {
164*c8dee2aaSAndroid Build Coastguard Worker         features.push_back(wgpu::FeatureName::Unorm16TextureFormats);
165*c8dee2aaSAndroid Build Coastguard Worker     }
166*c8dee2aaSAndroid Build Coastguard Worker     if (adapter.HasFeature(wgpu::FeatureName::DualSourceBlending)) {
167*c8dee2aaSAndroid Build Coastguard Worker         features.push_back(wgpu::FeatureName::DualSourceBlending);
168*c8dee2aaSAndroid Build Coastguard Worker     }
169*c8dee2aaSAndroid Build Coastguard Worker     if (adapter.HasFeature(wgpu::FeatureName::FramebufferFetch)) {
170*c8dee2aaSAndroid Build Coastguard Worker         features.push_back(wgpu::FeatureName::FramebufferFetch);
171*c8dee2aaSAndroid Build Coastguard Worker     }
172*c8dee2aaSAndroid Build Coastguard Worker     if (adapter.HasFeature(wgpu::FeatureName::BufferMapExtendedUsages)) {
173*c8dee2aaSAndroid Build Coastguard Worker         features.push_back(wgpu::FeatureName::BufferMapExtendedUsages);
174*c8dee2aaSAndroid Build Coastguard Worker     }
175*c8dee2aaSAndroid Build Coastguard Worker     if (adapter.HasFeature(wgpu::FeatureName::TextureCompressionETC2)) {
176*c8dee2aaSAndroid Build Coastguard Worker         features.push_back(wgpu::FeatureName::TextureCompressionETC2);
177*c8dee2aaSAndroid Build Coastguard Worker     }
178*c8dee2aaSAndroid Build Coastguard Worker     if (adapter.HasFeature(wgpu::FeatureName::TextureCompressionBC)) {
179*c8dee2aaSAndroid Build Coastguard Worker         features.push_back(wgpu::FeatureName::TextureCompressionBC);
180*c8dee2aaSAndroid Build Coastguard Worker     }
181*c8dee2aaSAndroid Build Coastguard Worker     if (adapter.HasFeature(wgpu::FeatureName::R8UnormStorage)) {
182*c8dee2aaSAndroid Build Coastguard Worker         features.push_back(wgpu::FeatureName::R8UnormStorage);
183*c8dee2aaSAndroid Build Coastguard Worker     }
184*c8dee2aaSAndroid Build Coastguard Worker     if (adapter.HasFeature(wgpu::FeatureName::DawnLoadResolveTexture)) {
185*c8dee2aaSAndroid Build Coastguard Worker         features.push_back(wgpu::FeatureName::DawnLoadResolveTexture);
186*c8dee2aaSAndroid Build Coastguard Worker     }
187*c8dee2aaSAndroid Build Coastguard Worker     if (adapter.HasFeature(wgpu::FeatureName::DawnPartialLoadResolveTexture)) {
188*c8dee2aaSAndroid Build Coastguard Worker         features.push_back(wgpu::FeatureName::DawnPartialLoadResolveTexture);
189*c8dee2aaSAndroid Build Coastguard Worker     }
190*c8dee2aaSAndroid Build Coastguard Worker     if (adapter.HasFeature(wgpu::FeatureName::TimestampQuery)) {
191*c8dee2aaSAndroid Build Coastguard Worker         features.push_back(wgpu::FeatureName::TimestampQuery);
192*c8dee2aaSAndroid Build Coastguard Worker     }
193*c8dee2aaSAndroid Build Coastguard Worker     if (adapter.HasFeature(wgpu::FeatureName::DawnTexelCopyBufferRowAlignment)) {
194*c8dee2aaSAndroid Build Coastguard Worker         features.push_back(wgpu::FeatureName::DawnTexelCopyBufferRowAlignment);
195*c8dee2aaSAndroid Build Coastguard Worker     }
196*c8dee2aaSAndroid Build Coastguard Worker 
197*c8dee2aaSAndroid Build Coastguard Worker     wgpu::DeviceDescriptor deviceDescriptor;
198*c8dee2aaSAndroid Build Coastguard Worker     deviceDescriptor.requiredFeatures = features.data();
199*c8dee2aaSAndroid Build Coastguard Worker     deviceDescriptor.requiredFeatureCount = features.size();
200*c8dee2aaSAndroid Build Coastguard Worker     deviceDescriptor.nextInChain = &togglesDesc;
201*c8dee2aaSAndroid Build Coastguard Worker     deviceDescriptor.SetDeviceLostCallback(
202*c8dee2aaSAndroid Build Coastguard Worker             wgpu::CallbackMode::AllowSpontaneous,
203*c8dee2aaSAndroid Build Coastguard Worker             [](const wgpu::Device&, wgpu::DeviceLostReason reason, const char* message) {
204*c8dee2aaSAndroid Build Coastguard Worker                 if (reason != wgpu::DeviceLostReason::Destroyed &&
205*c8dee2aaSAndroid Build Coastguard Worker                     reason != wgpu::DeviceLostReason::InstanceDropped) {
206*c8dee2aaSAndroid Build Coastguard Worker                     SK_ABORT("Device lost: %s\n", message);
207*c8dee2aaSAndroid Build Coastguard Worker                 }
208*c8dee2aaSAndroid Build Coastguard Worker             });
209*c8dee2aaSAndroid Build Coastguard Worker     deviceDescriptor.SetUncapturedErrorCallback(
210*c8dee2aaSAndroid Build Coastguard Worker             [](const wgpu::Device&, wgpu::ErrorType, const char* message) {
211*c8dee2aaSAndroid Build Coastguard Worker                 SkDebugf("Device error: %s\n", message);
212*c8dee2aaSAndroid Build Coastguard Worker                 SkASSERT(false);
213*c8dee2aaSAndroid Build Coastguard Worker             });
214*c8dee2aaSAndroid Build Coastguard Worker 
215*c8dee2aaSAndroid Build Coastguard Worker     wgpu::DawnTogglesDescriptor deviceTogglesDesc;
216*c8dee2aaSAndroid Build Coastguard Worker 
217*c8dee2aaSAndroid Build Coastguard Worker     if (fDisplayParams->graphiteTestOptions()->fTestOptions.fDisableTintSymbolRenaming) {
218*c8dee2aaSAndroid Build Coastguard Worker         static constexpr const char* kOptionalDeviceToggles[] = {
219*c8dee2aaSAndroid Build Coastguard Worker             "disable_symbol_renaming",
220*c8dee2aaSAndroid Build Coastguard Worker         };
221*c8dee2aaSAndroid Build Coastguard Worker         deviceTogglesDesc.enabledToggleCount = std::size(kOptionalDeviceToggles);
222*c8dee2aaSAndroid Build Coastguard Worker         deviceTogglesDesc.enabledToggles     = kOptionalDeviceToggles;
223*c8dee2aaSAndroid Build Coastguard Worker 
224*c8dee2aaSAndroid Build Coastguard Worker         // Insert the toggles descriptor ahead of any existing entries in the chain that might have
225*c8dee2aaSAndroid Build Coastguard Worker         // been added above.
226*c8dee2aaSAndroid Build Coastguard Worker         deviceTogglesDesc.nextInChain = deviceDescriptor.nextInChain;
227*c8dee2aaSAndroid Build Coastguard Worker         deviceDescriptor.nextInChain  = &deviceTogglesDesc;
228*c8dee2aaSAndroid Build Coastguard Worker     }
229*c8dee2aaSAndroid Build Coastguard Worker 
230*c8dee2aaSAndroid Build Coastguard Worker     auto device = adapter.CreateDevice(&deviceDescriptor);
231*c8dee2aaSAndroid Build Coastguard Worker     if (!device) {
232*c8dee2aaSAndroid Build Coastguard Worker         return nullptr;
233*c8dee2aaSAndroid Build Coastguard Worker     }
234*c8dee2aaSAndroid Build Coastguard Worker 
235*c8dee2aaSAndroid Build Coastguard Worker     return device;
236*c8dee2aaSAndroid Build Coastguard Worker }
237*c8dee2aaSAndroid Build Coastguard Worker 
configureSurface()238*c8dee2aaSAndroid Build Coastguard Worker void GraphiteDawnWindowContext::configureSurface() {
239*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(fDevice);
240*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(fSurface);
241*c8dee2aaSAndroid Build Coastguard Worker 
242*c8dee2aaSAndroid Build Coastguard Worker     wgpu::SurfaceConfiguration surfaceConfig;
243*c8dee2aaSAndroid Build Coastguard Worker     surfaceConfig.device = fDevice;
244*c8dee2aaSAndroid Build Coastguard Worker     surfaceConfig.format = fSurfaceFormat;
245*c8dee2aaSAndroid Build Coastguard Worker     surfaceConfig.usage = wgpu::TextureUsage::RenderAttachment |
246*c8dee2aaSAndroid Build Coastguard Worker                           wgpu::TextureUsage::TextureBinding |
247*c8dee2aaSAndroid Build Coastguard Worker                           wgpu::TextureUsage::CopySrc |
248*c8dee2aaSAndroid Build Coastguard Worker                           wgpu::TextureUsage::CopyDst;
249*c8dee2aaSAndroid Build Coastguard Worker     surfaceConfig.width = fWidth;
250*c8dee2aaSAndroid Build Coastguard Worker     surfaceConfig.height = fHeight;
251*c8dee2aaSAndroid Build Coastguard Worker     surfaceConfig.presentMode =
252*c8dee2aaSAndroid Build Coastguard Worker             fDisplayParams->disableVsync() ? wgpu::PresentMode::Immediate : wgpu::PresentMode::Fifo;
253*c8dee2aaSAndroid Build Coastguard Worker     fSurface.Configure(&surfaceConfig);
254*c8dee2aaSAndroid Build Coastguard Worker }
255*c8dee2aaSAndroid Build Coastguard Worker 
256*c8dee2aaSAndroid Build Coastguard Worker }   //namespace skwindow::internal
257