141 lines
5.0 KiB
Plaintext
141 lines
5.0 KiB
Plaintext
Render_Pass_Handle :: #type, distinct u32;
|
|
|
|
|
|
Pass_Buffer_Info :: struct {
|
|
shader_type: Shader_Type;
|
|
slot: u32;
|
|
buffer: Buffer_Handle;
|
|
}
|
|
|
|
Render_Graph :: struct {
|
|
temp_sampler: Sampler_Handle;
|
|
render_passes: PArray(Render_Pass, Render_Pass_Handle);
|
|
}
|
|
|
|
new_render_graph :: () -> *Render_Graph {
|
|
graph := New(Render_Graph);
|
|
return graph;
|
|
}
|
|
|
|
execute_render_graph :: (graph: *Render_Graph) {
|
|
for graph.render_passes {
|
|
execute_render_pass(it);
|
|
}
|
|
}
|
|
|
|
push_material_pass_properties :: (render_pass: Render_Pass, mat_pass: Material_Pass_Old) {
|
|
for mat_pass.properties {
|
|
if it.parameter.type == {
|
|
case .BUFFER;
|
|
push_cmd_set_constant_buffer(renderer, it.parameter.slot, it.buffer, it.parameter.shader);
|
|
case .SAMPLER;
|
|
push_cmd_set_sampler(renderer, it.parameter.slot, it.sampler);
|
|
case .TEXTURE;
|
|
{
|
|
is_texture_input := false;
|
|
input_index := 0;
|
|
|
|
if it.parameter.mapping == {
|
|
case .SHADER_ATTACHMENT0;
|
|
is_texture_input = true;
|
|
input_index = 0;
|
|
case .SHADER_ATTACHMENT1;
|
|
is_texture_input = true;
|
|
input_index = 1;
|
|
case .SHADER_ATTACHMENT2;
|
|
is_texture_input = true;
|
|
input_index = 2;
|
|
case .SHADER_ATTACHMENT3;
|
|
is_texture_input = true;
|
|
input_index = 3;
|
|
}
|
|
|
|
if is_texture_input {
|
|
input := render_pass.inputs[input_index];
|
|
owning_pass := parray_get(*renderer.render_graph.render_passes, input.pass_handle);
|
|
|
|
if input.rt_index == DEPTH_STENCIL_SLOT {
|
|
push_cmd_set_texture(renderer, it.parameter.slot, owning_pass.depth_stencil);
|
|
} else {
|
|
push_cmd_set_texture(renderer, it.parameter.slot, owning_pass.render_targets[input.rt_index]);
|
|
}
|
|
} else {
|
|
if it.texture > 0 {
|
|
push_cmd_set_texture(renderer, it.parameter.slot, it.texture);
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
setup_pass_inputs :: (render_pass: Render_Pass) {
|
|
for input: render_pass.inputs {
|
|
owning_pass := parray_get(*renderer.render_graph.render_passes, input.pass_handle);
|
|
|
|
if input.rt_index == DEPTH_STENCIL_SLOT {
|
|
push_cmd_set_texture(renderer, xx it_index, owning_pass.depth_stencil);
|
|
} else {
|
|
push_cmd_set_texture(renderer, xx it_index, owning_pass.render_targets[input.rt_index]);
|
|
}
|
|
}
|
|
}
|
|
|
|
set_render_pass_clear_color :: (rp: Render_Pass_Handle, input_index: s32, color: Color) {
|
|
pass := parray_get(*renderer.render_graph.render_passes, rp);
|
|
pass.clear_colors[input_index] = color;
|
|
}
|
|
|
|
execute_render_pass :: (render_pass: Render_Pass) { // @Incomplete: Add command buffer as parameter
|
|
if render_pass.render_targets.count == 0 {
|
|
if render_pass.has_depth_stencil {
|
|
push_cmd_set_render_targets(renderer, depth_stencil_enabled=render_pass.has_depth_stencil, depth_stencil_buffer=render_pass.depth_stencil);
|
|
push_cmd_clear_depth_stencil(renderer, render_pass.depth_stencil, 1.0);
|
|
width := ifx render_pass.width == SWAPCHAIN_SIZE then renderer.render_target_width else render_pass.width;
|
|
height := ifx render_pass.height == SWAPCHAIN_SIZE then renderer.render_target_height else render_pass.height;
|
|
push_cmd_set_viewport(renderer, width, height);
|
|
} else {
|
|
assert(render_pass.uses_backbuffer);
|
|
push_cmd_set_backbuffer(renderer);
|
|
|
|
color: Vector4;
|
|
color.x = 0.0;
|
|
color.y = 0.0;
|
|
color.z = 0.0;
|
|
color.w = 1.0;
|
|
push_cmd_clear_backbuffer(renderer, color);
|
|
push_cmd_set_viewport(renderer, xx renderer.render_target_width, xx renderer.render_target_height);
|
|
}
|
|
} else {
|
|
|
|
width := render_pass.width;
|
|
height := render_pass.height;
|
|
|
|
if render_pass.width == SWAPCHAIN_SIZE {
|
|
width = renderer.render_target_width;
|
|
}
|
|
|
|
if render_pass.height == SWAPCHAIN_SIZE {
|
|
height = renderer.render_target_height;
|
|
}
|
|
push_cmd_set_render_targets(renderer, ..render_pass.render_targets, render_pass.has_depth_stencil, render_pass.depth_stencil);
|
|
push_cmd_set_viewport(renderer, width, height);
|
|
|
|
for render_pass.render_targets {
|
|
push_cmd_clear_render_target(renderer, it, render_pass.clear_colors[it_index]);
|
|
}
|
|
|
|
if render_pass.has_depth_stencil {
|
|
push_cmd_clear_depth_stencil(renderer, render_pass.depth_stencil, 1.0);
|
|
}
|
|
}
|
|
|
|
// @NOCHECKIN Setup inputs!
|
|
|
|
setup_pass_inputs(render_pass);
|
|
render_pass.callback(render_pass);
|
|
}
|
|
|
|
#load "render_pass.jai";
|