Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
GraphiteDawnWindowContext.cpp
Go to the documentation of this file.
1/*
2 * Copyright 2022 Google Inc.
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
9
21#include "tools/ToolUtils.h"
22#include "tools/GpuToolUtils.h"
23
24#include "dawn/dawn_proc.h"
25
26namespace skwindow::internal {
27
29 wgpu::TextureFormat swapChainFormat)
31 , fSwapChainFormat(swapChainFormat) {
32 WGPUInstanceDescriptor desc{};
33 // need for WaitAny with timeout > 0
34 desc.features.timedWaitAnyEnable = true;
35 fInstance = std::make_unique<dawn::native::Instance>(&desc);
36}
37
40
41 fWidth = width;
43
45 return;
46
50
52 backendContext.fInstance = wgpu::Instance(fInstance->Get());
53 backendContext.fDevice = fDevice;
54 backendContext.fQueue = fDevice.GetQueue();
55 // Needed to make synchronous readPixels work:
56 fDisplayParams.fGraphiteContextOptions.fPriv.fStoreContextRefInRecorder = true;
58 backendContext, fDisplayParams.fGraphiteContextOptions.fOptions);
59 if (!fGraphiteContext) {
60 SkASSERT(false);
61 return;
62 }
63
64 fGraphiteRecorder = fGraphiteContext->makeRecorder(ToolUtils::CreateTestingRecorderOptions());
65 SkASSERT(fGraphiteRecorder);
66}
67
69
71 if (!fDevice.Get()) {
72 return;
73 }
74
75 this->onDestroyContext();
76
77 fGraphiteRecorder = nullptr;
78 fGraphiteContext = nullptr;
79 fSwapChain = nullptr;
80 fSurface = nullptr;
81 fDevice = nullptr;
82}
83
85 auto texture = fSwapChain.GetCurrentTexture();
86 skgpu::graphite::DawnTextureInfo info(/*sampleCount=*/1,
87 skgpu::Mipmapped::kNo,
89 texture.GetUsage(),
90 wgpu::TextureAspect::All);
92 SkASSERT(this->graphiteRecorder());
93 auto surface = SkSurfaces::WrapBackendTexture(this->graphiteRecorder(),
94 backendTex,
99 return surface;
100}
101
103 if (fGraphiteContext) {
104 SkASSERT(fGraphiteRecorder);
105 std::unique_ptr<skgpu::graphite::Recording> recording = fGraphiteRecorder->snap();
106 if (recording) {
108 info.fRecording = recording.get();
109 fGraphiteContext->insertRecording(info);
110 fGraphiteContext->submit(skgpu::graphite::SyncToCpu::kNo);
111 }
112 }
113
114 fSwapChain.Present();
115}
116
122
123wgpu::Device GraphiteDawnWindowContext::createDevice(wgpu::BackendType type) {
124 DawnProcTable backendProcs = dawn::native::GetProcs();
125 dawnProcSetProcs(&backendProcs);
126
127 static constexpr const char* kToggles[] = {
128 "allow_unsafe_apis", // Needed for dual-source blending, BufferMapExtendedUsages.
129 "use_user_defined_labels_in_backend",
130 };
131 wgpu::DawnTogglesDescriptor togglesDesc;
132 togglesDesc.enabledToggleCount = std::size(kToggles);
133 togglesDesc.enabledToggles = kToggles;
134
135 wgpu::RequestAdapterOptions adapterOptions;
136 adapterOptions.backendType = type;
137 adapterOptions.nextInChain = &togglesDesc;
138
139 std::vector<dawn::native::Adapter> adapters = fInstance->EnumerateAdapters(&adapterOptions);
140 if (adapters.empty()) {
141 return nullptr;
142 }
143
144 wgpu::Adapter adapter = adapters[0].Get();
145
146 std::vector<wgpu::FeatureName> features;
147 features.push_back(wgpu::FeatureName::SurfaceCapabilities);
148 if (adapter.HasFeature(wgpu::FeatureName::MSAARenderToSingleSampled)) {
149 features.push_back(wgpu::FeatureName::MSAARenderToSingleSampled);
150 }
151 if (adapter.HasFeature(wgpu::FeatureName::TransientAttachments)) {
152 features.push_back(wgpu::FeatureName::TransientAttachments);
153 }
154 if (adapter.HasFeature(wgpu::FeatureName::Unorm16TextureFormats)) {
155 features.push_back(wgpu::FeatureName::Unorm16TextureFormats);
156 }
157 if (adapter.HasFeature(wgpu::FeatureName::DualSourceBlending)) {
158 features.push_back(wgpu::FeatureName::DualSourceBlending);
159 }
160 if (adapter.HasFeature(wgpu::FeatureName::FramebufferFetch)) {
161 features.push_back(wgpu::FeatureName::FramebufferFetch);
162 }
163 if (adapter.HasFeature(wgpu::FeatureName::BufferMapExtendedUsages)) {
164 features.push_back(wgpu::FeatureName::BufferMapExtendedUsages);
165 }
166 if (adapter.HasFeature(wgpu::FeatureName::TextureCompressionETC2)) {
167 features.push_back(wgpu::FeatureName::TextureCompressionETC2);
168 }
169 if (adapter.HasFeature(wgpu::FeatureName::TextureCompressionBC)) {
170 features.push_back(wgpu::FeatureName::TextureCompressionBC);
171 }
172 if (adapter.HasFeature(wgpu::FeatureName::R8UnormStorage)) {
173 features.push_back(wgpu::FeatureName::R8UnormStorage);
174 }
175
176 wgpu::DeviceDescriptor deviceDescriptor;
177 deviceDescriptor.requiredFeatures = features.data();
178 deviceDescriptor.requiredFeatureCount = features.size();
179
180 auto device = adapter.CreateDevice(&deviceDescriptor);
181 if (!device) {
182 return nullptr;
183 }
184
185 device.SetUncapturedErrorCallback(
186 [](WGPUErrorType type, const char* message, void*) {
187 SkDebugf("Device error: %s\n", message);
188 SkASSERT(false);
189 },
190 nullptr);
191 return device;
192}
193
195 wgpu::SwapChainDescriptor swapChainDesc;
196 swapChainDesc.usage = wgpu::TextureUsage::RenderAttachment |
197 wgpu::TextureUsage::TextureBinding |
198 wgpu::TextureUsage::CopySrc |
199 wgpu::TextureUsage::CopyDst;
200 swapChainDesc.format = fSwapChainFormat;
201 swapChainDesc.width = fWidth;
202 swapChainDesc.height = fHeight;
203 swapChainDesc.presentMode =
204 fDisplayParams.fDisableVsync ? wgpu::PresentMode::Immediate : wgpu::PresentMode::Fifo;
205 auto swapChain = fDevice.CreateSwapChain(fSurface, &swapChainDesc);
206 SkASSERT(swapChain);
207 return swapChain;
208}
209
210} //namespace skwindow::internal
static void info(const char *fmt,...) SK_PRINTF_LIKE(1
Definition DM.cpp:213
#define SkASSERT(cond)
Definition SkAssert.h:116
@ kBGRA_8888_SkColorType
pixel with 8 bits for blue, green, red, alpha; in 32-bit word
Definition SkColorType.h:26
void SK_SPI SkDebugf(const char format[],...) SK_PRINTF_LIKE(1
sk_sp< GrDirectContext > fContext
DisplayParams fDisplayParams
GraphiteDawnWindowContext(const DisplayParams &, wgpu::TextureFormat swapChainFormat)
void setDisplayParams(const DisplayParams &params) override
std::unique_ptr< dawn::native::Instance > fInstance
const EmbeddedViewParams * params
VkDevice device
Definition main.cc:53
VkSurfaceKHR surface
Definition main.cc:49
Win32Message message
FlTexture * texture
SK_API sk_sp< SkSurface > WrapBackendTexture(GrRecordingContext *context, const GrBackendTexture &backendTexture, GrSurfaceOrigin origin, int sampleCnt, SkColorType colorType, sk_sp< SkColorSpace > colorSpace, const SkSurfaceProps *surfaceProps, TextureReleaseProc textureReleaseProc=nullptr, ReleaseContext releaseContext=nullptr)
SK_API std::unique_ptr< Context > MakeDawn(const DawnBackendContext &, const ContextOptions &)
int32_t height
int32_t width
SkSurfaceProps fSurfaceProps
sk_sp< SkColorSpace > fColorSpace