diff options
author | Aaron O'Mullan <aaron.omullan@gmail.com> | 2022-01-20 15:23:53 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-01-20 15:23:53 +0100 |
commit | 3ab68bd0a2aff6df12388f2c3b5ed7ae3333a6ca (patch) | |
tree | 9a81824deb4e5a2b29c3eeb5a2adaa3e00720c45 /ext/webgpu/sampler.rs | |
parent | 1cc38f5155bdc5605d74cd959660fa04f782ac63 (diff) |
revert(#13402): experiment: wgpu sync (#13439)
Diffstat (limited to 'ext/webgpu/sampler.rs')
-rw-r--r-- | ext/webgpu/sampler.rs | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/ext/webgpu/sampler.rs b/ext/webgpu/sampler.rs new file mode 100644 index 000000000..23652cc47 --- /dev/null +++ b/ext/webgpu/sampler.rs @@ -0,0 +1,132 @@ +// Copyright 2018-2022 the Deno authors. All rights reserved. MIT license. + +use deno_core::error::AnyError; +use deno_core::ResourceId; +use deno_core::{OpState, Resource}; +use serde::Deserialize; +use std::borrow::Cow; + +use super::error::WebGpuResult; + +pub(crate) struct WebGpuSampler(pub(crate) wgpu_core::id::SamplerId); +impl Resource for WebGpuSampler { + fn name(&self) -> Cow<str> { + "webGPUSampler".into() + } +} + +#[derive(Deserialize)] +#[serde(rename_all = "kebab-case")] +enum GpuAddressMode { + ClampToEdge, + Repeat, + MirrorRepeat, +} + +impl From<GpuAddressMode> for wgpu_types::AddressMode { + fn from(value: GpuAddressMode) -> wgpu_types::AddressMode { + match value { + GpuAddressMode::ClampToEdge => wgpu_types::AddressMode::ClampToEdge, + GpuAddressMode::Repeat => wgpu_types::AddressMode::Repeat, + GpuAddressMode::MirrorRepeat => wgpu_types::AddressMode::MirrorRepeat, + } + } +} + +#[derive(Deserialize)] +#[serde(rename_all = "kebab-case")] +enum GpuFilterMode { + Nearest, + Linear, +} + +impl From<GpuFilterMode> for wgpu_types::FilterMode { + fn from(value: GpuFilterMode) -> wgpu_types::FilterMode { + match value { + GpuFilterMode::Nearest => wgpu_types::FilterMode::Nearest, + GpuFilterMode::Linear => wgpu_types::FilterMode::Linear, + } + } +} + +#[derive(Deserialize)] +#[serde(rename_all = "kebab-case")] +pub enum GpuCompareFunction { + Never, + Less, + Equal, + LessEqual, + Greater, + NotEqual, + GreaterEqual, + Always, +} + +impl From<GpuCompareFunction> for wgpu_types::CompareFunction { + fn from(value: GpuCompareFunction) -> wgpu_types::CompareFunction { + match value { + GpuCompareFunction::Never => wgpu_types::CompareFunction::Never, + GpuCompareFunction::Less => wgpu_types::CompareFunction::Less, + GpuCompareFunction::Equal => wgpu_types::CompareFunction::Equal, + GpuCompareFunction::LessEqual => wgpu_types::CompareFunction::LessEqual, + GpuCompareFunction::Greater => wgpu_types::CompareFunction::Greater, + GpuCompareFunction::NotEqual => wgpu_types::CompareFunction::NotEqual, + GpuCompareFunction::GreaterEqual => { + wgpu_types::CompareFunction::GreaterEqual + } + GpuCompareFunction::Always => wgpu_types::CompareFunction::Always, + } + } +} + +#[derive(Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct CreateSamplerArgs { + device_rid: ResourceId, + label: Option<String>, + address_mode_u: GpuAddressMode, + address_mode_v: GpuAddressMode, + address_mode_w: GpuAddressMode, + mag_filter: GpuFilterMode, + min_filter: GpuFilterMode, + mipmap_filter: GpuFilterMode, + lod_min_clamp: f32, + lod_max_clamp: f32, + compare: Option<GpuCompareFunction>, + max_anisotropy: u8, +} + +pub fn op_webgpu_create_sampler( + state: &mut OpState, + args: CreateSamplerArgs, + _: (), +) -> Result<WebGpuResult, AnyError> { + let instance = state.borrow::<super::Instance>(); + let device_resource = state + .resource_table + .get::<super::WebGpuDevice>(args.device_rid)?; + let device = device_resource.0; + + let descriptor = wgpu_core::resource::SamplerDescriptor { + label: args.label.map(Cow::from), + address_modes: [ + args.address_mode_u.into(), + args.address_mode_v.into(), + args.address_mode_w.into(), + ], + mag_filter: args.mag_filter.into(), + min_filter: args.min_filter.into(), + mipmap_filter: args.mipmap_filter.into(), + lod_min_clamp: args.lod_min_clamp, + lod_max_clamp: args.lod_max_clamp, + compare: args.compare.map(Into::into), + anisotropy_clamp: std::num::NonZeroU8::new(args.max_anisotropy), + border_color: None, // native-only + }; + + gfx_put!(device => instance.device_create_sampler( + device, + &descriptor, + std::marker::PhantomData + ) => state, WebGpuSampler) +} |