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