rafx_framework/resources/
cooked_shader.rs1use crate::{
2 ComputePipelineResource, FixedFunctionState, MaterialPassResource, ReflectedShader,
3 ResourceArc, ResourceLookupSet,
4};
5use rafx_api::{RafxHashedShaderPackage, RafxResult};
6use std::sync::Arc;
7
8pub fn load_compute_pipeline_from_package(
9 shader_package: &RafxHashedShaderPackage,
10 resources: &ResourceLookupSet,
11 entry_name: &str,
12) -> RafxResult<ResourceArc<ComputePipelineResource>> {
13 let entry_point = shader_package
17 .shader_package()
18 .find_entry_point(resources.device_context().api_type(), entry_name);
19 let entry_point = entry_point.ok_or_else(|| {
20 let error_message = format!(
21 "Load Compute Shader Failed - Searching for entry point named {}, but no matching reflection data was found",
22 entry_name
23 );
24 log::error!("{}", error_message);
25 error_message
26 })?;
27
28 let shader_module =
29 resources.get_or_create_shader_module_from_hashed_package(shader_package)?;
30 let reflected_shader = ReflectedShader::new(resources, &[shader_module], &[entry_point])?;
31
32 reflected_shader.load_compute_pipeline(
33 resources,
34 shader_package.shader_package().debug_name.as_deref(),
35 )
36}
37
38pub fn load_material_pass_from_packages(
39 resources: &ResourceLookupSet,
40 cooked_shader_packages: &[&RafxHashedShaderPackage],
41 entry_names: &[&str],
42 fixed_function_state: Arc<FixedFunctionState>,
43 debug_name: Option<&str>,
44) -> RafxResult<ResourceArc<MaterialPassResource>> {
45 assert_eq!(cooked_shader_packages.len(), entry_names.len());
46 let mut shader_modules = Vec::with_capacity(cooked_shader_packages.len());
47 let mut entry_points = Vec::with_capacity(entry_names.len());
48 for (shader_package, entry_name) in cooked_shader_packages.iter().zip(entry_names) {
49 shader_modules
50 .push(resources.get_or_create_shader_module_from_hashed_package(&shader_package)?);
51
52 let entry_point = shader_package
53 .shader_package()
54 .find_entry_point(resources.device_context().api_type(), entry_name);
55 let entry_point = entry_point.ok_or_else(|| {
56 let error_message = format!(
57 "Load Material Pass Failed - Searching for entry point named {}, but no matching reflection data was found",
58 entry_name
59 );
60 log::error!("{}", error_message);
61 error_message
62 })?;
63
64 entry_points.push(entry_point);
65 }
66
67 let reflected_shader = ReflectedShader::new(resources, &shader_modules, &entry_points)?;
68 reflected_shader.load_material_pass(resources, fixed_function_state, debug_name)
69}