Jiawei Shao | 574b951 | 2019-08-02 00:06:38 +0000 | [diff] [blame] | 1 | // 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 | |
| 21 | namespace dawn_native { |
| 22 | namespace { |
| 23 | |
| 24 | struct ExtensionEnumAndInfo { |
| 25 | Extension extension; |
| 26 | ExtensionInfo info; |
Jiawei Shao | cfdbaaa | 2019-11-13 01:53:25 +0000 | [diff] [blame] | 27 | bool WGPUDeviceProperties::*memberInWGPUDeviceProperties; |
Jiawei Shao | 574b951 | 2019-08-02 00:06:38 +0000 | [diff] [blame] | 28 | }; |
| 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 Shao | cfdbaaa | 2019-11-13 01:53:25 +0000 | [diff] [blame] | 36 | "https://bugs.chromium.org/p/dawn/issues/detail?id=42"}, |
Xinghua Cao | bdc05c3 | 2020-05-27 02:49:08 +0000 | [diff] [blame] | 37 | &WGPUDeviceProperties::textureCompressionBC}, |
Xinghua Cao | db8f804 | 2020-06-08 12:18:21 +0000 | [diff] [blame] | 38 | {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 Li | 55c85f6 | 2020-05-27 05:15:18 +0000 | [diff] [blame] | 43 | {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 Bernhart | 14a2398 | 2021-02-05 20:11:24 +0000 | [diff] [blame] | 50 | &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 Ho | 2cccd5a | 2021-04-05 17:16:47 +0000 | [diff] [blame] | 55 | &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 Shao | 574b951 | 2019-08-02 00:06:38 +0000 | [diff] [blame] | 60 | |
| 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 Shao | cfdbaaa | 2019-11-13 01:53:25 +0000 | [diff] [blame] | 87 | 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 Shao | 574b951 | 2019-08-02 00:06:38 +0000 | [diff] [blame] | 95 | 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 |