diff --git a/libs/vkd3d/device.c b/libs/vkd3d/device.c index 8efb21c8..cc2fb49c 100644 --- a/libs/vkd3d/device.c +++ b/libs/vkd3d/device.c @@ -99,6 +99,7 @@ static const struct vkd3d_optional_extension_info optional_device_extensions[] = VK_EXTENSION(EXT_EXTERNAL_MEMORY_HOST, EXT_external_memory_host), VK_EXTENSION(EXT_4444_FORMATS, EXT_4444_formats), VK_EXTENSION(EXT_SHADER_IMAGE_ATOMIC_INT64, EXT_shader_image_atomic_int64), + VK_EXTENSION(EXT_SCALAR_BLOCK_LAYOUT, EXT_scalar_block_layout), /* AMD extensions */ VK_EXTENSION(AMD_BUFFER_MARKER, AMD_buffer_marker), VK_EXTENSION(AMD_SHADER_CORE_PROPERTIES, AMD_shader_core_properties), @@ -1261,6 +1262,13 @@ static void vkd3d_physical_device_info_init(struct vkd3d_physical_device_info *i vk_prepend_struct(&info->features2, &info->shader_image_atomic_int64_features); } + if (vulkan_info->EXT_scalar_block_layout) + { + info->scalar_block_layout_features.sType = + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES_EXT; + vk_prepend_struct(&info->features2, &info->scalar_block_layout_features); + } + /* Core in Vulkan 1.1. */ info->shader_draw_parameters_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES; vk_prepend_struct(&info->features2, &info->shader_draw_parameters_features); @@ -5578,6 +5586,12 @@ static void vkd3d_init_shader_extensions(struct d3d12_device *device) device->vk_info.shader_extensions[device->vk_info.shader_extension_count++] = VKD3D_SHADER_TARGET_EXTENSION_RAY_TRACING_PRIMITIVE_CULLING; } + + if (device->device_info.scalar_block_layout_features.scalarBlockLayout) + { + device->vk_info.shader_extensions[device->vk_info.shader_extension_count++] = + VKD3D_SHADER_TARGET_EXTENSION_SCALAR_BLOCK_LAYOUT; + } } static bool d3d12_device_supports_feature_level(struct d3d12_device *device, D3D_FEATURE_LEVEL feature_level) diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h index 7e6b4eb8..449836be 100644 --- a/libs/vkd3d/vkd3d_private.h +++ b/libs/vkd3d/vkd3d_private.h @@ -49,7 +49,7 @@ #define MAKE_MAGIC(a,b,c,d) (((uint32_t)a) | (((uint32_t)b) << 8) | (((uint32_t)c) << 16) | (((uint32_t)d) << 24)) #define VKD3D_MAX_COMPATIBLE_FORMAT_COUNT 6u -#define VKD3D_MAX_SHADER_EXTENSIONS 4u +#define VKD3D_MAX_SHADER_EXTENSIONS 5u #define VKD3D_MAX_SHADER_STAGES 5u #define VKD3D_MAX_VK_SYNC_OBJECTS 4u @@ -147,6 +147,7 @@ struct vkd3d_vulkan_info bool EXT_external_memory_host; bool EXT_4444_formats; bool EXT_shader_image_atomic_int64; + bool EXT_scalar_block_layout; /* AMD device extensions */ bool AMD_buffer_marker; bool AMD_shader_core_properties; @@ -2724,6 +2725,7 @@ struct vkd3d_physical_device_info VkPhysicalDeviceComputeShaderDerivativesFeaturesNV compute_shader_derivatives_features_nv; VkPhysicalDeviceShaderAtomicInt64FeaturesKHR shader_atomic_int64_features; VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT shader_image_atomic_int64_features; + VkPhysicalDeviceScalarBlockLayoutFeaturesEXT scalar_block_layout_features; VkPhysicalDeviceFeatures2 features2;