diff --git a/src/render/render_graph/renderers/wgpu_renderer.rs b/src/render/render_graph/renderers/wgpu_renderer.rs index bc947618f2..d1c34112fa 100644 --- a/src/render/render_graph/renderers/wgpu_renderer.rs +++ b/src/render/render_graph/renderers/wgpu_renderer.rs @@ -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, wgpu::RenderPipeline>, pub buffers: HashMap, pub textures: HashMap, + pub textures_from_handles: HashMap, wgpu::TextureView>, pub resource_info: HashMap, pub bind_groups: HashMap, pub bind_group_layouts: HashMap, @@ -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(), diff --git a/src/render/shader_reflect.rs b/src/render/shader_reflect.rs index 4a7d7fabda..39cafc8158 100644 --- a/src/render/shader_reflect.rs +++ b/src/render/shader_reflect.rs @@ -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), };