fix android crashing

This commit is contained in:
CamilleLaVey 2026-01-26 21:12:19 -04:00
parent 16bdb64ec9
commit 477157d029
2 changed files with 27 additions and 11 deletions

View file

@ -269,6 +269,9 @@ struct FixedPipelineState {
// When transform feedback is enabled, use the whole struct // When transform feedback is enabled, use the whole struct
return sizeof(*this); return sizeof(*this);
} }
if (extended_dynamic_state_3_blend) {
return offsetof(FixedPipelineState, attachments);
}
if (dynamic_vertex_input && extended_dynamic_state_3_blend) { if (dynamic_vertex_input && extended_dynamic_state_3_blend) {
// Exclude dynamic state and attributes // Exclude dynamic state and attributes
return offsetof(FixedPipelineState, dynamic_state); return offsetof(FixedPipelineState, dynamic_state);
@ -277,6 +280,9 @@ struct FixedPipelineState {
// Exclude dynamic state // Exclude dynamic state
return offsetof(FixedPipelineState, attributes); return offsetof(FixedPipelineState, attributes);
} }
if (extended_dynamic_state_3_enables) {
return offsetof(FixedPipelineState, dynamic_state);
}
if (extended_dynamic_state) { if (extended_dynamic_state) {
// Exclude dynamic state // Exclude dynamic state
return offsetof(FixedPipelineState, vertex_strides); return offsetof(FixedPipelineState, vertex_strides);

View file

@ -462,26 +462,36 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR
first_next = &diagnostics_nv; first_next = &diagnostics_nv;
} }
VkPhysicalDeviceDescriptorIndexingFeaturesEXT descriptor_indexing{ // Query descriptor indexing features from the physical device first so we only
// request sub-features that are actually supported by the driver.
VkPhysicalDeviceDescriptorIndexingFeaturesEXT descriptor_indexing_temp{};
descriptor_indexing_temp.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT;
descriptor_indexing_temp.pNext = nullptr;
VkPhysicalDeviceFeatures2 desc_idx_features2{};
desc_idx_features2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
desc_idx_features2.pNext = &descriptor_indexing_temp;
physical.GetFeatures2(desc_idx_features2);
VkPhysicalDeviceDescriptorIndexingFeaturesEXT descriptor_indexing_req{
.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT, .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT,
.pNext = use_diagnostics_nv ? static_cast<void*>(&diagnostics_nv) : static_cast<void*>(&features2), .pNext = use_diagnostics_nv ? static_cast<void*>(&diagnostics_nv) : static_cast<void*>(&features2),
.shaderSampledImageArrayNonUniformIndexing = VK_TRUE, .shaderSampledImageArrayNonUniformIndexing = descriptor_indexing_temp.shaderSampledImageArrayNonUniformIndexing,
.descriptorBindingPartiallyBound = VK_TRUE, .descriptorBindingPartiallyBound = descriptor_indexing_temp.descriptorBindingPartiallyBound,
.descriptorBindingVariableDescriptorCount = VK_TRUE, .descriptorBindingVariableDescriptorCount = descriptor_indexing_temp.descriptorBindingVariableDescriptorCount,
}; };
if (extensions.descriptor_indexing && Settings::values.descriptor_indexing.GetValue()) { if (extensions.descriptor_indexing && Settings::values.descriptor_indexing.GetValue()) {
first_next = &descriptor_indexing; first_next = &descriptor_indexing_req;
} }
// VK_EXT_descriptor_buffer // VK_EXT_descriptor_buffer
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 = VK_TRUE, .descriptorBuffer = features.descriptor_buffer.descriptorBuffer ? VK_TRUE : VK_FALSE,
.descriptorBufferCaptureReplay = VK_TRUE, .descriptorBufferCaptureReplay = features.descriptor_buffer.descriptorBufferCaptureReplay ? VK_TRUE : VK_FALSE,
.descriptorBufferImageLayoutIgnored = VK_TRUE, .descriptorBufferImageLayoutIgnored = features.descriptor_buffer.descriptorBufferImageLayoutIgnored ? VK_TRUE : VK_FALSE,
.descriptorBufferPushDescriptors = VK_FALSE, .descriptorBufferPushDescriptors = features.descriptor_buffer.descriptorBufferPushDescriptors ? VK_TRUE : VK_FALSE,
}; };
if (extensions.descriptor_buffer) { if (extensions.descriptor_buffer) {
@ -492,10 +502,10 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR
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 = VK_TRUE, .inlineUniformBlock = features.inline_uniform_block.inlineUniformBlock ? VK_TRUE : VK_FALSE,
}; };
if (extensions.inline_uniform_block) { if (extensions.inline_uniform_block && features.inline_uniform_block.inlineUniformBlock) {
first_next = &inline_uniform_block_features; first_next = &inline_uniform_block_features;
} }