vk: clean up docs
This commit is contained in:
parent
43bd53a92b
commit
dc6e8f9a2c
47
Cargo.lock
generated
47
Cargo.lock
generated
|
@ -902,6 +902,7 @@ dependencies = [
|
||||||
"librashader-presets",
|
"librashader-presets",
|
||||||
"librashader-reflect",
|
"librashader-reflect",
|
||||||
"librashader-runtime",
|
"librashader-runtime",
|
||||||
|
"num",
|
||||||
"raw-window-handle 0.5.0",
|
"raw-window-handle 0.5.0",
|
||||||
"rustc-hash",
|
"rustc-hash",
|
||||||
"spirv_cross",
|
"spirv_cross",
|
||||||
|
@ -1128,6 +1129,40 @@ dependencies = [
|
||||||
"nom",
|
"nom",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "num"
|
||||||
|
version = "0.4.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "43db66d1170d347f9a065114077f7dccb00c1b9478c89384490a3425279a4606"
|
||||||
|
dependencies = [
|
||||||
|
"num-bigint",
|
||||||
|
"num-complex",
|
||||||
|
"num-integer",
|
||||||
|
"num-iter",
|
||||||
|
"num-rational",
|
||||||
|
"num-traits",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "num-bigint"
|
||||||
|
version = "0.4.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f"
|
||||||
|
dependencies = [
|
||||||
|
"autocfg",
|
||||||
|
"num-integer",
|
||||||
|
"num-traits",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "num-complex"
|
||||||
|
version = "0.4.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "7ae39348c8bc5fbd7f40c727a9925f03517afd2ab27d46702108b6a7e5414c19"
|
||||||
|
dependencies = [
|
||||||
|
"num-traits",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "num-integer"
|
name = "num-integer"
|
||||||
version = "0.1.45"
|
version = "0.1.45"
|
||||||
|
@ -1138,6 +1173,17 @@ dependencies = [
|
||||||
"num-traits",
|
"num-traits",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "num-iter"
|
||||||
|
version = "0.1.43"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252"
|
||||||
|
dependencies = [
|
||||||
|
"autocfg",
|
||||||
|
"num-integer",
|
||||||
|
"num-traits",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "num-rational"
|
name = "num-rational"
|
||||||
version = "0.4.1"
|
version = "0.4.1"
|
||||||
|
@ -1145,6 +1191,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0"
|
checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"autocfg",
|
"autocfg",
|
||||||
|
"num-bigint",
|
||||||
"num-integer",
|
"num-integer",
|
||||||
"num-traits",
|
"num-traits",
|
||||||
]
|
]
|
||||||
|
|
|
@ -26,6 +26,7 @@ thiserror = "1.0.37"
|
||||||
ash = { version = "0.37.1+1.3.235", features = ["linked", "debug"] }
|
ash = { version = "0.37.1+1.3.235", features = ["linked", "debug"] }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
|
num = "0.4.0"
|
||||||
glfw = "0.49.0"
|
glfw = "0.49.0"
|
||||||
winit = "0.27.5"
|
winit = "0.27.5"
|
||||||
raw-window-handle = "0.5"
|
raw-window-handle = "0.5"
|
||||||
|
|
|
@ -11,7 +11,6 @@ use crate::ubo_ring::VkUboRing;
|
||||||
use crate::viewport::Viewport;
|
use crate::viewport::Viewport;
|
||||||
use crate::vulkan_state::VulkanGraphicsPipeline;
|
use crate::vulkan_state::VulkanGraphicsPipeline;
|
||||||
use crate::{error, util};
|
use crate::{error, util};
|
||||||
use ash::extensions::ext::DebugUtils;
|
|
||||||
use ash::vk;
|
use ash::vk;
|
||||||
use librashader_common::{ImageFormat, Size};
|
use librashader_common::{ImageFormat, Size};
|
||||||
use librashader_preprocess::ShaderSource;
|
use librashader_preprocess::ShaderSource;
|
||||||
|
@ -28,6 +27,7 @@ use librashader_runtime::uniforms::UniformStorage;
|
||||||
use rustc_hash::FxHashMap;
|
use rustc_hash::FxHashMap;
|
||||||
use std::collections::VecDeque;
|
use std::collections::VecDeque;
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
|
use crate::options::{FilterChainOptionsVulkan, FrameOptionsVulkan};
|
||||||
|
|
||||||
pub struct Vulkan {
|
pub struct Vulkan {
|
||||||
pub(crate) device: ash::Device,
|
pub(crate) device: ash::Device,
|
||||||
|
@ -42,12 +42,17 @@ type ShaderPassMeta = (
|
||||||
CompilerBackend<impl CompileShader<SpirV, Options = Option<()>, Context = ()> + ReflectShader>,
|
CompilerBackend<impl CompileShader<SpirV, Options = Option<()>, Context = ()> + ReflectShader>,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/// A collection of handles needed to access the Vulkan instance.
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct VulkanInfo {
|
pub struct VulkanInfo {
|
||||||
device: vk::Device,
|
/// A `VkDevice` handle.
|
||||||
instance: vk::Instance,
|
pub device: vk::Device,
|
||||||
physical_device: vk::PhysicalDevice,
|
/// A `VkInstance` handle.
|
||||||
get_instance_proc_addr: vk::PFN_vkGetInstanceProcAddr,
|
pub instance: vk::Instance,
|
||||||
|
/// A `VkPhysicalDevice` handle.
|
||||||
|
pub physical_device: vk::PhysicalDevice,
|
||||||
|
/// A function pointer to the Vulkan library entry point.
|
||||||
|
pub get_instance_proc_addr: vk::PFN_vkGetInstanceProcAddr,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl TryFrom<VulkanInfo> for Vulkan {
|
impl TryFrom<VulkanInfo> for Vulkan {
|
||||||
|
@ -67,13 +72,6 @@ impl TryFrom<VulkanInfo> for Vulkan {
|
||||||
let pipeline_cache =
|
let pipeline_cache =
|
||||||
device.create_pipeline_cache(&vk::PipelineCacheCreateInfo::default(), None)?;
|
device.create_pipeline_cache(&vk::PipelineCacheCreateInfo::default(), None)?;
|
||||||
|
|
||||||
let _debug = DebugUtils::new(
|
|
||||||
&ash::Entry::from_static_fn(vk::StaticFn {
|
|
||||||
get_instance_proc_addr: vulkan.get_instance_proc_addr,
|
|
||||||
}),
|
|
||||||
&instance,
|
|
||||||
);
|
|
||||||
|
|
||||||
let queue = get_graphics_queue(&instance, &device, vulkan.physical_device);
|
let queue = get_graphics_queue(&instance, &device, vulkan.physical_device);
|
||||||
let memory_properties =
|
let memory_properties =
|
||||||
instance.get_physical_device_memory_properties(vulkan.physical_device);
|
instance.get_physical_device_memory_properties(vulkan.physical_device);
|
||||||
|
@ -96,9 +94,7 @@ impl TryFrom<(vk::PhysicalDevice, ash::Instance, ash::Device)> for Vulkan {
|
||||||
unsafe {
|
unsafe {
|
||||||
let device = value.2;
|
let device = value.2;
|
||||||
|
|
||||||
let pipeline_cache = unsafe {
|
let pipeline_cache = device.create_pipeline_cache(&vk::PipelineCacheCreateInfo::default(), None)?;
|
||||||
device.create_pipeline_cache(&vk::PipelineCacheCreateInfo::default(), None)?
|
|
||||||
};
|
|
||||||
|
|
||||||
let queue = get_graphics_queue(&value.1, &device, value.0);
|
let queue = get_graphics_queue(&value.1, &device, value.0);
|
||||||
|
|
||||||
|
@ -117,11 +113,12 @@ impl TryFrom<(vk::PhysicalDevice, ash::Instance, ash::Device)> for Vulkan {
|
||||||
|
|
||||||
pub struct FilterChainVulkan {
|
pub struct FilterChainVulkan {
|
||||||
pub(crate) common: FilterCommon,
|
pub(crate) common: FilterCommon,
|
||||||
pub(crate) passes: Box<[FilterPass]>,
|
passes: Box<[FilterPass]>,
|
||||||
pub(crate) vulkan: Vulkan,
|
vulkan: Vulkan,
|
||||||
pub(crate) output_framebuffers: Box<[OwnedImage]>,
|
output_framebuffers: Box<[OwnedImage]>,
|
||||||
pub(crate) feedback_framebuffers: Box<[OwnedImage]>,
|
feedback_framebuffers: Box<[OwnedImage]>,
|
||||||
pub(crate) history_framebuffers: VecDeque<OwnedImage>,
|
history_framebuffers: VecDeque<OwnedImage>,
|
||||||
|
disable_mipmaps: bool
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct FilterMutable {
|
pub struct FilterMutable {
|
||||||
|
@ -133,7 +130,6 @@ pub(crate) struct FilterCommon {
|
||||||
pub(crate) luts: FxHashMap<usize, LutTexture>,
|
pub(crate) luts: FxHashMap<usize, LutTexture>,
|
||||||
pub samplers: SamplerSet,
|
pub samplers: SamplerSet,
|
||||||
pub(crate) draw_quad: DrawQuad,
|
pub(crate) draw_quad: DrawQuad,
|
||||||
|
|
||||||
pub output_inputs: Box<[Option<InputImage>]>,
|
pub output_inputs: Box<[Option<InputImage>]>,
|
||||||
pub feedback_inputs: Box<[Option<InputImage>]>,
|
pub feedback_inputs: Box<[Option<InputImage>]>,
|
||||||
pub history_textures: Box<[Option<InputImage>]>,
|
pub history_textures: Box<[Option<InputImage>]>,
|
||||||
|
@ -142,15 +138,15 @@ pub(crate) struct FilterCommon {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[must_use]
|
#[must_use]
|
||||||
pub struct FilterChainFrameIntermediates {
|
pub struct FrameIntermediates {
|
||||||
device: ash::Device,
|
device: ash::Device,
|
||||||
image_views: Vec<vk::ImageView>,
|
image_views: Vec<vk::ImageView>,
|
||||||
owned: Vec<OwnedImage>,
|
owned: Vec<OwnedImage>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl FilterChainFrameIntermediates {
|
impl FrameIntermediates {
|
||||||
pub(crate) fn new(device: &ash::Device) -> Self {
|
pub(crate) fn new(device: &ash::Device) -> Self {
|
||||||
FilterChainFrameIntermediates {
|
FrameIntermediates {
|
||||||
device: device.clone(),
|
device: device.clone(),
|
||||||
image_views: Vec::new(),
|
image_views: Vec::new(),
|
||||||
owned: Vec::new(),
|
owned: Vec::new(),
|
||||||
|
@ -164,10 +160,9 @@ impl FilterChainFrameIntermediates {
|
||||||
pub(crate) fn dispose_owned(&mut self, owned: OwnedImage) {
|
pub(crate) fn dispose_owned(&mut self, owned: OwnedImage) {
|
||||||
self.owned.push(owned)
|
self.owned.push(owned)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
impl Drop for FilterChainFrameIntermediates {
|
/// Dispose of the intermediate objects created during a frame.
|
||||||
fn drop(&mut self) {
|
pub fn dispose(self) {
|
||||||
for image_view in &self.image_views {
|
for image_view in &self.image_views {
|
||||||
if *image_view != vk::ImageView::null() {
|
if *image_view != vk::ImageView::null() {
|
||||||
unsafe {
|
unsafe {
|
||||||
|
@ -175,11 +170,10 @@ impl Drop for FilterChainFrameIntermediates {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
drop(self)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub type FilterChainOptionsVulkan = ();
|
|
||||||
|
|
||||||
impl FilterChainVulkan {
|
impl FilterChainVulkan {
|
||||||
/// Load the shader preset at the given path into a filter chain.
|
/// Load the shader preset at the given path into a filter chain.
|
||||||
pub fn load_from_path(
|
pub fn load_from_path(
|
||||||
|
@ -195,7 +189,7 @@ impl FilterChainVulkan {
|
||||||
pub fn load_from_preset(
|
pub fn load_from_preset(
|
||||||
vulkan: impl TryInto<Vulkan, Error = FilterChainError>,
|
vulkan: impl TryInto<Vulkan, Error = FilterChainError>,
|
||||||
preset: ShaderPreset,
|
preset: ShaderPreset,
|
||||||
_options: Option<&FilterChainOptionsVulkan>,
|
options: Option<&FilterChainOptionsVulkan>,
|
||||||
) -> error::Result<FilterChainVulkan> {
|
) -> error::Result<FilterChainVulkan> {
|
||||||
let (passes, semantics) = FilterChainVulkan::load_preset(preset.shaders, &preset.textures)?;
|
let (passes, semantics) = FilterChainVulkan::load_preset(preset.shaders, &preset.textures)?;
|
||||||
let device = vulkan.try_into()?;
|
let device = vulkan.try_into()?;
|
||||||
|
@ -252,6 +246,7 @@ impl FilterChainVulkan {
|
||||||
output_framebuffers: output_framebuffers?.into_boxed_slice(),
|
output_framebuffers: output_framebuffers?.into_boxed_slice(),
|
||||||
feedback_framebuffers: feedback_framebuffers?.into_boxed_slice(),
|
feedback_framebuffers: feedback_framebuffers?.into_boxed_slice(),
|
||||||
history_framebuffers,
|
history_framebuffers,
|
||||||
|
disable_mipmaps: options.map_or(false, |o| o.force_no_mipmaps),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -496,7 +491,7 @@ impl FilterChainVulkan {
|
||||||
pub fn push_history(
|
pub fn push_history(
|
||||||
&mut self,
|
&mut self,
|
||||||
input: &VulkanImage,
|
input: &VulkanImage,
|
||||||
intermediates: &mut FilterChainFrameIntermediates,
|
intermediates: &mut FrameIntermediates,
|
||||||
cmd: vk::CommandBuffer,
|
cmd: vk::CommandBuffer,
|
||||||
) -> error::Result<()> {
|
) -> error::Result<()> {
|
||||||
if let Some(mut back) = self.history_framebuffers.pop_back() {
|
if let Some(mut back) = self.history_framebuffers.pop_back() {
|
||||||
|
@ -551,7 +546,7 @@ impl FilterChainVulkan {
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
/// Process a frame with the input image.
|
/// Records shader rendering commands to the provided command buffer.
|
||||||
///
|
///
|
||||||
/// * The input image must be in the `VK_SHADER_READ_ONLY_OPTIMAL`.
|
/// * The input image must be in the `VK_SHADER_READ_ONLY_OPTIMAL`.
|
||||||
/// * The output image must be in `VK_COLOR_ATTACHMENT_OPTIMAL`.
|
/// * The output image must be in `VK_COLOR_ATTACHMENT_OPTIMAL`.
|
||||||
|
@ -559,18 +554,31 @@ impl FilterChainVulkan {
|
||||||
/// librashader **will not** create a pipeline barrier for the final pass. The output image will
|
/// librashader **will not** create a pipeline barrier for the final pass. The output image will
|
||||||
/// remain in `VK_COLOR_ATTACHMENT_OPTIMAL` after all shader passes. The caller must transition
|
/// remain in `VK_COLOR_ATTACHMENT_OPTIMAL` after all shader passes. The caller must transition
|
||||||
/// the output image to the final layout.
|
/// the output image to the final layout.
|
||||||
|
///
|
||||||
|
/// This function returns an [`FrameIntermediates`](crate::filter_chain::FrameIntermediates) struct,
|
||||||
|
/// which contains intermediate ImageViews. These may be disposed by calling
|
||||||
|
/// [`FrameIntermediates::dispose`](crate::filter_chain::FrameIntermediates::dispose),
|
||||||
|
/// only after they are no longer in use by the GPU, after queue submission.
|
||||||
pub fn frame(
|
pub fn frame(
|
||||||
&mut self,
|
&mut self,
|
||||||
count: usize,
|
count: usize,
|
||||||
viewport: &Viewport,
|
viewport: &Viewport,
|
||||||
input: &VulkanImage,
|
input: &VulkanImage,
|
||||||
cmd: vk::CommandBuffer,
|
cmd: vk::CommandBuffer,
|
||||||
_options: Option<()>,
|
options: Option<FrameOptionsVulkan>,
|
||||||
) -> error::Result<FilterChainFrameIntermediates> {
|
) -> error::Result<FrameIntermediates> {
|
||||||
// limit number of passes to those enabled.
|
// limit number of passes to those enabled.
|
||||||
let passes = &mut self.passes[0..self.common.config.passes_enabled];
|
let passes = &mut self.passes[0..self.common.config.passes_enabled];
|
||||||
|
|
||||||
let mut intermediates = FilterChainFrameIntermediates::new(&self.vulkan.device);
|
if let Some(options) = &options {
|
||||||
|
if options.clear_history {
|
||||||
|
for history in &mut self.history_framebuffers {
|
||||||
|
history.clear(cmd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut intermediates = FrameIntermediates::new(&self.vulkan.device);
|
||||||
if passes.is_empty() {
|
if passes.is_empty() {
|
||||||
return Ok(intermediates);
|
return Ok(intermediates);
|
||||||
}
|
}
|
||||||
|
@ -666,10 +674,10 @@ impl FilterChainVulkan {
|
||||||
let passes_len = passes.len();
|
let passes_len = passes.len();
|
||||||
let (pass, last) = passes.split_at_mut(passes_len - 1);
|
let (pass, last) = passes.split_at_mut(passes_len - 1);
|
||||||
|
|
||||||
|
let frame_direction = options.map(|f| f.frame_direction).unwrap_or(1);
|
||||||
|
|
||||||
for (index, pass) in pass.iter_mut().enumerate() {
|
for (index, pass) in pass.iter_mut().enumerate() {
|
||||||
let target = &self.output_framebuffers[index];
|
let target = &self.output_framebuffers[index];
|
||||||
|
|
||||||
// todo: use proper mode
|
|
||||||
let out = RenderTarget {
|
let out = RenderTarget {
|
||||||
x: 0.0,
|
x: 0.0,
|
||||||
y: 0.0,
|
y: 0.0,
|
||||||
|
@ -686,14 +694,14 @@ impl FilterChainVulkan {
|
||||||
} else {
|
} else {
|
||||||
count
|
count
|
||||||
} as u32,
|
} as u32,
|
||||||
0,
|
frame_direction,
|
||||||
viewport,
|
viewport,
|
||||||
&original,
|
&original,
|
||||||
&source,
|
&source,
|
||||||
&out,
|
&out,
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
if target.max_miplevels > 1 {
|
if target.max_miplevels > 1 && !self.disable_mipmaps {
|
||||||
target.generate_mipmaps_and_end_pass(cmd);
|
target.generate_mipmaps_and_end_pass(cmd);
|
||||||
} else {
|
} else {
|
||||||
out.output.end_pass(cmd);
|
out.output.end_pass(cmd);
|
||||||
|
|
|
@ -339,7 +339,7 @@ impl VulkanWindow {
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
vulkan.base.device.device_wait_idle().unwrap();
|
vulkan.base.device.device_wait_idle().unwrap();
|
||||||
drop(intermediates)
|
intermediates.dispose();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,7 +20,7 @@ mod viewport;
|
||||||
mod vulkan_primitives;
|
mod vulkan_primitives;
|
||||||
mod vulkan_state;
|
mod vulkan_state;
|
||||||
|
|
||||||
pub use filter_chain::FilterChainFrameIntermediates;
|
pub use filter_chain::FrameIntermediates;
|
||||||
pub use filter_chain::FilterChainVulkan;
|
pub use filter_chain::FilterChainVulkan;
|
||||||
pub use filter_chain::Vulkan;
|
pub use filter_chain::Vulkan;
|
||||||
pub use filter_chain::VulkanInfo;
|
pub use filter_chain::VulkanInfo;
|
||||||
|
|
|
@ -1 +1,18 @@
|
||||||
|
/// Options for each Vulkan shader frame.
|
||||||
|
#[repr(C)]
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
pub struct FrameOptionsVulkan {
|
||||||
|
/// Whether or not to clear the history buffers.
|
||||||
|
pub clear_history: bool,
|
||||||
|
/// The direction of the frame. 1 should be vertical.
|
||||||
|
pub frame_direction: i32,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Options for filter chain creation.
|
||||||
|
#[repr(C)]
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
pub struct FilterChainOptionsVulkan {
|
||||||
|
/// Whether or not to explicitly disable mipmap generation regardless of shader preset settings.
|
||||||
|
pub force_no_mipmaps: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -60,10 +60,6 @@ impl PipelineDescriptors {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn binding_count(&self) -> usize {
|
|
||||||
self.layout_bindings.len()
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn bindings(&self) -> &[vk::DescriptorSetLayoutBinding] {
|
pub fn bindings(&self) -> &[vk::DescriptorSetLayoutBinding] {
|
||||||
self.layout_bindings.as_ref()
|
self.layout_bindings.as_ref()
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue