Adding copy_texture_to_buffer and copy_texture_to_texture (#1236)
* Adding copy_texture_to_buffer and copy_texture_to_texture * Adding CopyTextureToTexture and CopyTextureToBuffer in CommandQueue
This commit is contained in:
parent
6a0116e994
commit
cf0e9f9968
@ -23,6 +23,24 @@ pub enum Command {
|
|||||||
destination_mip_level: u32,
|
destination_mip_level: u32,
|
||||||
size: Extent3d,
|
size: Extent3d,
|
||||||
},
|
},
|
||||||
|
CopyTextureToTexture {
|
||||||
|
source_texture: TextureId,
|
||||||
|
source_origin: [u32; 3],
|
||||||
|
source_mip_level: u32,
|
||||||
|
destination_texture: TextureId,
|
||||||
|
destination_origin: [u32; 3],
|
||||||
|
destination_mip_level: u32,
|
||||||
|
size: Extent3d,
|
||||||
|
},
|
||||||
|
CopyTextureToBuffer {
|
||||||
|
source_texture: TextureId,
|
||||||
|
source_origin: [u32; 3],
|
||||||
|
source_mip_level: u32,
|
||||||
|
destination_buffer: BufferId,
|
||||||
|
destination_offset: u64,
|
||||||
|
destination_bytes_per_row: u32,
|
||||||
|
size: Extent3d,
|
||||||
|
},
|
||||||
// TODO: Frees probably don't need to be queued?
|
// TODO: Frees probably don't need to be queued?
|
||||||
FreeBuffer(BufferId),
|
FreeBuffer(BufferId),
|
||||||
}
|
}
|
||||||
@ -77,6 +95,50 @@ impl CommandQueue {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[allow(clippy::too_many_arguments)]
|
||||||
|
pub fn copy_texture_to_buffer(
|
||||||
|
&mut self,
|
||||||
|
source_texture: TextureId,
|
||||||
|
source_origin: [u32; 3],
|
||||||
|
source_mip_level: u32,
|
||||||
|
destination_buffer: BufferId,
|
||||||
|
destination_offset: u64,
|
||||||
|
destination_bytes_per_row: u32,
|
||||||
|
size: Extent3d,
|
||||||
|
) {
|
||||||
|
self.push(Command::CopyTextureToBuffer {
|
||||||
|
source_texture,
|
||||||
|
source_origin,
|
||||||
|
source_mip_level,
|
||||||
|
destination_buffer,
|
||||||
|
destination_offset,
|
||||||
|
destination_bytes_per_row,
|
||||||
|
size,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
#[allow(clippy::too_many_arguments)]
|
||||||
|
pub fn copy_texture_to_texture(
|
||||||
|
&mut self,
|
||||||
|
source_texture: TextureId,
|
||||||
|
source_origin: [u32; 3],
|
||||||
|
source_mip_level: u32,
|
||||||
|
destination_texture: TextureId,
|
||||||
|
destination_origin: [u32; 3],
|
||||||
|
destination_mip_level: u32,
|
||||||
|
size: Extent3d,
|
||||||
|
) {
|
||||||
|
self.push(Command::CopyTextureToTexture {
|
||||||
|
source_texture,
|
||||||
|
source_origin,
|
||||||
|
source_mip_level,
|
||||||
|
destination_texture,
|
||||||
|
destination_origin,
|
||||||
|
destination_mip_level,
|
||||||
|
size,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
pub fn free_buffer(&mut self, buffer: BufferId) {
|
pub fn free_buffer(&mut self, buffer: BufferId) {
|
||||||
self.push(Command::FreeBuffer(buffer));
|
self.push(Command::FreeBuffer(buffer));
|
||||||
}
|
}
|
||||||
@ -118,6 +180,40 @@ impl CommandQueue {
|
|||||||
destination_mip_level,
|
destination_mip_level,
|
||||||
size,
|
size,
|
||||||
),
|
),
|
||||||
|
Command::CopyTextureToTexture {
|
||||||
|
source_texture,
|
||||||
|
source_origin,
|
||||||
|
source_mip_level,
|
||||||
|
destination_texture,
|
||||||
|
destination_origin,
|
||||||
|
destination_mip_level,
|
||||||
|
size,
|
||||||
|
} => render_context.copy_texture_to_texture(
|
||||||
|
source_texture,
|
||||||
|
source_origin,
|
||||||
|
source_mip_level,
|
||||||
|
destination_texture,
|
||||||
|
destination_origin,
|
||||||
|
destination_mip_level,
|
||||||
|
size,
|
||||||
|
),
|
||||||
|
Command::CopyTextureToBuffer {
|
||||||
|
source_texture,
|
||||||
|
source_origin,
|
||||||
|
source_mip_level,
|
||||||
|
destination_buffer,
|
||||||
|
destination_offset,
|
||||||
|
destination_bytes_per_row,
|
||||||
|
size,
|
||||||
|
} => render_context.copy_texture_to_buffer(
|
||||||
|
source_texture,
|
||||||
|
source_origin,
|
||||||
|
source_mip_level,
|
||||||
|
destination_buffer,
|
||||||
|
destination_offset,
|
||||||
|
destination_bytes_per_row,
|
||||||
|
size,
|
||||||
|
),
|
||||||
Command::FreeBuffer(buffer) => render_context.resources().remove_buffer(buffer),
|
Command::FreeBuffer(buffer) => render_context.resources().remove_buffer(buffer),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -27,6 +27,28 @@ pub trait RenderContext {
|
|||||||
destination_mip_level: u32,
|
destination_mip_level: u32,
|
||||||
size: Extent3d,
|
size: Extent3d,
|
||||||
);
|
);
|
||||||
|
#[allow(clippy::too_many_arguments)]
|
||||||
|
fn copy_texture_to_buffer(
|
||||||
|
&mut self,
|
||||||
|
source_texture: TextureId,
|
||||||
|
source_origin: [u32; 3],
|
||||||
|
source_mip_level: u32,
|
||||||
|
destination_buffer: BufferId,
|
||||||
|
destination_offset: u64,
|
||||||
|
destination_bytes_per_row: u32,
|
||||||
|
size: Extent3d,
|
||||||
|
);
|
||||||
|
#[allow(clippy::too_many_arguments)]
|
||||||
|
fn copy_texture_to_texture(
|
||||||
|
&mut self,
|
||||||
|
source_texture: TextureId,
|
||||||
|
source_origin: [u32; 3],
|
||||||
|
source_mip_level: u32,
|
||||||
|
destination_texture: TextureId,
|
||||||
|
destination_origin: [u32; 3],
|
||||||
|
destination_mip_level: u32,
|
||||||
|
size: Extent3d,
|
||||||
|
);
|
||||||
fn begin_pass(
|
fn begin_pass(
|
||||||
&mut self,
|
&mut self,
|
||||||
pass_descriptor: &PassDescriptor,
|
pass_descriptor: &PassDescriptor,
|
||||||
|
@ -114,6 +114,50 @@ impl RenderContext for WgpuRenderContext {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn copy_texture_to_buffer(
|
||||||
|
&mut self,
|
||||||
|
source_texture: TextureId,
|
||||||
|
source_origin: [u32; 3],
|
||||||
|
source_mip_level: u32,
|
||||||
|
destination_buffer: BufferId,
|
||||||
|
destination_offset: u64,
|
||||||
|
destination_bytes_per_row: u32,
|
||||||
|
size: Extent3d,
|
||||||
|
) {
|
||||||
|
self.render_resource_context.copy_texture_to_buffer(
|
||||||
|
self.command_encoder.get_or_create(&self.device),
|
||||||
|
source_texture,
|
||||||
|
source_origin,
|
||||||
|
source_mip_level,
|
||||||
|
destination_buffer,
|
||||||
|
destination_offset,
|
||||||
|
destination_bytes_per_row,
|
||||||
|
size,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn copy_texture_to_texture(
|
||||||
|
&mut self,
|
||||||
|
source_texture: TextureId,
|
||||||
|
source_origin: [u32; 3],
|
||||||
|
source_mip_level: u32,
|
||||||
|
destination_texture: TextureId,
|
||||||
|
destination_origin: [u32; 3],
|
||||||
|
destination_mip_level: u32,
|
||||||
|
size: Extent3d,
|
||||||
|
) {
|
||||||
|
self.render_resource_context.copy_texture_to_texture(
|
||||||
|
self.command_encoder.get_or_create(&self.device),
|
||||||
|
source_texture,
|
||||||
|
source_origin,
|
||||||
|
source_mip_level,
|
||||||
|
destination_texture,
|
||||||
|
destination_origin,
|
||||||
|
destination_mip_level,
|
||||||
|
size,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
fn resources(&self) -> &dyn RenderResourceContext {
|
fn resources(&self) -> &dyn RenderResourceContext {
|
||||||
&self.render_resource_context
|
&self.render_resource_context
|
||||||
}
|
}
|
||||||
|
@ -65,6 +65,83 @@ impl WgpuRenderResourceContext {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[allow(clippy::too_many_arguments)]
|
||||||
|
pub fn copy_texture_to_texture(
|
||||||
|
&self,
|
||||||
|
command_encoder: &mut wgpu::CommandEncoder,
|
||||||
|
source_texture: TextureId,
|
||||||
|
source_origin: [u32; 3], // TODO: replace with math type
|
||||||
|
source_mip_level: u32,
|
||||||
|
destination_texture: TextureId,
|
||||||
|
destination_origin: [u32; 3], // TODO: replace with math type
|
||||||
|
destination_mip_level: u32,
|
||||||
|
size: Extent3d,
|
||||||
|
) {
|
||||||
|
let textures = self.resources.textures.read();
|
||||||
|
let source = textures.get(&source_texture).unwrap();
|
||||||
|
let destination = textures.get(&destination_texture).unwrap();
|
||||||
|
command_encoder.copy_texture_to_texture(
|
||||||
|
wgpu::TextureCopyView {
|
||||||
|
texture: source,
|
||||||
|
mip_level: source_mip_level,
|
||||||
|
origin: wgpu::Origin3d {
|
||||||
|
x: source_origin[0],
|
||||||
|
y: source_origin[1],
|
||||||
|
z: source_origin[2],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
wgpu::TextureCopyView {
|
||||||
|
texture: destination,
|
||||||
|
mip_level: destination_mip_level,
|
||||||
|
origin: wgpu::Origin3d {
|
||||||
|
x: destination_origin[0],
|
||||||
|
y: destination_origin[1],
|
||||||
|
z: destination_origin[2],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
size.wgpu_into(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[allow(clippy::too_many_arguments)]
|
||||||
|
pub fn copy_texture_to_buffer(
|
||||||
|
&self,
|
||||||
|
command_encoder: &mut wgpu::CommandEncoder,
|
||||||
|
source_texture: TextureId,
|
||||||
|
source_origin: [u32; 3], // TODO: replace with math type
|
||||||
|
source_mip_level: u32,
|
||||||
|
destination_buffer: BufferId,
|
||||||
|
destination_offset: u64,
|
||||||
|
destination_bytes_per_row: u32,
|
||||||
|
size: Extent3d,
|
||||||
|
) {
|
||||||
|
let buffers = self.resources.buffers.read();
|
||||||
|
let textures = self.resources.textures.read();
|
||||||
|
|
||||||
|
let source = textures.get(&source_texture).unwrap();
|
||||||
|
let destination = buffers.get(&destination_buffer).unwrap();
|
||||||
|
command_encoder.copy_texture_to_buffer(
|
||||||
|
wgpu::TextureCopyView {
|
||||||
|
texture: source,
|
||||||
|
mip_level: source_mip_level,
|
||||||
|
origin: wgpu::Origin3d {
|
||||||
|
x: source_origin[0],
|
||||||
|
y: source_origin[1],
|
||||||
|
z: source_origin[2],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
wgpu::BufferCopyView {
|
||||||
|
buffer: destination,
|
||||||
|
layout: wgpu::TextureDataLayout {
|
||||||
|
offset: destination_offset,
|
||||||
|
bytes_per_row: destination_bytes_per_row,
|
||||||
|
rows_per_image: size.height,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
size.wgpu_into(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
#[allow(clippy::too_many_arguments)]
|
#[allow(clippy::too_many_arguments)]
|
||||||
pub fn copy_buffer_to_texture(
|
pub fn copy_buffer_to_texture(
|
||||||
&self,
|
&self,
|
||||||
|
Loading…
Reference in New Issue
Block a user