wgpu: upgrade to latest master. use pollster instead of futures. texture copy alignment
This commit is contained in:
		
							parent
							
								
									69ac775bfb
								
							
						
					
					
						commit
						e72b5583d1
					
				@ -109,6 +109,8 @@ impl BaseRenderGraphBuilder for RenderGraph {
 | 
			
		||||
                        depth_store_op: StoreOp::Store,
 | 
			
		||||
                        stencil_load_op: LoadOp::Clear,
 | 
			
		||||
                        stencil_store_op: StoreOp::Store,
 | 
			
		||||
                        stencil_read_only: false,
 | 
			
		||||
                        depth_read_only: false,
 | 
			
		||||
                        clear_depth: 1.0,
 | 
			
		||||
                        clear_stencil: 0,
 | 
			
		||||
                    }),
 | 
			
		||||
 | 
			
		||||
@ -44,6 +44,8 @@ pub struct RenderPassDepthStencilAttachmentDescriptor {
 | 
			
		||||
    pub clear_depth: f32,
 | 
			
		||||
    pub stencil_load_op: LoadOp,
 | 
			
		||||
    pub stencil_store_op: StoreOp,
 | 
			
		||||
    pub depth_read_only: bool,
 | 
			
		||||
    pub stencil_read_only: bool,
 | 
			
		||||
    pub clear_stencil: u32,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -17,7 +17,6 @@ pub enum Command {
 | 
			
		||||
        destination_texture: RenderResource,
 | 
			
		||||
        destination_origin: [u32; 3],
 | 
			
		||||
        destination_mip_level: u32,
 | 
			
		||||
        destination_array_layer: u32,
 | 
			
		||||
        size: Extent3d,
 | 
			
		||||
    },
 | 
			
		||||
    // TODO: Frees probably don't need to be queued?
 | 
			
		||||
@ -60,7 +59,6 @@ impl CommandQueue {
 | 
			
		||||
        destination_texture: RenderResource,
 | 
			
		||||
        destination_origin: [u32; 3],
 | 
			
		||||
        destination_mip_level: u32,
 | 
			
		||||
        destination_array_layer: u32,
 | 
			
		||||
        size: Extent3d,
 | 
			
		||||
    ) {
 | 
			
		||||
        self.push(Command::CopyBufferToTexture {
 | 
			
		||||
@ -70,7 +68,6 @@ impl CommandQueue {
 | 
			
		||||
            destination_texture,
 | 
			
		||||
            destination_origin,
 | 
			
		||||
            destination_mip_level,
 | 
			
		||||
            destination_array_layer,
 | 
			
		||||
            size,
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
@ -102,7 +99,6 @@ impl CommandQueue {
 | 
			
		||||
                    destination_texture,
 | 
			
		||||
                    destination_origin,
 | 
			
		||||
                    destination_mip_level,
 | 
			
		||||
                    destination_array_layer,
 | 
			
		||||
                    size,
 | 
			
		||||
                } => render_context.copy_buffer_to_texture(
 | 
			
		||||
                    source_buffer,
 | 
			
		||||
@ -111,7 +107,6 @@ impl CommandQueue {
 | 
			
		||||
                    destination_texture,
 | 
			
		||||
                    destination_origin,
 | 
			
		||||
                    destination_mip_level,
 | 
			
		||||
                    destination_array_layer,
 | 
			
		||||
                    size,
 | 
			
		||||
                ),
 | 
			
		||||
                Command::FreeBuffer(buffer) => render_context.resources().remove_buffer(buffer),
 | 
			
		||||
 | 
			
		||||
@ -14,6 +14,11 @@ pub struct TextureCopyNode {
 | 
			
		||||
    pub texture_event_reader: EventReader<AssetEvent<Texture>>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub const ALIGNMENT: usize = 256;
 | 
			
		||||
fn get_aligned(data_size: f32) -> usize {
 | 
			
		||||
    ALIGNMENT * ((data_size / ALIGNMENT as f32).ceil() as usize)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl Node for TextureCopyNode {
 | 
			
		||||
    fn update(
 | 
			
		||||
        &mut self,
 | 
			
		||||
@ -30,12 +35,20 @@ impl Node for TextureCopyNode {
 | 
			
		||||
                AssetEvent::Created { handle } | AssetEvent::Modified { handle } => {
 | 
			
		||||
                    if let Some(texture) = textures.get(&handle) {
 | 
			
		||||
                        let texture_descriptor: TextureDescriptor = texture.into();
 | 
			
		||||
                        let width = texture.size.x() as usize; 
 | 
			
		||||
                        let aligned_width = get_aligned(texture.size.x());
 | 
			
		||||
                        let format_size = 4; // TODO: this will be incorrect for some formats
 | 
			
		||||
                        let mut aligned_data = vec![0; format_size * aligned_width * texture.size.y() as usize];
 | 
			
		||||
                        texture.data.chunks_exact(format_size * width).enumerate().for_each(|(index, row)| {
 | 
			
		||||
                           let offset = index * aligned_width * format_size;  
 | 
			
		||||
                           aligned_data[offset..(offset + width * format_size)].copy_from_slice(row);
 | 
			
		||||
                        });
 | 
			
		||||
                        let texture_buffer = render_context.resources().create_buffer_with_data(
 | 
			
		||||
                            BufferInfo {
 | 
			
		||||
                                buffer_usage: BufferUsage::COPY_SRC,
 | 
			
		||||
                                ..Default::default()
 | 
			
		||||
                            },
 | 
			
		||||
                            &texture.data,
 | 
			
		||||
                            &aligned_data,
 | 
			
		||||
                        );
 | 
			
		||||
 | 
			
		||||
                        let texture_resource = render_context
 | 
			
		||||
@ -43,15 +56,13 @@ impl Node for TextureCopyNode {
 | 
			
		||||
                            .get_asset_resource(*handle, TEXTURE_ASSET_INDEX)
 | 
			
		||||
                            .unwrap();
 | 
			
		||||
 | 
			
		||||
                        // TODO: bytes_per_row could be incorrect for some texture formats
 | 
			
		||||
                        render_context.copy_buffer_to_texture(
 | 
			
		||||
                            texture_buffer,
 | 
			
		||||
                            0,
 | 
			
		||||
                            4 * texture.size.x() as u32,
 | 
			
		||||
                            (format_size * aligned_width) as u32,
 | 
			
		||||
                            texture_resource,
 | 
			
		||||
                            [0, 0, 0],
 | 
			
		||||
                            0,
 | 
			
		||||
                            0,
 | 
			
		||||
                            texture_descriptor.size.clone(),
 | 
			
		||||
                        );
 | 
			
		||||
                        render_context.resources().remove_buffer(texture_buffer);
 | 
			
		||||
 | 
			
		||||
@ -2,18 +2,12 @@ use super::RenderResourceContext;
 | 
			
		||||
use crate::{
 | 
			
		||||
    pass::{PassDescriptor, RenderPass},
 | 
			
		||||
    render_resource::{RenderResource, RenderResourceAssignments},
 | 
			
		||||
    texture::{Extent3d, TextureDescriptor},
 | 
			
		||||
    texture::{Extent3d},
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
pub trait RenderContext {
 | 
			
		||||
    fn resources(&self) -> &dyn RenderResourceContext;
 | 
			
		||||
    fn resources_mut(&mut self) -> &mut dyn RenderResourceContext;
 | 
			
		||||
 | 
			
		||||
    fn create_texture_with_data(
 | 
			
		||||
        &mut self,
 | 
			
		||||
        texture_descriptor: TextureDescriptor,
 | 
			
		||||
        bytes: &[u8],
 | 
			
		||||
    ) -> RenderResource;
 | 
			
		||||
    fn copy_buffer_to_buffer(
 | 
			
		||||
        &mut self,
 | 
			
		||||
        source_buffer: RenderResource,
 | 
			
		||||
@ -30,7 +24,6 @@ pub trait RenderContext {
 | 
			
		||||
        destination_texture: RenderResource,
 | 
			
		||||
        destination_origin: [u32; 3],
 | 
			
		||||
        destination_mip_level: u32,
 | 
			
		||||
        destination_array_layer: u32,
 | 
			
		||||
        size: Extent3d,
 | 
			
		||||
    );
 | 
			
		||||
    fn begin_pass(
 | 
			
		||||
 | 
			
		||||
@ -11,7 +11,8 @@ pub struct SamplerDescriptor {
 | 
			
		||||
    pub mipmap_filter: FilterMode,
 | 
			
		||||
    pub lod_min_clamp: f32,
 | 
			
		||||
    pub lod_max_clamp: f32,
 | 
			
		||||
    pub compare_function: CompareFunction,
 | 
			
		||||
    pub compare_function: Option<CompareFunction>,
 | 
			
		||||
    pub anisotropy_clamp: Option<u8>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl Default for SamplerDescriptor {
 | 
			
		||||
@ -25,7 +26,8 @@ impl Default for SamplerDescriptor {
 | 
			
		||||
            mipmap_filter: FilterMode::Nearest,
 | 
			
		||||
            lod_min_clamp: -100.0,
 | 
			
		||||
            lod_max_clamp: 100.0,
 | 
			
		||||
            compare_function: CompareFunction::Always,
 | 
			
		||||
            compare_function: Some(CompareFunction::Always),
 | 
			
		||||
            anisotropy_clamp: None,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -41,7 +43,8 @@ impl From<&Texture> for SamplerDescriptor {
 | 
			
		||||
            mipmap_filter: FilterMode::Nearest,
 | 
			
		||||
            lod_min_clamp: -100.0,
 | 
			
		||||
            lod_max_clamp: 100.0,
 | 
			
		||||
            compare_function: CompareFunction::Always,
 | 
			
		||||
            compare_function: Some(CompareFunction::Always),
 | 
			
		||||
            anisotropy_clamp: None,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -19,10 +19,10 @@ bevy_winit = { path = "../bevy_winit", optional = true }
 | 
			
		||||
legion = { path = "../bevy_legion" }
 | 
			
		||||
 | 
			
		||||
# render
 | 
			
		||||
wgpu = { git = "https://github.com/gfx-rs/wgpu-rs.git", rev = "89ee5bffd3c37279f733b76b05e5d030aba035db" }
 | 
			
		||||
wgpu = { git = "https://github.com/gfx-rs/wgpu-rs.git", rev = "ff41d31200a5c5f0d7ddcd9a87b370c566936257" }
 | 
			
		||||
# wgpu = { version = "0.5.0" }
 | 
			
		||||
 | 
			
		||||
futures = "0.3"
 | 
			
		||||
pollster = "0.2.0"
 | 
			
		||||
log = { version = "0.4", features = ["release_max_level_info"] }
 | 
			
		||||
crossbeam-channel = "0.4.2"
 | 
			
		||||
crossbeam-utils = "0.7.2"
 | 
			
		||||
@ -125,7 +125,7 @@ impl WgpuResourceDiagnosticsPlugin {
 | 
			
		||||
            Self::SWAP_CHAIN_OUTPUTS,
 | 
			
		||||
            render_resource_context
 | 
			
		||||
                .resources
 | 
			
		||||
                .swap_chain_outputs
 | 
			
		||||
                .swap_chain_frames
 | 
			
		||||
                .read()
 | 
			
		||||
                .unwrap()
 | 
			
		||||
                .len() as f64,
 | 
			
		||||
 | 
			
		||||
@ -29,7 +29,7 @@ pub fn wgpu_render_system(resources: &mut Resources) -> impl FnMut(&mut World, &
 | 
			
		||||
    let mut wgpu_renderer = {
 | 
			
		||||
        let window_resized_event = resources.get::<Events<WindowResized>>().unwrap();
 | 
			
		||||
        let window_created_event = resources.get::<Events<WindowCreated>>().unwrap();
 | 
			
		||||
        futures::executor::block_on(WgpuRenderer::new(
 | 
			
		||||
        pollster::block_on(WgpuRenderer::new(
 | 
			
		||||
            window_resized_event.get_reader(),
 | 
			
		||||
            window_created_event.get_reader(),
 | 
			
		||||
        ))
 | 
			
		||||
 | 
			
		||||
@ -8,7 +8,7 @@ use bevy_render::{
 | 
			
		||||
    },
 | 
			
		||||
    render_resource::{RenderResource, RenderResourceAssignment, RenderResourceAssignments},
 | 
			
		||||
    renderer::{RenderContext, RenderResourceContext},
 | 
			
		||||
    texture::{Extent3d, TextureDescriptor},
 | 
			
		||||
    texture::Extent3d,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
use std::{collections::HashMap, sync::Arc};
 | 
			
		||||
@ -71,17 +71,6 @@ impl WgpuRenderContext {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl RenderContext for WgpuRenderContext {
 | 
			
		||||
    fn create_texture_with_data(
 | 
			
		||||
        &mut self,
 | 
			
		||||
        texture_descriptor: TextureDescriptor,
 | 
			
		||||
        bytes: &[u8],
 | 
			
		||||
    ) -> RenderResource {
 | 
			
		||||
        self.render_resources.create_texture_with_data(
 | 
			
		||||
            self.command_encoder.get_or_create(&self.device),
 | 
			
		||||
            texture_descriptor,
 | 
			
		||||
            bytes,
 | 
			
		||||
        )
 | 
			
		||||
    }
 | 
			
		||||
    fn copy_buffer_to_buffer(
 | 
			
		||||
        &mut self,
 | 
			
		||||
        source_buffer: RenderResource,
 | 
			
		||||
@ -108,7 +97,6 @@ impl RenderContext for WgpuRenderContext {
 | 
			
		||||
        destination_texture: RenderResource,
 | 
			
		||||
        destination_origin: [u32; 3],
 | 
			
		||||
        destination_mip_level: u32,
 | 
			
		||||
        destination_array_layer: u32,
 | 
			
		||||
        size: Extent3d,
 | 
			
		||||
    ) {
 | 
			
		||||
        self.render_resources.copy_buffer_to_texture(
 | 
			
		||||
@ -119,7 +107,6 @@ impl RenderContext for WgpuRenderContext {
 | 
			
		||||
            destination_texture,
 | 
			
		||||
            destination_origin,
 | 
			
		||||
            destination_mip_level,
 | 
			
		||||
            destination_array_layer,
 | 
			
		||||
            size,
 | 
			
		||||
        )
 | 
			
		||||
    }
 | 
			
		||||
@ -200,7 +187,7 @@ fn get_texture_view<'a>(
 | 
			
		||||
                panic!("Color attachment {} does not exist", name);
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        TextureAttachment::RenderResource(render_resource) => refs.textures.get(&render_resource).unwrap_or_else(|| &refs.swap_chain_outputs.get(&render_resource).unwrap().view),
 | 
			
		||||
        TextureAttachment::RenderResource(render_resource) => refs.textures.get(&render_resource).unwrap_or_else(|| &refs.swap_chain_frames.get(&render_resource).unwrap().output.view),
 | 
			
		||||
        TextureAttachment::Input(_) => panic!("Encountered unset TextureAttachment::Input. The RenderGraph executor should always set TextureAttachment::Inputs to TextureAttachment::RenderResource before running. This is a bug"),
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -257,5 +244,7 @@ fn create_wgpu_depth_stencil_attachment_descriptor<'a>(
 | 
			
		||||
        stencil_store_op: depth_stencil_attachment_descriptor
 | 
			
		||||
            .stencil_store_op
 | 
			
		||||
            .wgpu_into(),
 | 
			
		||||
        depth_read_only: depth_stencil_attachment_descriptor.depth_read_only,
 | 
			
		||||
        stencil_read_only: depth_stencil_attachment_descriptor.stencil_read_only,
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -36,46 +36,6 @@ impl WgpuRenderResourceContext {
 | 
			
		||||
        window_surfaces.insert(window_id, surface);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub fn create_texture_with_data(
 | 
			
		||||
        &mut self,
 | 
			
		||||
        command_encoder: &mut wgpu::CommandEncoder,
 | 
			
		||||
        texture_descriptor: TextureDescriptor,
 | 
			
		||||
        bytes: &[u8],
 | 
			
		||||
    ) -> RenderResource {
 | 
			
		||||
        let mut resource_info = self.resources.resource_info.write().unwrap();
 | 
			
		||||
        let mut texture_views = self.resources.texture_views.write().unwrap();
 | 
			
		||||
        let mut textures = self.resources.textures.write().unwrap();
 | 
			
		||||
 | 
			
		||||
        let descriptor: wgpu::TextureDescriptor = (&texture_descriptor).wgpu_into();
 | 
			
		||||
        let texture = self.device.create_texture(&descriptor);
 | 
			
		||||
        let texture_view = texture.create_default_view();
 | 
			
		||||
        let temp_buf = self
 | 
			
		||||
            .device
 | 
			
		||||
            .create_buffer_with_data(bytes, wgpu::BufferUsage::COPY_SRC);
 | 
			
		||||
        command_encoder.copy_buffer_to_texture(
 | 
			
		||||
            wgpu::BufferCopyView {
 | 
			
		||||
                buffer: &temp_buf,
 | 
			
		||||
                offset: 0,
 | 
			
		||||
                bytes_per_row: 4 * descriptor.size.width,
 | 
			
		||||
                rows_per_image: 0, // NOTE: Example sets this to 0, but should it be height?
 | 
			
		||||
            },
 | 
			
		||||
            wgpu::TextureCopyView {
 | 
			
		||||
                texture: &texture,
 | 
			
		||||
                mip_level: 0,
 | 
			
		||||
                array_layer: 0,
 | 
			
		||||
                origin: wgpu::Origin3d { x: 0, y: 0, z: 0 },
 | 
			
		||||
            },
 | 
			
		||||
            descriptor.size,
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        let resource = RenderResource::new();
 | 
			
		||||
        resource_info.insert(resource, ResourceInfo::Texture(texture_descriptor));
 | 
			
		||||
        texture_views.insert(resource, texture_view);
 | 
			
		||||
        textures.insert(resource, texture);
 | 
			
		||||
 | 
			
		||||
        resource
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub fn copy_buffer_to_buffer(
 | 
			
		||||
        &self,
 | 
			
		||||
        command_encoder: &mut wgpu::CommandEncoder,
 | 
			
		||||
@ -107,7 +67,6 @@ impl WgpuRenderResourceContext {
 | 
			
		||||
        destination_texture: RenderResource,
 | 
			
		||||
        destination_origin: [u32; 3], // TODO: replace with math type
 | 
			
		||||
        destination_mip_level: u32,
 | 
			
		||||
        destination_array_layer: u32,
 | 
			
		||||
        size: Extent3d,
 | 
			
		||||
    ) {
 | 
			
		||||
        let buffers = self.resources.buffers.read().unwrap();
 | 
			
		||||
@ -118,14 +77,15 @@ impl WgpuRenderResourceContext {
 | 
			
		||||
        command_encoder.copy_buffer_to_texture(
 | 
			
		||||
            wgpu::BufferCopyView {
 | 
			
		||||
                buffer: source,
 | 
			
		||||
                layout: wgpu::TextureDataLayout {
 | 
			
		||||
                    offset: source_offset,
 | 
			
		||||
                    bytes_per_row: source_bytes_per_row,
 | 
			
		||||
                    rows_per_image: 0, // NOTE: Example sets this to 0, but should it be height?
 | 
			
		||||
                },
 | 
			
		||||
            },
 | 
			
		||||
            wgpu::TextureCopyView {
 | 
			
		||||
                texture: destination,
 | 
			
		||||
                mip_level: destination_mip_level,
 | 
			
		||||
                array_layer: destination_array_layer,
 | 
			
		||||
                origin: wgpu::Origin3d {
 | 
			
		||||
                    x: destination_origin[0],
 | 
			
		||||
                    y: destination_origin[1],
 | 
			
		||||
@ -207,6 +167,7 @@ impl RenderResourceContext for WgpuRenderResourceContext {
 | 
			
		||||
            label: None,
 | 
			
		||||
            size: buffer_info.size as u64,
 | 
			
		||||
            usage: buffer_info.buffer_usage.wgpu_into(),
 | 
			
		||||
            mapped_at_creation: false,
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        let resource = RenderResource::new();
 | 
			
		||||
@ -220,14 +181,24 @@ impl RenderResourceContext for WgpuRenderResourceContext {
 | 
			
		||||
        buffer_info: BufferInfo,
 | 
			
		||||
        setup_data: &mut dyn FnMut(&mut [u8], &dyn RenderResourceContext),
 | 
			
		||||
    ) -> RenderResource {
 | 
			
		||||
        let mut mapped = self.device.create_buffer_mapped(&wgpu::BufferDescriptor {
 | 
			
		||||
        let usage: wgpu::BufferUsage = buffer_info.buffer_usage.wgpu_into();
 | 
			
		||||
        let buffer = self.device.create_buffer(&wgpu::BufferDescriptor {
 | 
			
		||||
            size: buffer_info.size as u64,
 | 
			
		||||
            usage: buffer_info.buffer_usage.wgpu_into(),
 | 
			
		||||
            usage: usage | wgpu::BufferUsage::MAP_WRITE,
 | 
			
		||||
            label: None,
 | 
			
		||||
            mapped_at_creation: false,
 | 
			
		||||
        });
 | 
			
		||||
        setup_data(&mut mapped.data(), self);
 | 
			
		||||
        let buffer = mapped.finish();
 | 
			
		||||
 | 
			
		||||
        let data = buffer.map_async(wgpu::MapMode::Write, 0, wgpu::BufferSize::WHOLE);
 | 
			
		||||
        self.device.poll(wgpu::Maintain::Wait);
 | 
			
		||||
        if let Ok(()) = pollster::block_on(data) {
 | 
			
		||||
            let data = buffer.get_mapped_range_mut(0, wgpu::BufferSize::WHOLE);
 | 
			
		||||
            setup_data(data, self);
 | 
			
		||||
        } else {
 | 
			
		||||
            panic!("failed to map buffer to host");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        buffer.unmap();
 | 
			
		||||
        let resource = RenderResource::new();
 | 
			
		||||
        let mut resource_info = self.resources.resource_info.write().unwrap();
 | 
			
		||||
        let mut buffers = self.resources.buffers.write().unwrap();
 | 
			
		||||
@ -326,10 +297,10 @@ impl RenderResourceContext for WgpuRenderResourceContext {
 | 
			
		||||
 | 
			
		||||
    fn next_swap_chain_texture(&self, window_id: bevy_window::WindowId) -> RenderResource {
 | 
			
		||||
        let mut window_swap_chains = self.resources.window_swap_chains.write().unwrap();
 | 
			
		||||
        let mut swap_chain_outputs = self.resources.swap_chain_outputs.write().unwrap();
 | 
			
		||||
        let mut swap_chain_outputs = self.resources.swap_chain_frames.write().unwrap();
 | 
			
		||||
 | 
			
		||||
        let window_swap_chain = window_swap_chains.get_mut(&window_id).unwrap();
 | 
			
		||||
        let next_texture = window_swap_chain.get_next_texture().unwrap();
 | 
			
		||||
        let next_texture = window_swap_chain.get_next_frame().unwrap();
 | 
			
		||||
 | 
			
		||||
        // TODO: Add ResourceInfo
 | 
			
		||||
        let render_resource = RenderResource::new();
 | 
			
		||||
@ -338,12 +309,12 @@ impl RenderResourceContext for WgpuRenderResourceContext {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn drop_swap_chain_texture(&self, render_resource: RenderResource) {
 | 
			
		||||
        let mut swap_chain_outputs = self.resources.swap_chain_outputs.write().unwrap();
 | 
			
		||||
        let mut swap_chain_outputs = self.resources.swap_chain_frames.write().unwrap();
 | 
			
		||||
        swap_chain_outputs.remove(&render_resource);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn drop_all_swap_chain_textures(&self) {
 | 
			
		||||
        let mut swap_chain_outputs = self.resources.swap_chain_outputs.write().unwrap();
 | 
			
		||||
        let mut swap_chain_outputs = self.resources.swap_chain_frames.write().unwrap();
 | 
			
		||||
        swap_chain_outputs.clear();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -521,10 +492,7 @@ impl RenderResourceContext for WgpuRenderResourceContext {
 | 
			
		||||
                                }
 | 
			
		||||
                                RenderResourceAssignment::Buffer { resource, range , .. } => {
 | 
			
		||||
                                    let buffer = buffers.get(&resource).unwrap();
 | 
			
		||||
                                    wgpu::BindingResource::Buffer {
 | 
			
		||||
                                        buffer,
 | 
			
		||||
                                        range: range.clone(),
 | 
			
		||||
                                    }
 | 
			
		||||
                                    wgpu::BindingResource::Buffer(buffer.slice(range.clone()))
 | 
			
		||||
                                }
 | 
			
		||||
                            };
 | 
			
		||||
                            wgpu::Binding {
 | 
			
		||||
 | 
			
		||||
@ -25,7 +25,7 @@ impl<'a> RenderPass for WgpuRenderPass<'a> {
 | 
			
		||||
    fn set_vertex_buffer(&mut self, start_slot: u32, resource: RenderResource, offset: u64) {
 | 
			
		||||
        let buffer = self.render_resources.buffers.get(&resource).unwrap();
 | 
			
		||||
        self.render_pass
 | 
			
		||||
            .set_vertex_buffer(start_slot, &buffer, offset, 0);
 | 
			
		||||
            .set_vertex_buffer(start_slot, buffer.slice(offset..));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn set_viewport(&mut self, x: f32, y: f32, w: f32, h: f32, min_depth: f32, max_depth: f32) {
 | 
			
		||||
@ -39,7 +39,7 @@ impl<'a> RenderPass for WgpuRenderPass<'a> {
 | 
			
		||||
 | 
			
		||||
    fn set_index_buffer(&mut self, resource: RenderResource, offset: u64) {
 | 
			
		||||
        let buffer = self.render_resources.buffers.get(&resource).unwrap();
 | 
			
		||||
        self.render_pass.set_index_buffer(&buffer, offset, 0);
 | 
			
		||||
        self.render_pass.set_index_buffer(buffer.slice(offset..));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn draw_indexed(&mut self, indices: Range<u32>, base_vertex: i32, instances: Range<u32>) {
 | 
			
		||||
 | 
			
		||||
@ -39,9 +39,7 @@ impl WgpuRenderer {
 | 
			
		||||
        let (device, queue) = adapter
 | 
			
		||||
            .request_device(
 | 
			
		||||
                &wgpu::DeviceDescriptor {
 | 
			
		||||
                    extensions: wgpu::Extensions {
 | 
			
		||||
                        anisotropic_filtering: false,
 | 
			
		||||
                    },
 | 
			
		||||
                    extensions: wgpu::Extensions::empty(),
 | 
			
		||||
                    limits: wgpu::Limits::default(),
 | 
			
		||||
                },
 | 
			
		||||
                None,
 | 
			
		||||
 | 
			
		||||
@ -40,7 +40,7 @@ pub struct WgpuBindGroupInfo {
 | 
			
		||||
pub struct WgpuResourcesReadLock<'a> {
 | 
			
		||||
    pub buffers: RwLockReadGuard<'a, HashMap<RenderResource, wgpu::Buffer>>,
 | 
			
		||||
    pub textures: RwLockReadGuard<'a, HashMap<RenderResource, wgpu::TextureView>>,
 | 
			
		||||
    pub swap_chain_outputs: RwLockReadGuard<'a, HashMap<RenderResource, wgpu::SwapChainOutput>>,
 | 
			
		||||
    pub swap_chain_frames: RwLockReadGuard<'a, HashMap<RenderResource, wgpu::SwapChainFrame>>,
 | 
			
		||||
    pub render_pipelines:
 | 
			
		||||
        RwLockReadGuard<'a, HashMap<Handle<PipelineDescriptor>, wgpu::RenderPipeline>>,
 | 
			
		||||
    pub bind_groups: RwLockReadGuard<'a, HashMap<BindGroupDescriptorId, WgpuBindGroupInfo>>,
 | 
			
		||||
@ -51,7 +51,7 @@ impl<'a> WgpuResourcesReadLock<'a> {
 | 
			
		||||
        WgpuResourceRefs {
 | 
			
		||||
            buffers: &self.buffers,
 | 
			
		||||
            textures: &self.textures,
 | 
			
		||||
            swap_chain_outputs: &self.swap_chain_outputs,
 | 
			
		||||
            swap_chain_frames: &self.swap_chain_frames,
 | 
			
		||||
            render_pipelines: &self.render_pipelines,
 | 
			
		||||
            bind_groups: &self.bind_groups,
 | 
			
		||||
        }
 | 
			
		||||
@ -62,7 +62,7 @@ impl<'a> WgpuResourcesReadLock<'a> {
 | 
			
		||||
pub struct WgpuResourceRefs<'a> {
 | 
			
		||||
    pub buffers: &'a HashMap<RenderResource, wgpu::Buffer>,
 | 
			
		||||
    pub textures: &'a HashMap<RenderResource, wgpu::TextureView>,
 | 
			
		||||
    pub swap_chain_outputs: &'a HashMap<RenderResource, wgpu::SwapChainOutput>,
 | 
			
		||||
    pub swap_chain_frames: &'a HashMap<RenderResource, wgpu::SwapChainFrame>,
 | 
			
		||||
    pub render_pipelines: &'a HashMap<Handle<PipelineDescriptor>, wgpu::RenderPipeline>,
 | 
			
		||||
    pub bind_groups: &'a HashMap<BindGroupDescriptorId, WgpuBindGroupInfo>,
 | 
			
		||||
}
 | 
			
		||||
@ -72,7 +72,7 @@ pub struct WgpuResources {
 | 
			
		||||
    pub resource_info: Arc<RwLock<HashMap<RenderResource, ResourceInfo>>>,
 | 
			
		||||
    pub window_surfaces: Arc<RwLock<HashMap<WindowId, wgpu::Surface>>>,
 | 
			
		||||
    pub window_swap_chains: Arc<RwLock<HashMap<WindowId, wgpu::SwapChain>>>,
 | 
			
		||||
    pub swap_chain_outputs: Arc<RwLock<HashMap<RenderResource, wgpu::SwapChainOutput>>>,
 | 
			
		||||
    pub swap_chain_frames: Arc<RwLock<HashMap<RenderResource, wgpu::SwapChainFrame>>>,
 | 
			
		||||
    pub buffers: Arc<RwLock<HashMap<RenderResource, wgpu::Buffer>>>,
 | 
			
		||||
    pub texture_views: Arc<RwLock<HashMap<RenderResource, wgpu::TextureView>>>,
 | 
			
		||||
    pub textures: Arc<RwLock<HashMap<RenderResource, wgpu::Texture>>>,
 | 
			
		||||
@ -89,7 +89,7 @@ impl WgpuResources {
 | 
			
		||||
        WgpuResourcesReadLock {
 | 
			
		||||
            buffers: self.buffers.read().unwrap(),
 | 
			
		||||
            textures: self.texture_views.read().unwrap(),
 | 
			
		||||
            swap_chain_outputs: self.swap_chain_outputs.read().unwrap(),
 | 
			
		||||
            swap_chain_frames: self.swap_chain_frames.read().unwrap(),
 | 
			
		||||
            render_pipelines: self.render_pipelines.read().unwrap(),
 | 
			
		||||
            bind_groups: self.bind_groups.read().unwrap(),
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@ -506,7 +506,8 @@ impl WgpuFrom<SamplerDescriptor> for wgpu::SamplerDescriptor<'_> {
 | 
			
		||||
            mipmap_filter: sampler_descriptor.mipmap_filter.wgpu_into(),
 | 
			
		||||
            lod_min_clamp: sampler_descriptor.lod_min_clamp,
 | 
			
		||||
            lod_max_clamp: sampler_descriptor.lod_max_clamp,
 | 
			
		||||
            compare: sampler_descriptor.compare_function.wgpu_into(),
 | 
			
		||||
            compare: sampler_descriptor.compare_function.map(|c| c.wgpu_into()),
 | 
			
		||||
            anisotropy_clamp: sampler_descriptor.anisotropy_clamp.clone(),
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user