package render_ir_tests import ir "../../render_ir" import "core:testing" @(test) test_trace_empty_frame_ir :: proc(t: ^testing.T) { frame := ir.init_frame_ir() defer ir.destroy_frame_ir(&frame) trace := ir.trace_frame_ir(&frame) defer delete(trace) testing.expect_value(t, trace, "Trace") } @(test) test_trace_draw_and_dispatch :: proc(t: ^testing.T) { frame := ir.init_frame_ir() defer ir.destroy_frame_ir(&frame) render_pass := ir.add_pass(&frame, {kind = .Render, name = "main"}) compute_pass := ir.add_pass(&frame, {kind = .Compute, name = "compute"}) gfx := ir.add_pipeline(&frame, {kind = .Graphics, name = "rect"}) compute := ir.add_pipeline(&frame, {kind = .Compute, name = "particles"}) _ = ir.add_draw( &frame, {pass = render_pass, pipeline = gfx, vertex_count = 6, instance_count = 1}, ) _ = ir.add_dispatch(&frame, {pass = compute_pass, pipeline = compute, groups = {8, 1, 1}}) trace := ir.trace_frame_ir(&frame) defer delete(trace) expected := "Trace\n" + "begin_pass #1 Render name=\"main\"\n" + "bind_pipeline #1 Graphics name=\"rect\"\n" + "draw vertex_count=6 instance_count=1\n" + "end_pass #1\n" + "begin_pass #2 Compute name=\"compute\"\n" + "bind_pipeline #2 Compute name=\"particles\"\n" + "dispatch groups=8,1,1 shader_id=0 buffers=None push_constants_size=0 barrier_after=false\n" + "end_pass #2" testing.expect_value(t, trace, expected) } @(test) test_trace_reuses_pipeline_within_pass :: proc(t: ^testing.T) { frame := ir.init_frame_ir() defer ir.destroy_frame_ir(&frame) pass := ir.add_pass(&frame, {kind = .Render, name = "main"}) gfx := ir.add_pipeline(&frame, {kind = .Graphics, name = "rect"}) _ = ir.add_draw(&frame, {pass = pass, pipeline = gfx, vertex_count = 6, instance_count = 1}) _ = ir.add_draw(&frame, {pass = pass, pipeline = gfx, vertex_count = 12, instance_count = 1}) trace := ir.trace_frame_ir(&frame) defer delete(trace) expected := "Trace\n" + "begin_pass #1 Render name=\"main\"\n" + "bind_pipeline #1 Graphics name=\"rect\"\n" + "draw vertex_count=6 instance_count=1\n" + "draw vertex_count=12 instance_count=1\n" + "end_pass #1" testing.expect_value(t, trace, expected) } @(test) test_trace_rebinds_same_pipeline_in_new_pass :: proc(t: ^testing.T) { frame := ir.init_frame_ir() defer ir.destroy_frame_ir(&frame) first_pass := ir.add_pass(&frame, {kind = .Render, name = "main"}) second_pass := ir.add_pass(&frame, {kind = .Render, name = "overlay"}) gfx := ir.add_pipeline(&frame, {kind = .Graphics, name = "rect"}) _ = ir.add_draw( &frame, {pass = first_pass, pipeline = gfx, vertex_count = 6, instance_count = 1}, ) _ = ir.add_draw( &frame, {pass = second_pass, pipeline = gfx, vertex_count = 3, instance_count = 1}, ) trace := ir.trace_frame_ir(&frame) defer delete(trace) expected := "Trace\n" + "begin_pass #1 Render name=\"main\"\n" + "bind_pipeline #1 Graphics name=\"rect\"\n" + "draw vertex_count=6 instance_count=1\n" + "end_pass #1\n" + "begin_pass #2 Render name=\"overlay\"\n" + "bind_pipeline #1 Graphics name=\"rect\"\n" + "draw vertex_count=3 instance_count=1\n" + "end_pass #2" testing.expect_value(t, trace, expected) } @(test) test_trace_rebinds_pipeline_within_pass :: proc(t: ^testing.T) { frame := ir.init_frame_ir() defer ir.destroy_frame_ir(&frame) pass := ir.add_pass(&frame, {kind = .Render, name = "main"}) first_pipeline := ir.add_pipeline(&frame, {kind = .Graphics, name = "rect"}) second_pipeline := ir.add_pipeline(&frame, {kind = .Graphics, name = "line"}) _ = ir.add_draw( &frame, {pass = pass, pipeline = first_pipeline, vertex_count = 6, instance_count = 1}, ) _ = ir.add_draw( &frame, {pass = pass, pipeline = second_pipeline, vertex_count = 2, instance_count = 1}, ) trace := ir.trace_frame_ir(&frame) defer delete(trace) expected := "Trace\n" + "begin_pass #1 Render name=\"main\"\n" + "bind_pipeline #1 Graphics name=\"rect\"\n" + "draw vertex_count=6 instance_count=1\n" + "bind_pipeline #2 Graphics name=\"line\"\n" + "draw vertex_count=2 instance_count=1\n" + "end_pass #1" testing.expect_value(t, trace, expected) } @(test) test_trace_reports_invalid_public_handles :: proc(t: ^testing.T) { frame := ir.init_frame_ir() defer ir.destroy_frame_ir(&frame) _ = ir.add_draw( &frame, { pass = ir.Pass_Handle(99), pipeline = ir.Pipeline_Handle(77), vertex_count = 6, instance_count = 1, }, ) trace := ir.trace_frame_ir(&frame) defer delete(trace) expected := "Trace\n" + "begin_pass invalid handle=99\n" + "bind_pipeline invalid handle=77\n" + "draw vertex_count=6 instance_count=1\n" + "end_pass #99" testing.expect_value(t, trace, expected) }