[vulkan] Re-odering pNext chain access for InlineUniformBlock + DescriptorBuffer

This commit is contained in:
CamilleLaVey 2026-01-26 21:48:37 -04:00
parent 477157d029
commit b3d4dbca60

View file

@ -485,27 +485,43 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR
} }
// VK_EXT_descriptor_buffer // VK_EXT_descriptor_buffer
VkPhysicalDeviceDescriptorBufferFeaturesEXT descriptor_buffer_temp{};
descriptor_buffer_temp.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_FEATURES_EXT;
descriptor_buffer_temp.pNext = nullptr;
VkPhysicalDeviceFeatures2 db_features2{};
db_features2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
db_features2.pNext = &descriptor_buffer_temp;
physical.GetFeatures2(db_features2);
VkPhysicalDeviceDescriptorBufferFeaturesEXT descriptor_buffer_features{ VkPhysicalDeviceDescriptorBufferFeaturesEXT descriptor_buffer_features{
.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_FEATURES_EXT, .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_FEATURES_EXT,
.pNext = first_next, .pNext = first_next,
.descriptorBuffer = features.descriptor_buffer.descriptorBuffer ? VK_TRUE : VK_FALSE, .descriptorBuffer = descriptor_buffer_temp.descriptorBuffer ? VK_TRUE : VK_FALSE,
.descriptorBufferCaptureReplay = features.descriptor_buffer.descriptorBufferCaptureReplay ? VK_TRUE : VK_FALSE, .descriptorBufferCaptureReplay = descriptor_buffer_temp.descriptorBufferCaptureReplay ? VK_TRUE : VK_FALSE,
.descriptorBufferImageLayoutIgnored = features.descriptor_buffer.descriptorBufferImageLayoutIgnored ? VK_TRUE : VK_FALSE, .descriptorBufferImageLayoutIgnored = descriptor_buffer_temp.descriptorBufferImageLayoutIgnored ? VK_TRUE : VK_FALSE,
.descriptorBufferPushDescriptors = features.descriptor_buffer.descriptorBufferPushDescriptors ? VK_TRUE : VK_FALSE, .descriptorBufferPushDescriptors = descriptor_buffer_temp.descriptorBufferPushDescriptors ? VK_TRUE : VK_FALSE,
}; };
if (extensions.descriptor_buffer) { if (extensions.descriptor_buffer && descriptor_buffer_temp.descriptorBuffer) {
first_next = &descriptor_buffer_features; first_next = &descriptor_buffer_features;
} }
// VK_EXT_inline_uniform_block // VK_EXT_inline_uniform_block
VkPhysicalDeviceInlineUniformBlockFeaturesEXT inline_uniform_block_temp{};
inline_uniform_block_temp.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT;
inline_uniform_block_temp.pNext = nullptr;
VkPhysicalDeviceFeatures2 iub_features2{};
iub_features2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
iub_features2.pNext = &inline_uniform_block_temp;
physical.GetFeatures2(iub_features2);
VkPhysicalDeviceInlineUniformBlockFeaturesEXT inline_uniform_block_features{ VkPhysicalDeviceInlineUniformBlockFeaturesEXT inline_uniform_block_features{
.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT, .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT,
.pNext = first_next, .pNext = first_next,
.inlineUniformBlock = features.inline_uniform_block.inlineUniformBlock ? VK_TRUE : VK_FALSE, .inlineUniformBlock = inline_uniform_block_temp.inlineUniformBlock ? VK_TRUE : VK_FALSE,
}; };
if (extensions.inline_uniform_block && features.inline_uniform_block.inlineUniformBlock) { if (extensions.inline_uniform_block && inline_uniform_block_temp.inlineUniformBlock) {
first_next = &inline_uniform_block_features; first_next = &inline_uniform_block_features;
} }