123 {
124 DawnProcTable backendProcs = dawn::native::GetProcs();
125 dawnProcSetProcs(&backendProcs);
126
127 static constexpr const char* kToggles[] = {
128 "allow_unsafe_apis",
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);
182 return nullptr;
183 }
184
185 device.SetUncapturedErrorCallback(
186 [](WGPUErrorType
type,
const char*
message,
void*) {
189 },
190 nullptr);
192}
void SK_SPI SkDebugf(const char format[],...) SK_PRINTF_LIKE(1