add texture and sampler shader reflection

This commit is contained in:
Carter Anderson 2020-02-19 00:24:59 -08:00
parent 2f1a0cb4a4
commit 4eaae0f815
2 changed files with 20 additions and 3 deletions

View file

@ -1,5 +1,5 @@
use crate::{
asset::{AssetStorage, Handle},
asset::{AssetStorage, Handle, Texture},
legion::prelude::*,
render::{
render_graph::{
@ -22,6 +22,7 @@ pub struct WgpuRenderer {
pub render_pipelines: HashMap<Handle<PipelineDescriptor>, wgpu::RenderPipeline>,
pub buffers: HashMap<String, wgpu::Buffer>,
pub textures: HashMap<String, wgpu::TextureView>,
pub textures_from_handles: HashMap<Handle<Texture>, wgpu::TextureView>,
pub resource_info: HashMap<String, ResourceInfo>,
pub bind_groups: HashMap<u64, BindGroupInfo>,
pub bind_group_layouts: HashMap<u64, wgpu::BindGroupLayout>,
@ -62,6 +63,7 @@ impl WgpuRenderer {
render_pipelines: HashMap::new(),
buffers: HashMap::new(),
textures: HashMap::new(),
textures_from_handles: HashMap::new(),
resource_info: HashMap::new(),
bind_groups: HashMap::new(),
bind_group_layouts: HashMap::new(),

View file

@ -1,10 +1,10 @@
use crate::render::render_graph::{
BindGroup, BindType, Binding, UniformProperty, UniformPropertyType,
BindGroup, BindType, Binding, UniformProperty, UniformPropertyType, TextureViewDimension
};
use spirv_reflect::{
types::{
ReflectDescriptorBinding, ReflectDescriptorSet, ReflectDescriptorType,
ReflectTypeDescription, ReflectTypeFlags,
ReflectTypeDescription, ReflectTypeFlags, ReflectDimension,
},
ShaderModule,
};
@ -58,6 +58,16 @@ fn reflect_bind_group(descriptor_set: &ReflectDescriptorSet) -> BindGroup {
BindGroup::new(descriptor_set.set, bindings)
}
fn reflect_dimension(type_description: &ReflectTypeDescription) -> TextureViewDimension {
match type_description.traits.image.dim {
ReflectDimension::Type1d => TextureViewDimension::D1,
ReflectDimension::Type2d => TextureViewDimension::D2,
ReflectDimension::Type3d => TextureViewDimension::D3,
ReflectDimension::Cube => TextureViewDimension::Cube,
dimension => panic!("unsupported image dimension: {:?}", dimension),
}
}
fn reflect_binding(binding: &ReflectDescriptorBinding) -> Binding {
let type_description = binding.type_description.as_ref().unwrap();
let bind_type = match binding.descriptor_type {
@ -65,6 +75,11 @@ fn reflect_binding(binding: &ReflectDescriptorBinding) -> Binding {
dynamic: false,
properties: vec![reflect_uniform(type_description)],
},
ReflectDescriptorType::SampledImage => BindType::SampledTexture {
dimension: reflect_dimension(type_description),
multisampled: false,
},
ReflectDescriptorType::Sampler => BindType::Sampler,
_ => panic!("unsupported bind type {:?}", binding.descriptor_type),
};