radv: add a LLVM version string workaround for SotTR and ACO
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>
Mon, 11 May 2020 07:54:11 +0000 (09:54 +0200)
committerMarge Bot <eric+marge@anholt.net>
Wed, 13 May 2020 07:57:18 +0000 (07:57 +0000)
When the LLVM version is too old or missing, SotTR applies shader
workarounds and that reduces performance by 2-5% with ACO.

SotTR workarounds are applied with LLVM 8 and older, so reporting
LLVM 9.0.1 should be fine.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Edmondo Tommasina <edmondo.tommasina@gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4984>

src/amd/vulkan/radv_device.c
src/util/00-mesa-defaults.conf
src/util/xmlpool/t_options.h

index 10d9b34e14b84c07734c8747921bc491d568d2b5..fc102e23cedcadde9255af3b01a06beb6181071d 100644 (file)
@@ -238,6 +238,25 @@ radv_physical_device_init_mem_types(struct radv_physical_device *device)
        }
 }
 
        }
 }
 
+static const char *
+radv_get_compiler_string(struct radv_physical_device *pdevice)
+{
+       if (pdevice->use_aco) {
+               /* Some games like SotTR apply shader workarounds if the LLVM
+                * version is too old or if the LLVM version string is
+                * missing. This gives 2-5% performance with SotTR and ACO.
+                */
+               if (driQueryOptionb(&pdevice->instance->dri_options,
+                                   "radv_report_llvm9_version_string")) {
+                       return "ACO/LLVM 9.0.1";
+               }
+
+               return "ACO";
+       }
+
+       return "LLVM " MESA_LLVM_VERSION_STRING;
+}
+
 static VkResult
 radv_physical_device_try_create(struct radv_instance *instance,
                                drmDevicePtr drm_device,
 static VkResult
 radv_physical_device_try_create(struct radv_instance *instance,
                                drmDevicePtr drm_device,
@@ -334,8 +353,7 @@ radv_physical_device_try_create(struct radv_instance *instance,
 
        snprintf(device->name, sizeof(device->name),
                 "AMD RADV %s (%s)",
 
        snprintf(device->name, sizeof(device->name),
                 "AMD RADV %s (%s)",
-                device->rad_info.name,
-                device->use_aco ? "ACO" : "LLVM " MESA_LLVM_VERSION_STRING);
+                device->rad_info.name, radv_get_compiler_string(device));
 
        if (radv_device_get_cache_uuid(device->rad_info.family, device->cache_uuid)) {
                result = vk_errorf(instance, VK_ERROR_INITIALIZATION_FAILED,
 
        if (radv_device_get_cache_uuid(device->rad_info.family, device->cache_uuid)) {
                result = vk_errorf(instance, VK_ERROR_INITIALIZATION_FAILED,
@@ -578,6 +596,7 @@ DRI_CONF_BEGIN
                DRI_CONF_ADAPTIVE_SYNC("true")
                DRI_CONF_VK_X11_OVERRIDE_MIN_IMAGE_COUNT(0)
                DRI_CONF_VK_X11_STRICT_IMAGE_COUNT("false")
                DRI_CONF_ADAPTIVE_SYNC("true")
                DRI_CONF_VK_X11_OVERRIDE_MIN_IMAGE_COUNT(0)
                DRI_CONF_VK_X11_STRICT_IMAGE_COUNT("false")
+               DRI_CONF_RADV_REPORT_LLVM9_VERSION_STRING("false")
        DRI_CONF_SECTION_END
 
        DRI_CONF_SECTION_DEBUG
        DRI_CONF_SECTION_END
 
        DRI_CONF_SECTION_DEBUG
@@ -1492,7 +1511,7 @@ radv_get_physical_device_properties_1_2(struct radv_physical_device *pdevice,
        snprintf(p->driverName, VK_MAX_DRIVER_NAME_SIZE, "radv");
        snprintf(p->driverInfo, VK_MAX_DRIVER_INFO_SIZE,
                 "Mesa " PACKAGE_VERSION MESA_GIT_SHA1 " (%s)",
        snprintf(p->driverName, VK_MAX_DRIVER_NAME_SIZE, "radv");
        snprintf(p->driverInfo, VK_MAX_DRIVER_INFO_SIZE,
                 "Mesa " PACKAGE_VERSION MESA_GIT_SHA1 " (%s)",
-                pdevice->use_aco ? "ACO" : "LLVM " MESA_LLVM_VERSION_STRING);
+                radv_get_compiler_string(pdevice));
        p->conformanceVersion = (VkConformanceVersion) {
                .major = 1,
                .minor = 2,
        p->conformanceVersion = (VkConformanceVersion) {
                .major = 1,
                .minor = 2,
index 849b6b169decd33b5d8f8d4eff13f768fb6bf8c8..fc9fa9e2a3531e3a306a04a543f33221eac0b240 100644 (file)
@@ -673,4 +673,9 @@ TODO: document the other workarounds.
             <option name="vs_position_always_invariant" value="true" />
         </application>
     </device>
             <option name="vs_position_always_invariant" value="true" />
         </application>
     </device>
+    <device driver="radv">
+        <application name="Shadow Of The Tomb Raider" executable="ShadowOfTheTombRaider">
+            <option name="radv_report_llvm9_version_string" value="true" />
+        </application>
+    </device>
 </driconf>
 </driconf>
index 0dbac8e0479fcc362baf6501ea0e4da99cd8ea9a..0321becc49b557a561f2c7ac644f699bccfbad50 100644 (file)
@@ -421,3 +421,12 @@ DRI_CONF_OPT_END
 DRI_CONF_OPT_BEGIN_V(gles_samples_passed_value, def, minimum, maximum) \
         DRI_CONF_DESC(en,gettext("GL_SAMPLES_PASSED value when emulated by GL_ANY_SAMPLES_PASSED")) \
 DRI_CONF_OPT_END
 DRI_CONF_OPT_BEGIN_V(gles_samples_passed_value, def, minimum, maximum) \
         DRI_CONF_DESC(en,gettext("GL_SAMPLES_PASSED value when emulated by GL_ANY_SAMPLES_PASSED")) \
 DRI_CONF_OPT_END
+
+/**
+ * \brief RADV specific configuration options
+ */
+
+#define DRI_CONF_RADV_REPORT_LLVM9_VERSION_STRING(def) \
+DRI_CONF_OPT_BEGIN_B(radv_report_llvm9_version_string, def) \
+        DRI_CONF_DESC(en,gettext("Report LLVM 9.0.1 for games that apply shader workarounds if missing (for ACO only)")) \
+DRI_CONF_OPT_END