@@ -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