152{
153 auto device =
m_backend->get_context().get_device();
154 auto physical_device =
m_backend->get_context().get_physical_device();
155
156 vk::SamplerCreateInfo sampler_info {};
157 sampler_info.magFilter =
to_vk_filter(config.mag_filter);
158 sampler_info.minFilter =
to_vk_filter(config.min_filter);
159
163
164 if (config.max_anisotropy > 1.0F) {
165 auto properties = physical_device.getProperties();
166 sampler_info.anisotropyEnable = VK_TRUE;
167 sampler_info.maxAnisotropy = std::min(
168 config.max_anisotropy,
169 properties.limits.maxSamplerAnisotropy);
170 } else {
171 sampler_info.anisotropyEnable = VK_FALSE;
172 sampler_info.maxAnisotropy = 1.0F;
173 }
174
175 sampler_info.borderColor = vk::BorderColor::eIntOpaqueBlack;
176
177 sampler_info.unnormalizedCoordinates = VK_FALSE;
178
179 sampler_info.compareEnable = VK_FALSE;
180 sampler_info.compareOp = vk::CompareOp::eAlways;
181
182 if (config.enable_mipmaps) {
184 ? vk::SamplerMipmapMode::eLinear
185 : vk::SamplerMipmapMode::eNearest;
186 sampler_info.minLod = 0.0F;
187 sampler_info.maxLod = VK_LOD_CLAMP_NONE;
188 sampler_info.mipLodBias = 0.0F;
189 } else {
190 sampler_info.mipmapMode = vk::SamplerMipmapMode::eNearest;
191 sampler_info.minLod = 0.0F;
192 sampler_info.maxLod = 0.0F;
193 sampler_info.mipLodBias = 0.0F;
194 }
195
196 try {
197 vk::Sampler sampler = device.createSampler(sampler_info);
199 "Created sampler: mag={}, min={}, aniso={}",
200 vk::to_string(sampler_info.magFilter),
201 vk::to_string(sampler_info.minFilter),
202 sampler_info.maxAnisotropy);
203 return sampler;
204 } catch (const vk::SystemError& e) {
206 "Failed to create sampler: {}", e.what());
207 return nullptr;
208 }
209}
#define MF_ERROR(comp, ctx,...)
#define MF_DEBUG(comp, ctx,...)
static vk::Filter to_vk_filter(FilterMode mode)
static vk::SamplerAddressMode to_vk_address_mode(AddressMode mode)
std::shared_ptr< Core::VulkanBackend > m_backend
@ ImageProcessing
Image processing tasks (filters, transformations)
@ Portal
High-level user-facing API layer.
@ LINEAR
Bilinear filtering (smooth)