Skip to content

Commit 311aa7a

Browse files
committed
vo/vulkan: sync recommended Vulkan 1.x features from ffmpeg
This second set of additional features are ones from extensions that were incorporated into Vulkan eventually. As we do not require Vulkan to be newer than 1.2, we must request the 1.3 and 1.4 features via their original original extensions, while the others can use the core feature structs. This change assumes that libplacebo can correctly merge features using their old extensions or using the core feature structs.
1 parent ec3fa50 commit 311aa7a

1 file changed

Lines changed: 69 additions & 5 deletions

File tree

video/out/vulkan/context.c

Lines changed: 69 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -186,10 +186,12 @@ pl_vulkan mppl_create_vulkan(struct vulkan_opts *opts,
186186
const char *opt_extensions[] = {
187187
VK_EXT_DESCRIPTOR_BUFFER_EXTENSION_NAME,
188188
VK_EXT_SHADER_ATOMIC_FLOAT_EXTENSION_NAME,
189+
VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME,
189190
VK_KHR_VIDEO_DECODE_QUEUE_EXTENSION_NAME,
190191
VK_KHR_VIDEO_DECODE_H264_EXTENSION_NAME,
191192
VK_KHR_VIDEO_DECODE_H265_EXTENSION_NAME,
192193
VK_KHR_VIDEO_QUEUE_EXTENSION_NAME,
194+
VK_KHR_ZERO_INITIALIZE_WORKGROUP_MEMORY_EXTENSION_NAME,
193195
/*
194196
* Extensions below this point are newer than our minimum required Vulkan
195197
* headers and so we only activate them if the build time headers contain
@@ -203,6 +205,12 @@ pl_vulkan mppl_create_vulkan(struct vulkan_opts *opts,
203205
#endif
204206
#ifdef VK_KHR_video_maintenance1
205207
VK_KHR_VIDEO_MAINTENANCE_1_EXTENSION_NAME, /* 1.3.274 */
208+
#endif
209+
#ifdef VK_KHR_shader_expect_assume
210+
VK_KHR_SHADER_EXPECT_ASSUME_EXTENSION_NAME, /* 1.3.276 */
211+
#endif
212+
#ifdef VK_KHR_shader_subgroup_rotate
213+
VK_KHR_SHADER_SUBGROUP_ROTATE_EXTENSION_NAME, /* 1.3.276 */
206214
#endif
207215
/*
208216
* Because the AV1 extension does not require a feature flag to be enabled,
@@ -253,11 +261,31 @@ pl_vulkan mppl_create_vulkan(struct vulkan_opts *opts,
253261
};
254262
#endif
255263

264+
#ifdef VK_KHR_shader_subgroup_rotate
265+
VkPhysicalDeviceShaderSubgroupRotateFeaturesKHR shader_subgroup_rotate_feature = {
266+
.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_ROTATE_FEATURES_KHR,
267+
#ifdef VK_KHR_shader_relaxed_extended_instruction
268+
.pNext = &shader_relaxed_feature,
269+
#endif
270+
.shaderSubgroupRotate = true,
271+
};
272+
#endif
273+
274+
#ifdef VK_KHR_shader_expect_assume
275+
VkPhysicalDeviceShaderExpectAssumeFeaturesKHR shader_expect_assume_feature = {
276+
.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_EXPECT_ASSUME_FEATURES_KHR,
277+
#ifdef VK_KHR_shader_subgroup_rotate
278+
.pNext = &shader_subgroup_rotate_feature,
279+
#endif
280+
.shaderExpectAssume = true,
281+
};
282+
#endif
283+
256284
#ifdef VK_KHR_video_maintenance1
257285
VkPhysicalDeviceVideoMaintenance1FeaturesKHR video_maintenance_1_feature = {
258286
.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_MAINTENANCE_1_FEATURES_KHR,
259-
#ifdef VK_KHR_shader_relaxed_extended_instruction
260-
.pNext = &shader_relaxed_feature,
287+
#ifdef VK_KHR_shader_expect_assume
288+
.pNext = &shader_expect_assume_feature,
261289
#endif
262290
.videoMaintenance1 = true,
263291
};
@@ -283,11 +311,23 @@ pl_vulkan mppl_create_vulkan(struct vulkan_opts *opts,
283311
};
284312
#endif
285313

286-
VkPhysicalDeviceDescriptorBufferFeaturesEXT descriptor_buffer_feature = {
287-
.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_FEATURES_EXT,
314+
VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR zero_init_feature = {
315+
.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ZERO_INITIALIZE_WORKGROUP_MEMORY_FEATURES_KHR,
288316
#ifdef VK_EXT_shader_object
289317
.pNext = &shader_object_feature,
290318
#endif
319+
.shaderZeroInitializeWorkgroupMemory = true,
320+
};
321+
322+
VkPhysicalDeviceDynamicRenderingFeaturesKHR dynamic_rendering_feature = {
323+
.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES_KHR,
324+
.pNext = &zero_init_feature,
325+
.dynamicRendering = true,
326+
};
327+
328+
VkPhysicalDeviceDescriptorBufferFeaturesEXT descriptor_buffer_feature = {
329+
.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_FEATURES_EXT,
330+
.pNext = &dynamic_rendering_feature,
291331
.descriptorBuffer = true,
292332
.descriptorBufferPushDescriptors = true,
293333
};
@@ -299,7 +339,31 @@ pl_vulkan mppl_create_vulkan(struct vulkan_opts *opts,
299339
.shaderBufferFloat32AtomicAdd = true,
300340
};
301341

302-
features.pNext = &atomic_float_feature;
342+
VkPhysicalDeviceVulkan12Features recommended_vk12 = {
343+
.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES,
344+
.pNext = &atomic_float_feature,
345+
.scalarBlockLayout = true,
346+
.shaderBufferInt64Atomics = true,
347+
.uniformBufferStandardLayout = true,
348+
};
349+
350+
VkPhysicalDeviceVulkan11Features recommended_vk11 = {
351+
.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES,
352+
.pNext = &recommended_vk12,
353+
.storageBuffer16BitAccess = true,
354+
.uniformAndStorageBuffer16BitAccess = true,
355+
};
356+
357+
VkPhysicalDeviceFeatures2 recommended_features = {
358+
.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2,
359+
.pNext = &recommended_vk11,
360+
.features = {
361+
.shaderInt16 = true,
362+
.shaderFloat64 = true,
363+
},
364+
};
365+
366+
features.pNext = &recommended_features;
303367

304368
AVUUID param_uuid = { 0 };
305369
bool is_uuid = opts->device &&

0 commit comments

Comments
 (0)