Harbor

branch main
showing the latest snapshot on main
intent_packet_test.odin 4.4 KB · Plain text
tests/render_ir/intent_packet_test.odin 0644 Raw
package render_ir_tests

import ir "../../render_ir"
import "core:strings"
import "core:testing"

make_intent_frame :: proc(
) -> (
	frame: ir.Frame_IR,
	pass: ir.Pass_Handle,
	pipeline: ir.Pipeline_Handle,
	target: ir.Target_Handle,
	layer: ir.Layer_Handle,
	clip: ir.Clip_Handle,
	material: ir.Material_Handle,
	vertices: ir.Resource_Handle,
) {
	frame = ir.init_frame_ir()
	vertices = ir.add_buffer(&frame, "quad-vertices", 256, {.Vertex}, {.Host_Visible})
	pass = ir.add_pass(&frame, {kind = .Render, name = "main"})
	pipeline = ir.add_graphics_pipeline(&frame, "quads", ir.default_graphics_pipeline_state())
	target = ir.add_target(
		&frame,
		{
			kind = .Present,
			name = "swapchain",
			width = 800,
			height = 600,
			color_format = .B8G8R8A8_SRGB,
			clear_color = {0, 0, 0, 1},
			clear_depth = 1,
		},
	)
	layer = ir.add_layer(
		&frame,
		{target = target, name = "ui", sort_base = 10_000, order = .Strict},
	)
	clip = ir.add_clip(
		&frame,
		{target = target, kind = .Rect, rect = {x = 0, y = 0, width = 800, height = 600}},
	)
	material = ir.add_material(
		&frame,
		{name = "ui-material", pipeline = pipeline, blend_mode = .Alpha},
	)
	return
}

@(test)
test_generic_draw_packet_stores_intent_handles :: proc(t: ^testing.T) {
	frame, pass, pipeline, target, layer, clip, material, vertices := make_intent_frame()
	defer ir.destroy_frame_ir(&frame)

	cmd := ir.add_draw_packet(
		&frame,
		pass,
		pipeline,
		.Quad_Stream,
		{
			target = target,
			layer = layer,
			sort_key = 42,
			clip = clip,
			material = material,
			geometry = {kind = .Quad_Stream, resource = vertices, vertex_count = 6},
			instances = {count = 1},
			order = .Strict,
		},
		6,
		1,
	)

	draw, ok := ir.get_draw(&frame, cmd)
	testing.expect(t, ok)
	testing.expect(t, ir.draw_kind_is_packet(draw.kind))
	testing.expect(t, draw.packet.target == target)
	testing.expect(t, draw.packet.layer == layer)
	testing.expect(t, draw.packet.clip == clip)
	testing.expect(t, draw.packet.material == material)
	testing.expect(t, draw.packet.geometry.resource == vertices)
	testing.expect_value(t, draw.packet.sort_key, u64(42))
	testing.expect_value(t, draw.packet.sequence, u64(1))
	testing.expect_value(t, ir.target_count(&frame), 1)
	testing.expect_value(t, ir.layer_count(&frame), 1)
	testing.expect_value(t, ir.clip_count(&frame), 1)
	testing.expect_value(t, ir.material_count(&frame), 1)

	diagnostics := ir.init_diagnostics()
	defer ir.destroy_diagnostics(&diagnostics)
	ir.validate_intent_handles(&frame, &diagnostics)
	testing.expect_value(t, len(diagnostics.items), 0)
}

@(test)
test_generic_draw_packet_dump_and_trace :: proc(t: ^testing.T) {
	frame, pass, pipeline, target, layer, clip, material, vertices := make_intent_frame()
	defer ir.destroy_frame_ir(&frame)

	_ = ir.add_draw_packet(
		&frame,
		pass,
		pipeline,
		.Quad_Stream,
		{
			target = target,
			layer = layer,
			sort_key = 7,
			clip = clip,
			material = material,
			geometry = {kind = .Quad_Stream, resource = vertices, vertex_count = 6},
			instances = {count = 1},
			order = .Strict,
		},
		6,
		1,
	)

	dump := ir.dump_frame_ir(&frame)
	defer delete(dump)
	testing.expect(t, strings.contains(dump, "targets 1"))
	testing.expect(t, strings.contains(dump, "layers 1"))
	testing.expect(t, strings.contains(dump, "clips 1"))
	testing.expect(t, strings.contains(dump, "materials 1"))
	testing.expect(
		t,
		strings.contains(
			dump,
			"Draw kind=Quad_Stream pass=1 pipeline=1 target=1 layer=1 order=Strict sort_key=7 sequence=1",
		),
	)

	trace := ir.trace_frame_ir(&frame)
	defer delete(trace)
	testing.expect(
		t,
		strings.contains(
			trace,
			"draw_packet kind=Quad_Stream target=1 layer=1 order=Strict sort_key=7 sequence=1",
		),
	)
}

@(test)
test_generic_draw_packet_invalid_handles_diagnose :: proc(t: ^testing.T) {
	frame := ir.init_frame_ir()
	defer ir.destroy_frame_ir(&frame)

	pass := ir.add_pass(&frame, {kind = .Render, name = "main"})
	pipeline := ir.add_graphics_pipeline(&frame, "quads", ir.default_graphics_pipeline_state())
	_ = ir.add_draw_packet(
		&frame,
		pass,
		pipeline,
		.Quad_Stream,
		{
			target = ir.Target_Handle(99),
			layer = ir.Layer_Handle(99),
			geometry = {kind = .Quad_Stream, resource = ir.Resource_Handle(99), vertex_count = 6},
			order = .Strict,
		},
		6,
		1,
	)

	diagnostics := ir.init_diagnostics()
	defer ir.destroy_diagnostics(&diagnostics)
	ir.validate_intent_handles(&frame, &diagnostics)
	testing.expect_value(t, len(diagnostics.items), 3)
}