Module: Mesa
Branch: staging/20.0
Commit: 86e586862f2c9f9756cc60b5812a3d1d6c39290c
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=86e586862f2c9f9756cc60b5812a3d1d6c39290c

Author: Joshua Ashton <[email protected]>
Date:   Tue Feb 25 19:24:15 2020 +0000

radv: Use TRUNC_COORD on samplers

The default behaviour (0) is: "round-nearest-even to n.6 and drop fraction when 
point sampling" whereas the Vulkan spec simply wants us to floor it (1) 
"truncate when point sampling".

See 15.6.1 in the Vulkan spec.
https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#textures-normalized-operations

The Direct3D spec also mandates this 
(https://microsoft.github.io/DirectX-Specs/d3d/archive/D3D11_3_FunctionalSpec.htm#7.18.7%20Point%20Sample%20Addressing)

This fixes some point-sampling texture precision issues in some Direct3D 9 
titles such as Guild Wars 2 and htoL#NiQ: The Firefly Diary that are not 
present on other vendors.

Fixes dEQP-VK.pipeline.sampler.exact_sampling.*

https://github.com/Joshua-Ashton/d9vk/issues/450
https://github.com/doitsujin/dxvk/issues/1433

CC: <[email protected]>

Reviewed-by: Samuel Pitoiset <[email protected]>
Reviewed-by: Bas Nieuwenhuizen <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/3951>
(cherry picked from commit 58f25098a0dc4f4976dadacdc4e7a9db42ec0c50)

---

 .pick_status.json            | 2 +-
 src/amd/vulkan/radv_device.c | 4 +++-
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/.pick_status.json b/.pick_status.json
index 132f6a8d1e2..f9d245786df 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -139,7 +139,7 @@
         "description": "radv: Use TRUNC_COORD on samplers",
         "nominated": true,
         "nomination_type": 0,
-        "resolution": 0,
+        "resolution": 1,
         "master_sha": null,
         "because_sha": null
     },
diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c
index 60f5f06c43b..c4ed1505c60 100644
--- a/src/amd/vulkan/radv_device.c
+++ b/src/amd/vulkan/radv_device.c
@@ -6892,6 +6892,7 @@ radv_init_sampler(struct radv_device *device,
                           device->physical_device->rad_info.chip_class == GFX9;
        unsigned filter_mode = V_008F30_SQ_IMG_FILTER_MODE_BLEND;
        unsigned depth_compare_func = V_008F30_SQ_TEX_DEPTH_COMPARE_NEVER;
+       bool trunc_coord = pCreateInfo->minFilter == VK_FILTER_NEAREST && 
pCreateInfo->magFilter == VK_FILTER_NEAREST;
 
        const struct VkSamplerReductionModeCreateInfo *sampler_reduction =
                vk_find_struct_const(pCreateInfo->pNext,
@@ -6912,7 +6913,8 @@ radv_init_sampler(struct radv_device *device,
                             S_008F30_ANISO_BIAS(max_aniso_ratio) |
                             S_008F30_DISABLE_CUBE_WRAP(0) |
                             S_008F30_COMPAT_MODE(compat_mode) |
-                            S_008F30_FILTER_MODE(filter_mode));
+                            S_008F30_FILTER_MODE(filter_mode) |
+                            S_008F30_TRUNC_COORD(trunc_coord));
        sampler->state[1] = 
(S_008F34_MIN_LOD(S_FIXED(CLAMP(pCreateInfo->minLod, 0, 15), 8)) |
                             
S_008F34_MAX_LOD(S_FIXED(CLAMP(pCreateInfo->maxLod, 0, 15), 8)) |
                             S_008F34_PERF_MIP(max_aniso_ratio ? 
max_aniso_ratio + 6 : 0));

_______________________________________________
mesa-commit mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to