rt(wgpu): wip filter chain logic
This commit is contained in:
parent
32148cdff4
commit
10358b4966
|
@ -16,13 +16,13 @@ use std::convert::Infallible;
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use librashader_common::{ImageFormat, Size};
|
use librashader_common::{ImageFormat, Size, Viewport};
|
||||||
use librashader_reflect::back::wgsl::WgslCompileOptions;
|
use librashader_reflect::back::wgsl::WgslCompileOptions;
|
||||||
use librashader_runtime::framebuffer::FramebufferInit;
|
use librashader_runtime::framebuffer::FramebufferInit;
|
||||||
use librashader_runtime::render_target::RenderTarget;
|
use librashader_runtime::render_target::RenderTarget;
|
||||||
use librashader_runtime::scaling::ScaleFramebuffer;
|
use librashader_runtime::scaling::ScaleFramebuffer;
|
||||||
use rayon::prelude::*;
|
use rayon::prelude::*;
|
||||||
use wgpu::{CommandBuffer, CommandEncoder, Device, Queue, TextureFormat};
|
use wgpu::{BindGroupEntry, CommandBuffer, CommandEncoder, Device, Queue, TextureAspect, TextureFormat};
|
||||||
use crate::draw_quad::DrawQuad;
|
use crate::draw_quad::DrawQuad;
|
||||||
|
|
||||||
use crate::error;
|
use crate::error;
|
||||||
|
@ -58,24 +58,17 @@ pub struct FilterChainWGPU {
|
||||||
pub struct FilterMutable {
|
pub struct FilterMutable {
|
||||||
pub passes_enabled: usize,
|
pub passes_enabled: usize,
|
||||||
pub(crate) parameters: FxHashMap<String, f32>,
|
pub(crate) parameters: FxHashMap<String, f32>,
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) struct FilterCommon {
|
pub(crate) struct FilterCommon {
|
||||||
// pub(crate) luts: FxHashMap<usize, LutTexture>,
|
|
||||||
// pub samplers: SamplerSet,
|
|
||||||
// pub(crate) draw_quad: DrawQuad,
|
|
||||||
pub output_textures: Box<[Option<InputImage>]>,
|
pub output_textures: Box<[Option<InputImage>]>,
|
||||||
pub feedback_textures: Box<[Option<InputImage>]>,
|
pub feedback_textures: Box<[Option<InputImage>]>,
|
||||||
pub history_textures: Box<[Option<InputImage>]>,
|
pub history_textures: Box<[Option<InputImage>]>,
|
||||||
// pub config: FilterMutable,
|
pub luts: FxHashMap<usize, LutTexture>,
|
||||||
// pub device: Arc<ash::Device>,
|
pub samplers: SamplerSet,
|
||||||
// pub(crate) internal_frame_count: usize,
|
pub config: FilterMutable,
|
||||||
luts: FxHashMap<usize, LutTexture>,
|
pub internal_frame_count: i32,
|
||||||
samplers: SamplerSet,
|
pub(crate) draw_quad: DrawQuad,
|
||||||
config: FilterMutable,
|
|
||||||
internal_frame_count: i32,
|
|
||||||
draw_quad: DrawQuad,
|
|
||||||
device: Arc<Device>,
|
device: Arc<Device>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -219,6 +212,7 @@ impl FilterChainWGPU {
|
||||||
|
|
||||||
Ok(FilterPass {
|
Ok(FilterPass {
|
||||||
// device: vulkan.device.clone(),
|
// device: vulkan.device.clone(),
|
||||||
|
device,
|
||||||
reflection,
|
reflection,
|
||||||
compiled: wgsl,
|
compiled: wgsl,
|
||||||
uniform_storage,
|
uniform_storage,
|
||||||
|
@ -228,6 +222,8 @@ impl FilterChainWGPU {
|
||||||
graphics_pipeline,
|
graphics_pipeline,
|
||||||
// // ubo_ring,
|
// // ubo_ring,
|
||||||
// frames_in_flight,
|
// frames_in_flight,
|
||||||
|
// texture_heap: [],
|
||||||
|
// sampler_heap: [],
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
|
@ -237,5 +233,95 @@ impl FilterChainWGPU {
|
||||||
Ok(filters.into_boxed_slice())
|
Ok(filters.into_boxed_slice())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn frame(&mut self,
|
||||||
|
input: wgpu::Texture,
|
||||||
|
viewport: &Viewport<OwnedImage>,
|
||||||
|
cmd: wgpu::CommandEncoder,
|
||||||
|
frame_count: usize,
|
||||||
|
) -> error::Result<()> {
|
||||||
|
let max = std::cmp::min(self.passes.len(), self.common.config.passes_enabled);
|
||||||
|
let passes = &mut self.passes[0..max];
|
||||||
|
|
||||||
|
// if let Some(options) = &options {
|
||||||
|
// if options.clear_history {
|
||||||
|
// for history in &mut self.history_framebuffers {
|
||||||
|
// history.clear(cmd);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
if passes.is_empty() {
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
|
||||||
|
let original_image_view = input.create_view(&wgpu::TextureViewDescriptor {
|
||||||
|
label: Some("original_image_view"),
|
||||||
|
format: Some(input.format()),
|
||||||
|
dimension: Some(wgpu::TextureViewDimension::D2),
|
||||||
|
aspect: TextureAspect::All,
|
||||||
|
base_mip_level: 1,
|
||||||
|
mip_level_count: None,
|
||||||
|
base_array_layer: 1,
|
||||||
|
array_layer_count: None,
|
||||||
|
});
|
||||||
|
|
||||||
|
let filter = passes[0].config.filter;
|
||||||
|
let wrap_mode = passes[0].config.wrap_mode;
|
||||||
|
|
||||||
|
|
||||||
|
// update history
|
||||||
|
for (texture, image) in self
|
||||||
|
.common
|
||||||
|
.history_textures
|
||||||
|
.iter_mut()
|
||||||
|
.zip(self.history_framebuffers.iter())
|
||||||
|
{
|
||||||
|
*texture = Some(image.as_input(filter, wrap_mode));
|
||||||
|
}
|
||||||
|
|
||||||
|
let original = InputImage {
|
||||||
|
image: input.clone(),
|
||||||
|
view: original_image_view,
|
||||||
|
wrap_mode,
|
||||||
|
filter_mode: filter,
|
||||||
|
mip_filter: filter,
|
||||||
|
};
|
||||||
|
|
||||||
|
let mut source = original.clone();
|
||||||
|
|
||||||
|
// swap output and feedback **before** recording command buffers
|
||||||
|
std::mem::swap(
|
||||||
|
&mut self.output_framebuffers,
|
||||||
|
&mut self.feedback_framebuffers,
|
||||||
|
);
|
||||||
|
|
||||||
|
// rescale render buffers to ensure all bindings are valid.
|
||||||
|
OwnedImage::scale_framebuffers_with_context(
|
||||||
|
source.image.size,
|
||||||
|
viewport.output.size,
|
||||||
|
&mut self.output_framebuffers,
|
||||||
|
&mut self.feedback_framebuffers,
|
||||||
|
passes,
|
||||||
|
&None::<()>,
|
||||||
|
Some(&mut |index: usize,
|
||||||
|
pass: &FilterPass,
|
||||||
|
output: &OwnedImage,
|
||||||
|
feedback: &OwnedImage| {
|
||||||
|
// refresh inputs
|
||||||
|
self.common.feedback_textures[index] =
|
||||||
|
Some(feedback.as_input(pass.config.filter, pass.config.wrap_mode));
|
||||||
|
self.common.output_textures[index] =
|
||||||
|
Some(output.as_input(pass.config.filter, pass.config.wrap_mode));
|
||||||
|
Ok(())
|
||||||
|
}),
|
||||||
|
)?;
|
||||||
|
|
||||||
|
let passes_len = passes.len();
|
||||||
|
let (pass, last) = passes.split_at_mut(passes_len - 1);
|
||||||
|
|
||||||
|
let frame_direction = options.map_or(1, |f| f.frame_direction);
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue