1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
package gpu_tests
import gpu ".."
import bk "../backend"
import "core:testing"
@(test)
test_gpu_capabilities_are_empty_without_backend :: proc(t: ^testing.T) {
caps := gpu.get_capabilities()
testing.expect(t, !gpu.supports(.Compute_Dispatch))
testing.expect(t, !gpu.supports(.Storage_Buffers))
testing.expect(t, !gpu.supports(.Offscreen_Targets))
testing.expect(t, !gpu.supports(.Sampled_Targets))
testing.expect(t, !gpu.supports(.Multiple_Render_Targets))
testing.expect(t, !gpu.supports(.Stencil_Clips))
testing.expect(t, !gpu.supports(.Indirect_Draws))
testing.expect_value(t, caps.max_color_targets, u32(0))
testing.expect_value(t, caps.max_push_constant_size, u32(0))
testing.expect_value(t, caps.max_frames_in_flight, u32(0))
}
@(test)
test_backend_implemented_capabilities_are_conservative_and_explicit :: proc(t: ^testing.T) {
caps := bk.implemented_base_capabilities(1, 240)
testing.expect(t, bk.supports(caps, .Compute_Dispatch))
testing.expect(t, bk.supports(caps, .Storage_Buffers))
testing.expect(t, bk.supports(caps, .Offscreen_Targets))
testing.expect(t, bk.supports(caps, .Sampled_Targets))
testing.expect(t, bk.supports(caps, .Indirect_Draws))
testing.expect(t, !bk.supports(caps, .Multiple_Render_Targets))
testing.expect(t, bk.supports(caps, .Stencil_Clips))
testing.expect_value(t, caps.max_color_targets, u32(1))
testing.expect_value(t, caps.max_push_constant_size, u32(240))
testing.expect_value(t, caps.max_frames_in_flight, u32(bk.MAX_FRAMES_IN_FLIGHT))
}
@(test)
test_backend_implemented_capabilities_enable_mrt_with_multi_target_limit :: proc(t: ^testing.T) {
caps := bk.implemented_base_capabilities(bk.MAX_COLOR_TARGETS, 240)
testing.expect(t, bk.supports(caps, .Multiple_Render_Targets))
testing.expect_value(t, caps.max_color_targets, u32(bk.MAX_COLOR_TARGETS))
}
@(test)
test_backend_capability_limit_helpers :: proc(t: ^testing.T) {
caps := bk.implemented_base_capabilities(1, 240)
testing.expect(t, bk.supports_color_target_count(caps, 0))
testing.expect(t, bk.supports_color_target_count(caps, 1))
testing.expect(t, !bk.supports_color_target_count(caps, 2))
testing.expect(t, bk.supports_push_constant_size(caps, 0))
testing.expect(t, bk.supports_push_constant_size(caps, 240))
testing.expect(t, !bk.supports_push_constant_size(caps, 241))
}
@(test)
test_vertex_layout_can_emit_instance_binding_metadata :: proc(t: ^testing.T) {
layout := bk.vertex_layout_build(.Position, .Color)
binding, attrs, attr_count := bk.vertex_layout_to_pipeline_attrs_for_binding(
&layout,
1,
.Instance,
3,
)
testing.expect_value(t, binding.binding, u32(1))
testing.expect_value(t, binding.input_rate, bk.Vertex_Input_Rate.Instance)
testing.expect_value(t, binding.stride, u32(28))
testing.expect_value(t, attr_count, 2)
testing.expect_value(t, attrs[0].location, u32(3))
testing.expect_value(t, attrs[0].binding, u32(1))
testing.expect_value(t, attrs[0].offset, u32(0))
testing.expect_value(t, attrs[1].location, u32(4))
testing.expect_value(t, attrs[1].binding, u32(1))
testing.expect_value(t, attrs[1].offset, u32(12))
}
@(test)
test_backend_handle_index_rejects_null_and_out_of_range :: proc(t: ^testing.T) {
_, null_ok := bk.handle_index(bk.NULL_BUFFER, 8)
testing.expect(t, !null_ok)
idx, valid_ok := bk.handle_index(bk.Buffer_Handle(1), 8)
testing.expect(t, valid_ok)
testing.expect_value(t, idx, 1)
_, max_ok := bk.handle_index(bk.Buffer_Handle(8), 8)
testing.expect(t, !max_ok)
_, overflow_ok := bk.handle_index(bk.Texture_Handle(99), 8)
testing.expect(t, !overflow_ok)
}
@(test)
test_backend_blend_factors_are_canonical :: proc(t: ^testing.T) {
alpha := bk.blend_factors(.Alpha)
testing.expect_value(t, alpha.src_color, bk.Blend_Factor.Src_Alpha)
testing.expect_value(t, alpha.dst_color, bk.Blend_Factor.One_Minus_Src_Alpha)
testing.expect_value(t, alpha.src_alpha, bk.Blend_Factor.One)
testing.expect_value(t, alpha.dst_alpha, bk.Blend_Factor.One_Minus_Src_Alpha)
additive := bk.blend_factors(.Additive)
testing.expect_value(t, additive.src_color, bk.Blend_Factor.Src_Alpha)
testing.expect_value(t, additive.dst_color, bk.Blend_Factor.One)
testing.expect_value(t, additive.src_alpha, bk.Blend_Factor.One)
testing.expect_value(t, additive.dst_alpha, bk.Blend_Factor.One)
premultiplied := bk.blend_factors(.Premultiplied_Alpha)
testing.expect_value(t, premultiplied.src_color, bk.Blend_Factor.One)
testing.expect_value(t, premultiplied.dst_color, bk.Blend_Factor.One_Minus_Src_Alpha)
testing.expect_value(t, premultiplied.src_alpha, bk.Blend_Factor.One)
testing.expect_value(t, premultiplied.dst_alpha, bk.Blend_Factor.One_Minus_Src_Alpha)
}
@(test)
test_backend_vtable_rejects_missing_required_slots :: proc(t: ^testing.T) {
testing.expect(t, !bk.backend_vtable_is_complete(nil))
backend: bk.Backend
testing.expect(t, !bk.backend_vtable_is_complete(&backend))
}