rafx_framework/resources/
cooked_shader.rs

1use 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    //
14    // Find the reflection data in the shader module for the given entry point
15    //
16    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}