diff --git a/src/gallium/frontends/lavapipe/lvp_device.c b/src/gallium/frontends/lavapipe/lvp_device.c index b1efbb488bc..d69965b7d6b 100644 --- a/src/gallium/frontends/lavapipe/lvp_device.c +++ b/src/gallium/frontends/lavapipe/lvp_device.c @@ -173,6 +173,8 @@ static const struct vk_device_extension_table lvp_device_extensions_supported = .EXT_sampler_filter_minmax = true, .EXT_scalar_block_layout = true, .EXT_separate_stencil_usage = true, + .EXT_shader_atomic_float = true, + .EXT_shader_atomic_float2 = true, .EXT_shader_demote_to_helper_invocation= true, .EXT_shader_stencil_export = true, .EXT_shader_subgroup_ballot = true, @@ -979,6 +981,38 @@ VKAPI_ATTR void VKAPI_CALL lvp_GetPhysicalDeviceFeatures2( 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; } diff --git a/src/gallium/frontends/lavapipe/lvp_formats.c b/src/gallium/frontends/lavapipe/lvp_formats.c index ed040107377..4a54a898150 100644 --- a/src/gallium/frontends/lavapipe/lvp_formats.c +++ b/src/gallium/frontends/lavapipe/lvp_formats.c @@ -148,7 +148,7 @@ lvp_physical_device_get_format_properties(struct lvp_physical_device *physical_d features |= VK_FORMAT_FEATURE_2_STORAGE_WRITE_WITHOUT_FORMAT_BIT; } - if (pformat == PIPE_FORMAT_R32_UINT || pformat == PIPE_FORMAT_R32_SINT) { + if (pformat == PIPE_FORMAT_R32_UINT || pformat == PIPE_FORMAT_R32_SINT || pformat == PIPE_FORMAT_R32_FLOAT) { features |= VK_FORMAT_FEATURE_2_STORAGE_IMAGE_ATOMIC_BIT; buffer_features |= VK_FORMAT_FEATURE_2_STORAGE_TEXEL_BUFFER_ATOMIC_BIT; } diff --git a/src/gallium/frontends/lavapipe/lvp_pipeline.c b/src/gallium/frontends/lavapipe/lvp_pipeline.c index 5255584c21b..eed64890022 100644 --- a/src/gallium/frontends/lavapipe/lvp_pipeline.c +++ b/src/gallium/frontends/lavapipe/lvp_pipeline.c @@ -374,6 +374,10 @@ lvp_shader_compile_to_ir(struct lvp_pipeline *pipeline, .int64 = (pdevice->pscreen->get_param(pdevice->pscreen, PIPE_CAP_INT64) == 1), .tessellation = true, .float_controls = true, + .float32_atomic_add = true, +#if LLVM_VERSION_MAJOR >= 15 + .float32_atomic_minmax = true, +#endif .image_ms_array = true, .image_read_without_format = true, .image_write_without_format = true,