create shader module from source
This commit is contained in:
		
							parent
							
								
									e459b42418
								
							
						
					
					
						commit
						20cc41a639
					
				@ -129,4 +129,10 @@ impl RenderResourceContext for HeadlessRenderResourceContext {
 | 
			
		||||
            None
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    fn create_shader_module_from_source(
 | 
			
		||||
        &self,
 | 
			
		||||
        _shader_handle: Handle<Shader>,
 | 
			
		||||
        _shader: &Shader,
 | 
			
		||||
    ) {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -45,6 +45,11 @@ pub trait RenderResourceContext: Downcast + Send + Sync + 'static {
 | 
			
		||||
        shader_handle: Handle<Shader>,
 | 
			
		||||
        shader_storage: &AssetStorage<Shader>,
 | 
			
		||||
    );
 | 
			
		||||
    fn create_shader_module_from_source(
 | 
			
		||||
        &self,
 | 
			
		||||
        shader_handle: Handle<Shader>,
 | 
			
		||||
        shader: &Shader,
 | 
			
		||||
    );
 | 
			
		||||
    fn remove_buffer(&self, resource: RenderResource);
 | 
			
		||||
    fn remove_texture(&self, resource: RenderResource);
 | 
			
		||||
    fn remove_sampler(&self, resource: RenderResource);
 | 
			
		||||
 | 
			
		||||
@ -27,14 +27,18 @@ pub fn glsl_to_spirv(
 | 
			
		||||
    let mut output = compile(glsl_source, stage.into(), shader_defs).unwrap();
 | 
			
		||||
    let mut spv_bytes = Vec::new();
 | 
			
		||||
    output.read_to_end(&mut spv_bytes).unwrap();
 | 
			
		||||
    bytes_to_words(&spv_bytes)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
    let mut spv_words = Vec::new();
 | 
			
		||||
    for bytes4 in spv_bytes.chunks(4) {
 | 
			
		||||
        spv_words.push(u32::from_le_bytes([
 | 
			
		||||
fn bytes_to_words(bytes: &[u8]) -> Vec<u32> {
 | 
			
		||||
    let mut words = Vec::new();
 | 
			
		||||
    for bytes4 in bytes.chunks(4) {
 | 
			
		||||
        words.push(u32::from_le_bytes([
 | 
			
		||||
            bytes4[0], bytes4[1], bytes4[2], bytes4[3],
 | 
			
		||||
        ]));
 | 
			
		||||
    }
 | 
			
		||||
    spv_words
 | 
			
		||||
 | 
			
		||||
    words
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Clone, Debug, Hash, Eq, PartialEq)]
 | 
			
		||||
@ -43,6 +47,12 @@ pub enum ShaderSource {
 | 
			
		||||
    Glsl(String),
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl ShaderSource {
 | 
			
		||||
    pub fn spirv_from_bytes(bytes: &[u8]) -> ShaderSource {
 | 
			
		||||
        ShaderSource::Spirv(bytes_to_words(bytes))
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Clone, Debug)]
 | 
			
		||||
pub struct Shader {
 | 
			
		||||
    pub source: ShaderSource,
 | 
			
		||||
@ -51,6 +61,12 @@ pub struct Shader {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl Shader {
 | 
			
		||||
    pub fn new(stage: ShaderStage, source: ShaderSource) -> Shader {
 | 
			
		||||
        Shader {
 | 
			
		||||
            stage,
 | 
			
		||||
            source,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    pub fn from_glsl(stage: ShaderStage, glsl: &str) -> Shader {
 | 
			
		||||
        Shader {
 | 
			
		||||
            source: ShaderSource::Glsl(glsl.to_string()),
 | 
			
		||||
 | 
			
		||||
@ -287,6 +287,16 @@ impl RenderResourceContext for WgpuRenderResourceContext {
 | 
			
		||||
        handle_info(info);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn create_shader_module_from_source(
 | 
			
		||||
        &self,
 | 
			
		||||
        shader_handle: Handle<Shader>,
 | 
			
		||||
        shader: &Shader,
 | 
			
		||||
    ) {
 | 
			
		||||
        let mut shader_modules = self.resources.shader_modules.write().unwrap();
 | 
			
		||||
        let shader_module = self.device.create_shader_module(&shader.get_spirv(None));
 | 
			
		||||
        shader_modules.insert(shader_handle, shader_module);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn create_shader_module(
 | 
			
		||||
        &self,
 | 
			
		||||
        shader_handle: Handle<Shader>,
 | 
			
		||||
@ -302,13 +312,8 @@ impl RenderResourceContext for WgpuRenderResourceContext {
 | 
			
		||||
        {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let mut shader_modules = self.resources.shader_modules.write().unwrap();
 | 
			
		||||
        // TODO: consider re-checking existence here
 | 
			
		||||
 | 
			
		||||
        let shader = shader_storage.get(&shader_handle).unwrap();
 | 
			
		||||
        let shader_module = self.device.create_shader_module(&shader.get_spirv(None));
 | 
			
		||||
        shader_modules.insert(shader_handle, shader_module);
 | 
			
		||||
        self.create_shader_module_from_source(shader_handle, shader);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn create_swap_chain(&self, window: &Window) {
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user