From e30271227df027b7b8e2d239bd7ec39d5e4146e6 Mon Sep 17 00:00:00 2001 From: Dzmitry Malyshau Date: Fri, 23 Feb 2018 10:18:05 -0500 Subject: [PATCH] [vk] better anisotropy sampling checks --- src/backend/vulkan/src/conv.rs | 14 +++++++------- src/backend/vulkan/src/device.rs | 19 +++++++++++++++---- src/backend/vulkan/src/lib.rs | 12 ++++++++---- 3 files changed, 30 insertions(+), 15 deletions(-) diff --git a/src/backend/vulkan/src/conv.rs b/src/backend/vulkan/src/conv.rs index 29173de3a61..765d7116379 100644 --- a/src/backend/vulkan/src/conv.rs +++ b/src/backend/vulkan/src/conv.rs @@ -393,7 +393,7 @@ pub fn map_image_usage(usage: image::Usage) -> vk::ImageUsageFlags { if usage.contains(Usage::INPUT_ATTACHMENT) { flags |= vk::IMAGE_USAGE_INPUT_ATTACHMENT_BIT; } - + flags } @@ -444,14 +444,14 @@ pub fn map_stage_flags(stages: pso::ShaderStageFlags) -> vk::ShaderStageFlags { } -pub fn map_filter(filter: image::FilterMethod) -> (vk::Filter, vk::Filter, vk::SamplerMipmapMode, f32) { +pub fn map_filter(filter: image::FilterMethod) -> (vk::Filter, vk::Filter, vk::SamplerMipmapMode) { use hal::image::FilterMethod as Fm; match filter { - Fm::Scale => (vk::Filter::Nearest, vk::Filter::Nearest, vk::SamplerMipmapMode::Nearest, 1.0), - Fm::Mipmap => (vk::Filter::Nearest, vk::Filter::Nearest, vk::SamplerMipmapMode::Linear, 1.0), - Fm::Bilinear => (vk::Filter::Linear, vk::Filter::Linear, vk::SamplerMipmapMode::Nearest, 1.0), - Fm::Trilinear => (vk::Filter::Linear, vk::Filter::Linear, vk::SamplerMipmapMode::Linear, 1.0), - Fm::Anisotropic(a) => (vk::Filter::Linear, vk::Filter::Linear, vk::SamplerMipmapMode::Linear, a as f32), + Fm::Scale => (vk::Filter::Nearest, vk::Filter::Nearest, vk::SamplerMipmapMode::Nearest), + Fm::Mipmap => (vk::Filter::Nearest, vk::Filter::Nearest, vk::SamplerMipmapMode::Linear), + Fm::Bilinear => (vk::Filter::Linear, vk::Filter::Linear, vk::SamplerMipmapMode::Nearest), + Fm::Trilinear => (vk::Filter::Linear, vk::Filter::Linear, vk::SamplerMipmapMode::Linear), + Fm::Anisotropic(_) => (vk::Filter::Linear, vk::Filter::Linear, vk::SamplerMipmapMode::Linear), } } diff --git a/src/backend/vulkan/src/device.rs b/src/backend/vulkan/src/device.rs index f807b303b42..3e7d48ac435 100644 --- a/src/backend/vulkan/src/device.rs +++ b/src/backend/vulkan/src/device.rs @@ -4,7 +4,7 @@ use ash::version::DeviceV1_0; use smallvec::SmallVec; use hal::{buffer, device as d, format, image, mapping, pass, pso, query, queue}; -use hal::{Backbuffer, MemoryTypeId, SwapchainConfig}; +use hal::{Backbuffer, Features, MemoryTypeId, SwapchainConfig}; use hal::error::HostExecutionError; use hal::memory::Requirements; use hal::pool::CommandPoolCreateFlags; @@ -768,7 +768,18 @@ impl d::Device for Device { fn create_sampler(&self, sampler_info: image::SamplerInfo) -> n::Sampler { use hal::pso::Comparison; - let (min_filter, mag_filter, mipmap_mode, aniso) = conv::map_filter(sampler_info.filter); + let (min_filter, mag_filter, mipmap_mode) = conv::map_filter(sampler_info.filter); + let (anisotropy_enable, max_anisotropy) = match sampler_info.filter { + image::FilterMethod::Anisotropic(aniso) => { + if self.raw.1.contains(Features::SAMPLER_ANISOTROPY) { + (vk::VK_TRUE, aniso as f32) + } else { + warn!("Anisotropy({}) was requested on a device with disabled anisotropy feature", aniso); + (vk::VK_FALSE, 0.0) + } + } + _ => (vk::VK_FALSE, 0.0) + }; let info = vk::SamplerCreateInfo { s_type: vk::StructureType::SamplerCreateInfo, p_next: ptr::null(), @@ -780,8 +791,8 @@ impl d::Device for Device { address_mode_v: conv::map_wrap(sampler_info.wrap_mode.1), address_mode_w: conv::map_wrap(sampler_info.wrap_mode.2), mip_lod_bias: sampler_info.lod_bias.into(), - anisotropy_enable: if aniso > 1.0 { vk::VK_TRUE } else { vk::VK_FALSE }, - max_anisotropy: aniso, + anisotropy_enable, + max_anisotropy, compare_enable: if sampler_info.comparison.is_some() { vk::VK_TRUE } else { vk::VK_FALSE }, compare_op: conv::map_comparison(sampler_info.comparison.unwrap_or(Comparison::Never)), min_lod: sampler_info.lod_range.start.into(), diff --git a/src/backend/vulkan/src/lib.rs b/src/backend/vulkan/src/lib.rs index 1c41138eb4b..5efcb5ad1ff 100644 --- a/src/backend/vulkan/src/lib.rs +++ b/src/backend/vulkan/src/lib.rs @@ -329,6 +329,9 @@ impl hal::PhysicalDevice for PhysicalDevice { }) .collect::>(); + // enabled features mask + let features = Features::empty(); + // Create device let device_raw = { let cstrings = DEVICE_EXTENSIONS @@ -341,7 +344,8 @@ impl hal::PhysicalDevice for PhysicalDevice { .map(|s| s.as_ptr()) .collect::>(); - let features = unsafe { mem::zeroed() }; + // TODO: derive from `features` + let enabled_features = unsafe { mem::zeroed() }; let info = vk::DeviceCreateInfo { s_type: vk::StructureType::DeviceCreateInfo, p_next: ptr::null(), @@ -352,7 +356,7 @@ impl hal::PhysicalDevice for PhysicalDevice { pp_enabled_layer_names: ptr::null(), enabled_extension_count: str_pointers.len() as u32, pp_enabled_extension_names: str_pointers.as_ptr(), - p_enabled_features: &features, + p_enabled_features: &enabled_features, }; unsafe { @@ -380,7 +384,7 @@ impl hal::PhysicalDevice for PhysicalDevice { }).unwrap(); let device = Device { - raw: Arc::new(RawDevice(device_raw)), + raw: Arc::new(RawDevice(device_raw, features)), }; let device_arc = device.raw.clone(); @@ -572,7 +576,7 @@ impl hal::PhysicalDevice for PhysicalDevice { } #[doc(hidden)] -pub struct RawDevice(pub ash::Device); +pub struct RawDevice(pub ash::Device, Features); impl fmt::Debug for RawDevice { fn fmt(&self, _formatter: &mut fmt::Formatter) -> fmt::Result { unimplemented!()