Skip to content

Commit

Permalink
Use VK_EXT_robustness2 only when not using an outdated intel iGPU d…
Browse files Browse the repository at this point in the history
…river (#4602)
  • Loading branch information
TheoDulka authored Dec 7, 2023
1 parent 0cbabcf commit cf8e11e
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 0 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,10 @@ Passing an owned value `window` to `Surface` will return a `Surface<'static>`. S

### Bug Fixes

#### Vulkan

- Use `VK_EXT_robustness2` only when not using an outdated intel iGPU driver. By @TheoDulka in [#4602](https://github.com/gfx-rs/wgpu/pull/4602).

#### WebGPU

- Allow calling `BufferSlice::get_mapped_range` multiple times on the same buffer slice (instead of throwing a Javascript exception): By @DouglasDwyer in [#4726](https://github.com/gfx-rs/wgpu/pull/4726)
Expand Down
37 changes: 37 additions & 0 deletions wgpu-hal/src/vulkan/adapter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -943,6 +943,17 @@ impl super::InstanceShared {
unsafe {
get_device_properties.get_physical_device_properties2(phd, &mut properties2);
}

if is_intel_igpu_outdated_for_robustness2(
capabilities.properties,
capabilities.driver,
) {
use crate::auxil::cstr_from_bytes_until_nul;
capabilities.supported_extensions.retain(|&x| {
cstr_from_bytes_until_nul(&x.extension_name)
!= Some(vk::ExtRobustness2Fn::name())
});
}
};
capabilities
};
Expand Down Expand Up @@ -1953,3 +1964,29 @@ fn supports_bgra8unorm_storage(
&& features3.contains(vk::FormatFeatureFlags2::STORAGE_WRITE_WITHOUT_FORMAT)
}
}

// For https://github.com/gfx-rs/wgpu/issues/4599
// Intel iGPUs with outdated drivers can break rendering if `VK_EXT_robustness2` is used.
// Driver version 31.0.101.2115 works, but there's probably an earlier functional version.
fn is_intel_igpu_outdated_for_robustness2(
props: vk::PhysicalDeviceProperties,
driver: Option<vk::PhysicalDeviceDriverPropertiesKHR>,
) -> bool {
const DRIVER_VERSION_WORKING: u32 = (101 << 14) | 2115; // X.X.101.2115

let is_outdated = props.vendor_id == crate::auxil::db::intel::VENDOR
&& props.device_type == vk::PhysicalDeviceType::INTEGRATED_GPU
&& props.driver_version < DRIVER_VERSION_WORKING
&& driver
.map(|driver| driver.driver_id == vk::DriverId::INTEL_PROPRIETARY_WINDOWS)
.unwrap_or_default();

if is_outdated {
log::warn!(
"Disabling robustBufferAccess2 and robustImageAccess2: IntegratedGpu Intel Driver is outdated. Found with version 0x{:X}, less than the known good version 0x{:X} (31.0.101.2115)",
props.driver_version,
DRIVER_VERSION_WORKING
);
}
is_outdated
}

0 comments on commit cf8e11e

Please sign in to comment.