blob: 47b2481c5e13436275f3034304c0ad614cd39cfd [file] [log] [blame]
Jiawei Shao574b9512019-08-02 00:06:38 +00001// Copyright 2019 The Dawn Authors
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15#include <array>
16
17#include "common/Assert.h"
18#include "common/BitSetIterator.h"
19#include "dawn_native/Extensions.h"
20
21namespace dawn_native {
22 namespace {
23
24 struct ExtensionEnumAndInfo {
25 Extension extension;
26 ExtensionInfo info;
Jiawei Shaocfdbaaa2019-11-13 01:53:25 +000027 bool WGPUDeviceProperties::*memberInWGPUDeviceProperties;
Jiawei Shao574b9512019-08-02 00:06:38 +000028 };
29
30 using ExtensionEnumAndInfoList =
31 std::array<ExtensionEnumAndInfo, static_cast<size_t>(Extension::EnumCount)>;
32
33 static constexpr ExtensionEnumAndInfoList kExtensionNameAndInfoList = {
34 {{Extension::TextureCompressionBC,
35 {"texture_compression_bc", "Support Block Compressed (BC) texture formats",
Jiawei Shaocfdbaaa2019-11-13 01:53:25 +000036 "https://bugs.chromium.org/p/dawn/issues/detail?id=42"},
Xinghua Caobdc05c32020-05-27 02:49:08 +000037 &WGPUDeviceProperties::textureCompressionBC},
Xinghua Caodb8f8042020-06-08 12:18:21 +000038 {Extension::ShaderFloat16,
39 {"shader_float16",
40 "Support 16bit float arithmetic and declarations in uniform and storage buffers",
41 "https://bugs.chromium.org/p/dawn/issues/detail?id=426"},
42 &WGPUDeviceProperties::shaderFloat16},
Hao Li55c85f62020-05-27 05:15:18 +000043 {Extension::PipelineStatisticsQuery,
44 {"pipeline_statistics_query", "Support Pipeline Statistics Query",
45 "https://bugs.chromium.org/p/dawn/issues/detail?id=434"},
46 &WGPUDeviceProperties::pipelineStatisticsQuery},
47 {Extension::TimestampQuery,
48 {"timestamp_query", "Support Timestamp Query",
49 "https://bugs.chromium.org/p/dawn/issues/detail?id=434"},
Bryan Bernhart14a23982021-02-05 20:11:24 +000050 &WGPUDeviceProperties::timestampQuery},
51 {Extension::MultiPlanarFormats,
52 {"multiplanar_formats",
53 "Import and use multi-planar texture formats with per plane views",
54 "https://bugs.chromium.org/p/dawn/issues/detail?id=551"},
Brian Ho2cccd5a2021-04-05 17:16:47 +000055 &WGPUDeviceProperties::multiPlanarFormats},
56 {Extension::DepthClamping,
57 {"depth_clamping", "Clamp depth to [0, 1] in NDC space instead of clipping",
58 "https://bugs.chromium.org/p/dawn/issues/detail?id=716"},
59 &WGPUDeviceProperties::depthClamping}}};
Jiawei Shao574b9512019-08-02 00:06:38 +000060
61 } // anonymous namespace
62
63 void ExtensionsSet::EnableExtension(Extension extension) {
64 ASSERT(extension != Extension::InvalidEnum);
65 const size_t extensionIndex = static_cast<size_t>(extension);
66 extensionsBitSet.set(extensionIndex);
67 }
68
69 bool ExtensionsSet::IsEnabled(Extension extension) const {
70 ASSERT(extension != Extension::InvalidEnum);
71 const size_t extensionIndex = static_cast<size_t>(extension);
72 return extensionsBitSet[extensionIndex];
73 }
74
75 std::vector<const char*> ExtensionsSet::GetEnabledExtensionNames() const {
76 std::vector<const char*> enabledExtensionNames(extensionsBitSet.count());
77
78 uint32_t index = 0;
79 for (uint32_t i : IterateBitSet(extensionsBitSet)) {
80 const char* extensionName = ExtensionEnumToName(static_cast<Extension>(i));
81 enabledExtensionNames[index] = extensionName;
82 ++index;
83 }
84 return enabledExtensionNames;
85 }
86
Jiawei Shaocfdbaaa2019-11-13 01:53:25 +000087 void ExtensionsSet::InitializeDeviceProperties(WGPUDeviceProperties* properties) const {
88 ASSERT(properties != nullptr);
89
90 for (uint32_t i : IterateBitSet(extensionsBitSet)) {
91 properties->*(kExtensionNameAndInfoList[i].memberInWGPUDeviceProperties) = true;
92 }
93 }
94
Jiawei Shao574b9512019-08-02 00:06:38 +000095 const char* ExtensionEnumToName(Extension extension) {
96 ASSERT(extension != Extension::InvalidEnum);
97
98 const ExtensionEnumAndInfo& extensionNameAndInfo =
99 kExtensionNameAndInfoList[static_cast<size_t>(extension)];
100 ASSERT(extensionNameAndInfo.extension == extension);
101 return extensionNameAndInfo.info.name;
102 }
103
104 ExtensionsInfo::ExtensionsInfo() {
105 for (size_t index = 0; index < kExtensionNameAndInfoList.size(); ++index) {
106 const ExtensionEnumAndInfo& extensionNameAndInfo = kExtensionNameAndInfoList[index];
107 ASSERT(index == static_cast<size_t>(extensionNameAndInfo.extension));
108 mExtensionNameToEnumMap[extensionNameAndInfo.info.name] =
109 extensionNameAndInfo.extension;
110 }
111 }
112
113 const ExtensionInfo* ExtensionsInfo::GetExtensionInfo(const char* extensionName) const {
114 ASSERT(extensionName);
115
116 const auto& iter = mExtensionNameToEnumMap.find(extensionName);
117 if (iter != mExtensionNameToEnumMap.cend()) {
118 return &kExtensionNameAndInfoList[static_cast<size_t>(iter->second)].info;
119 }
120 return nullptr;
121 }
122
123 Extension ExtensionsInfo::ExtensionNameToEnum(const char* extensionName) const {
124 ASSERT(extensionName);
125
126 const auto& iter = mExtensionNameToEnumMap.find(extensionName);
127 if (iter != mExtensionNameToEnumMap.cend()) {
128 return kExtensionNameAndInfoList[static_cast<size_t>(iter->second)].extension;
129 }
130 return Extension::InvalidEnum;
131 }
132
133 ExtensionsSet ExtensionsInfo::ExtensionNamesToExtensionsSet(
134 const std::vector<const char*>& requiredExtensions) const {
135 ExtensionsSet extensionsSet;
136
137 for (const char* extensionName : requiredExtensions) {
138 Extension extensionEnum = ExtensionNameToEnum(extensionName);
139 ASSERT(extensionEnum != Extension::InvalidEnum);
140 extensionsSet.EnableExtension(extensionEnum);
141 }
142 return extensionsSet;
143 }
144
145} // namespace dawn_native