VirtualBox

source: vbox/trunk/src/libs/dxvk-2.3.1/src/dxvk/dxvk_extensions.h

Last change on this file was 108577, checked in by vboxsync, 2 months ago

libs/dxvk-2.3.1: Video decode: AV1; various fixes. bugref:10529

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 12.1 KB
Line 
1#pragma once
2
3#include <algorithm>
4#include <map>
5#include <vector>
6
7#include "dxvk_include.h"
8
9namespace dxvk {
10
11 /**
12 * \brief Vulkan extension mode
13 *
14 * Defines whether an extension is
15 * optional, required, or disabled.
16 */
17 enum class DxvkExtMode {
18 Disabled,
19 Optional,
20 Required,
21 Passive,
22 };
23
24
25 /**
26 * \brief Vulkan extension info
27 *
28 * Stores information for a single extension.
29 * The renderer can use this information to
30 * find out which extensions are enabled.
31 */
32 class DxvkExt {
33
34 public:
35
36 DxvkExt(
37 const char* pName,
38 DxvkExtMode mode)
39 : m_name(pName), m_mode(mode) { }
40
41 /**
42 * \brief Extension name
43 * \returns Extension name
44 */
45 const char* name() const {
46 return m_name;
47 }
48
49 /**
50 * \brief Extension mode
51 * \returns Extension mode
52 */
53 DxvkExtMode mode() const {
54 return m_mode;
55 }
56
57 /**
58 * \brief Checks whether the extension is enabled
59 *
60 * If an extension is enabled, the features
61 * provided by the extension can be used.
62 * \returns \c true if the extension is enabled
63 */
64 explicit operator bool () const {
65 return m_revision != 0;
66 }
67
68 /**
69 * \brief Supported revision
70 * \returns Supported revision
71 */
72 uint32_t revision() const {
73 return m_revision;
74 }
75
76 /**
77 * \brief Changes extension mode
78 *
79 * In some cases, it may be useful to change the
80 * default mode dynamically after initialization.
81 */
82 void setMode(DxvkExtMode mode) {
83 m_mode = mode;
84 }
85
86 /**
87 * \brief Enables the extension
88 */
89 void enable(uint32_t revision) {
90 m_revision = revision;
91 }
92
93 /**
94 * \brief Disables the extension
95 */
96 void disable() {
97 m_revision = 0;
98 }
99
100 private:
101
102 const char* m_name = nullptr;
103 DxvkExtMode m_mode = DxvkExtMode::Disabled;
104 uint32_t m_revision = 0;
105
106 };
107
108
109 /**
110 * \brief Vulkan name list
111 *
112 * A simple \c vector wrapper that can
113 * be used to build a list of layer and
114 * extension names.
115 */
116 class DxvkNameList {
117
118 public:
119
120 DxvkNameList() { }
121 DxvkNameList(uint32_t count, const char* const* names) {
122 for (uint32_t i = 0; i < count; i++)
123 add(names[i]);
124 }
125
126 /**
127 * \brief Adds a name
128 * \param [in] pName The name
129 */
130 void add(const char* pName) {
131 m_names.push_back(pName);
132 }
133
134 /**
135 * \brief Number of names
136 * \returns Name count
137 */
138 uint32_t count() const {
139 return m_names.size();
140 }
141
142 /**
143 * \brief Name list
144 * \returns Name list
145 */
146 const char* const* names() const {
147 return m_names.data();
148 }
149
150 /**
151 * \brief Retrieves a single name
152 *
153 * \param [in] index Name index
154 * \returns The given name
155 */
156 const char* name(uint32_t index) const {
157 return m_names.at(index);
158 }
159
160 private:
161
162 std::vector<const char*> m_names;
163
164 };
165
166
167 /**
168 * \brief Vulkan extension set
169 *
170 * Stores a set of extensions or layers
171 * supported by the Vulkan implementation.
172 */
173 class DxvkNameSet {
174
175 public:
176
177 DxvkNameSet();
178
179 DxvkNameSet(
180 uint32_t count,
181 const char* const* names);
182
183 ~DxvkNameSet();
184
185 /**
186 * \brief Adds a name to the set
187 * \param [in] pName Extension name
188 */
189 void add(
190 const char* pName);
191
192 /**
193 * \brief Merges two name sets
194 *
195 * Adds all names from the given name set to
196 * this name set, avoiding duplicate entries.
197 * \param [in] names Name set to merge
198 */
199 void merge(
200 const DxvkNameSet& names);
201
202 /**
203 * \brief Pulls in revisions from another name set
204 * \param [in] names Name set to pull revisions from
205 */
206 void mergeRevisions(
207 const DxvkNameSet& names);
208
209 /**
210 * \brief Checks whether an extension is supported
211 *
212 * \param [in] pName Extension name
213 * \returns Supported revision, or zero
214 */
215 uint32_t supports(
216 const char* pName) const;
217
218 /**
219 * \brief Enables requested extensions
220 *
221 * Walks over a set of extensions and enables all
222 * extensions that are supported and not disabled.
223 * This also checks whether all required extensions
224 * could be enabled, and returns \c false otherwise.
225 * \param [in] numExtensions Number of extensions
226 * \param [in] ppExtensions List of extensions
227 * \param [out] nameSet Extension name set
228 * \returns \c true on success
229 */
230 bool enableExtensions(
231 uint32_t numExtensions,
232 DxvkExt** ppExtensions,
233 DxvkNameSet* nameSet) const;
234
235 /**
236 * \brief Disables given extension
237 *
238 * Removes the given extension from the set
239 * and sets its revision to 0 (i.e. disabled).
240 * \param [in,out] ext Extension to disable
241 */
242 void disableExtension(
243 DxvkExt& ext);
244
245 /**
246 * \brief Creates name list from name set
247 *
248 * Adds all names contained in the name set
249 * to a name list, which can then be passed
250 * to Vulkan functions.
251 * \returns Name list
252 */
253 DxvkNameList toNameList() const;
254
255 /**
256 * \brief Enumerates instance layers
257 *
258 * \param [in] vkl Vulkan library functions
259 * \returns Set of available instance layers
260 */
261 static DxvkNameSet enumInstanceLayers(
262 const Rc<vk::LibraryFn>& vkl);
263
264 /**
265 * \brief Enumerates instance extensions
266 *
267 * \param [in] vkl Vulkan library functions
268 * \returns Set of available instance extensions
269 */
270 static DxvkNameSet enumInstanceExtensions(
271 const Rc<vk::LibraryFn>& vkl);
272
273 /**
274 * \brief Enumerates device extensions
275 *
276 * \param [in] vki Vulkan instance functions
277 * \param [in] device The device to query
278 * \returns Set of available device extensions
279 */
280 static DxvkNameSet enumDeviceExtensions(
281 const Rc<vk::InstanceFn>& vki,
282 VkPhysicalDevice device);
283
284 private:
285
286 std::map<std::string, uint32_t> m_names;
287
288 };
289
290 /**
291 * \brief Device extensions
292 *
293 * Lists all Vulkan extensions that are potentially
294 * used by DXVK if supported by the implementation.
295 */
296 struct DxvkDeviceExtensions {
297 DxvkExt amdMemoryOverallocationBehaviour = { VK_AMD_MEMORY_OVERALLOCATION_BEHAVIOR_EXTENSION_NAME, DxvkExtMode::Optional };
298 DxvkExt amdShaderFragmentMask = { VK_AMD_SHADER_FRAGMENT_MASK_EXTENSION_NAME, DxvkExtMode::Optional };
299 DxvkExt extAttachmentFeedbackLoopLayout = { VK_EXT_ATTACHMENT_FEEDBACK_LOOP_LAYOUT_EXTENSION_NAME, DxvkExtMode::Optional };
300 DxvkExt extConservativeRasterization = { VK_EXT_CONSERVATIVE_RASTERIZATION_EXTENSION_NAME, DxvkExtMode::Optional };
301 DxvkExt extCustomBorderColor = { VK_EXT_CUSTOM_BORDER_COLOR_EXTENSION_NAME, DxvkExtMode::Optional };
302 DxvkExt extDepthClipEnable = { VK_EXT_DEPTH_CLIP_ENABLE_EXTENSION_NAME, DxvkExtMode::Optional };
303 DxvkExt extDepthBiasControl = { VK_EXT_DEPTH_BIAS_CONTROL_EXTENSION_NAME, DxvkExtMode::Optional };
304 DxvkExt extExtendedDynamicState3 = { VK_EXT_EXTENDED_DYNAMIC_STATE_3_EXTENSION_NAME, DxvkExtMode::Optional };
305 DxvkExt extFullScreenExclusive = { VK_EXT_FULL_SCREEN_EXCLUSIVE_EXTENSION_NAME, DxvkExtMode::Optional };
306 DxvkExt extFragmentShaderInterlock = { VK_EXT_FRAGMENT_SHADER_INTERLOCK_EXTENSION_NAME, DxvkExtMode::Optional };
307 DxvkExt extGraphicsPipelineLibrary = { VK_EXT_GRAPHICS_PIPELINE_LIBRARY_EXTENSION_NAME, DxvkExtMode::Optional };
308 DxvkExt extLineRasterization = { VK_EXT_LINE_RASTERIZATION_EXTENSION_NAME, DxvkExtMode::Passive };
309 DxvkExt extMemoryBudget = { VK_EXT_MEMORY_BUDGET_EXTENSION_NAME, DxvkExtMode::Passive };
310 DxvkExt extMemoryPriority = { VK_EXT_MEMORY_PRIORITY_EXTENSION_NAME, DxvkExtMode::Optional };
311 DxvkExt extNonSeamlessCubeMap = { VK_EXT_NON_SEAMLESS_CUBE_MAP_EXTENSION_NAME, DxvkExtMode::Optional };
312 DxvkExt extRobustness2 = { VK_EXT_ROBUSTNESS_2_EXTENSION_NAME, DxvkExtMode::Required };
313 DxvkExt extShaderModuleIdentifier = { VK_EXT_SHADER_MODULE_IDENTIFIER_EXTENSION_NAME, DxvkExtMode::Optional };
314 DxvkExt extShaderStencilExport = { VK_EXT_SHADER_STENCIL_EXPORT_EXTENSION_NAME, DxvkExtMode::Optional };
315 DxvkExt extSwapchainColorSpace = { VK_EXT_SWAPCHAIN_COLOR_SPACE_EXTENSION_NAME, DxvkExtMode::Optional };
316 DxvkExt extSwapchainMaintenance1 = { VK_EXT_SWAPCHAIN_MAINTENANCE_1_EXTENSION_NAME, DxvkExtMode::Optional };
317 DxvkExt extHdrMetadata = { VK_EXT_HDR_METADATA_EXTENSION_NAME, DxvkExtMode::Optional };
318 DxvkExt extTransformFeedback = { VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME, DxvkExtMode::Optional };
319 DxvkExt extVertexAttributeDivisor = { VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME, DxvkExtMode::Optional };
320 DxvkExt khrExternalMemoryWin32 = { VK_KHR_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME, DxvkExtMode::Optional };
321 DxvkExt khrExternalSemaphoreWin32 = { VK_KHR_EXTERNAL_SEMAPHORE_WIN32_EXTENSION_NAME, DxvkExtMode::Optional };
322 DxvkExt khrMaintenance5 = { VK_KHR_MAINTENANCE_5_EXTENSION_NAME, DxvkExtMode::Optional };
323 DxvkExt khrPipelineLibrary = { VK_KHR_PIPELINE_LIBRARY_EXTENSION_NAME, DxvkExtMode::Optional };
324 DxvkExt khrPresentId = { VK_KHR_PRESENT_ID_EXTENSION_NAME, DxvkExtMode::Optional };
325 DxvkExt khrPresentWait = { VK_KHR_PRESENT_WAIT_EXTENSION_NAME, DxvkExtMode::Optional };
326 DxvkExt khrSwapchain = { VK_KHR_SWAPCHAIN_EXTENSION_NAME, DxvkExtMode::Required };
327 DxvkExt khrWin32KeyedMutex = { VK_KHR_WIN32_KEYED_MUTEX_EXTENSION_NAME, DxvkExtMode::Optional };
328 DxvkExt nvRawAccessChains = { VK_NV_RAW_ACCESS_CHAINS_EXTENSION_NAME, DxvkExtMode::Optional };
329 DxvkExt nvxBinaryImport = { VK_NVX_BINARY_IMPORT_EXTENSION_NAME, DxvkExtMode::Disabled };
330 DxvkExt nvxImageViewHandle = { VK_NVX_IMAGE_VIEW_HANDLE_EXTENSION_NAME, DxvkExtMode::Disabled };
331#ifdef VBOX_WITH_DXVK_VIDEO
332 DxvkExt khrVideoQueue = { VK_KHR_VIDEO_QUEUE_EXTENSION_NAME, DxvkExtMode::Optional };
333 DxvkExt khrVideoDecodeQueue = { VK_KHR_VIDEO_DECODE_QUEUE_EXTENSION_NAME, DxvkExtMode::Optional };
334 DxvkExt khrVideoDecodeH264 = { VK_KHR_VIDEO_DECODE_H264_EXTENSION_NAME, DxvkExtMode::Optional };
335 DxvkExt khrVideoDecodeH265 = { VK_KHR_VIDEO_DECODE_H265_EXTENSION_NAME, DxvkExtMode::Optional };
336 DxvkExt khrVideoDecodeAV1 = { VK_KHR_VIDEO_DECODE_AV1_EXTENSION_NAME, DxvkExtMode::Optional };
337#endif
338 };
339
340 /**
341 * \brief Instance extensions
342 *
343 * Lists all Vulkan extensions that are potentially
344 * used by DXVK if supported by the implementation.
345 */
346 struct DxvkInstanceExtensions {
347 DxvkExt extDebugUtils = { VK_EXT_DEBUG_UTILS_EXTENSION_NAME, DxvkExtMode::Optional };
348 DxvkExt extSurfaceMaintenance1 = { VK_EXT_SURFACE_MAINTENANCE_1_EXTENSION_NAME, DxvkExtMode::Optional };
349 DxvkExt khrGetSurfaceCapabilities2 = { VK_KHR_GET_SURFACE_CAPABILITIES_2_EXTENSION_NAME, DxvkExtMode::Optional };
350 DxvkExt khrSurface = { VK_KHR_SURFACE_EXTENSION_NAME, DxvkExtMode::Required };
351 };
352
353}
Note: See TracBrowser for help on using the repository browser.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette