package render_ir_tests import ir "../../render_ir" import "core:testing" @(test) test_descriptor_layout_and_set_helpers :: proc(t: ^testing.T) { frame := ir.init_frame_ir() defer ir.destroy_frame_ir(&frame) texture := ir.add_texture(&frame, "albedo", 16, 16, .R8G8B8A8_UNORM, {.Sampled}) sampler := ir.add_sampler(&frame, "linear", {mag_filter = .Linear, min_filter = .Linear}) uniform := ir.add_buffer(&frame, "camera", 64, {.Uniform}, {.Host_Visible, .Host_Coherent}) storage := ir.add_buffer(&frame, "particles", 1024, {.Storage}, {.Device_Local}) layout := ir.make_descriptor_set_layout("set0") testing.expect( t, ir.descriptor_layout_add_binding(&layout, 0, .Combined_Image_Sampler, 1, {.Fragment}), ) testing.expect( t, ir.descriptor_layout_add_binding(&layout, 1, .Uniform_Buffer, 1, {.Vertex, .Fragment}), ) testing.expect(t, ir.descriptor_layout_add_binding(&layout, 2, .Storage_Buffer, 1, {.Compute})) layout_handle := ir.add_descriptor_set_layout(&frame, layout) set := ir.make_descriptor_set("frame", layout_handle) testing.expect(t, ir.descriptor_set_bind_texture_sampler(&set, 0, texture, sampler)) testing.expect(t, ir.descriptor_set_bind_buffer(&set, 1, .Uniform_Buffer, uniform, 64)) testing.expect(t, ir.descriptor_set_bind_buffer(&set, 2, .Storage_Buffer, storage, 1024)) set_handle := ir.add_descriptor_set(&frame, set) diagnostics := ir.init_diagnostics() defer ir.destroy_diagnostics(&diagnostics) testing.expect(t, ir.validate_descriptor_set(&frame, set_handle, &diagnostics)) testing.expect(t, !ir.has_errors(&diagnostics)) testing.expect_value(t, ir.descriptor_layout_count(&frame), 1) testing.expect_value(t, ir.descriptor_set_count(&frame), 1) } @(test) test_validate_descriptor_set_reports_type_mismatch :: proc(t: ^testing.T) { frame := ir.init_frame_ir() defer ir.destroy_frame_ir(&frame) uniform := ir.add_buffer(&frame, "camera", 64, {.Uniform}, {.Host_Visible}) layout := ir.make_descriptor_set_layout("set0") _ = ir.descriptor_layout_add_binding(&layout, 0, .Storage_Buffer, 1, {.Compute}) layout_handle := ir.add_descriptor_set_layout(&frame, layout) set := ir.make_descriptor_set("frame", layout_handle) _ = ir.descriptor_set_bind_buffer(&set, 0, .Uniform_Buffer, uniform, 64) set_handle := ir.add_descriptor_set(&frame, set) diagnostics := ir.init_diagnostics() defer ir.destroy_diagnostics(&diagnostics) testing.expect(t, !ir.validate_descriptor_set(&frame, set_handle, &diagnostics)) testing.expect(t, ir.has_errors(&diagnostics)) testing.expect_value(t, diagnostics.items[0].code, ir.Diagnostic_Code.Invalid_Descriptor) testing.expect_value(t, diagnostics.items[0].message, "descriptor binding type mismatch") } @(test) test_validate_descriptor_set_reports_invalid_resource_usage :: proc(t: ^testing.T) { frame := ir.init_frame_ir() defer ir.destroy_frame_ir(&frame) buffer := ir.add_buffer(&frame, "vertices", 64, {.Vertex}, {.Device_Local}) layout := ir.make_descriptor_set_layout("set0") _ = ir.descriptor_layout_add_binding(&layout, 0, .Uniform_Buffer, 1, {.Vertex}) layout_handle := ir.add_descriptor_set_layout(&frame, layout) set := ir.make_descriptor_set("frame", layout_handle) _ = ir.descriptor_set_bind_buffer(&set, 0, .Uniform_Buffer, buffer, 64) set_handle := ir.add_descriptor_set(&frame, set) diagnostics := ir.init_diagnostics() defer ir.destroy_diagnostics(&diagnostics) testing.expect(t, !ir.validate_descriptor_set(&frame, set_handle, &diagnostics)) testing.expect(t, ir.has_errors(&diagnostics)) testing.expect_value(t, diagnostics.items[0].code, ir.Diagnostic_Code.Invalid_Resource) testing.expect_value(t, diagnostics.items[0].message, "uniform buffer missing Uniform usage") } @(test) test_validate_descriptor_set_reports_duplicate_bindings :: proc(t: ^testing.T) { frame := ir.init_frame_ir() defer ir.destroy_frame_ir(&frame) buffer := ir.add_buffer(&frame, "camera", 64, {.Uniform}, {.Host_Visible}) layout := ir.make_descriptor_set_layout("set0") _ = ir.descriptor_layout_add_binding(&layout, 0, .Uniform_Buffer, 1, {.Vertex}) layout_handle := ir.add_descriptor_set_layout(&frame, layout) set := ir.make_descriptor_set("frame", layout_handle) _ = ir.descriptor_set_bind_buffer(&set, 0, .Uniform_Buffer, buffer, 64) _ = ir.descriptor_set_bind_buffer(&set, 0, .Uniform_Buffer, buffer, 64) set_handle := ir.add_descriptor_set(&frame, set) diagnostics := ir.init_diagnostics() defer ir.destroy_diagnostics(&diagnostics) testing.expect(t, !ir.validate_descriptor_set(&frame, set_handle, &diagnostics)) testing.expect(t, ir.has_errors(&diagnostics)) testing.expect_value(t, diagnostics.items[0].code, ir.Diagnostic_Code.Invalid_Descriptor) testing.expect_value(t, diagnostics.items[0].message, "duplicate descriptor set binding") } @(test) test_validate_descriptor_set_requires_sampled_texture :: proc(t: ^testing.T) { frame := ir.init_frame_ir() defer ir.destroy_frame_ir(&frame) texture := ir.add_texture(&frame, "target", 16, 16, .R8G8B8A8_UNORM, {.Color_Attachment}) sampler := ir.add_sampler(&frame, "linear", {mag_filter = .Linear, min_filter = .Linear}) layout := ir.make_descriptor_set_layout("set0") _ = ir.descriptor_layout_add_binding(&layout, 0, .Combined_Image_Sampler, 1, {.Fragment}) layout_handle := ir.add_descriptor_set_layout(&frame, layout) set := ir.make_descriptor_set("frame", layout_handle) _ = ir.descriptor_set_bind_texture_sampler(&set, 0, texture, sampler) set_handle := ir.add_descriptor_set(&frame, set) diagnostics := ir.init_diagnostics() defer ir.destroy_diagnostics(&diagnostics) testing.expect(t, !ir.validate_descriptor_set(&frame, set_handle, &diagnostics)) testing.expect(t, ir.has_errors(&diagnostics)) testing.expect_value( t, diagnostics.items[0].message, "combined image sampler texture missing Sampled usage", ) }