diff --git a/src/CRE/Vulkan/Sampler.cpp b/src/CRE/Vulkan/Sampler.cpp index e0cb827e..67c36d8c 100644 --- a/src/CRE/Vulkan/Sampler.cpp +++ b/src/CRE/Vulkan/Sampler.cpp @@ -11,7 +11,7 @@ namespace Vulkan { Sampler::Sampler(VkDevice device, VkSamplerCreateFlags flags, VkFilter mag_filter, VkFilter min_filter, VkSamplerMipmapMode mipmap_mode, float_t mip_lod_bias, VkSamplerAddressMode address_mode_u, VkSamplerAddressMode address_mode_v, - VkSamplerAddressMode address_mode_w, float_t min_lod, float_t max_lod, + VkSamplerAddressMode address_mode_w, bool no_mipmap, float_t min_lod, float_t max_lod, float_t max_anisotropy, VkBorderColor border_color) { VkSamplerCreateInfo sampler_create_info = {}; sampler_create_info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO; @@ -28,8 +28,8 @@ namespace Vulkan { sampler_create_info.maxAnisotropy = min_def(max_anisotropy, 16.0f); sampler_create_info.compareEnable = VK_FALSE; sampler_create_info.compareOp = VK_COMPARE_OP_LESS_OR_EQUAL; - sampler_create_info.minLod = min_lod; - sampler_create_info.maxLod = max_lod; + sampler_create_info.minLod = no_mipmap ? clamp_def(min_lod, 0.0f, 0.25f) : min_lod; + sampler_create_info.maxLod = no_mipmap ? clamp_def(max_lod, 0.0f, 0.25f) : max_lod; sampler_create_info.borderColor = border_color; sampler_create_info.unnormalizedCoordinates = VK_FALSE; diff --git a/src/CRE/Vulkan/Sampler.hpp b/src/CRE/Vulkan/Sampler.hpp index ffb231ce..93d39635 100644 --- a/src/CRE/Vulkan/Sampler.hpp +++ b/src/CRE/Vulkan/Sampler.hpp @@ -17,7 +17,7 @@ namespace Vulkan { Sampler(VkDevice device, VkSamplerCreateFlags flags, VkFilter mag_filter, VkFilter min_filter, VkSamplerMipmapMode mipmap_mode, float_t mip_lod_bias, VkSamplerAddressMode address_mode_u, VkSamplerAddressMode address_mode_v, - VkSamplerAddressMode address_mode_w, float_t min_lod, float_t max_lod, + VkSamplerAddressMode address_mode_w, bool no_mipmap, float_t min_lod, float_t max_lod, float_t max_anisotropy, VkBorderColor border_color); ~Sampler(); diff --git a/src/CRE/Vulkan/manager.cpp b/src/CRE/Vulkan/manager.cpp index b6c68192..3676ae62 100644 --- a/src/CRE/Vulkan/manager.cpp +++ b/src/CRE/Vulkan/manager.cpp @@ -633,17 +633,26 @@ namespace Vulkan { return elem->second; VkFilter vk_mag_filter = sampler_data.mag_filter != GL_NEAREST ? VK_FILTER_LINEAR : VK_FILTER_NEAREST; + bool no_mipmap = false; VkFilter vk_min_filter; VkSamplerMipmapMode vk_mipmap_mode; switch (sampler_data.min_filter) { case GL_NEAREST: + no_mipmap = true; + vk_min_filter = VK_FILTER_NEAREST; + vk_mipmap_mode = VK_SAMPLER_MIPMAP_MODE_NEAREST; + break; case GL_NEAREST_MIPMAP_NEAREST: vk_min_filter = VK_FILTER_NEAREST; vk_mipmap_mode = VK_SAMPLER_MIPMAP_MODE_NEAREST; break; case GL_LINEAR: - case GL_LINEAR_MIPMAP_NEAREST: default: + no_mipmap = true; + vk_min_filter = VK_FILTER_LINEAR; + vk_mipmap_mode = VK_SAMPLER_MIPMAP_MODE_NEAREST; + break; + case GL_LINEAR_MIPMAP_NEAREST: vk_min_filter = VK_FILTER_LINEAR; vk_mipmap_mode = VK_SAMPLER_MIPMAP_MODE_NEAREST; break; @@ -657,6 +666,9 @@ namespace Vulkan { break; } + float_t min_lod = max_def(sampler_data.min_lod, 0.0f); + float_t max_lod = max_def(sampler_data.max_lod, min_lod); + VkBorderColor vk_border_color; if (sampler_data.border_color == 0.0f) vk_border_color = VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK; @@ -672,7 +684,7 @@ namespace Vulkan { get_sampler_address_mode(sampler_data.wrap_s), get_sampler_address_mode(sampler_data.wrap_t), get_sampler_address_mode(sampler_data.wrap_r), - sampler_data.min_lod, sampler_data.max_lod, + no_mipmap, min_lod, max_lod, sampler_data.max_anisotropy, vk_border_color)); samplers.insert({ sampler_hash, sampler }); return sampler;