3030#include " RenderDeviceVkImpl.hpp"
3131#include " VulkanTypeConversions.hpp"
3232#include " GraphicsAccessories.hpp"
33+ #include " BasicMath.hpp"
3334
3435namespace Diligent
3536{
@@ -45,34 +46,30 @@ SamplerVkImpl::SamplerVkImpl(IReferenceCounters* pRefCounters, RenderDeviceVkImp
4546// clang-format on
4647{
4748 const auto & LogicalDevice = pRenderDeviceVk->GetLogicalDevice ();
49+ const auto & Limits = pRenderDeviceVk->GetPhysicalDevice ().GetProperties ().limits ;
4850
4951 VkSamplerCreateInfo SamplerCI{};
50- SamplerCI.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
51- SamplerCI.pNext = nullptr ;
52- SamplerCI.flags = 0 ; // reserved for future use
53- SamplerCI.magFilter = FilterTypeToVkFilter (m_Desc.MagFilter );
54- SamplerCI.minFilter = FilterTypeToVkFilter (m_Desc.MinFilter );
55- SamplerCI.mipmapMode = FilterTypeToVkMipmapMode (m_Desc.MipFilter );
56- SamplerCI.addressModeU = AddressModeToVkAddressMode (m_Desc.AddressU );
57- SamplerCI.addressModeV = AddressModeToVkAddressMode (m_Desc.AddressV );
58- SamplerCI.addressModeW = AddressModeToVkAddressMode (m_Desc.AddressW );
59- SamplerCI.mipLodBias = m_Desc.MipLODBias ;
52+ SamplerCI.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
53+ SamplerCI.pNext = nullptr ;
54+ SamplerCI.flags = 0 ; // reserved for future use
55+ SamplerCI.magFilter = FilterTypeToVkFilter (m_Desc.MagFilter );
56+ SamplerCI.minFilter = FilterTypeToVkFilter (m_Desc.MinFilter );
57+ SamplerCI.mipmapMode = FilterTypeToVkMipmapMode (m_Desc.MipFilter );
58+ SamplerCI.addressModeU = AddressModeToVkAddressMode (m_Desc.AddressU );
59+ SamplerCI.addressModeV = AddressModeToVkAddressMode (m_Desc.AddressV );
60+ SamplerCI.addressModeW = AddressModeToVkAddressMode (m_Desc.AddressW );
61+ SamplerCI.mipLodBias = m_Desc.MipLODBias ;
62+
6063 SamplerCI.anisotropyEnable = IsAnisotropicFilter (m_Desc.MinFilter );
61- #ifdef DILIGENT_DEVELOPMENT
62- if ((SamplerCI.anisotropyEnable != VK_FALSE) != IsAnisotropicFilter (m_Desc.MagFilter ))
63- {
64- LOG_ERROR (" Min and mag filters must both be either anisotropic filters or non-anisotropic ones" );
65- }
66- #endif
64+ DEV_CHECK_ERR (!SamplerCI.anisotropyEnable || (m_Desc.MaxAnisotropy >= 1 && static_cast <float >(m_Desc.MaxAnisotropy ) <= Limits.maxSamplerAnisotropy ),
65+ " MaxAnisotropy (" , m_Desc.MaxAnisotropy , " ) must be in range 1 .. " , Limits.maxSamplerAnisotropy , " ." );
66+ SamplerCI.maxAnisotropy = SamplerCI.anisotropyEnable ? clamp (static_cast <float >(m_Desc.MaxAnisotropy ), 1 .f , Limits.maxSamplerAnisotropy ) : 0 .f ;
67+ DEV_CHECK_ERR ((SamplerCI.anisotropyEnable != VK_FALSE) == IsAnisotropicFilter (m_Desc.MagFilter ),
68+ " Min and mag filters must both be either anisotropic filters or non-anisotropic ones" );
6769
68- SamplerCI.maxAnisotropy = static_cast <float >(m_Desc.MaxAnisotropy );
6970 SamplerCI.compareEnable = IsComparisonFilter (m_Desc.MinFilter );
70- #ifdef DILIGENT_DEVELOPMENT
71- if ((SamplerCI.compareEnable != VK_FALSE) != IsComparisonFilter (m_Desc.MagFilter ))
72- {
73- LOG_ERROR (" Min and mag filters must both be either comparison filters or non-comparison ones" );
74- }
75- #endif
71+ DEV_CHECK_ERR ((SamplerCI.compareEnable != VK_FALSE) == IsComparisonFilter (m_Desc.MagFilter ),
72+ " Min and mag filters must both be either comparison filters or non-comparison ones" );
7673
7774 SamplerCI.compareOp = ComparisonFuncToVkCompareOp (m_Desc.ComparisonFunc );
7875 SamplerCI.minLod = m_Desc.MinLOD ;
0 commit comments