98 lines
2.7 KiB
Plaintext
98 lines
2.7 KiB
Plaintext
DEPTH_STENCIL_SLOT :: 42;
|
|
|
|
// The slots used by the render pass render targets
|
|
// Slots 10-17 are reserved for the passes
|
|
Render_Target_Shader_Slots :: enum {
|
|
SLOT0 :: 10;
|
|
SLOT1 :: 11;
|
|
SLOT2 :: 12;
|
|
SLOT3 :: 13;
|
|
SLOT4 :: 14;
|
|
SLOT5 :: 15;
|
|
SLOT6 :: 16;
|
|
SLOT7 :: 17;
|
|
}
|
|
|
|
Render_Target_Info :: struct {
|
|
format: Format;
|
|
width: u32;
|
|
height: u32;
|
|
|
|
clear_color: Color;
|
|
}
|
|
|
|
Depth_Stencil_Info :: struct {
|
|
enabled: bool;
|
|
format: Format;
|
|
width: u32;
|
|
height: u32;
|
|
}
|
|
|
|
Render_Pass_Input_Info :: struct {
|
|
pass_handle: Render_Pass_Handle;
|
|
rt_index: u32; // the index into the render pass
|
|
}
|
|
|
|
Render_Pass :: struct {
|
|
name: string;
|
|
|
|
inputs: [..] Render_Pass_Input_Info;
|
|
|
|
uses_backbuffer: bool;
|
|
render_targets: [..] Render_Target_Handle;
|
|
clear_colors: [..] Color;
|
|
depth_stencil: Depth_Stencil_Buffer_Handle;
|
|
has_depth_stencil: bool;
|
|
|
|
width: u32;
|
|
height: u32;
|
|
|
|
callback: (pass: Render_Pass);
|
|
}
|
|
|
|
create_render_pass :: (graph: *Render_Graph, name: string, callback: (Render_Pass), render_target_infos: [] Render_Target_Info = .[], depth_stencil_info : Depth_Stencil_Info = .{}, uses_backbuffer: bool = false) -> Render_Pass_Handle {
|
|
render_pass : Render_Pass;
|
|
render_pass.name = copy_string(name);
|
|
render_pass.uses_backbuffer = uses_backbuffer;
|
|
render_pass.callback = callback;
|
|
|
|
if depth_stencil_info.enabled {
|
|
render_pass.has_depth_stencil = true;
|
|
render_pass.depth_stencil = create_depth_stencil_buffer(depth_stencil_info.width, depth_stencil_info.height, 0);
|
|
render_pass.width = depth_stencil_info.width;
|
|
render_pass.height = depth_stencil_info.height;
|
|
}
|
|
|
|
array_reserve(*render_pass.render_targets, render_target_infos.count);
|
|
array_reserve(*render_pass.clear_colors, render_target_infos.count);
|
|
|
|
for render_target_infos {
|
|
array_add(*render_pass.render_targets, create_render_target(it.width, it.height, it.format));
|
|
array_add(*render_pass.clear_colors, it.clear_color);
|
|
render_pass.width = it.width;
|
|
render_pass.height = it.height;
|
|
}
|
|
|
|
return parray_add(*graph.render_passes, render_pass);
|
|
}
|
|
|
|
add_render_pass_input :: (graph: *Render_Graph, to_pass: Render_Pass_Handle, from_pass: Render_Pass_Handle, rt_index: u32) {
|
|
info : Render_Pass_Input_Info;
|
|
info.pass_handle = from_pass;
|
|
info.rt_index = rt_index;
|
|
|
|
pass := parray_get(*graph.render_passes, to_pass);
|
|
array_add(*pass.inputs, info);
|
|
}
|
|
|
|
get_texture_from_pass :: (name: string) -> Texture_Handle {
|
|
for engine.renderer.render_graph.render_passes {
|
|
if it.name == name {
|
|
rt := parray_get(engine.renderer.render_targets, it.render_targets[0]);
|
|
return rt.texture;
|
|
}
|
|
}
|
|
|
|
return xx 0;
|
|
}
|