Harbor

branch main
showing the latest snapshot on main
trace_test.odin 4.6 KB · Plain text
tests/render_ir/trace_test.odin 0644 Raw
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)
}