From d83045394cb07fd132c90c55fe538500e8f9dfb8 Mon Sep 17 00:00:00 2001 From: Till W Date: Fri, 12 Mar 2021 21:29:58 +0100 Subject: [PATCH] mipmaps actually broken rip --- src/game/mod.rs | 2 +- src/vulkan/mod.rs | 20 +++++++++++--------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/game/mod.rs b/src/game/mod.rs index df3c69c..85e7533 100644 --- a/src/game/mod.rs +++ b/src/game/mod.rs @@ -170,7 +170,7 @@ impl TestGame { self.texture_index_counter += 1; if self.log_config.mesh_load_info { - println!("Uploading texture took {:?}s", texture_start_time.elapsed().unwrap().as_secs()); + println!("Uploading texture took {:?}ms", texture_start_time.elapsed().unwrap().as_millis()); } } mesh_handles diff --git a/src/vulkan/mod.rs b/src/vulkan/mod.rs index 6795741..158e07f 100644 --- a/src/vulkan/mod.rs +++ b/src/vulkan/mod.rs @@ -2,7 +2,7 @@ use std::sync::Arc; use std::time::SystemTime; use cgmath::{Matrix4, SquareMatrix}; -use vulkano::{buffer::{BufferAccess, BufferUsage, CpuAccessibleBuffer}, command_buffer::{CommandBuffer, SubpassContents}, image::{ImageLayout, ImageUsage, MipmapsCount, immutable::SubImage}}; +use vulkano::{buffer::{BufferUsage, CpuAccessibleBuffer}, command_buffer::{CommandBuffer, SubpassContents}, image::{ImageLayout, ImageUsage, MipmapsCount, immutable::SubImage}}; use vulkano::command_buffer::{AutoCommandBuffer, AutoCommandBufferBuilder, DynamicState}; use vulkano::descriptor::DescriptorSet; use vulkano::device::{Device, DeviceExtensions, Queue}; @@ -467,17 +467,20 @@ impl VulkanRenderer { let mut offset: usize = 0; for i in 0..13 { + let mut mip_size = dimensions.width_height_depth(); + mip_size[0] = mip_size[0] / u32::pow(2, i); + mip_size[1] = mip_size[1] / u32::pow(2, i); + + // 4 bits per pixel in DXT1 -> 1/2 byte + let mip_byte_size = ((mip_size[0] * mip_size[1]) / 2) as usize; + let source = CpuAccessibleBuffer::from_iter( device.clone(), BufferUsage::transfer_source(), false, - bytes[offset..].iter().cloned(), + bytes[offset..(offset + mip_byte_size + 8)].iter().cloned(), // +8 because rounding errors??? ).unwrap(); - let mut mip_size = dimensions.width_height_depth(); - mip_size[0] = mip_size[0] / u32::pow(2, i); - mip_size[1] = mip_size[1] / u32::pow(2, i); - cbb.copy_buffer_to_image_dimensions( source.clone(), init.clone(), @@ -489,8 +492,7 @@ impl VulkanRenderer { ) .unwrap(); - // 4 bits per pixel -> 1/2 byte - offset += ((mip_size[0] * mip_size[1]) / 2) as usize; + offset += mip_byte_size; } let cb = cbb.build().unwrap(); @@ -503,7 +505,7 @@ impl VulkanRenderer { future.flush().unwrap(); let sampler = Sampler::new(device.clone(), Filter::Linear, Filter::Linear, - MipmapMode::Nearest, SamplerAddressMode::Repeat, SamplerAddressMode::Repeat, + MipmapMode::Linear, SamplerAddressMode::Repeat, SamplerAddressMode::Repeat, SamplerAddressMode::Repeat, 0.0, 1.0, 0.0, 12 as f32).unwrap(); self.game_data.textures.push(Texture { image: image_view, sampler });