summaryrefslogtreecommitdiffstats
path: root/src/renderer.rs
diff options
context:
space:
mode:
authors-ol <s+removethis@s-ol.nu>2026-04-22 13:35:18 +0000
committers-ol <s+removethis@s-ol.nu>2026-05-14 14:46:13 +0000
commit9fd2105289ccc5a7c12af56bad4d33ef768d0f16 (patch)
treea4e6ff2c64fd0f1d4c73d74b3d62327630ff6206 /src/renderer.rs
parentadd tsv-video-buffer (diff)
downloadwgsl-view-9fd2105289ccc5a7c12af56bad4d33ef768d0f16.tar.gz
wgsl-view-9fd2105289ccc5a7c12af56bad4d33ef768d0f16.zip
samplers/textures as resources
Diffstat (limited to 'src/renderer.rs')
-rw-r--r--src/renderer.rs74
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"),