diff --git a/src/panfrost/vulkan/panvk_instance.c b/src/panfrost/vulkan/panvk_instance.c index bd86964bb20..31abc8f4369 100644 --- a/src/panfrost/vulkan/panvk_instance.c +++ b/src/panfrost/vulkan/panvk_instance.c @@ -168,6 +168,7 @@ static const driOptionDescription panvk_dri_options[] = { DRI_CONF_PAN_COMPUTE_CORE_MASK(~0ull) DRI_CONF_PAN_FRAGMENT_CORE_MASK(~0ull) DRI_CONF_PAN_ENABLE_VERTEX_PIPELINE_STORES_ATOMICS(false) + DRI_CONF_PAN_FORCE_ENABLE_SHADER_ATOMICS(false) DRI_CONF_SECTION_END }; @@ -184,6 +185,8 @@ panvk_init_dri_options(struct panvk_instance *instance) instance->enable_vertex_pipeline_stores_atomics = driQueryOptionb( &instance->dri_options, "pan_enable_vertex_pipeline_stores_atomics"); + instance->force_enable_shader_atomics = driQueryOptionb( + &instance->dri_options, "pan_force_enable_shader_atomics"); } VKAPI_ATTR VkResult VKAPI_CALL diff --git a/src/panfrost/vulkan/panvk_instance.h b/src/panfrost/vulkan/panvk_instance.h index 42f4144ecc6..3ab77a5543b 100644 --- a/src/panfrost/vulkan/panvk_instance.h +++ b/src/panfrost/vulkan/panvk_instance.h @@ -49,6 +49,7 @@ struct panvk_instance { uint32_t force_vk_vendor; bool enable_vertex_pipeline_stores_atomics; + bool force_enable_shader_atomics; struct { struct pan_kmod_allocator allocator; diff --git a/src/panfrost/vulkan/panvk_vX_physical_device.c b/src/panfrost/vulkan/panvk_vX_physical_device.c index 817cc913242..d2b45c99521 100644 --- a/src/panfrost/vulkan/panvk_vX_physical_device.c +++ b/src/panfrost/vulkan/panvk_vX_physical_device.c @@ -241,7 +241,8 @@ panvk_per_arch(get_physical_device_features)( .textureCompressionETC2 = has_texture_compression_etc2(device), .textureCompressionASTC_LDR = has_texture_compression_astc_ldr(device), .textureCompressionBC = has_texture_compression_bc(device), - .fragmentStoresAndAtomics = PAN_ARCH >= 10, + .fragmentStoresAndAtomics = (PAN_ARCH >= 10) || + instance->force_enable_shader_atomics, .shaderImageGatherExtended = true, .shaderStorageImageExtendedFormats = true, .shaderStorageImageReadWithoutFormat = true, @@ -257,7 +258,8 @@ panvk_per_arch(get_physical_device_features)( /* On v13+, the hardware isn't speculatively referencing to invalid indices anymore. */ .vertexPipelineStoresAndAtomics = - PAN_ARCH >= 13 && instance->enable_vertex_pipeline_stores_atomics, + (PAN_ARCH >= 13 && instance->enable_vertex_pipeline_stores_atomics) || + instance->force_enable_shader_atomics, /* Vulkan 1.1 */ .storageBuffer16BitAccess = true, diff --git a/src/util/driconf.h b/src/util/driconf.h index 8b36db732b3..fe8f1ee2aab 100644 --- a/src/util/driconf.h +++ b/src/util/driconf.h @@ -611,6 +611,10 @@ DRI_CONF_OPT_B(pan_enable_vertex_pipeline_stores_atomics, def, \ "Enable vertexPipelineStoresAndAtomics on v13+ (This cannot work on older generation because of speculative behaviors around vertices)") +#define DRI_CONF_PAN_FORCE_ENABLE_SHADER_ATOMICS(def) \ + DRI_CONF_OPT_B(pan_force_enable_shader_atomics, def, \ + "Enable fragmentStoresAndAtomics and vertexPipelineStoresAndAtomics on any architecture. (This may not work reliably and is for debug purposes only!)") + /** * \brief Turnip specific configuration options */