From 69dcfa8186936dbb6013a68f5eb2a80f3028388f Mon Sep 17 00:00:00 2001 From: Frederic Nieto Date: Mon, 8 Aug 2022 02:18:28 +0200 Subject: [PATCH 1/4] tried updating version --- Cargo.toml | 6 +++--- examples/example.rs | 36 ++++++++++++++++++------------------ src/lib.rs | 31 +++++++++++++++++++------------ 3 files changed, 40 insertions(+), 33 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 5e83944..79dd6e4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,14 +11,14 @@ categories = ["gui", "game-development"] edition = "2021" [dependencies] -vulkano = "0.29.0" -vulkano-shaders = "0.29.0" +vulkano = "0.30.0" +vulkano-shaders = "0.30.0" bytemuck = "1.8.0" egui = "0.18.1" thiserror = "1.0" [dev-dependencies] winit = "0.26.0" -vulkano-win = "0.29.0" +vulkano-win = "0.30.0" egui-winit = "0.18.0" egui_demo_lib = "0.18.0" \ No newline at end of file diff --git a/examples/example.rs b/examples/example.rs index ae8f0f8..91c4ecf 100644 --- a/examples/example.rs +++ b/examples/example.rs @@ -12,10 +12,10 @@ use egui::plot::{HLine, Line, Plot, Value, Values}; use egui::{Color32, ColorImage, Ui}; use egui_vulkano::UpdateTexturesResult; use vulkano::buffer::{BufferUsage, CpuAccessibleBuffer, TypedBufferAccess}; -use vulkano::command_buffer::{AutoCommandBufferBuilder, CommandBufferUsage, SubpassContents}; +use vulkano::command_buffer::{AutoCommandBufferBuilder, CommandBufferUsage, RenderPassBeginInfo, SubpassContents}; use vulkano::device::physical::{PhysicalDevice, PhysicalDeviceType}; use vulkano::device::{Device, DeviceCreateInfo, DeviceExtensions, QueueCreateInfo}; -use vulkano::format::Format; +use vulkano::format::{ClearValue, Format}; use vulkano::image::view::ImageView; use vulkano::image::{ImageAccess, ImageUsage, SwapchainImage}; use vulkano::instance::{Instance, InstanceCreateInfo}; @@ -66,7 +66,7 @@ fn main() { enabled_extensions: required_extensions, ..Default::default() }) - .unwrap(); + .unwrap(); let physical = PhysicalDevice::enumerate(&instance).next().unwrap(); @@ -107,14 +107,12 @@ fn main() { let (device, mut queues) = Device::new( physical_device, DeviceCreateInfo { - enabled_extensions: physical_device - .required_extensions() - .union(&device_extensions), + enabled_extensions: device_extensions, queue_create_infos: vec![QueueCreateInfo::family(queue_family)], ..Default::default() }, ) - .unwrap(); + .unwrap(); let queue = queues.next().unwrap(); @@ -140,7 +138,7 @@ fn main() { ..Default::default() }, ) - .unwrap() + .unwrap() }; #[derive(Default, Debug, Clone, Copy, Pod, Zeroable)] @@ -166,10 +164,10 @@ fn main() { position: [0.25, -0.1], }, ] - .iter() - .cloned(), + .iter() + .cloned(), ) - .unwrap() + .unwrap() }; mod vs { @@ -220,7 +218,7 @@ fn main() { { color: [color], depth_stencil: {}, input: [] } // Create a second renderpass to draw egui ] ) - .unwrap(); + .unwrap(); let pipeline = GraphicsPipeline::start() .vertex_input_state(BuffersDefinition::new().vertex::()) @@ -254,7 +252,7 @@ fn main() { queue.clone(), Subpass::from(render_pass.clone(), 1).unwrap(), ) - .unwrap(); + .unwrap(); //Set up some window to look at for the test @@ -326,13 +324,13 @@ fn main() { recreate_swapchain = true; } - let clear_values = vec![[0.0, 0.0, 1.0, 1.0].into()]; + let clear_values = vec![ClearValue::Float([0.0, 0.0, 1.0, 1.0]).into()]; let mut builder = AutoCommandBufferBuilder::primary( device.clone(), queue.family(), CommandBufferUsage::OneTimeSubmit, ) - .unwrap(); + .unwrap(); let frame_start = Instant::now(); egui_ctx.begin_frame(egui_winit.take_egui_input(surface.window())); @@ -376,9 +374,11 @@ fn main() { // Do your usual rendering builder .begin_render_pass( - framebuffers[image_num].clone(), + RenderPassBeginInfo { + clear_values, + ..RenderPassBeginInfo::framebuffer(framebuffers[image_num].clone()) + }, SubpassContents::Inline, - clear_values, ) .unwrap() .set_viewport(0, [viewport.clone()]) @@ -462,7 +462,7 @@ fn window_size_dependent_setup( ..Default::default() }, ) - .unwrap() + .unwrap() }) .collect::>() } diff --git a/src/lib.rs b/src/lib.rs index a1e7ba5..edaa95b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -11,18 +11,13 @@ use egui::epaint::{ use egui::{Color32, Context, Rect, TextureId}; use vulkano::buffer::{BufferAccess, BufferSlice, BufferUsage, CpuAccessibleBuffer}; use vulkano::command_buffer::SubpassContents::Inline; -use vulkano::command_buffer::{ - AutoCommandBufferBuilder, AutoCommandBufferBuilderContextError, CopyBufferImageError, - DrawIndexedError, PrimaryAutoCommandBuffer, -}; +use vulkano::command_buffer::{AutoCommandBufferBuilder, AutoCommandBufferBuilderContextError, BufferImageCopy, CopyBufferToImageInfo, CopyError, DrawIndexedError, PrimaryAutoCommandBuffer, RenderPassError}; use vulkano::descriptor_set::{ DescriptorSetCreationError, PersistentDescriptorSet, WriteDescriptorSet, }; use vulkano::device::{Device, Queue}; use vulkano::format::Format; -use vulkano::image::{ - ImageCreateFlags, ImageCreationError, ImageDimensions, ImageUsage, StorageImage, -}; +use vulkano::image::{ImageAccess, ImageCreateFlags, ImageCreationError, ImageDimensions, ImageSubresourceLayers, ImageUsage, StorageImage}; use vulkano::pipeline::graphics::color_blend::{AttachmentBlend, BlendFactor, ColorBlendState}; use vulkano::pipeline::graphics::input_assembly::InputAssemblyState; use vulkano::pipeline::graphics::rasterization::{CullMode, RasterizationState}; @@ -90,7 +85,7 @@ pub enum UpdateTexturesError { #[error(transparent)] Alloc(#[from] DeviceMemoryAllocationError), #[error(transparent)] - Copy(#[from] CopyBufferImageError), + Copy(#[from] CopyError), #[error(transparent)] CreateImage(#[from] ImageCreationError), } @@ -105,6 +100,8 @@ pub enum DrawError { CreateBuffersFailed(#[from] DeviceMemoryAllocationError), #[error(transparent)] DrawIndexedFailed(#[from] DrawIndexedError), + #[error(transparent)] + RenderPassFailed(#[from] RenderPassError), } #[must_use = "You must use this to avoid attempting to modify a texture that's still in use"] @@ -175,7 +172,7 @@ impl Painter { let img_buffer = CpuAccessibleBuffer::from_iter( self.device.clone(), - BufferUsage::transfer_source(), + BufferUsage::transfer_src(), false, image_data, )?; @@ -185,8 +182,18 @@ impl Painter { None => [0, 0, 0], Some(pos) => [pos[0] as u32, pos[1] as u32, 0], }; - - builder.copy_buffer_to_image_dimensions(img_buffer, image, offset, size, 0, 1, 0)?; +//, offset, size, 0, 1, 0).regions + builder.copy_buffer_to_image(CopyBufferToImageInfo { + regions: [ + BufferImageCopy { + image_extent: size, + image_offset: offset, + image_subresource: image.subresource_layers(), + ..Default::default() + } + ].into(), + ..CopyBufferToImageInfo::buffer_image(img_buffer, image) + })?; Ok(()) } @@ -426,7 +433,7 @@ fn create_image( let format = Format::R8G8B8A8_SRGB; let usage = ImageUsage { - transfer_destination: true, + transfer_dst: true, sampled: true, storage: false, ..ImageUsage::none() From e16e85ac64f4c5d3f904523242c7e7388267546f Mon Sep 17 00:00:00 2001 From: Frederic Nieto Date: Mon, 8 Aug 2022 04:19:01 +0200 Subject: [PATCH 2/4] fixed scaling issues --- examples/example.rs | 5 ++--- src/lib.rs | 5 +++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/examples/example.rs b/examples/example.rs index ae8f0f8..4e4a6c6 100644 --- a/examples/example.rs +++ b/examples/example.rs @@ -390,12 +390,11 @@ fn main() { // Build your gui // Automatically start the next render subpass and draw the gui - let size = surface.window().inner_size(); - let sf: f32 = surface.window().scale_factor() as f32; + let size = surface.window().inner_size().to_logical(surface.window().scale_factor()); egui_painter .draw( &mut builder, - [(size.width as f32) / sf, (size.height as f32) / sf], + [size.width, size.height], &egui_ctx, egui_output.shapes, ) diff --git a/src/lib.rs b/src/lib.rs index a1e7ba5..9007a80 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -304,13 +304,14 @@ impl Painter { return Ok(()); } + let sf = egui_ctx.pixels_per_point(); let (vertex_buf, index_buf) = self.create_buffers((verts, indices))?; for (idx, clip) in clips.iter().enumerate() { let mut scissors = Vec::with_capacity(1); let o = clip.min; - let (w, h) = (clip.width() as u32, clip.height() as u32); + let (w, h) = ((clip.width() * sf) as u32, (clip.height() * sf) as u32); scissors.push(Scissor { - origin: [(o.x as u32), (o.y as u32)], + origin: [(o.x * sf) as u32, (o.y * sf) as u32], dimensions: [w, h], }); builder.set_scissor(0, scissors); From 1bef5385c28cd64b59c5cb1795aa03e889abe2f0 Mon Sep 17 00:00:00 2001 From: Frederic Nieto Date: Mon, 8 Aug 2022 17:46:01 +0200 Subject: [PATCH 3/4] updated to vulkano 0.30 (storage image changed to immutable image due to conflicts being checked in newer version) --- examples/example.rs | 70 +++++++-------- src/lib.rs | 205 +++++++++++++++++++++++++++----------------- 2 files changed, 160 insertions(+), 115 deletions(-) diff --git a/examples/example.rs b/examples/example.rs index 4472055..09dbf92 100644 --- a/examples/example.rs +++ b/examples/example.rs @@ -18,7 +18,7 @@ use vulkano::device::{Device, DeviceCreateInfo, DeviceExtensions, QueueCreateInf use vulkano::format::{ClearValue, Format}; use vulkano::image::view::ImageView; use vulkano::image::{ImageAccess, ImageUsage, SwapchainImage}; -use vulkano::instance::{Instance, InstanceCreateInfo}; +use vulkano::instance::{Instance, InstanceCreateInfo, InstanceExtensions}; use vulkano::pipeline::graphics::input_assembly::InputAssemblyState; use vulkano::pipeline::graphics::vertex_input::BuffersDefinition; use vulkano::pipeline::graphics::viewport::Viewport; @@ -28,46 +28,48 @@ use vulkano::render_pass::{Framebuffer, FramebufferCreateInfo, RenderPass, Subpa use vulkano::swapchain::{AcquireError, Swapchain, SwapchainCreateInfo, SwapchainCreationError}; use vulkano::sync::{FenceSignalFuture, FlushError, GpuFuture}; use vulkano::{swapchain, sync}; +use vulkano::instance::debug::{DebugUtilsMessenger, DebugUtilsMessengerCreateInfo}; use vulkano_win::VkSurfaceBuild; use winit::event::{Event, WindowEvent}; use winit::event_loop::{ControlFlow, EventLoop}; use winit::window::{Fullscreen, Window, WindowBuilder}; -pub enum FrameEndFuture { - FenceSignalFuture(FenceSignalFuture), - BoxedFuture(Box), -} +pub struct FrameEndFuture(Box); -impl FrameEndFuture { +impl FrameEndFuture { pub fn now(device: Arc) -> Self { - Self::BoxedFuture(sync::now(device).boxed()) + Self(sync::now(device).boxed()) } pub fn get(self) -> Box { - match self { - FrameEndFuture::FenceSignalFuture(f) => f.boxed(), - FrameEndFuture::BoxedFuture(f) => f, - } + self.0 } } -impl AsMut for FrameEndFuture { +impl AsMut for FrameEndFuture { fn as_mut(&mut self) -> &mut (dyn GpuFuture + 'static) { - match self { - FrameEndFuture::FenceSignalFuture(f) => f, - FrameEndFuture::BoxedFuture(f) => f, - } + self.0.as_mut() } } fn main() { let required_extensions = vulkano_win::required_extensions(); + for layer in vulkano::instance::layers_list().unwrap() { + println!("Available layer: {}", layer.name()); + } let instance = Instance::new(InstanceCreateInfo { enabled_extensions: required_extensions, + enabled_layers: vec!["VK_LAYER_KHRONOS_validation".into()], ..Default::default() - }) - .unwrap(); - + }).unwrap(); + let _callback = unsafe { + DebugUtilsMessenger::new( + instance.clone(), + DebugUtilsMessengerCreateInfo::user_callback(Arc::new(|msg| { + println!("Debug callback: {:?}", msg.description); + })), + ).ok() + }; let physical = PhysicalDevice::enumerate(&instance).next().unwrap(); println!( @@ -240,7 +242,7 @@ fn main() { let mut recreate_swapchain = false; - let mut previous_frame_end = Some(FrameEndFuture::now(device.clone())); + let mut previous_frame_end: Option> = Some(sync::now(device.clone()).boxed()); //Set up everything need to draw the gui let window = surface.window(); @@ -365,12 +367,10 @@ fn main() { let platform_output = egui_output.platform_output; egui_winit.handle_platform_output(surface.window(), &egui_ctx, platform_output); - let result = egui_painter - .update_textures(egui_output.textures_delta, &mut builder) + let tex_future = egui_painter + .update_textures(egui_output.textures_delta) .expect("egui texture error"); - let wait_for_last_frame = result == UpdateTexturesResult::Changed; - // Do your usual rendering builder .begin_render_pass( @@ -406,18 +406,11 @@ fn main() { builder.end_render_pass().unwrap(); let command_buffer = builder.build().unwrap(); - - if wait_for_last_frame { - if let Some(FrameEndFuture::FenceSignalFuture(ref mut f)) = previous_frame_end { - f.wait(None).unwrap(); - } + let mut future_mut = acquire_future.join(tex_future).boxed(); + if let Some(future) = previous_frame_end.take() { + future_mut = future_mut.join(future).boxed(); } - - let future = previous_frame_end - .take() - .unwrap() - .get() - .join(acquire_future) + let future = future_mut .then_execute(queue.clone(), command_buffer) .unwrap() .then_swapchain_present(queue.clone(), swapchain.clone(), image_num) @@ -425,15 +418,16 @@ fn main() { match future { Ok(future) => { - previous_frame_end = Some(FrameEndFuture::FenceSignalFuture(future)); + future.wait(None).unwrap(); + previous_frame_end = Some(sync::now(device.clone()).boxed()); } Err(FlushError::OutOfDate) => { recreate_swapchain = true; - previous_frame_end = Some(FrameEndFuture::now(device.clone())); + previous_frame_end = Some(sync::now(device.clone()).boxed()); } Err(e) => { println!("Failed to flush future: {:?}", e); - previous_frame_end = Some(FrameEndFuture::now(device.clone())); + previous_frame_end = Some(sync::now(device.clone()).boxed()); } } } diff --git a/src/lib.rs b/src/lib.rs index dce4d60..0e78b9c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -11,13 +11,13 @@ use egui::epaint::{ use egui::{Color32, Context, Rect, TextureId}; use vulkano::buffer::{BufferAccess, BufferSlice, BufferUsage, CpuAccessibleBuffer}; use vulkano::command_buffer::SubpassContents::Inline; -use vulkano::command_buffer::{AutoCommandBufferBuilder, AutoCommandBufferBuilderContextError, BufferImageCopy, CopyBufferToImageInfo, CopyError, DrawIndexedError, PrimaryAutoCommandBuffer, RenderPassError}; +use vulkano::command_buffer::{AutoCommandBufferBuilder, AutoCommandBufferBuilderContextError, BufferImageCopy, CommandBufferExecFuture, CommandBufferUsage, CopyBufferToImageInfo, CopyError, CopyImageInfo, DrawIndexedError, PrimaryAutoCommandBuffer, PrimaryCommandBuffer, RenderPassError}; use vulkano::descriptor_set::{ DescriptorSetCreationError, PersistentDescriptorSet, WriteDescriptorSet, }; use vulkano::device::{Device, Queue}; use vulkano::format::Format; -use vulkano::image::{ImageAccess, ImageCreateFlags, ImageCreationError, ImageDimensions, ImageSubresourceLayers, ImageUsage, StorageImage}; +use vulkano::image::{ImageAccess, ImageCreateFlags, ImageCreationError, ImageDimensions, ImageLayout, ImageSubresourceLayers, ImageUsage, ImmutableImage, MipmapsCount, StorageImage}; use vulkano::pipeline::graphics::color_blend::{AttachmentBlend, BlendFactor, ColorBlendState}; use vulkano::pipeline::graphics::input_assembly::InputAssemblyState; use vulkano::pipeline::graphics::rasterization::{CullMode, RasterizationState}; @@ -63,10 +63,13 @@ vulkano::impl_vertex!(Vertex, pos, uv, color); use thiserror::Error; use vulkano::command_buffer::pool::CommandPoolBuilderAlloc; +use vulkano::image::immutable::ImmutableImageCreationError; use vulkano::image::view::{ImageView, ImageViewCreationError}; use vulkano::memory::DeviceMemoryAllocationError; use vulkano::pipeline::graphics::vertex_input::BuffersDefinition; use vulkano::render_pass::Subpass; +use vulkano::sync; +use vulkano::sync::{GpuFuture, NowFuture}; #[derive(Error, Debug)] pub enum PainterCreationError { @@ -88,6 +91,8 @@ pub enum UpdateTexturesError { Copy(#[from] CopyError), #[error(transparent)] CreateImage(#[from] ImageCreationError), + #[error(transparent)] + ImmutableCreateImage(#[from] ImmutableImageCreationError), } #[derive(Error, Debug)] @@ -123,9 +128,9 @@ pub struct Painter { pub pipeline: Arc, /// Texture sampler used to render the gui. pub sampler: Arc, - images: HashMap>, - texture_sets: HashMap>, - texture_free_queue: Vec, + images: HashMap>, + texture_sets: HashMap>, + texture_free_queue: Vec, } impl Painter { @@ -149,76 +154,37 @@ impl Painter { }) } - fn write_image_delta

( - &mut self, - image: Arc, - delta: &ImageDelta, - builder: &mut AutoCommandBufferBuilder, P>, - ) -> Result<(), UpdateTexturesError> - where - P: CommandPoolBuilderAlloc, - { - let image_data = match &delta.image { - ImageData::Color(image) => image - .pixels - .iter() - .flat_map(|c| c.to_array()) - .collect::>(), - ImageData::Font(image) => image - .srgba_pixels(1.0) - .flat_map(|c| c.to_array()) - .collect::>(), - }; - - let img_buffer = CpuAccessibleBuffer::from_iter( - self.device.clone(), - BufferUsage::transfer_src(), - false, - image_data, - )?; - - let size = [delta.image.width() as u32, delta.image.height() as u32, 1]; - let offset = match delta.pos { - None => [0, 0, 0], - Some(pos) => [pos[0] as u32, pos[1] as u32, 0], - }; -//, offset, size, 0, 1, 0).regions - builder.copy_buffer_to_image(CopyBufferToImageInfo { - regions: [ - BufferImageCopy { - image_extent: size, - image_offset: offset, - image_subresource: image.subresource_layers(), - ..Default::default() - } - ].into(), - ..CopyBufferToImageInfo::buffer_image(img_buffer, image) - })?; - Ok(()) - } - /// Uploads all newly created and modified textures to the GPU. /// Has to be called before entering the first render pass. /// If the return value is [`UpdateTexturesResult::Changed`], /// a texture will be changed in this frame and you need to wait for the last frame to finish /// before submitting the command buffer for this frame. - pub fn update_textures

( + pub fn update_textures( &mut self, textures_delta: TexturesDelta, - builder: &mut AutoCommandBufferBuilder, P>, - ) -> Result - where - P: CommandPoolBuilderAlloc, + ) -> Result { for texture_id in textures_delta.free { self.texture_free_queue.push(texture_id); } - let mut result = UpdateTexturesResult::Unchanged; + let mut cbb = AutoCommandBufferBuilder::primary( + self.queue.device().clone(), + self.queue.family(), + CommandBufferUsage::OneTimeSubmit, + ).map_err(ImmutableImageCreationError::from)?; for (texture_id, delta) in &textures_delta.set { - let image = if delta.is_whole() { - let image = create_image(self.queue.clone(), &delta.image)?; + + let image = if let Some(image) = self.images.remove(texture_id) { + if delta.is_whole() { + create_immutable_image_full(&self.queue, &delta.image, &mut cbb)? + } else { + create_immutable_image_part(&self.queue, &delta, &image, &mut cbb)? + } + } else { + create_immutable_image_full(&self.queue, &delta.image, &mut cbb)? + }; let layout = &self.pipeline.layout().set_layouts()[0]; let set = PersistentDescriptorSet::new( @@ -232,15 +198,14 @@ impl Painter { self.texture_sets.insert(*texture_id, set); self.images.insert(*texture_id, image.clone()); - image - } else { - result = UpdateTexturesResult::Changed; //modifying an existing image that might be in use - self.images[texture_id].clone() - }; - self.write_image_delta(image, delta, builder)?; } + let cb = cbb.build().unwrap(); - Ok(result) + let future = match cb.execute(self.queue.clone()) { + Ok(f) => f, + Err(e) => unreachable!("{:?}", e), + }; + Ok(future) } /// Free textures freed by egui, *after* drawing @@ -420,11 +385,11 @@ fn create_sampler(device: Arc) -> Result, SamplerCreationEr ) } -/// Create a Vulkano image for the given egui texture -fn create_image( - queue: Arc, +fn create_immutable_image_full( + queue: &Arc, texture: &ImageData, -) -> Result, ImageCreationError> { + cbb: &mut AutoCommandBufferBuilder +) -> Result, ImmutableImageCreationError> { let dimensions = ImageDimensions::Dim2d { width: texture.width() as u32, height: texture.height() as u32, @@ -433,21 +398,107 @@ fn create_image( let format = Format::R8G8B8A8_SRGB; + let image_data = match texture { + ImageData::Color(image) => image + .pixels + .iter() + .flat_map(|c| c.to_array()) + .collect::>(), + ImageData::Font(image) => image + .srgba_pixels(1.0) + .flat_map(|c| c.to_array()) + .collect::>(), + }; + + let img_buffer = CpuAccessibleBuffer::from_iter( + queue.device().clone(), + BufferUsage::transfer_src(), + false, + image_data, + )?; + + + let flags = ImageCreateFlags::none(); + let layout = ImageLayout::ShaderReadOnlyOptimal; let usage = ImageUsage { transfer_dst: true, + transfer_src: true, sampled: true, - storage: false, ..ImageUsage::none() }; - - let image = StorageImage::with_usage( + let (image, initializer) = ImmutableImage::uninitialized( queue.device().clone(), dimensions, format, + MipmapsCount::One, usage, - ImageCreateFlags::none(), - [queue.family()], + flags, + layout, + vec![queue.family()], )?; + cbb.copy_buffer_to_image(CopyBufferToImageInfo::buffer_image(img_buffer, initializer)).unwrap(); + Ok(image) } + +fn create_immutable_image_part( + queue: &Arc, + delta: &ImageDelta, + old: &Arc, + cbb: &mut AutoCommandBufferBuilder +) -> Result, ImmutableImageCreationError> { + + let image_data = match &delta.image { + ImageData::Color(image) => image + .pixels + .iter() + .flat_map(|c| c.to_array()) + .collect::>(), + ImageData::Font(image) => image + .srgba_pixels(1.0) + .flat_map(|c| c.to_array()) + .collect::>(), + }; + + let img_buffer = CpuAccessibleBuffer::from_iter( + queue.device().clone(), + BufferUsage::transfer_src(), + false, + image_data, + )?; + + let flags = ImageCreateFlags::none(); + let layout = ImageLayout::ShaderReadOnlyOptimal; + + let (image, initializer) = ImmutableImage::uninitialized( + queue.device().clone(), + old.dimensions(), + old.format(), + MipmapsCount::One, + old.usage().clone(), + flags, + layout, + vec![queue.family()], + )?; + + cbb.copy_image(CopyImageInfo::images(old.clone(), initializer.clone())).unwrap(); + + let size = [delta.image.width() as u32, delta.image.height() as u32, 1]; + let offset = match delta.pos { + None => [0, 0, 0], + Some(pos) => [pos[0] as u32, pos[1] as u32, 0], + }; + cbb.copy_buffer_to_image(CopyBufferToImageInfo { + regions: [ + BufferImageCopy { + image_extent: size, + image_offset: offset, + image_subresource: initializer.subresource_layers(), + ..Default::default() + } + ].into(), + ..CopyBufferToImageInfo::buffer_image(img_buffer, initializer) + }).unwrap(); + Ok(image) +} \ No newline at end of file From 02ca7f81df42ace9577f5c669e42d76b56c8112c Mon Sep 17 00:00:00 2001 From: Frederic Nieto Date: Mon, 15 Aug 2022 07:32:34 +0200 Subject: [PATCH 4/4] fixed non window ppp clipping issues --- examples/example.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/example.rs b/examples/example.rs index 09dbf92..20dbc95 100644 --- a/examples/example.rs +++ b/examples/example.rs @@ -390,7 +390,7 @@ fn main() { // Build your gui // Automatically start the next render subpass and draw the gui - let size = surface.window().inner_size().to_logical(surface.window().scale_factor()); + let size = surface.window().inner_size().to_logical(egui_ctx.pixels_per_point() as _); egui_painter .draw( &mut builder,