33 {
34 static std::unique_ptr<dawn::native::Instance> sInstance;
36
37 static constexpr const char* kToggles[] = {
38 "allow_unsafe_apis",
39 "use_user_defined_labels_in_backend",
40 };
41 wgpu::DawnTogglesDescriptor togglesDesc;
42 togglesDesc.enabledToggleCount = std::size(kToggles);
43 togglesDesc.enabledToggles = kToggles;
44
45
46
47
48 sOnce([&]{
49 DawnProcTable backendProcs = dawn::native::GetProcs();
50 dawnProcSetProcs(&backendProcs);
51 WGPUInstanceDescriptor
desc{};
52
53 desc.features.timedWaitAnyEnable =
true;
54 sInstance = std::make_unique<dawn::native::Instance>(&desc);
55 });
56
57 dawn::native::Adapter matchedAdaptor;
58
59 wgpu::RequestAdapterOptions
options;
60 options.nextInChain = &togglesDesc;
61 std::vector<dawn::native::Adapter> adapters = sInstance->EnumerateAdapters(&
options);
63
64
65 std::sort(adapters.begin(),
66 adapters.end(),
67 [](dawn::native::Adapter
a, dawn::native::Adapter
b) {
68 wgpu::AdapterProperties propA;
69 wgpu::AdapterProperties propB;
70 a.GetProperties(&propA);
71 b.GetProperties(&propB);
72 return std::tuple(propA.adapterType, propA.backendType) <
73 std::tuple(propB.adapterType, propB.backendType);
74 });
75
76 for (const auto& adapter : adapters) {
77 wgpu::AdapterProperties props;
78 adapter.GetProperties(&props);
79 if (
backend == props.backendType) {
80 matchedAdaptor = adapter;
81 break;
82 }
83 }
84
85 if (!matchedAdaptor) {
86 return nullptr;
87 }
88
89#if LOG_ADAPTER
90 wgpu::AdapterProperties properties;
91 sAdapter.GetProperties(&properties);
92 SkDebugf(
"GPU: %s\nDriver: %s\n", properties.name, properties.driverDescription);
93#endif
94
95 std::vector<wgpu::FeatureName> features;
96 wgpu::Adapter adapter = matchedAdaptor.Get();
97 if (adapter.HasFeature(wgpu::FeatureName::MSAARenderToSingleSampled)) {
98 features.push_back(wgpu::FeatureName::MSAARenderToSingleSampled);
99 }
100 if (adapter.HasFeature(wgpu::FeatureName::TransientAttachments)) {
101 features.push_back(wgpu::FeatureName::TransientAttachments);
102 }
103 if (adapter.HasFeature(wgpu::FeatureName::Unorm16TextureFormats)) {
104 features.push_back(wgpu::FeatureName::Unorm16TextureFormats);
105 }
106 if (adapter.HasFeature(wgpu::FeatureName::DualSourceBlending)) {
107 features.push_back(wgpu::FeatureName::DualSourceBlending);
108 }
109 if (adapter.HasFeature(wgpu::FeatureName::FramebufferFetch)) {
110 features.push_back(wgpu::FeatureName::FramebufferFetch);
111 }
112 if (adapter.HasFeature(wgpu::FeatureName::BufferMapExtendedUsages)) {
113 features.push_back(wgpu::FeatureName::BufferMapExtendedUsages);
114 }
115 if (adapter.HasFeature(wgpu::FeatureName::TextureCompressionETC2)) {
116 features.push_back(wgpu::FeatureName::TextureCompressionETC2);
117 }
118 if (adapter.HasFeature(wgpu::FeatureName::TextureCompressionBC)) {
119 features.push_back(wgpu::FeatureName::TextureCompressionBC);
120 }
121 if (adapter.HasFeature(wgpu::FeatureName::R8UnormStorage)) {
122 features.push_back(wgpu::FeatureName::R8UnormStorage);
123 }
124
125 wgpu::DeviceDescriptor
desc;
126 desc.requiredFeatureCount = features.size();
127 desc.requiredFeatures = features.data();
128 desc.nextInChain = &togglesDesc;
129
130 wgpu::Device
device = wgpu::Device::Acquire(matchedAdaptor.CreateDevice(&desc));
132 device.SetUncapturedErrorCallback(
133 [](WGPUErrorType
type,
const char*
message,
void*) {
135 },
136 nullptr);
137 device.SetDeviceLostCallback(
138 [](WGPUDeviceLostReason reason,
const char*
message,
void*) {
139 if (reason != WGPUDeviceLostReason_Destroyed) {
141 }
142 },
143 nullptr);
144
146 backendContext.
fInstance = wgpu::Instance(sInstance->Get());
149 return std::unique_ptr<GraphiteTestContext>(
new DawnTestContext(backendContext));
150}
void SK_SPI SkDebugf(const char format[],...) SK_PRINTF_LIKE(1
skgpu::BackendApi backend() override
DawnTestContext(const skgpu::graphite::DawnBackendContext &backendContext)