-
Notifications
You must be signed in to change notification settings - Fork 58
Expand file tree
/
Copy pathGPU.cpp
More file actions
104 lines (94 loc) · 3.35 KB
/
GPU.cpp
File metadata and controls
104 lines (94 loc) · 3.35 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include "GPU.h"
#include <utility>
#include <vector>
#include "Convertors.h"
namespace rnwgpu {
// Static member definitions for singleton pattern
std::shared_ptr<GPU> GPU::_instance = nullptr;
std::once_flag GPU::_onceFlag;
std::future<std::variant<std::nullptr_t, std::shared_ptr<GPUAdapter>>>
GPU::requestAdapter(
std::optional<std::shared_ptr<GPURequestAdapterOptions>> options) {
std::promise<std::variant<std::nullptr_t, std::shared_ptr<GPUAdapter>>>
promise;
auto future = promise.get_future();
wgpu::RequestAdapterOptions aOptions;
Convertor conv;
if (!conv(aOptions, options)) {
throw std::runtime_error("Failed to convert GPUDeviceDescriptor");
}
#ifdef __APPLE__
constexpr auto kDefaultBackendType = wgpu::BackendType::Metal;
#else
constexpr auto kDefaultBackendType = wgpu::BackendType::Vulkan;
#endif
aOptions.backendType = kDefaultBackendType;
wgpu::Adapter adapter = nullptr;
_instance.RequestAdapter(
&aOptions, wgpu::CallbackMode::AllowSpontaneous,
[](wgpu::RequestAdapterStatus status, wgpu::Adapter adapter,
wgpu::StringView message, wgpu::Adapter *userdata) {
if (message.length) {
fprintf(stderr, "%s", message.data);
return;
}
if (status == wgpu::RequestAdapterStatus::Success) {
*userdata = std::move(adapter);
}
},
&adapter);
if (!adapter) {
promise.set_value(nullptr);
} else {
promise.set_value(std::make_shared<GPUAdapter>(std::move(adapter), _async));
}
return future;
}
std::unordered_set<std::string> GPU::getWgslLanguageFeatures() {
wgpu::SupportedWGSLLanguageFeatures supportedFeatures = {};
_instance.GetWGSLLanguageFeatures(&supportedFeatures);
std::unordered_set<std::string> result;
for (size_t i = 0; i < supportedFeatures.featureCount; i++) {
wgpu::WGSLLanguageFeatureName feature = supportedFeatures.features[i];
std::string name;
switch (feature) {
case wgpu::WGSLLanguageFeatureName::ReadonlyAndReadwriteStorageTextures:
name = "readonly_and_readwrite_storage_textures";
break;
case wgpu::WGSLLanguageFeatureName::Packed4x8IntegerDotProduct:
name = "packed_4x8_integer_dot_product";
break;
case wgpu::WGSLLanguageFeatureName::UnrestrictedPointerParameters:
name = "unrestricted_pointer_parameters";
break;
case wgpu::WGSLLanguageFeatureName::PointerCompositeAccess:
name = "pointer_composite_access";
break;
case wgpu::WGSLLanguageFeatureName::ChromiumTestingUnimplemented:
name = "chromium_testing_unimplemented";
break;
case wgpu::WGSLLanguageFeatureName::ChromiumTestingUnsafeExperimental:
name = "chromium_testing_unsafe_experimental";
break;
case wgpu::WGSLLanguageFeatureName::ChromiumTestingExperimental:
name = "chromium_testing_experimental";
break;
case wgpu::WGSLLanguageFeatureName::ChromiumTestingShippedWithKillswitch:
name = "chromium_testing_shipped_with_killswitch";
break;
case wgpu::WGSLLanguageFeatureName::ChromiumTestingShipped:
name = "chromium_testing_shipped";
break;
}
result.insert(name);
}
return result;
}
wgpu::TextureFormat GPU::getPreferredCanvasFormat() {
#if defined(__ANDROID__)
return wgpu::TextureFormat::RGBA8Unorm;
#else
return wgpu::TextureFormat::BGRA8Unorm;
#endif // defined(__ANDROID__)
}
} // namespace rnwgpu