From 4aea3fb3dd22425c264e5f6899fe8c8ce8996c7d Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Fri, 12 May 2023 16:46:52 -0400 Subject: [PATCH] lvp: Use common GetPhysicalDeviceFeatures2 This is a big delete-the-code win. Tested by diff'ing vulkaninfo output before/after the patch and confirming no changes (other than the driverInfo git sha and the pipelineCacheUUID). Signed-off-by: Alyssa Rosenzweig Acked-by: Mike Blumenkrantz Part-of: --- src/gallium/frontends/lavapipe/lvp_device.c | 853 ++++++++++------------------ 1 file changed, 313 insertions(+), 540 deletions(-) diff --git a/src/gallium/frontends/lavapipe/lvp_device.c b/src/gallium/frontends/lavapipe/lvp_device.c index 39a4df0..215ac5e 100644 --- a/src/gallium/frontends/lavapipe/lvp_device.c +++ b/src/gallium/frontends/lavapipe/lvp_device.c @@ -223,6 +223,318 @@ min_shader_param(struct pipe_screen *pscreen, enum pipe_shader_cap param) pscreen->get_shader_param(pscreen, MESA_SHADER_COMPUTE, param)); } +static void +lvp_get_features(const struct lvp_physical_device *pdevice, + struct vk_features *features) +{ + bool instance_divisor = pdevice->pscreen->get_param(pdevice->pscreen, PIPE_CAP_VERTEX_ELEMENT_INSTANCE_DIVISOR) != 0; + bool indirect = false;//pdevice->pscreen->get_param(pdevice->pscreen, PIPE_CAP_GLSL_FEATURE_LEVEL) >= 400; + + *features = (struct vk_features){ + /* Vulkan 1.0 */ + .robustBufferAccess = true, + .fullDrawIndexUint32 = true, + .imageCubeArray = (pdevice->pscreen->get_param(pdevice->pscreen, PIPE_CAP_CUBE_MAP_ARRAY) != 0), + .independentBlend = true, + .geometryShader = (pdevice->pscreen->get_shader_param(pdevice->pscreen, MESA_SHADER_GEOMETRY, PIPE_SHADER_CAP_MAX_INSTRUCTIONS) != 0), + .tessellationShader = (pdevice->pscreen->get_shader_param(pdevice->pscreen, MESA_SHADER_TESS_EVAL, PIPE_SHADER_CAP_MAX_INSTRUCTIONS) != 0), + .sampleRateShading = (pdevice->pscreen->get_param(pdevice->pscreen, PIPE_CAP_SAMPLE_SHADING) != 0), + .dualSrcBlend = (pdevice->pscreen->get_param(pdevice->pscreen, PIPE_CAP_MAX_DUAL_SOURCE_RENDER_TARGETS) != 0), + .logicOp = true, + .multiDrawIndirect = (pdevice->pscreen->get_param(pdevice->pscreen, PIPE_CAP_MULTI_DRAW_INDIRECT) != 0), + .drawIndirectFirstInstance = true, + .depthClamp = (pdevice->pscreen->get_param(pdevice->pscreen, PIPE_CAP_DEPTH_CLIP_DISABLE) != 0), + .depthBiasClamp = true, + .fillModeNonSolid = true, + .depthBounds = (pdevice->pscreen->get_param(pdevice->pscreen, PIPE_CAP_DEPTH_BOUNDS_TEST) != 0), + .wideLines = true, + .largePoints = true, + .alphaToOne = true, + .multiViewport = true, + .samplerAnisotropy = true, + .textureCompressionETC2 = false, + .textureCompressionASTC_LDR = false, + .textureCompressionBC = true, + .occlusionQueryPrecise = true, + .pipelineStatisticsQuery = true, + .vertexPipelineStoresAndAtomics = (min_vertex_pipeline_param(pdevice->pscreen, PIPE_SHADER_CAP_MAX_SHADER_BUFFERS) != 0), + .fragmentStoresAndAtomics = (pdevice->pscreen->get_shader_param(pdevice->pscreen, MESA_SHADER_FRAGMENT, PIPE_SHADER_CAP_MAX_SHADER_BUFFERS) != 0), + .shaderTessellationAndGeometryPointSize = true, + .shaderImageGatherExtended = true, + .shaderStorageImageExtendedFormats = (min_shader_param(pdevice->pscreen, PIPE_SHADER_CAP_MAX_SHADER_IMAGES) != 0), + .shaderStorageImageMultisample = (pdevice->pscreen->get_param(pdevice->pscreen, PIPE_CAP_TEXTURE_MULTISAMPLE) != 0), + .shaderUniformBufferArrayDynamicIndexing = true, + .shaderSampledImageArrayDynamicIndexing = indirect, + .shaderStorageBufferArrayDynamicIndexing = true, + .shaderStorageImageArrayDynamicIndexing = indirect, + .shaderStorageImageReadWithoutFormat = (pdevice->pscreen->get_param(pdevice->pscreen, PIPE_CAP_IMAGE_LOAD_FORMATTED) != 0), + .shaderStorageImageWriteWithoutFormat = (pdevice->pscreen->get_param(pdevice->pscreen, PIPE_CAP_IMAGE_STORE_FORMATTED) != 0), + .shaderClipDistance = true, + .shaderCullDistance = (pdevice->pscreen->get_param(pdevice->pscreen, PIPE_CAP_CULL_DISTANCE) == 1), + .shaderFloat64 = (pdevice->pscreen->get_param(pdevice->pscreen, PIPE_CAP_DOUBLES) == 1), + .shaderInt64 = (pdevice->pscreen->get_param(pdevice->pscreen, PIPE_CAP_INT64) == 1), + .shaderInt16 = (min_shader_param(pdevice->pscreen, PIPE_SHADER_CAP_INT16) == 1), + .variableMultisampleRate = false, + .inheritedQueries = false, + + /* Vulkan 1.1 */ + .storageBuffer16BitAccess = true, + .uniformAndStorageBuffer16BitAccess = true, + .storagePushConstant16 = true, + .storageInputOutput16 = false, + .multiview = true, + .multiviewGeometryShader = true, + .multiviewTessellationShader = true, + .variablePointersStorageBuffer = true, + .variablePointers = true, + .protectedMemory = false, + .samplerYcbcrConversion = false, + .shaderDrawParameters = true, + + /* Vulkan 1.2 */ + .samplerMirrorClampToEdge = true, + .drawIndirectCount = true, + .storageBuffer8BitAccess = true, + .uniformAndStorageBuffer8BitAccess = true, + .storagePushConstant8 = true, + .shaderBufferInt64Atomics = true, + .shaderSharedInt64Atomics = true, + .shaderFloat16 = pdevice->pscreen->get_shader_param(pdevice->pscreen, MESA_SHADER_FRAGMENT, PIPE_SHADER_CAP_FP16) != 0, + .shaderInt8 = true, + + .descriptorIndexing = false, + .shaderInputAttachmentArrayDynamicIndexing = false, + .shaderUniformTexelBufferArrayDynamicIndexing = false, + .shaderStorageTexelBufferArrayDynamicIndexing = false, + .shaderUniformBufferArrayNonUniformIndexing = false, + .shaderSampledImageArrayNonUniformIndexing = false, + .shaderStorageBufferArrayNonUniformIndexing = false, + .shaderStorageImageArrayNonUniformIndexing = false, + .shaderInputAttachmentArrayNonUniformIndexing = false, + .shaderUniformTexelBufferArrayNonUniformIndexing = false, + .shaderStorageTexelBufferArrayNonUniformIndexing = false, + .descriptorBindingUniformBufferUpdateAfterBind = false, + .descriptorBindingSampledImageUpdateAfterBind = false, + .descriptorBindingStorageImageUpdateAfterBind = false, + .descriptorBindingStorageBufferUpdateAfterBind = false, + .descriptorBindingUniformTexelBufferUpdateAfterBind = false, + .descriptorBindingStorageTexelBufferUpdateAfterBind = false, + .descriptorBindingUpdateUnusedWhilePending = false, + .descriptorBindingPartiallyBound = false, + .descriptorBindingVariableDescriptorCount = false, + .runtimeDescriptorArray = false, + + .samplerFilterMinmax = true, + .scalarBlockLayout = true, + .imagelessFramebuffer = true, + .uniformBufferStandardLayout = true, + .shaderSubgroupExtendedTypes = true, + .separateDepthStencilLayouts = true, + .hostQueryReset = true, + .timelineSemaphore = true, + .bufferDeviceAddress = true, + .bufferDeviceAddressCaptureReplay = false, + .bufferDeviceAddressMultiDevice = false, + .vulkanMemoryModel = true, + .vulkanMemoryModelDeviceScope = true, + .vulkanMemoryModelAvailabilityVisibilityChains = true, + .shaderOutputViewportIndex = true, + .shaderOutputLayer = true, + .subgroupBroadcastDynamicId = true, + + /* Vulkan 1.3 */ + .robustImageAccess = true, + .inlineUniformBlock = true, + .descriptorBindingInlineUniformBlockUpdateAfterBind = true, + .pipelineCreationCacheControl = true, + .privateData = true, + .shaderDemoteToHelperInvocation = true, + .shaderTerminateInvocation = true, + .subgroupSizeControl = true, + .computeFullSubgroups = true, + .synchronization2 = true, + .textureCompressionASTC_HDR = VK_FALSE, + .shaderZeroInitializeWorkgroupMemory = true, + .dynamicRendering = true, + .shaderIntegerDotProduct = true, + .maintenance4 = true, + + /* VK_EXT_primitives_generated_query */ + .primitivesGeneratedQuery = true, + .primitivesGeneratedQueryWithRasterizerDiscard = true, + .primitivesGeneratedQueryWithNonZeroStreams = true, + + /* VK_EXT_border_color_swizzle */ + .borderColorSwizzle = true, + .borderColorSwizzleFromImage = true, + + /* VK_EXT_non_seamless_cube_map */ + .nonSeamlessCubeMap = true, + + /* VK_EXT_attachment_feedback_loop_layout */ + .attachmentFeedbackLoopLayout = true, + + /* VK_EXT_rasterization_order_attachment_access */ + .rasterizationOrderColorAttachmentAccess = true, + .rasterizationOrderDepthAttachmentAccess = true, + .rasterizationOrderStencilAttachmentAccess = true, + + /* VK_EXT_line_rasterization */ + .rectangularLines = true, + .bresenhamLines = true, + .smoothLines = true, + .stippledRectangularLines = true, + .stippledBresenhamLines = true, + .stippledSmoothLines = true, + + /* VK_EXT_vertex_attribute_divisor */ + .vertexAttributeInstanceRateZeroDivisor = instance_divisor, + .vertexAttributeInstanceRateDivisor = instance_divisor, + + /* VK_EXT_multisampled_render_to_single_sampled */ + .multisampledRenderToSingleSampled = true, + + /* VK_EXT_index_type_uint8 */ + .indexTypeUint8 = true, + + /* VK_EXT_vertex_input_dynamic_state */ + .vertexInputDynamicState = true, + + /* VK_EXT_image_sliced_view_of_3d */ + .imageSlicedViewOf3D = true, + + /* VK_EXT_depth_clip_control */ + .depthClipControl = true, + + /* VK_EXT_attachment_feedback_loop_layout_dynamic_state */ + .attachmentFeedbackLoopDynamicState = true, + + /* VK_EXT_shader_object */ + .shaderObject = true, + + /* VK_KHR_shader_clock */ + .shaderSubgroupClock = true, + .shaderDeviceClock = true, + + /* VK_EXT_texel_buffer_alignment */ + .texelBufferAlignment = true, + + /* VK_EXT_transform_feedback */ + .transformFeedback = true, + .geometryStreams = true, + + /* VK_EXT_conditional_rendering */ + .conditionalRendering = true, + .inheritedConditionalRendering = false, + + /* VK_EXT_extended_dynamic_state */ + .extendedDynamicState = true, + + /* VK_EXT_4444_formats */ + .formatA4R4G4B4 = true, + .formatA4B4G4R4 = true, + + /* VK_EXT_custom_border_color */ + .customBorderColors = true, + .customBorderColorWithoutFormat = true, + + /* VK_EXT_color_write_enable */ + .colorWriteEnable = true, + + /* VK_EXT_image_2d_view_of_3d */ + .image2DViewOf3D = true, + .sampler2DViewOf3D = true, + + /* VK_EXT_provoking_vertex */ + .provokingVertexLast = true, + .transformFeedbackPreservesProvokingVertex = true, + + /* VK_EXT_multi_draw */ + .multiDraw = true, + + /* VK_EXT_depth_clip_enable */ + .depthClipEnable = (pdevice->pscreen->get_param(pdevice->pscreen, PIPE_CAP_DEPTH_CLAMP_ENABLE) != 0), + + /* VK_EXT_extended_dynamic_state2 */ + .extendedDynamicState2 = true, + .extendedDynamicState2LogicOp = true, + .extendedDynamicState2PatchControlPoints = true, + + /* VK_EXT_extended_dynamic_state3 */ + .extendedDynamicState3PolygonMode = true, + .extendedDynamicState3TessellationDomainOrigin = true, + .extendedDynamicState3DepthClampEnable = true, + .extendedDynamicState3DepthClipEnable = true, + .extendedDynamicState3LogicOpEnable = true, + .extendedDynamicState3SampleMask = true, + .extendedDynamicState3RasterizationSamples = true, + .extendedDynamicState3AlphaToCoverageEnable = true, + .extendedDynamicState3AlphaToOneEnable = true, + .extendedDynamicState3DepthClipNegativeOneToOne = true, + .extendedDynamicState3RasterizationStream = false, + .extendedDynamicState3ConservativeRasterizationMode = false, + .extendedDynamicState3ExtraPrimitiveOverestimationSize = false, + .extendedDynamicState3LineRasterizationMode = true, + .extendedDynamicState3LineStippleEnable = true, + .extendedDynamicState3ProvokingVertexMode = true, + .extendedDynamicState3SampleLocationsEnable = false, + .extendedDynamicState3ColorBlendEnable = true, + .extendedDynamicState3ColorBlendEquation = true, + .extendedDynamicState3ColorWriteMask = true, + .extendedDynamicState3ViewportWScalingEnable = false, + .extendedDynamicState3ViewportSwizzle = false, + .extendedDynamicState3ShadingRateImageEnable = false, + .extendedDynamicState3CoverageToColorEnable = false, + .extendedDynamicState3CoverageToColorLocation = false, + .extendedDynamicState3CoverageModulationMode = false, + .extendedDynamicState3CoverageModulationTableEnable = false, + .extendedDynamicState3CoverageModulationTable = false, + .extendedDynamicState3CoverageReductionMode = false, + .extendedDynamicState3RepresentativeFragmentTestEnable = false, + .extendedDynamicState3ColorBlendAdvanced = false, + + /* VK_EXT_robustness2 */ + .robustBufferAccess2 = true, + .robustImageAccess2 = true, + .nullDescriptor = true, + + /* VK_EXT_primitive_topology_list_restart */ + .primitiveTopologyListRestart = true, + .primitiveTopologyPatchListRestart = true, + + /* VK_EXT_graphics_pipeline_library */ + .graphicsPipelineLibrary = true, + + /* VK_EXT_shader_atomic_float */ + .shaderBufferFloat32Atomics = true, + .shaderBufferFloat32AtomicAdd = true, + .shaderBufferFloat64Atomics = false, + .shaderBufferFloat64AtomicAdd = false, + .shaderSharedFloat32Atomics = true, + .shaderSharedFloat32AtomicAdd = true, + .shaderSharedFloat64Atomics = false, + .shaderSharedFloat64AtomicAdd = false, + .shaderImageFloat32Atomics = true, + .shaderImageFloat32AtomicAdd = true, + .sparseImageFloat32Atomics = false, + .sparseImageFloat32AtomicAdd = false, + + /* VK_EXT_shader_atomic_float2 */ + .shaderBufferFloat16Atomics = false, + .shaderBufferFloat16AtomicAdd = false, + .shaderBufferFloat16AtomicMinMax = false, + .shaderBufferFloat32AtomicMinMax = LLVM_VERSION_MAJOR >= 15, + .shaderBufferFloat64AtomicMinMax = false, + .shaderSharedFloat16Atomics = false, + .shaderSharedFloat16AtomicAdd = false, + .shaderSharedFloat16AtomicMinMax = false, + .shaderSharedFloat32AtomicMinMax = LLVM_VERSION_MAJOR >= 15, + .shaderSharedFloat64AtomicMinMax = false, + .shaderImageFloat32AtomicMinMax = LLVM_VERSION_MAJOR >= 15, + .sparseImageFloat32AtomicMinMax = false, + }; +} + static VkResult VKAPI_CALL lvp_physical_device_init(struct lvp_physical_device *device, struct lvp_instance *instance, @@ -257,6 +569,7 @@ lvp_physical_device_init(struct lvp_physical_device *device, device->max_images = device->pscreen->get_shader_param(device->pscreen, MESA_SHADER_FRAGMENT, PIPE_SHADER_CAP_MAX_SHADER_IMAGES); device->vk.supported_extensions = lvp_device_extensions_supported; + lvp_get_features(device, &device->vk.supported_features); VkSampleCountFlags sample_counts = VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT; @@ -540,546 +853,6 @@ lvp_enumerate_physical_devices(struct vk_instance *vk_instance) return result; } -VKAPI_ATTR void VKAPI_CALL lvp_GetPhysicalDeviceFeatures( - VkPhysicalDevice physicalDevice, - VkPhysicalDeviceFeatures* pFeatures) -{ - LVP_FROM_HANDLE(lvp_physical_device, pdevice, physicalDevice); - bool indirect = false;//pdevice->pscreen->get_param(pdevice->pscreen, PIPE_CAP_GLSL_FEATURE_LEVEL) >= 400; - memset(pFeatures, 0, sizeof(*pFeatures)); - *pFeatures = (VkPhysicalDeviceFeatures) { - .robustBufferAccess = true, - .fullDrawIndexUint32 = true, - .imageCubeArray = (pdevice->pscreen->get_param(pdevice->pscreen, PIPE_CAP_CUBE_MAP_ARRAY) != 0), - .independentBlend = true, - .geometryShader = (pdevice->pscreen->get_shader_param(pdevice->pscreen, MESA_SHADER_GEOMETRY, PIPE_SHADER_CAP_MAX_INSTRUCTIONS) != 0), - .tessellationShader = (pdevice->pscreen->get_shader_param(pdevice->pscreen, MESA_SHADER_TESS_EVAL, PIPE_SHADER_CAP_MAX_INSTRUCTIONS) != 0), - .sampleRateShading = (pdevice->pscreen->get_param(pdevice->pscreen, PIPE_CAP_SAMPLE_SHADING) != 0), - .dualSrcBlend = (pdevice->pscreen->get_param(pdevice->pscreen, PIPE_CAP_MAX_DUAL_SOURCE_RENDER_TARGETS) != 0), - .logicOp = true, - .multiDrawIndirect = (pdevice->pscreen->get_param(pdevice->pscreen, PIPE_CAP_MULTI_DRAW_INDIRECT) != 0), - .drawIndirectFirstInstance = true, - .depthClamp = (pdevice->pscreen->get_param(pdevice->pscreen, PIPE_CAP_DEPTH_CLIP_DISABLE) != 0), - .depthBiasClamp = true, - .fillModeNonSolid = true, - .depthBounds = (pdevice->pscreen->get_param(pdevice->pscreen, PIPE_CAP_DEPTH_BOUNDS_TEST) != 0), - .wideLines = true, - .largePoints = true, - .alphaToOne = true, - .multiViewport = true, - .samplerAnisotropy = true, - .textureCompressionETC2 = false, - .textureCompressionASTC_LDR = false, - .textureCompressionBC = true, - .occlusionQueryPrecise = true, - .pipelineStatisticsQuery = true, - .vertexPipelineStoresAndAtomics = (min_vertex_pipeline_param(pdevice->pscreen, PIPE_SHADER_CAP_MAX_SHADER_BUFFERS) != 0), - .fragmentStoresAndAtomics = (pdevice->pscreen->get_shader_param(pdevice->pscreen, MESA_SHADER_FRAGMENT, PIPE_SHADER_CAP_MAX_SHADER_BUFFERS) != 0), - .shaderTessellationAndGeometryPointSize = true, - .shaderImageGatherExtended = true, - .shaderStorageImageExtendedFormats = (min_shader_param(pdevice->pscreen, PIPE_SHADER_CAP_MAX_SHADER_IMAGES) != 0), - .shaderStorageImageMultisample = (pdevice->pscreen->get_param(pdevice->pscreen, PIPE_CAP_TEXTURE_MULTISAMPLE) != 0), - .shaderUniformBufferArrayDynamicIndexing = true, - .shaderSampledImageArrayDynamicIndexing = indirect, - .shaderStorageBufferArrayDynamicIndexing = true, - .shaderStorageImageArrayDynamicIndexing = indirect, - .shaderStorageImageReadWithoutFormat = (pdevice->pscreen->get_param(pdevice->pscreen, PIPE_CAP_IMAGE_LOAD_FORMATTED) != 0), - .shaderStorageImageWriteWithoutFormat = (pdevice->pscreen->get_param(pdevice->pscreen, PIPE_CAP_IMAGE_STORE_FORMATTED) != 0), - .shaderClipDistance = true, - .shaderCullDistance = (pdevice->pscreen->get_param(pdevice->pscreen, PIPE_CAP_CULL_DISTANCE) == 1), - .shaderFloat64 = (pdevice->pscreen->get_param(pdevice->pscreen, PIPE_CAP_DOUBLES) == 1), - .shaderInt64 = (pdevice->pscreen->get_param(pdevice->pscreen, PIPE_CAP_INT64) == 1), - .shaderInt16 = (min_shader_param(pdevice->pscreen, PIPE_SHADER_CAP_INT16) == 1), - .variableMultisampleRate = false, - .inheritedQueries = false, - }; -} - -static void -lvp_get_physical_device_features_1_1(struct lvp_physical_device *pdevice, - VkPhysicalDeviceVulkan11Features *f) -{ - assert(f->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES); - - f->storageBuffer16BitAccess = true; - f->uniformAndStorageBuffer16BitAccess = true; - f->storagePushConstant16 = true; - f->storageInputOutput16 = false; - f->multiview = true; - f->multiviewGeometryShader = true; - f->multiviewTessellationShader = true; - f->variablePointersStorageBuffer = true; - f->variablePointers = true; - f->protectedMemory = false; - f->samplerYcbcrConversion = false; - f->shaderDrawParameters = true; -} - -static void -lvp_get_physical_device_features_1_2(struct lvp_physical_device *pdevice, - VkPhysicalDeviceVulkan12Features *f) -{ - assert(f->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES); - - f->samplerMirrorClampToEdge = true; - f->drawIndirectCount = true; - f->storageBuffer8BitAccess = true; - f->uniformAndStorageBuffer8BitAccess = true; - f->storagePushConstant8 = true; - f->shaderBufferInt64Atomics = true; - f->shaderSharedInt64Atomics = true; - f->shaderFloat16 = pdevice->pscreen->get_shader_param(pdevice->pscreen, MESA_SHADER_FRAGMENT, PIPE_SHADER_CAP_FP16) != 0; - f->shaderInt8 = true; - - f->descriptorIndexing = false; - f->shaderInputAttachmentArrayDynamicIndexing = false; - f->shaderUniformTexelBufferArrayDynamicIndexing = false; - f->shaderStorageTexelBufferArrayDynamicIndexing = false; - f->shaderUniformBufferArrayNonUniformIndexing = false; - f->shaderSampledImageArrayNonUniformIndexing = false; - f->shaderStorageBufferArrayNonUniformIndexing = false; - f->shaderStorageImageArrayNonUniformIndexing = false; - f->shaderInputAttachmentArrayNonUniformIndexing = false; - f->shaderUniformTexelBufferArrayNonUniformIndexing = false; - f->shaderStorageTexelBufferArrayNonUniformIndexing = false; - f->descriptorBindingUniformBufferUpdateAfterBind = false; - f->descriptorBindingSampledImageUpdateAfterBind = false; - f->descriptorBindingStorageImageUpdateAfterBind = false; - f->descriptorBindingStorageBufferUpdateAfterBind = false; - f->descriptorBindingUniformTexelBufferUpdateAfterBind = false; - f->descriptorBindingStorageTexelBufferUpdateAfterBind = false; - f->descriptorBindingUpdateUnusedWhilePending = false; - f->descriptorBindingPartiallyBound = false; - f->descriptorBindingVariableDescriptorCount = false; - f->runtimeDescriptorArray = false; - - f->samplerFilterMinmax = true; - f->scalarBlockLayout = true; - f->imagelessFramebuffer = true; - f->uniformBufferStandardLayout = true; - f->shaderSubgroupExtendedTypes = true; - f->separateDepthStencilLayouts = true; - f->hostQueryReset = true; - f->timelineSemaphore = true; - f->bufferDeviceAddress = true; - f->bufferDeviceAddressCaptureReplay = false; - f->bufferDeviceAddressMultiDevice = false; - f->vulkanMemoryModel = true; - f->vulkanMemoryModelDeviceScope = true; - f->vulkanMemoryModelAvailabilityVisibilityChains = true; - f->shaderOutputViewportIndex = true; - f->shaderOutputLayer = true; - f->subgroupBroadcastDynamicId = true; -} - -static void -lvp_get_physical_device_features_1_3(struct lvp_physical_device *pdevice, - VkPhysicalDeviceVulkan13Features *f) -{ - assert(f->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES); - - f->robustImageAccess = VK_TRUE; - f->inlineUniformBlock = VK_TRUE; - f->descriptorBindingInlineUniformBlockUpdateAfterBind = VK_TRUE; - f->pipelineCreationCacheControl = VK_TRUE; - f->privateData = VK_TRUE; - f->shaderDemoteToHelperInvocation = VK_TRUE; - f->shaderTerminateInvocation = VK_TRUE; - f->subgroupSizeControl = VK_TRUE; - f->computeFullSubgroups = VK_TRUE; - f->synchronization2 = VK_TRUE; - f->textureCompressionASTC_HDR = VK_FALSE; - f->shaderZeroInitializeWorkgroupMemory = VK_TRUE; - f->dynamicRendering = VK_TRUE; - f->shaderIntegerDotProduct = VK_TRUE; - f->maintenance4 = VK_TRUE; -} - -VKAPI_ATTR void VKAPI_CALL lvp_GetPhysicalDeviceFeatures2( - VkPhysicalDevice physicalDevice, - VkPhysicalDeviceFeatures2 *pFeatures) -{ - LVP_FROM_HANDLE(lvp_physical_device, pdevice, physicalDevice); - lvp_GetPhysicalDeviceFeatures(physicalDevice, &pFeatures->features); - - VkPhysicalDeviceVulkan11Features core_1_1 = { - .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, - }; - lvp_get_physical_device_features_1_1(pdevice, &core_1_1); - - VkPhysicalDeviceVulkan12Features core_1_2 = { - .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, - }; - lvp_get_physical_device_features_1_2(pdevice, &core_1_2); - - VkPhysicalDeviceVulkan13Features core_1_3 = { - .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES, - }; - lvp_get_physical_device_features_1_3(pdevice, &core_1_3); - - vk_foreach_struct(ext, pFeatures->pNext) { - - if (vk_get_physical_device_core_1_1_feature_ext(ext, &core_1_1)) - continue; - if (vk_get_physical_device_core_1_2_feature_ext(ext, &core_1_2)) - continue; - if (vk_get_physical_device_core_1_3_feature_ext(ext, &core_1_3)) - continue; - - switch (ext->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES: { - VkPhysicalDevicePrivateDataFeatures *features = - (VkPhysicalDevicePrivateDataFeatures *)ext; - features->privateData = true; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES: { - VkPhysicalDeviceSynchronization2Features *features = - (VkPhysicalDeviceSynchronization2Features *)ext; - features->synchronization2 = true; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES: { - VkPhysicalDevicePipelineCreationCacheControlFeatures *features = - (VkPhysicalDevicePipelineCreationCacheControlFeatures *)ext; - features->pipelineCreationCacheControl = true; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVES_GENERATED_QUERY_FEATURES_EXT: { - VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT *features = - (VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT *)ext; - features->primitivesGeneratedQuery = true; - features->primitivesGeneratedQueryWithRasterizerDiscard = true; - features->primitivesGeneratedQueryWithNonZeroStreams = true; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BORDER_COLOR_SWIZZLE_FEATURES_EXT: { - VkPhysicalDeviceBorderColorSwizzleFeaturesEXT *features = - (VkPhysicalDeviceBorderColorSwizzleFeaturesEXT *)ext; - features->borderColorSwizzle = true; - features->borderColorSwizzleFromImage = true; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_NON_SEAMLESS_CUBE_MAP_FEATURES_EXT: { - VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT *features = - (VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT *)ext; - features->nonSeamlessCubeMap = true; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ATTACHMENT_FEEDBACK_LOOP_LAYOUT_FEATURES_EXT: { - VkPhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT *features = - (VkPhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT *)ext; - features->attachmentFeedbackLoopLayout = true; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT: { - VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT *features = - (VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT *)ext; - features->rasterizationOrderColorAttachmentAccess = true; - features->rasterizationOrderDepthAttachmentAccess = true; - features->rasterizationOrderStencilAttachmentAccess = true; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT: { - VkPhysicalDeviceLineRasterizationFeaturesEXT *features = - (VkPhysicalDeviceLineRasterizationFeaturesEXT *)ext; - features->rectangularLines = true; - features->bresenhamLines = true; - features->smoothLines = true; - features->stippledRectangularLines = true; - features->stippledBresenhamLines = true; - features->stippledSmoothLines = true; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT: { - VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT *features = - (VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT *)ext; - if (pdevice->pscreen->get_param(pdevice->pscreen, PIPE_CAP_VERTEX_ELEMENT_INSTANCE_DIVISOR) != 0) { - features->vertexAttributeInstanceRateZeroDivisor = true; - features->vertexAttributeInstanceRateDivisor = true; - } else { - features->vertexAttributeInstanceRateDivisor = false; - features->vertexAttributeInstanceRateZeroDivisor = false; - } - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_FEATURES_EXT: { - VkPhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT *features = - (VkPhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT *)ext; - features->multisampledRenderToSingleSampled = true; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT: { - VkPhysicalDeviceIndexTypeUint8FeaturesEXT *features = - (VkPhysicalDeviceIndexTypeUint8FeaturesEXT *)ext; - features->indexTypeUint8 = true; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES: { - VkPhysicalDeviceShaderIntegerDotProductFeatures *features = - (VkPhysicalDeviceShaderIntegerDotProductFeatures *)ext; - features->shaderIntegerDotProduct = true; - break; - } - - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT: { - VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT *features = - (VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT *)ext; - features->vertexInputDynamicState = true; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_FEATURES: { - VkPhysicalDeviceMaintenance4Features *features = - (VkPhysicalDeviceMaintenance4Features *)ext; - features->maintenance4 = true; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_SLICED_VIEW_OF_3D_FEATURES_EXT: { - VkPhysicalDeviceImageSlicedViewOf3DFeaturesEXT *features = - (VkPhysicalDeviceImageSlicedViewOf3DFeaturesEXT *)ext; - features->imageSlicedViewOf3D = true; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES: { - VkPhysicalDeviceSubgroupSizeControlFeatures *features = - (VkPhysicalDeviceSubgroupSizeControlFeatures *)ext; - features->subgroupSizeControl = true; - features->computeFullSubgroups = true; - break; - } - - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_CONTROL_FEATURES_EXT: { - VkPhysicalDeviceDepthClipControlFeaturesEXT *features = - (VkPhysicalDeviceDepthClipControlFeaturesEXT *)ext; - features->depthClipControl = true; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ATTACHMENT_FEEDBACK_LOOP_DYNAMIC_STATE_FEATURES_EXT: { - VkPhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT *features = - (VkPhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT *)ext; - features->attachmentFeedbackLoopDynamicState = true; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_OBJECT_FEATURES_EXT: { - VkPhysicalDeviceShaderObjectFeaturesEXT *features = - (VkPhysicalDeviceShaderObjectFeaturesEXT *)ext; - features->shaderObject = true; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ZERO_INITIALIZE_WORKGROUP_MEMORY_FEATURES: { - VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeatures *features = - (VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeatures *)ext; - features->shaderZeroInitializeWorkgroupMemory = true; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR: { - VkPhysicalDeviceShaderClockFeaturesKHR *features = - (VkPhysicalDeviceShaderClockFeaturesKHR *)ext; - features->shaderSubgroupClock = true; - features->shaderDeviceClock = true; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT: { - VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT *features = - (VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT *)ext; - features->texelBufferAlignment = true; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT: { - VkPhysicalDeviceTransformFeedbackFeaturesEXT *features = - (VkPhysicalDeviceTransformFeedbackFeaturesEXT*)ext; - - features->transformFeedback = true; - features->geometryStreams = true; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT: { - VkPhysicalDeviceConditionalRenderingFeaturesEXT *features = - (VkPhysicalDeviceConditionalRenderingFeaturesEXT*)ext; - features->conditionalRendering = true; - features->inheritedConditionalRendering = false; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT: { - VkPhysicalDeviceExtendedDynamicStateFeaturesEXT *features = - (VkPhysicalDeviceExtendedDynamicStateFeaturesEXT*)ext; - features->extendedDynamicState = true; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES: { - VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures *features = - (VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures *)ext; - features->shaderDemoteToHelperInvocation = true; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT: { - VkPhysicalDevice4444FormatsFeaturesEXT *features = - (VkPhysicalDevice4444FormatsFeaturesEXT*)ext; - features->formatA4R4G4B4 = true; - features->formatA4B4G4R4 = true; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES: { - VkPhysicalDeviceInlineUniformBlockFeatures *features = - (VkPhysicalDeviceInlineUniformBlockFeatures*)ext; - features->inlineUniformBlock = true; - features->descriptorBindingInlineUniformBlockUpdateAfterBind = true; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT: { - VkPhysicalDeviceCustomBorderColorFeaturesEXT *features = - (VkPhysicalDeviceCustomBorderColorFeaturesEXT *)ext; - features->customBorderColors = true; - features->customBorderColorWithoutFormat = true; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COLOR_WRITE_ENABLE_FEATURES_EXT: { - VkPhysicalDeviceColorWriteEnableFeaturesEXT *features = - (VkPhysicalDeviceColorWriteEnableFeaturesEXT *)ext; - features->colorWriteEnable = true; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_2D_VIEW_OF_3D_FEATURES_EXT: { - VkPhysicalDeviceImage2DViewOf3DFeaturesEXT *features = - (VkPhysicalDeviceImage2DViewOf3DFeaturesEXT *)ext; - features->image2DViewOf3D = true; - features->sampler2DViewOf3D = true; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT: { - VkPhysicalDeviceProvokingVertexFeaturesEXT *features = - (VkPhysicalDeviceProvokingVertexFeaturesEXT*)ext; - features->provokingVertexLast = true; - features->transformFeedbackPreservesProvokingVertex = true; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT: { - VkPhysicalDeviceMultiDrawFeaturesEXT *features = (VkPhysicalDeviceMultiDrawFeaturesEXT *)ext; - features->multiDraw = true; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT: { - VkPhysicalDeviceDepthClipEnableFeaturesEXT *features = - (VkPhysicalDeviceDepthClipEnableFeaturesEXT *)ext; - if (pdevice->pscreen->get_param(pdevice->pscreen, PIPE_CAP_DEPTH_CLAMP_ENABLE) != 0) - features->depthClipEnable = true; - else - features->depthClipEnable = false; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT: { - VkPhysicalDeviceExtendedDynamicState2FeaturesEXT *features = (VkPhysicalDeviceExtendedDynamicState2FeaturesEXT *)ext; - features->extendedDynamicState2 = true; - features->extendedDynamicState2LogicOp = true; - features->extendedDynamicState2PatchControlPoints = true; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT: { - VkPhysicalDeviceExtendedDynamicState3FeaturesEXT *features = (VkPhysicalDeviceExtendedDynamicState3FeaturesEXT *)ext; - features->extendedDynamicState3PolygonMode = VK_TRUE; - features->extendedDynamicState3TessellationDomainOrigin = VK_TRUE; - features->extendedDynamicState3DepthClampEnable = VK_TRUE; - features->extendedDynamicState3DepthClipEnable = VK_TRUE; - features->extendedDynamicState3LogicOpEnable = VK_TRUE; - features->extendedDynamicState3SampleMask = VK_TRUE; - features->extendedDynamicState3RasterizationSamples = VK_TRUE; - features->extendedDynamicState3AlphaToCoverageEnable = VK_TRUE; - features->extendedDynamicState3AlphaToOneEnable = VK_TRUE; - features->extendedDynamicState3DepthClipNegativeOneToOne = VK_TRUE; - features->extendedDynamicState3RasterizationStream = VK_FALSE; - features->extendedDynamicState3ConservativeRasterizationMode = VK_FALSE; - features->extendedDynamicState3ExtraPrimitiveOverestimationSize = VK_FALSE; - features->extendedDynamicState3LineRasterizationMode = VK_TRUE; - features->extendedDynamicState3LineStippleEnable = VK_TRUE; - features->extendedDynamicState3ProvokingVertexMode = VK_TRUE; - features->extendedDynamicState3SampleLocationsEnable = VK_FALSE; - features->extendedDynamicState3ColorBlendEnable = VK_TRUE; - features->extendedDynamicState3ColorBlendEquation = VK_TRUE; - features->extendedDynamicState3ColorWriteMask = VK_TRUE; - features->extendedDynamicState3ViewportWScalingEnable = VK_FALSE; - features->extendedDynamicState3ViewportSwizzle = VK_FALSE; - features->extendedDynamicState3ShadingRateImageEnable = VK_FALSE; - features->extendedDynamicState3CoverageToColorEnable = VK_FALSE; - features->extendedDynamicState3CoverageToColorLocation = VK_FALSE; - features->extendedDynamicState3CoverageModulationMode = VK_FALSE; - features->extendedDynamicState3CoverageModulationTableEnable = VK_FALSE; - features->extendedDynamicState3CoverageModulationTable = VK_FALSE; - features->extendedDynamicState3CoverageReductionMode = VK_FALSE; - features->extendedDynamicState3RepresentativeFragmentTestEnable = VK_FALSE; - features->extendedDynamicState3ColorBlendAdvanced = VK_FALSE; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES: { - VkPhysicalDeviceImageRobustnessFeatures *features = (VkPhysicalDeviceImageRobustnessFeatures *)ext; - features->robustImageAccess = true; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT: { - VkPhysicalDeviceRobustness2FeaturesEXT *features = (VkPhysicalDeviceRobustness2FeaturesEXT *)ext; - features->robustBufferAccess2 = true; - features->robustImageAccess2 = true; - features->nullDescriptor = true; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT: { - VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT *features = (VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT *)ext; - features->primitiveTopologyListRestart = true; - features->primitiveTopologyPatchListRestart = true; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TERMINATE_INVOCATION_FEATURES: { - VkPhysicalDeviceShaderTerminateInvocationFeatures *features = (VkPhysicalDeviceShaderTerminateInvocationFeatures *)ext; - features->shaderTerminateInvocation = true; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES: { - VkPhysicalDeviceDynamicRenderingFeatures *features = (VkPhysicalDeviceDynamicRenderingFeatures *)ext; - features->dynamicRendering = VK_TRUE; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GRAPHICS_PIPELINE_LIBRARY_FEATURES_EXT: { - VkPhysicalDeviceGraphicsPipelineLibraryFeaturesEXT *features = (VkPhysicalDeviceGraphicsPipelineLibraryFeaturesEXT *)ext; - features->graphicsPipelineLibrary = VK_TRUE; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT: { - VkPhysicalDeviceShaderAtomicFloatFeaturesEXT *features = (VkPhysicalDeviceShaderAtomicFloatFeaturesEXT *)ext; - features->shaderBufferFloat32Atomics = true; - features->shaderBufferFloat32AtomicAdd = true; - features->shaderBufferFloat64Atomics = false; - features->shaderBufferFloat64AtomicAdd = false; - features->shaderSharedFloat32Atomics = true; - features->shaderSharedFloat32AtomicAdd = true; - features->shaderSharedFloat64Atomics = false; - features->shaderSharedFloat64AtomicAdd = false; - features->shaderImageFloat32Atomics = true; - features->shaderImageFloat32AtomicAdd = true; - features->sparseImageFloat32Atomics = false; - features->sparseImageFloat32AtomicAdd = false; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT: { - VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT *features = (VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT *)ext; - features->shaderBufferFloat16Atomics = false; - features->shaderBufferFloat16AtomicAdd = false; - features->shaderBufferFloat16AtomicMinMax = false; - features->shaderBufferFloat32AtomicMinMax = LLVM_VERSION_MAJOR >= 15; - features->shaderBufferFloat64AtomicMinMax = false; - features->shaderSharedFloat16Atomics = false; - features->shaderSharedFloat16AtomicAdd = false; - features->shaderSharedFloat16AtomicMinMax = false; - features->shaderSharedFloat32AtomicMinMax = LLVM_VERSION_MAJOR >= 15; - features->shaderSharedFloat64AtomicMinMax = false; - features->shaderImageFloat32AtomicMinMax = LLVM_VERSION_MAJOR >= 15; - features->sparseImageFloat32AtomicMinMax = false; - break; - } - default: - break; - } - } -} - void lvp_device_get_cache_uuid(void *uuid) { -- 2.7.4