writing brick to gpu
This commit is contained in:
@@ -1,14 +1,14 @@
|
|||||||
|
use wgpu::util::DeviceExt;
|
||||||
use std::convert::TryInto;
|
use std::convert::TryInto;
|
||||||
|
|
||||||
const BRICK_SIZE : usize = 32; // 32x32x32 brick size
|
const BRICK_SIZE : usize = 32; // 32x32x32 brick size
|
||||||
const BRICK_NUM : usize = 64; // 64 bricks in texture
|
const BRICK_NUM : usize = 10000; // 64 bricks in texture
|
||||||
|
|
||||||
const BRICK_LEN : usize = BRICK_SIZE*BRICK_SIZE*BRICK_SIZE;
|
const BRICK_LEN : usize = BRICK_SIZE*BRICK_SIZE*BRICK_SIZE;
|
||||||
const DATA_LEN : usize = BRICK_LEN * BRICK_NUM;
|
const DATA_LEN : usize = BRICK_LEN * BRICK_NUM;
|
||||||
|
|
||||||
struct BrickData {
|
struct BrickData {
|
||||||
data: Box<[u8]>
|
pub data: Box<[u8]>
|
||||||
}
|
}
|
||||||
|
|
||||||
impl BrickData {
|
impl BrickData {
|
||||||
@@ -24,11 +24,6 @@ impl BrickData {
|
|||||||
let offset = brick * BRICK_LEN;
|
let offset = brick * BRICK_LEN;
|
||||||
self.data[offset + local_idx] = value;
|
self.data[offset + local_idx] = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_1024(&mut self, offset: usize) -> [u8; 1024]
|
|
||||||
{
|
|
||||||
self.data[offset..offset+1024].try_into().expect("wrong size")
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -44,7 +39,7 @@ impl BrickBuffer {
|
|||||||
pub fn new(device: &wgpu::Device) -> Self {
|
pub fn new(device: &wgpu::Device) -> Self {
|
||||||
|
|
||||||
// Create texture
|
// Create texture
|
||||||
let size = wgpu::Extent3d { width: (BRICK_SIZE*BRICK_NUM) as u32, height: BRICK_SIZE as u32, depth: BRICK_SIZE as u32 };
|
let size = wgpu::Extent3d { width: BRICK_SIZE as u32, height: BRICK_SIZE as u32, depth: (BRICK_SIZE*BRICK_NUM) as u32 };
|
||||||
let texture = device.create_texture(
|
let texture = device.create_texture(
|
||||||
&wgpu::TextureDescriptor {
|
&wgpu::TextureDescriptor {
|
||||||
size: size,
|
size: size,
|
||||||
@@ -107,6 +102,24 @@ impl BrickBuffer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Done
|
// Done
|
||||||
|
println!("Brick buffer size: {} MB", DATA_LEN as f32 / 1024.0 / 1024.0);
|
||||||
Self { bricks, texture, size, bind_layout, bind_group }
|
Self { bricks, texture, size, bind_layout, bind_group }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn write(&mut self, queue: &wgpu::Queue)
|
||||||
|
{
|
||||||
|
return ();
|
||||||
|
|
||||||
|
// Get first brick
|
||||||
|
let brick_bytes : [u8;BRICK_LEN] = self.bricks.data[0..BRICK_LEN].try_into().unwrap();
|
||||||
|
let brick_size = wgpu::Extent3d{ width: BRICK_SIZE as u32, height: BRICK_SIZE as u32, depth: BRICK_SIZE as u32 };
|
||||||
|
|
||||||
|
// Write
|
||||||
|
queue.write_texture(
|
||||||
|
wgpu::TextureCopyView { texture: &self.texture, mip_level: 0, origin: wgpu::Origin3d::ZERO },
|
||||||
|
&brick_bytes,
|
||||||
|
wgpu::TextureDataLayout { offset: 0, bytes_per_row: self.size.width, rows_per_image: self.size.height },
|
||||||
|
brick_size
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
+7
-2
@@ -15,6 +15,7 @@ pub struct Renderer {
|
|||||||
raster_buffer: RasterBuffer,
|
raster_buffer: RasterBuffer,
|
||||||
uniform_buffer: UniformBuffer,
|
uniform_buffer: UniformBuffer,
|
||||||
node_buffer: NodeBuffer,
|
node_buffer: NodeBuffer,
|
||||||
|
brick_buffer: BrickBuffer,
|
||||||
// Camera
|
// Camera
|
||||||
pub camera: Camera,
|
pub camera: Camera,
|
||||||
}
|
}
|
||||||
@@ -105,16 +106,19 @@ impl Renderer {
|
|||||||
// Buffers
|
// Buffers
|
||||||
let uniform_buffer = UniformBuffer::new(&device);
|
let uniform_buffer = UniformBuffer::new(&device);
|
||||||
let raster_buffer = RasterBuffer::new(&device);
|
let raster_buffer = RasterBuffer::new(&device);
|
||||||
|
|
||||||
let mut node_buffer = NodeBuffer::new(&device);
|
let mut node_buffer = NodeBuffer::new(&device);
|
||||||
node_buffer.write(&queue);
|
node_buffer.write(&queue);
|
||||||
|
|
||||||
let mut brick_buffer = BrickBuffer::new(&device);
|
let mut brick_buffer = BrickBuffer::new(&device);
|
||||||
|
brick_buffer.write(&queue);
|
||||||
|
|
||||||
// Pipeline
|
// Pipeline
|
||||||
let pipeline = Self::create_pipeline(&device, &swapchain_desc, &[&uniform_buffer.bind_layout, &node_buffer.bind_layout]);
|
let pipeline = Self::create_pipeline(&device, &swapchain_desc, &[&uniform_buffer.bind_layout, &node_buffer.bind_layout, &brick_buffer.bind_layout]);
|
||||||
|
|
||||||
// Save values in app
|
// Save values in app
|
||||||
println!("Initialized");
|
println!("Initialized");
|
||||||
Self { surface, device, queue, swapchain_desc, swapchain, pipeline, raster_buffer, uniform_buffer, node_buffer, camera }
|
Self { surface, device, queue, swapchain_desc, swapchain, pipeline, raster_buffer, uniform_buffer, node_buffer, brick_buffer, camera }
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn resize(&mut self, new_size: Option<PhysicalSize<u32>>) {
|
pub fn resize(&mut self, new_size: Option<PhysicalSize<u32>>) {
|
||||||
@@ -162,6 +166,7 @@ impl Renderer {
|
|||||||
render_pass.set_pipeline(&self.pipeline);
|
render_pass.set_pipeline(&self.pipeline);
|
||||||
render_pass.set_bind_group(0, &self.uniform_buffer.bind_group, &[]);
|
render_pass.set_bind_group(0, &self.uniform_buffer.bind_group, &[]);
|
||||||
render_pass.set_bind_group(1, &self.node_buffer.bind_group, &[]);
|
render_pass.set_bind_group(1, &self.node_buffer.bind_group, &[]);
|
||||||
|
render_pass.set_bind_group(2, &self.brick_buffer.bind_group, &[]);
|
||||||
// Vertices and indices
|
// Vertices and indices
|
||||||
render_pass.set_vertex_buffer(0, self.raster_buffer.vertex_buffer.slice(..));
|
render_pass.set_vertex_buffer(0, self.raster_buffer.vertex_buffer.slice(..));
|
||||||
render_pass.set_index_buffer(self.raster_buffer.index_buffer.slice(..), wgpu::IndexFormat::Uint16);
|
render_pass.set_index_buffer(self.raster_buffer.index_buffer.slice(..), wgpu::IndexFormat::Uint16);
|
||||||
|
|||||||
Reference in New Issue
Block a user