Merge pull request #189 from StarArawn/bind-group-reflect-fix
Reflect shader stage for bind groups.
This commit is contained in:
commit
1ebb7e44ff
@ -25,16 +25,21 @@ impl PipelineLayout {
|
|||||||
for shader_binding in shader_bind_group.bindings.iter() {
|
for shader_binding in shader_bind_group.bindings.iter() {
|
||||||
if let Some(binding) = bind_group
|
if let Some(binding) = bind_group
|
||||||
.bindings
|
.bindings
|
||||||
.iter()
|
.iter_mut()
|
||||||
.find(|binding| binding.index == shader_binding.index)
|
.find(|binding| binding.index == shader_binding.index)
|
||||||
{
|
{
|
||||||
if binding != shader_binding {
|
binding.shader_stage |= shader_binding.shader_stage;
|
||||||
|
if binding.bind_type != shader_binding.bind_type
|
||||||
|
|| binding.name != shader_binding.name
|
||||||
|
|| binding.index != shader_binding.index
|
||||||
|
{
|
||||||
panic!("Binding {} in BindGroup {} does not match across all shader types: {:?} {:?}", binding.index, bind_group.index, binding, shader_binding);
|
panic!("Binding {} in BindGroup {} does not match across all shader types: {:?} {:?}", binding.index, bind_group.index, binding, shader_binding);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
bind_group.bindings.push(shader_binding.clone());
|
bind_group.bindings.push(shader_binding.clone());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
bind_group.update_id();
|
||||||
}
|
}
|
||||||
None => {
|
None => {
|
||||||
bind_groups.insert(shader_bind_group.index, shader_bind_group.clone());
|
bind_groups.insert(shader_bind_group.index, shader_bind_group.clone());
|
||||||
|
|||||||
@ -9,7 +9,8 @@ use bevy_core::AsBytes;
|
|||||||
use spirv_reflect::{
|
use spirv_reflect::{
|
||||||
types::{
|
types::{
|
||||||
ReflectDescriptorBinding, ReflectDescriptorSet, ReflectDescriptorType, ReflectDimension,
|
ReflectDescriptorBinding, ReflectDescriptorSet, ReflectDescriptorType, ReflectDimension,
|
||||||
ReflectInterfaceVariable, ReflectTypeDescription, ReflectTypeFlags,
|
ReflectInterfaceVariable, ReflectShaderStageFlags, ReflectTypeDescription,
|
||||||
|
ReflectTypeFlags,
|
||||||
},
|
},
|
||||||
ShaderModule,
|
ShaderModule,
|
||||||
};
|
};
|
||||||
@ -30,9 +31,10 @@ impl ShaderLayout {
|
|||||||
match ShaderModule::load_u8_data(spirv_data.as_bytes()) {
|
match ShaderModule::load_u8_data(spirv_data.as_bytes()) {
|
||||||
Ok(ref mut module) => {
|
Ok(ref mut module) => {
|
||||||
let entry_point_name = module.get_entry_point_name();
|
let entry_point_name = module.get_entry_point_name();
|
||||||
|
let shader_stage = module.get_shader_stage();
|
||||||
let mut bind_groups = Vec::new();
|
let mut bind_groups = Vec::new();
|
||||||
for descriptor_set in module.enumerate_descriptor_sets(None).unwrap() {
|
for descriptor_set in module.enumerate_descriptor_sets(None).unwrap() {
|
||||||
let bind_group = reflect_bind_group(&descriptor_set);
|
let bind_group = reflect_bind_group(&descriptor_set, shader_stage);
|
||||||
bind_groups.push(bind_group);
|
bind_groups.push(bind_group);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -148,10 +150,13 @@ fn reflect_vertex_attribute_descriptor(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn reflect_bind_group(descriptor_set: &ReflectDescriptorSet) -> BindGroupDescriptor {
|
fn reflect_bind_group(
|
||||||
|
descriptor_set: &ReflectDescriptorSet,
|
||||||
|
shader_stage: ReflectShaderStageFlags,
|
||||||
|
) -> BindGroupDescriptor {
|
||||||
let mut bindings = Vec::new();
|
let mut bindings = Vec::new();
|
||||||
for descriptor_binding in descriptor_set.bindings.iter() {
|
for descriptor_binding in descriptor_set.bindings.iter() {
|
||||||
let binding = reflect_binding(descriptor_binding);
|
let binding = reflect_binding(descriptor_binding, shader_stage);
|
||||||
bindings.push(binding);
|
bindings.push(binding);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -168,7 +173,10 @@ fn reflect_dimension(type_description: &ReflectTypeDescription) -> TextureViewDi
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn reflect_binding(binding: &ReflectDescriptorBinding) -> BindingDescriptor {
|
fn reflect_binding(
|
||||||
|
binding: &ReflectDescriptorBinding,
|
||||||
|
shader_stage: ReflectShaderStageFlags,
|
||||||
|
) -> BindingDescriptor {
|
||||||
let type_description = binding.type_description.as_ref().unwrap();
|
let type_description = binding.type_description.as_ref().unwrap();
|
||||||
let (name, bind_type) = match binding.descriptor_type {
|
let (name, bind_type) = match binding.descriptor_type {
|
||||||
ReflectDescriptorType::UniformBuffer => (
|
ReflectDescriptorType::UniformBuffer => (
|
||||||
@ -198,12 +206,24 @@ fn reflect_binding(binding: &ReflectDescriptorBinding) -> BindingDescriptor {
|
|||||||
_ => panic!("unsupported bind type {:?}", binding.descriptor_type),
|
_ => panic!("unsupported bind type {:?}", binding.descriptor_type),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let mut shader_stage = match shader_stage {
|
||||||
|
ReflectShaderStageFlags::COMPUTE => BindingShaderStage::COMPUTE,
|
||||||
|
ReflectShaderStageFlags::VERTEX => BindingShaderStage::VERTEX,
|
||||||
|
ReflectShaderStageFlags::FRAGMENT => BindingShaderStage::FRAGMENT,
|
||||||
|
_ => panic!("Only one specified shader stage is supported."),
|
||||||
|
};
|
||||||
|
|
||||||
|
let name = name.to_string();
|
||||||
|
|
||||||
|
if name == "Camera" {
|
||||||
|
shader_stage = BindingShaderStage::VERTEX | BindingShaderStage::FRAGMENT;
|
||||||
|
}
|
||||||
|
|
||||||
BindingDescriptor {
|
BindingDescriptor {
|
||||||
index: binding.binding,
|
index: binding.binding,
|
||||||
bind_type,
|
bind_type,
|
||||||
name: name.to_string(),
|
name,
|
||||||
// TODO: We should be able to detect which shader program the binding is being used in..
|
shader_stage,
|
||||||
shader_stage: BindingShaderStage::VERTEX | BindingShaderStage::FRAGMENT,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -425,7 +445,7 @@ mod tests {
|
|||||||
dimension: TextureViewDimension::D2,
|
dimension: TextureViewDimension::D2,
|
||||||
component_type: TextureComponentType::Float,
|
component_type: TextureComponentType::Float,
|
||||||
},
|
},
|
||||||
shader_stage: BindingShaderStage::VERTEX | BindingShaderStage::FRAGMENT,
|
shader_stage: BindingShaderStage::VERTEX,
|
||||||
}]
|
}]
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user