use crate::objects::enums::{ParamValue, Size};
use crate::objects::functions::status_update;
use crate::objects::structs::{SamplerInfo, StatusCode};
use crate::objects::types::{APIResult, ContextPtr, LongProperties, SamplerPtr};
use crate::{gen_param_value, size_getter};
use libc::c_void;
use opencl_heads::ffi;
use opencl_heads::ffi::clGetSamplerInfo;
use opencl_heads::types::*;
use std::ptr;
pub fn create_sampler(
context: &ContextPtr,
normalized_coords: cl_bool,
addressing_mode: cl_addressing_mode,
filter_mode: cl_filter_mode,
) -> APIResult<SamplerPtr> {
let fn_name = "clCreateSampler";
let mut status_code = StatusCode::INVALID_VALUE;
let sampler_ptr = unsafe {
ffi::clCreateSampler(
context.unwrap(),
normalized_coords,
addressing_mode,
filter_mode,
&mut status_code,
)
};
status_update(
status_code,
fn_name,
SamplerPtr::from_ptr(sampler_ptr, fn_name)?,
)
}
pub fn create_sampler_with_properties(
context: &ContextPtr,
sampler_properties: &LongProperties,
) -> APIResult<SamplerPtr> {
let fn_name = "clCreateSamplerWithProperties";
let mut status_code = StatusCode::INVALID_VALUE;
let sampler_properties = match sampler_properties {
Some(x) => x.as_ptr(),
None => ptr::null(),
};
let sampler_ptr = unsafe {
ffi::clCreateSamplerWithProperties(context.unwrap(), sampler_properties, &mut status_code)
};
status_update(
status_code,
fn_name,
SamplerPtr::from_ptr(sampler_ptr, fn_name)?,
)
}
pub fn retain_sampler(sampler: &SamplerPtr) -> APIResult<()> {
let fn_name = "clRetainSampler";
let status_code = unsafe { ffi::clRetainSampler(sampler.unwrap()) };
status_update(status_code, fn_name, ())
}
pub fn release_sampler(sampler: &SamplerPtr) -> APIResult<()> {
let fn_name = "clReleaseSampler";
let status_code = unsafe { ffi::clReleaseSampler(sampler.unwrap()) };
status_update(status_code, fn_name, ())
}
pub fn get_sampler_info(
sampler: &SamplerPtr,
param_name: cl_sampler_info,
) -> APIResult<ParamValue> {
type S = SamplerInfo;
let fn_name = "clGetSamplerInfo";
let sampler = sampler.unwrap();
size_getter!(get_sampler_info_size, clGetSamplerInfo);
match param_name {
S::ADDRESSING_MODE | S::FILTER_MODE | S::NORMALIZED_COORDS | S::REFERENCE_COUNT => {
let param_value = gen_param_value!(clGetSamplerInfo, u32, sampler, param_name);
Ok(ParamValue::UInt(param_value))
}
S::CONTEXT => {
let param_value = gen_param_value!(clGetSamplerInfo, isize, sampler, param_name);
Ok(ParamValue::CPtr(param_value))
}
S::PROPERTIES => {
let size = get_sampler_info_size(sampler, param_name)?;
let param_value = gen_param_value!(clGetSamplerInfo, isize, sampler, param_name, size);
Ok(ParamValue::ArrCPtr(param_value))
}
_ => status_update(40404, fn_name, ParamValue::default()),
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::api::context::{create_context, release_context};
use crate::api::device::get_device_ids;
use crate::api::platform::get_platform_ids;
use crate::objects::bitfields::DeviceType;
use crate::objects::property::SamplerProperties;
use crate::objects::structs::{AddressingMode, FilterMode};
use crate::objects::traits::GetSetGo;
use crate::objects::types::{PlatformPtr, WrapMutPtr};
#[test]
fn test_create_sampler() {
let platform_ids = get_platform_ids().unwrap();
let platform_id = PlatformPtr::from_ptr(platform_ids[0], "test_fn").unwrap();
let device_ids =
get_device_ids(&platform_id, DeviceType::new(DeviceType::DEFAULT).unwrap()).unwrap();
assert!(0 < device_ids.len());
let context = create_context(&None, device_ids, None, WrapMutPtr::null());
let context = context.unwrap();
let sampler_props = SamplerProperties.gen(
None,
Some(AddressingMode::new(AddressingMode::REPEAT).unwrap()),
Some(FilterMode::new(FilterMode::LINEAR).unwrap()),
);
let sampler = create_sampler_with_properties(&context, &sampler_props);
let sampler = sampler.unwrap();
assert_ne!(sampler.unwrap(), ptr::null_mut());
release_sampler(&sampler).unwrap();
release_context(context).unwrap();
}
#[test]
fn test_get_sampler_info() {
let platform_ids = get_platform_ids().unwrap();
let platform_id = PlatformPtr::from_ptr(platform_ids[0], "test_fn").unwrap();
let device_ids =
get_device_ids(&platform_id, DeviceType::new(DeviceType::DEFAULT).unwrap()).unwrap();
assert!(0 < device_ids.len());
let context = create_context(&None, device_ids, None, WrapMutPtr::null());
let context = context.unwrap();
let sampler_props = SamplerProperties.gen(
Some(true),
Some(AddressingMode::new(AddressingMode::REPEAT).unwrap()),
Some(FilterMode::new(FilterMode::LINEAR).unwrap()),
);
let sampler = create_sampler_with_properties(&context, &sampler_props);
let sampler = sampler.unwrap();
let sampler_context = get_sampler_info(&sampler, SamplerInfo::CONTEXT);
eprintln!("{:?}", sampler_context);
match sampler_context {
Ok(_) => assert!(true),
Err(_) => assert!(false),
};
let sampler_reference_count = get_sampler_info(&sampler, SamplerInfo::REFERENCE_COUNT);
eprintln!("{:?}", sampler_reference_count);
match sampler_reference_count {
Ok(_) => assert!(true),
Err(_) => assert!(false),
};
let sampler_addressing_mode = get_sampler_info(&sampler, SamplerInfo::ADDRESSING_MODE);
eprintln!("{:?}", sampler_addressing_mode);
match sampler_addressing_mode {
Ok(_) => assert!(true),
Err(_) => assert!(false),
};
let sampler_filter_mode = get_sampler_info(&sampler, SamplerInfo::FILTER_MODE);
eprintln!("{:?}", sampler_filter_mode);
match sampler_filter_mode {
Ok(_) => assert!(true),
Err(_) => assert!(false),
};
release_sampler(&sampler).unwrap();
release_context(context).unwrap();
}
}