You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

138 lines
5.4 KiB

use intel_gpu::*;
use gpu::i915;
use uapi::i915::DrmGemHandle;
use std::os::fd::{AsRawFd, OwnedFd, RawFd};
use std::fs::File;
use std::path::Path;
#[test]
fn test_i915_gpu_find_device() {
let device = i915::find_device();
assert!(device.is_some());
let drm_version = device.unwrap().driver;
assert_eq!(drm_version.name.to_str().unwrap(), "i915");
assert_eq!(drm_version.desc.to_str().unwrap(), "Intel Graphics");
}
#[test]
fn test_i915_gpu_from_path() {
let device = i915::find_device().expect("Failed to find i915 device");
let path = device.node.path.clone().expect("Failed to get path");
let device_2 = i915::Device::from_path(path).expect("Failed to create device from path");
assert_eq!(device.driver.name, device_2.driver.name);
assert_eq!(device.driver.desc, device_2.driver.desc);
assert_eq!(device.node.path, device_2.node.path);
}
#[test]
fn test_i915_gpu_from_fd() {
let device = i915::find_device().expect("Failed to find i915 device");
let fd = device.node.fd;
let device_2 = i915::Device::from_fd(OwnedFd::from(fd)).expect("Failed to create device from fd");
assert_eq!(device.driver.name, device_2.driver.name);
assert_eq!(device.driver.desc, device_2.driver.desc);
}
#[test]
fn test_i915_gpu_get_version() {
let device = i915::find_device();
assert!(device.is_some());
let drm_version = device.unwrap().driver;
assert_eq!(drm_version.name.to_str().unwrap(), "i915");
assert_eq!(drm_version.desc.to_str().unwrap(), "Intel Graphics");
let fd_null = File::open("/dev/null").expect("Failed to open /dev/null");
assert!(i915::Device::from_fd(OwnedFd::from(fd_null)).is_none());
}
fn has_engine_class(engines: &Vec<i915::Engine>, engine_class: uapi::i915::EngineClass) -> bool {
engines.iter().filter(|engine| engine.info.engine.engine_class == engine_class).count() > 0
}
#[test]
fn test_i915_gpu_get_engines() {
let device = i915::find_device().expect("Failed to find i915 device");
let drm_version = &device.driver;
assert_eq!(drm_version.name.to_str().unwrap(), "i915");
assert_eq!(drm_version.desc.to_str().unwrap(), "Intel Graphics");
let engines = device.get_engines().expect("Failed to get engines");
assert!(engines.len() > 0);
assert!(has_engine_class(&engines, uapi::i915::EngineClass::Render));
assert!(has_engine_class(&engines, uapi::i915::EngineClass::Copy));
assert!(has_engine_class(&engines, uapi::i915::EngineClass::Video));
assert!(has_engine_class(&engines, uapi::i915::EngineClass::VideoEnhance));
// Compute engine is not always present
// assert!(has_engine_class(&engines, uapi::i915::EngineClass::Compute));
}
fn get_vendor_for_fd(fd: RawFd) -> String{
unsafe {
let mut stat: libc::stat = std::mem::zeroed();
libc::fstat(fd, &mut stat);
let (major, minor) = (libc::major(stat.st_rdev),
libc::minor(stat.st_rdev));
let sysfs_path = format!("/sys/dev/char/{}:{}/device/device", major, minor);
let sysfs_path = Path::new(&sysfs_path);
let dev_id = std::fs::read_to_string(sysfs_path).expect("Unable to read device id");
return dev_id.trim().to_string();
}
}
#[test]
fn test_i915_gpu_get_param() {
let device = i915::find_device().expect("Failed to find i915 device");
let chipset_id = device.get_param(native::I915_PARAM_CHIPSET_ID).expect("Failed to get param");
let chip_id = format!("{:#04x}", chipset_id);
let dev_id = get_vendor_for_fd(device.node.fd.as_raw_fd());
assert_eq!(dev_id, chip_id);
}
#[test]
fn test_i915_gpu_gem_lifecycle() {
let device = i915::find_device().expect("Failed to find i915 device");
let gem = i915::GemHandle::new(&device.node, 4096).expect("Failed to create gem handle");
let tmp = DrmGemHandle { handle: gem.handle.handle };
assert!(gem.is_valid().unwrap());
drop(gem);
assert!(i915::GemHandle::from_handle(&device.node, tmp).is_err());
}
#[test]
fn test_i915_gpu_gem_close() {
let device = i915::find_device().expect("Failed to find i915 device");
let gem = i915::GemHandle::new(&device.node, 4096).expect("Failed to create gem handle");
let tmp_handle = DrmGemHandle { handle: gem.handle.handle };
let tmp = i915::GemHandle::from_handle(&device.node, tmp_handle)
.expect("Failed to create gem handle from handle");
assert!(gem.is_valid().unwrap());
gem.close().expect("Failed to close gem");
assert!(!tmp.is_valid().unwrap());
}
#[test]
fn test_i915_gpu_gem_from_handle() {
let device = i915::find_device().expect("Failed to find i915 device");
let gem = i915::GemHandle::new(&device.node, 4096).expect("Failed to create gem handle");
let tmp = DrmGemHandle { handle: gem.handle.handle };
let gem_2 = i915::GemHandle::from_handle(&device.node, tmp).expect("Failed to create gem handle from handle");
assert_eq!(gem.handle, gem_2.handle);
assert!(gem.is_valid().unwrap());
drop(gem);
assert!(!gem_2.is_valid().unwrap());
}
#[test]
fn test_i915_gpu_gem_has_tiling() {
let device = i915::find_device().expect("Failed to find i915 device");
let gem = i915::GemHandle::new(&device.node, 4096).expect("Failed to create gem handle");
assert!(gem.has_tiling().unwrap());
}
#[test]
fn test_i915_gpu_fences() {
for device in i915::find_all_devices() {
let _num_fences = device.get_param(native::I915_PARAM_NUM_FENCES_AVAIL).expect("Failed to get fences");
// TODO figure out how to skip on DG
//assert!(num_fences > 0);
}
}