summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2019-12-13 02:38:34 -0300
committerGravatar ReinUsesLisp2019-12-13 03:12:28 -0300
commit15513f08011b92e5cfe12107e197547978e49c93 (patch)
treea4ed110ffbf6a70e97b8cdbf91395b42731ac235 /src
parentmaxwell_to_vk: Use VK_EXT_index_type_uint8 when available (diff)
downloadyuzu-15513f08011b92e5cfe12107e197547978e49c93.tar.gz
yuzu-15513f08011b92e5cfe12107e197547978e49c93.tar.xz
yuzu-15513f08011b92e5cfe12107e197547978e49c93.zip
maxwell_to_vk: Approach GL_CLAMP closer to the GL spec
The OpenGL spec defines GL_CLAMP's formula similarly to CLAMP_TO_EDGE and CLAMP_TO_BORDER depending on the filter mode used. It doesn't exactly behave like this, but it's the closest we can get with what Vulkan offers without emulating it by injecting shader code.
Diffstat (limited to 'src')
-rw-r--r--src/video_core/renderer_vulkan/maxwell_to_vk.cpp16
-rw-r--r--src/video_core/renderer_vulkan/maxwell_to_vk.h3
-rw-r--r--src/video_core/renderer_vulkan/vk_sampler_cache.cpp7
3 files changed, 17 insertions, 9 deletions
diff --git a/src/video_core/renderer_vulkan/maxwell_to_vk.cpp b/src/video_core/renderer_vulkan/maxwell_to_vk.cpp
index 5263dd768..a1dc8dfd8 100644
--- a/src/video_core/renderer_vulkan/maxwell_to_vk.cpp
+++ b/src/video_core/renderer_vulkan/maxwell_to_vk.cpp
@@ -44,7 +44,8 @@ vk::SamplerMipmapMode MipmapMode(Tegra::Texture::TextureMipmapFilter mipmap_filt
44 return {}; 44 return {};
45} 45}
46 46
47vk::SamplerAddressMode WrapMode(Tegra::Texture::WrapMode wrap_mode) { 47vk::SamplerAddressMode WrapMode(Tegra::Texture::WrapMode wrap_mode,
48 Tegra::Texture::TextureFilter filter) {
48 switch (wrap_mode) { 49 switch (wrap_mode) {
49 case Tegra::Texture::WrapMode::Wrap: 50 case Tegra::Texture::WrapMode::Wrap:
50 return vk::SamplerAddressMode::eRepeat; 51 return vk::SamplerAddressMode::eRepeat;
@@ -55,10 +56,15 @@ vk::SamplerAddressMode WrapMode(Tegra::Texture::WrapMode wrap_mode) {
55 case Tegra::Texture::WrapMode::Border: 56 case Tegra::Texture::WrapMode::Border:
56 return vk::SamplerAddressMode::eClampToBorder; 57 return vk::SamplerAddressMode::eClampToBorder;
57 case Tegra::Texture::WrapMode::Clamp: 58 case Tegra::Texture::WrapMode::Clamp:
58 // TODO(Rodrigo): GL_CLAMP was removed as of OpenGL 3.1, to implement GL_CLAMP, we can use 59 // TODO(Rodrigo): Emulate GL_CLAMP properly
59 // eClampToBorder to get the border color of the texture, and then sample the edge to 60 switch (filter) {
60 // manually mix them. However the shader part of this is not yet implemented. 61 case Tegra::Texture::TextureFilter::Nearest:
61 return vk::SamplerAddressMode::eClampToBorder; 62 return vk::SamplerAddressMode::eClampToEdge;
63 case Tegra::Texture::TextureFilter::Linear:
64 return vk::SamplerAddressMode::eClampToBorder;
65 }
66 UNREACHABLE();
67 return vk::SamplerAddressMode::eClampToEdge;
62 case Tegra::Texture::WrapMode::MirrorOnceClampToEdge: 68 case Tegra::Texture::WrapMode::MirrorOnceClampToEdge:
63 return vk::SamplerAddressMode::eMirrorClampToEdge; 69 return vk::SamplerAddressMode::eMirrorClampToEdge;
64 case Tegra::Texture::WrapMode::MirrorOnceBorder: 70 case Tegra::Texture::WrapMode::MirrorOnceBorder:
diff --git a/src/video_core/renderer_vulkan/maxwell_to_vk.h b/src/video_core/renderer_vulkan/maxwell_to_vk.h
index 7dafdacf8..dd9de1d24 100644
--- a/src/video_core/renderer_vulkan/maxwell_to_vk.h
+++ b/src/video_core/renderer_vulkan/maxwell_to_vk.h
@@ -23,7 +23,8 @@ vk::Filter Filter(Tegra::Texture::TextureFilter filter);
23 23
24vk::SamplerMipmapMode MipmapMode(Tegra::Texture::TextureMipmapFilter mipmap_filter); 24vk::SamplerMipmapMode MipmapMode(Tegra::Texture::TextureMipmapFilter mipmap_filter);
25 25
26vk::SamplerAddressMode WrapMode(Tegra::Texture::WrapMode wrap_mode); 26vk::SamplerAddressMode WrapMode(Tegra::Texture::WrapMode wrap_mode,
27 Tegra::Texture::TextureFilter filter);
27 28
28vk::CompareOp DepthCompareFunction(Tegra::Texture::DepthCompareFunc depth_compare_func); 29vk::CompareOp DepthCompareFunction(Tegra::Texture::DepthCompareFunc depth_compare_func);
29 30
diff --git a/src/video_core/renderer_vulkan/vk_sampler_cache.cpp b/src/video_core/renderer_vulkan/vk_sampler_cache.cpp
index 801826d3d..1ce583f75 100644
--- a/src/video_core/renderer_vulkan/vk_sampler_cache.cpp
+++ b/src/video_core/renderer_vulkan/vk_sampler_cache.cpp
@@ -46,9 +46,10 @@ UniqueSampler VKSamplerCache::CreateSampler(const Tegra::Texture::TSCEntry& tsc)
46 {}, MaxwellToVK::Sampler::Filter(tsc.mag_filter), 46 {}, MaxwellToVK::Sampler::Filter(tsc.mag_filter),
47 MaxwellToVK::Sampler::Filter(tsc.min_filter), 47 MaxwellToVK::Sampler::Filter(tsc.min_filter),
48 MaxwellToVK::Sampler::MipmapMode(tsc.mipmap_filter), 48 MaxwellToVK::Sampler::MipmapMode(tsc.mipmap_filter),
49 MaxwellToVK::Sampler::WrapMode(tsc.wrap_u), MaxwellToVK::Sampler::WrapMode(tsc.wrap_v), 49 MaxwellToVK::Sampler::WrapMode(tsc.wrap_u, tsc.mag_filter),
50 MaxwellToVK::Sampler::WrapMode(tsc.wrap_p), tsc.GetLodBias(), has_anisotropy, 50 MaxwellToVK::Sampler::WrapMode(tsc.wrap_v, tsc.mag_filter),
51 max_anisotropy, tsc.depth_compare_enabled, 51 MaxwellToVK::Sampler::WrapMode(tsc.wrap_p, tsc.mag_filter), tsc.GetLodBias(),
52 has_anisotropy, max_anisotropy, tsc.depth_compare_enabled,
52 MaxwellToVK::Sampler::DepthCompareFunction(tsc.depth_compare_func), tsc.GetMinLod(), 53 MaxwellToVK::Sampler::DepthCompareFunction(tsc.depth_compare_func), tsc.GetMinLod(),
53 tsc.GetMaxLod(), vk_border_color.value_or(vk::BorderColor::eFloatTransparentBlack), 54 tsc.GetMaxLod(), vk_border_color.value_or(vk::BorderColor::eFloatTransparentBlack),
54 unnormalized_coords); 55 unnormalized_coords);