summaryrefslogtreecommitdiffstats
path: root/src/texture.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/texture.rs')
-rw-r--r--src/texture.rs96
1 files changed, 96 insertions, 0 deletions
diff --git a/src/texture.rs b/src/texture.rs
new file mode 100644
index 0000000..be07dd3
--- /dev/null
+++ b/src/texture.rs
@@ -0,0 +1,96 @@
+use crate::wgpuctx::WgpuCtx;
+
+pub struct Texture
+{
+ texture: wgpu::Texture,
+ view: wgpu::TextureView,
+ sampler: wgpu::Sampler,
+ pub bindgrouplayout: wgpu::BindGroupLayout,
+ bindgroup: wgpu::BindGroup,
+}
+
+impl Texture
+{
+ pub fn new(
+ device: &wgpu::Device,
+ descr: wgpu::TextureDescriptor)
+ -> Self
+ {
+ let texture = device.create_texture(&descr);
+ let view = texture.create_view(&wgpu::TextureViewDescriptor::default());
+ let sampler = device.create_sampler(
+ &wgpu::SamplerDescriptor {
+ address_mode_u: wgpu::AddressMode::Repeat,
+ address_mode_v: wgpu::AddressMode::Repeat,
+ address_mode_w: wgpu::AddressMode::ClampToEdge,
+ mag_filter: wgpu::FilterMode::Linear,
+ min_filter: wgpu::FilterMode::Nearest,
+ mipmap_filter: wgpu::FilterMode::Nearest,
+ ..Default::default()
+ }
+ );
+
+ let bind_group_layout = device.create_bind_group_layout(
+ &wgpu::BindGroupLayoutDescriptor {
+ label: None,
+ entries: &[
+ wgpu::BindGroupLayoutEntry {
+ binding: 0,
+ visibility: wgpu::ShaderStages::FRAGMENT,
+ ty: wgpu::BindingType::Texture {
+ sample_type: wgpu::TextureSampleType::Float {
+ filterable: true
+ },
+ view_dimension: wgpu::TextureViewDimension::D2,
+ multisampled: false
+ },
+ count: None
+ },
+ wgpu::BindGroupLayoutEntry {
+ binding: 1,
+ visibility: wgpu::ShaderStages::FRAGMENT,
+ ty: wgpu::BindingType::Sampler(wgpu::SamplerBindingType::Filtering),
+ count: None
+ }
+ ]
+ }
+ );
+
+ let bind_group = device.create_bind_group(
+ &wgpu::BindGroupDescriptor {
+ label: None,
+ layout: &bind_group_layout,
+ entries: &[
+ wgpu::BindGroupEntry {
+ binding: 0,
+ resource: wgpu::BindingResource::TextureView(&view)
+ },
+ wgpu::BindGroupEntry {
+ binding: 1,
+ resource: wgpu::BindingResource::Sampler(&sampler)
+ }
+ ]
+ }
+ );
+
+ Self {
+ texture: texture,
+ view: view,
+ sampler: sampler,
+ bindgrouplayout: bind_group_layout,
+ bindgroup: bind_group,
+ }
+ }
+
+ pub fn view(&self)
+ -> &wgpu::TextureView
+ { &self.view }
+
+ pub fn use_on_pass(
+ &self,
+ pass: &mut wgpu::RenderPass,
+ index: u32)
+ {
+ pass.set_bind_group(index, &self.bindgroup, &[]);
+ }
+} // impl Texture