Ported from RadeonSI.

Signed-off-by: Samuel Pitoiset <samuel.pitoi...@gmail.com>
---
 src/amd/vulkan/radv_device.c  | 46 +++++++++++++++++++++++++++++++++--
 src/amd/vulkan/radv_private.h |  3 +++
 2 files changed, 47 insertions(+), 2 deletions(-)

diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c
index af7754bea3..e1b8f6223e 100644
--- a/src/amd/vulkan/radv_device.c
+++ b/src/amd/vulkan/radv_device.c
@@ -1435,6 +1435,28 @@ static int radv_get_device_extension_index(const char 
*name)
        return -1;
 }
 
+static int
+radv_get_int_debug_option(const char *name, int default_value)
+{
+       const char *str;
+       int result;
+
+       str = getenv(name);
+       if (!str) {
+               result = default_value;
+       } else {
+               char *endptr;
+
+               result = strtol(str, &endptr, 0);
+               if (str == endptr) {
+                       /* No digits founs. */
+                       result = default_value;
+               }
+       }
+
+       return result;
+}
+
 VkResult radv_CreateDevice(
        VkPhysicalDevice                            physicalDevice,
        const VkDeviceCreateInfo*                   pCreateInfo,
@@ -1630,6 +1652,13 @@ VkResult radv_CreateDevice(
 
        device->mem_cache = radv_pipeline_cache_from_handle(pc);
 
+       device->force_aniso =
+               MIN2(16, radv_get_int_debug_option("RADV_TEX_ANISO", -1));
+       if (device->force_aniso >= 0) {
+               fprintf(stderr, "radv: Forcing anisotropy filter to %ix\n",
+                       1 << util_logbase2(device->force_aniso));
+       }
+
        *pDevice = radv_device_to_handle(device);
        return VK_SUCCESS;
 
@@ -4428,13 +4457,26 @@ radv_tex_filter_mode(VkSamplerReductionModeEXT mode)
        return 0;
 }
 
+static uint32_t
+radv_get_max_anisotropy(struct radv_device *device,
+                       const VkSamplerCreateInfo *pCreateInfo)
+{
+       if (device->force_aniso >= 0)
+               return device->force_aniso;
+
+       if (pCreateInfo->anisotropyEnable &&
+           pCreateInfo->maxAnisotropy > 1.0f)
+               return (uint32_t)pCreateInfo->maxAnisotropy;
+
+       return 0;
+}
+
 static void
 radv_init_sampler(struct radv_device *device,
                  struct radv_sampler *sampler,
                  const VkSamplerCreateInfo *pCreateInfo)
 {
-       uint32_t max_aniso = pCreateInfo->anisotropyEnable && 
pCreateInfo->maxAnisotropy > 1.0 ?
-                                       (uint32_t) pCreateInfo->maxAnisotropy : 
0;
+       uint32_t max_aniso = radv_get_max_anisotropy(device, pCreateInfo);
        uint32_t max_aniso_ratio = radv_tex_aniso_filter(max_aniso);
        bool is_vi = (device->physical_device->rad_info.chip_class >= VI);
        unsigned filter_mode = SQ_IMG_FILTER_MODE_BLEND;
diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h
index 08425473fe..a649835959 100644
--- a/src/amd/vulkan/radv_private.h
+++ b/src/amd/vulkan/radv_private.h
@@ -684,6 +684,9 @@ struct radv_device {
        bool use_global_bo_list;
 
        struct radv_bo_list bo_list;
+
+       /* Whether anisotropy is forced with RADV_TEX_ANISO (-1 is disabled). */
+       int force_aniso;
 };
 
 struct radv_device_memory {
-- 
2.19.0

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to