summaryrefslogtreecommitdiff
path: root/ext/webgpu/sampler.rs
diff options
context:
space:
mode:
authorLeo Kettmeir <crowlkats@toaxl.com>2023-02-20 17:48:02 +0100
committerGitHub <noreply@github.com>2023-02-20 16:48:02 +0000
commita16c11c5d10052c688ba4c2eca09fd1a225e395a (patch)
tree34fb4b4fb028ca2c19a0d7059915f86a5d511540 /ext/webgpu/sampler.rs
parent6915a9b7a701dde0e1078867961c9a91811c1850 (diff)
refactor: move webgpu files to ext root (#17832)
Required for #17826
Diffstat (limited to 'ext/webgpu/sampler.rs')
-rw-r--r--ext/webgpu/sampler.rs70
1 files changed, 70 insertions, 0 deletions
diff --git a/ext/webgpu/sampler.rs b/ext/webgpu/sampler.rs
new file mode 100644
index 000000000..b377f6835
--- /dev/null
+++ b/ext/webgpu/sampler.rs
@@ -0,0 +1,70 @@
+// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
+
+use deno_core::error::AnyError;
+use deno_core::op;
+use deno_core::OpState;
+use deno_core::Resource;
+use deno_core::ResourceId;
+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 = "camelCase")]
+pub struct CreateSamplerArgs {
+ device_rid: ResourceId,
+ label: Option<String>,
+ address_mode_u: wgpu_types::AddressMode,
+ address_mode_v: wgpu_types::AddressMode,
+ address_mode_w: wgpu_types::AddressMode,
+ mag_filter: wgpu_types::FilterMode,
+ min_filter: wgpu_types::FilterMode,
+ mipmap_filter: wgpu_types::FilterMode, // TODO: GPUMipmapFilterMode
+ lod_min_clamp: f32,
+ lod_max_clamp: f32,
+ compare: Option<wgpu_types::CompareFunction>,
+ max_anisotropy: u8,
+}
+
+#[op]
+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,
+ args.address_mode_v,
+ args.address_mode_w,
+ ],
+ mag_filter: args.mag_filter,
+ min_filter: args.min_filter,
+ mipmap_filter: args.mipmap_filter,
+ lod_min_clamp: args.lod_min_clamp,
+ lod_max_clamp: args.lod_max_clamp,
+ compare: args.compare,
+ anisotropy_clamp: std::num::NonZeroU8::new(args.max_anisotropy),
+ border_color: None, // native-only
+ };
+
+ gfx_put!(device => instance.device_create_sampler(
+ device,
+ &descriptor,
+ ()
+ ) => state, WebGpuSampler)
+}