diff options
| author | s-ol <s+removethis@s-ol.nu> | 2026-04-22 13:35:18 +0000 |
|---|---|---|
| committer | s-ol <s+removethis@s-ol.nu> | 2026-05-14 14:46:13 +0000 |
| commit | 9fd2105289ccc5a7c12af56bad4d33ef768d0f16 (patch) | |
| tree | a4e6ff2c64fd0f1d4c73d74b3d62327630ff6206 /src/renderer.rs | |
| parent | add tsv-video-buffer (diff) | |
| download | wgsl-view-9fd2105289ccc5a7c12af56bad4d33ef768d0f16.tar.gz wgsl-view-9fd2105289ccc5a7c12af56bad4d33ef768d0f16.zip | |
samplers/textures as resources
Diffstat (limited to 'src/renderer.rs')
| -rw-r--r-- | src/renderer.rs | 74 |
1 files changed, 73 insertions, 1 deletions
diff --git a/src/renderer.rs b/src/renderer.rs index 454e81a..3717945 100644 --- a/src/renderer.rs +++ b/src/renderer.rs @@ -1,4 +1,5 @@ -use crate::uniform::UniformCache; +use crate::gpu; +use crate::uniform::{ResourcePools, UniformCache}; const CANVAS_FORMAT: wgpu::TextureFormat = wgpu::TextureFormat::Rgba8UnormSrgb; @@ -37,6 +38,7 @@ pub struct Renderer { vertex_bgl: wgpu::BindGroupLayout, vertex_bg: wgpu::BindGroup, render_pipeline: wgpu::RenderPipeline, + resources: ResourcePools, uniforms: UniformCache, } @@ -101,12 +103,14 @@ impl Renderer { bytemuck::cast_slice(&[width as f32, height as f32]), ); + let resources = ResourcePools::new(); let mut uniforms = UniformCache::new(); let render_pipeline = build_pipeline( device, &vertex_module, &vertex_bgl, DEFAULT_FRAGMENT, + &resources, &mut uniforms, ) .expect("default shader"); @@ -118,6 +122,7 @@ impl Renderer { vertex_bgl, vertex_bg, render_pipeline, + resources, uniforms, } } @@ -140,6 +145,7 @@ impl Renderer { &self.vertex_module, &self.vertex_bgl, source, + &self.resources, &mut self.uniforms, )?; self.render_pipeline = pipeline; @@ -147,6 +153,70 @@ impl Renderer { Ok(()) } + pub fn create_texture_resource(&mut self, device: &wgpu::Device, id: &str, tsv_name: &str) { + self.resources.create_texture(device, id, tsv_name); + self.uniforms.rebuild_bind_group(device, &self.resources); + } + + pub fn destroy_texture_resource(&mut self, device: &wgpu::Device, id: &str) { + let removed = self.resources.destroy_texture(id); + let unbound = self.uniforms.unbind_texture_resource(id); + if removed || unbound { + self.uniforms.rebuild_bind_group(device, &self.resources); + } + } + + pub fn create_sampler_resource( + &mut self, + device: &wgpu::Device, + id: &str, + filter: wgpu::FilterMode, + address_mode: wgpu::AddressMode, + ) { + self.resources + .create_sampler(device, id, filter, address_mode); + self.uniforms.rebuild_bind_group(device, &self.resources); + } + + pub fn destroy_sampler_resource(&mut self, device: &wgpu::Device, id: &str) { + let removed = self.resources.destroy_sampler(id); + let unbound = self.uniforms.unbind_sampler_resource(id); + if removed || unbound { + self.uniforms.rebuild_bind_group(device, &self.resources); + } + } + + pub fn bind_texture_resource( + &mut self, + device: &wgpu::Device, + name: &str, + id: &str, + ) -> Result<(), String> { + self.uniforms + .bind_texture_resource(device, &self.resources, name, id) + } + + pub fn bind_sampler_resource( + &mut self, + device: &wgpu::Device, + name: &str, + id: &str, + ) -> Result<(), String> { + self.uniforms + .bind_sampler_resource(device, &self.resources, name, id) + } + + pub fn refresh_textures( + &mut self, + device: &wgpu::Device, + client: &mut texture_share_vk_client::VkClient, + fence: ash::vk::Fence, + ) { + if gpu::refresh_textures(&mut self.resources, device, client, fence) { + self.uniforms.rebuild_bind_group(device, &self.resources); + } + } + pub fn render(&mut self, device: &wgpu::Device, queue: &wgpu::Queue) { self.uniforms.flush(queue); @@ -188,6 +258,7 @@ fn build_pipeline( vertex_module: &wgpu::ShaderModule, vertex_bgl: &wgpu::BindGroupLayout, fragment_source: &str, + resources: &ResourcePools, cache: &mut UniformCache, ) -> Result<wgpu::RenderPipeline, String> { let module = naga::front::wgsl::parse_str(fragment_source) @@ -201,6 +272,7 @@ fn build_pipeline( .map_err(|e| format!("WGSL validation error: {e}"))?; cache.refresh(module, device); + cache.rebuild_bind_group(device, resources); let fragment_module = device.create_shader_module(wgpu::ShaderModuleDescriptor { label: Some("fragment_shader"), |
