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