aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndre Weissflog <floooh@gmail.com>2023-05-16 20:38:08 +0200
committerAndre Weissflog <floooh@gmail.com>2023-05-16 20:38:08 +0200
commitc7890f0bf26e2e774a73f10d44a8e369b191ebba (patch)
treeed99bd57ad96f3eda1ade328d51f4f4aa4f854db
parentbf5d7fe649a989183b7ee6a65dfb1769a5008e17 (diff)
sokol-gfx-test: add sg_make_pass validation tests
-rw-r--r--tests/functional/sokol_gfx_test.c666
1 files changed, 665 insertions, 1 deletions
diff --git a/tests/functional/sokol_gfx_test.c b/tests/functional/sokol_gfx_test.c
index b17c48ba..c5c95bf9 100644
--- a/tests/functional/sokol_gfx_test.c
+++ b/tests/functional/sokol_gfx_test.c
@@ -30,9 +30,13 @@ static void test_logger(const char* tag, uint32_t log_level, uint32_t log_item_i
}
}
-static void setup(const sg_desc* desc) {
+static void reset_log_items(void) {
num_log_called = 0;
memset(log_items, 0, sizeof(log_items));
+}
+
+static void setup(const sg_desc* desc) {
+ reset_log_items();
sg_desc desc_with_logger = *desc;
desc_with_logger.logger.func = test_logger;
sg_setup(&desc_with_logger);
@@ -1925,3 +1929,663 @@ UTEST(sokol_gfx, make_image_validate_wrong_mipsize) {
T(log_items[2] == SG_LOGITEM_VALIDATION_FAILED);
sg_shutdown();
}
+
+UTEST(sokol_gfx, make_pass_validate_start_canary) {
+ setup(&(sg_desc){0});
+ sg_pass pass = sg_make_pass(&(sg_pass_desc){
+ ._start_canary = 1234,
+ .color_attachments[0].image = sg_make_image(&(sg_image_desc){
+ .render_target = true,
+ .width = 64,
+ .height = 64,
+ }),
+ });
+ T(sg_query_pass_state(pass) == SG_RESOURCESTATE_FAILED);
+ T(log_items[0] == SG_LOGITEM_VALIDATE_PASSDESC_CANARY);
+ sg_shutdown();
+}
+
+UTEST(sokol_gfx, make_pass_validate_end_canary) {
+ setup(&(sg_desc){0});
+ sg_pass pass = sg_make_pass(&(sg_pass_desc){
+ .color_attachments[0].image = sg_make_image(&(sg_image_desc){
+ .render_target = true,
+ .width = 64,
+ .height = 64,
+ }),
+ ._end_canary = 1234,
+ });
+ T(sg_query_pass_state(pass) == SG_RESOURCESTATE_FAILED);
+ T(log_items[0] == SG_LOGITEM_VALIDATE_PASSDESC_CANARY);
+ T(log_items[1] == SG_LOGITEM_VALIDATION_FAILED);
+ sg_shutdown();
+}
+
+UTEST(sokol_gfx, make_pass_validate_no_color_attrs) {
+ setup(&(sg_desc){0});
+ // FIXME: rendering without color attachments but depth attachment should actually work
+ sg_pass pass = sg_make_pass(&(sg_pass_desc){
+ .depth_stencil_attachment.image = sg_make_image(&(sg_image_desc){
+ .render_target = true,
+ .width = 64,
+ .height = 64,
+ .pixel_format = SG_PIXELFORMAT_DEPTH,
+ })
+ });
+ T(sg_query_pass_state(pass) == SG_RESOURCESTATE_FAILED);
+ T(log_items[0] == SG_LOGITEM_VALIDATE_PASSDESC_NO_COLOR_ATTS);
+ T(log_items[1] == SG_LOGITEM_VALIDATE_PASSDESC_DEPTH_IMAGE_SIZES);
+ T(log_items[2] == SG_LOGITEM_VALIDATE_PASSDESC_DEPTH_IMAGE_SIZES);
+ T(log_items[3] == SG_LOGITEM_VALIDATE_PASSDESC_DEPTH_IMAGE_SAMPLE_COUNT);
+ T(log_items[4] == SG_LOGITEM_VALIDATION_FAILED);
+ sg_shutdown();
+}
+
+UTEST(sokol_gfx, make_pass_validate_no_cont_color_atts1) {
+ setup(&(sg_desc){0});
+ const sg_image_desc img_desc = { .render_target = true, .width = 64, .height = 64 };
+ sg_pass pass = sg_make_pass(&(sg_pass_desc){
+ .color_attachments = {
+ [0].image = sg_make_image(&img_desc),
+ [2].image = sg_make_image(&img_desc),
+ }
+ });
+ T(sg_query_pass_state(pass) == SG_RESOURCESTATE_FAILED);
+ T(log_items[0] == SG_LOGITEM_VALIDATE_PASSDESC_NO_CONT_COLOR_ATTS);
+ T(log_items[1] == SG_LOGITEM_VALIDATION_FAILED);
+ sg_shutdown();
+}
+
+UTEST(sokol_gfx, make_pass_validate_image) {
+ setup(&(sg_desc){0});
+ const sg_image_desc img_desc = { .render_target = true, .width = 64, .height = 64 };
+ const sg_image img0 = sg_make_image(&img_desc);
+ const sg_image img1 = sg_make_image(&img_desc);
+ sg_destroy_image(img1);
+ const sg_pass pass = sg_make_pass(&(sg_pass_desc){
+ .color_attachments = {
+ [0].image = img0,
+ [1].image = img1,
+ }
+ });
+ T(sg_query_pass_state(pass) == SG_RESOURCESTATE_FAILED);
+ T(log_items[0] == SG_LOGITEM_VALIDATE_PASSDESC_IMAGE);
+ T(log_items[1] == SG_LOGITEM_VALIDATION_FAILED);
+ sg_shutdown();
+}
+
+UTEST(sokol_gfx, make_pass_validate_miplevel) {
+ setup(&(sg_desc){0});
+ const sg_image img = sg_make_image(&(sg_image_desc){
+ .render_target = true,
+ .width = 16,
+ .height = 16,
+ .num_mipmaps = 4,
+ });
+ const sg_pass pass = sg_make_pass(&(sg_pass_desc){
+ .color_attachments[0] = { .image = img, .mip_level = 4 }
+ });
+ T(sg_query_pass_state(pass) == SG_RESOURCESTATE_FAILED);
+ T(log_items[0] == SG_LOGITEM_VALIDATE_PASSDESC_MIPLEVEL);
+ T(log_items[1] == SG_LOGITEM_VALIDATION_FAILED);
+ sg_shutdown();
+}
+
+UTEST(sokol_gfx, make_pass_validate_face) {
+ setup(&(sg_desc){0});
+ const sg_image img = sg_make_image(&(sg_image_desc){
+ .render_target = true,
+ .type = SG_IMAGETYPE_CUBE,
+ .width = 64,
+ .height = 64,
+ });
+ const sg_pass pass = sg_make_pass(&(sg_pass_desc){
+ .color_attachments[0] = { .image = img, .slice = 6 }
+ });
+ T(sg_query_pass_state(pass) == SG_RESOURCESTATE_FAILED);
+ T(log_items[0] == SG_LOGITEM_VALIDATE_PASSDESC_FACE);
+ T(log_items[1] == SG_LOGITEM_VALIDATION_FAILED);
+ sg_shutdown();
+}
+
+UTEST(sokol_gfx, make_pass_validate_layer) {
+ setup(&(sg_desc){0});
+ const sg_image img = sg_make_image(&(sg_image_desc){
+ .render_target = true,
+ .type = SG_IMAGETYPE_ARRAY,
+ .width = 64,
+ .height = 64,
+ .num_slices = 4,
+ });
+ const sg_pass pass = sg_make_pass(&(sg_pass_desc){
+ .color_attachments[0] = { .image = img, .slice = 5 },
+ });
+ T(sg_query_pass_state(pass) == SG_RESOURCESTATE_FAILED);
+ T(log_items[0] == SG_LOGITEM_VALIDATE_PASSDESC_LAYER);
+ T(log_items[1] == SG_LOGITEM_VALIDATION_FAILED);
+ sg_shutdown();
+}
+
+UTEST(sokol_gfx, make_pass_validate_slice) {
+ setup(&(sg_desc){0});
+ const sg_image img = sg_make_image(&(sg_image_desc){
+ .render_target = true,
+ .type = SG_IMAGETYPE_3D,
+ .width = 64,
+ .height = 64,
+ .num_slices = 4,
+ });
+ const sg_pass pass = sg_make_pass(&(sg_pass_desc){
+ .color_attachments[0] = { .image = img, .slice = 5 },
+ });
+ T(sg_query_pass_state(pass) == SG_RESOURCESTATE_FAILED);
+ T(log_items[0] == SG_LOGITEM_VALIDATE_PASSDESC_SLICE);
+ T(log_items[1] == SG_LOGITEM_VALIDATION_FAILED);
+ sg_shutdown();
+}
+
+UTEST(sokol_gfx, make_pass_validate_image_no_rt) {
+ setup(&(sg_desc){0});
+ const sg_image img = sg_make_image(&(sg_image_desc){
+ .width = 8,
+ .height = 8,
+ .usage = SG_USAGE_DYNAMIC,
+ });
+ const sg_pass pass = sg_make_pass(&(sg_pass_desc){
+ .color_attachments[0].image = img,
+ });
+ T(sg_query_pass_state(pass) == SG_RESOURCESTATE_FAILED);
+ T(log_items[0] == SG_LOGITEM_VALIDATE_PASSDESC_IMAGE_NO_RT);
+ T(log_items[1] == SG_LOGITEM_VALIDATION_FAILED);
+ sg_shutdown();
+}
+
+UTEST(sokol_gfx, make_pass_validate_color_inv_pixelformat) {
+ setup(&(sg_desc){0});
+ const sg_image_desc img_desc = {
+ .render_target = true,
+ .width = 8,
+ .height = 8,
+ .pixel_format = SG_PIXELFORMAT_DEPTH,
+ };
+ reset_log_items();
+ const sg_pass pass = sg_make_pass(&(sg_pass_desc){
+ .color_attachments[0].image = sg_make_image(&img_desc),
+ .depth_stencil_attachment.image = sg_make_image(&img_desc),
+ });
+ T(sg_query_pass_state(pass) == SG_RESOURCESTATE_FAILED);
+ T(log_items[0] == SG_LOGITEM_VALIDATE_PASSDESC_COLOR_INV_PIXELFORMAT);
+ T(log_items[1] == SG_LOGITEM_VALIDATION_FAILED);
+ sg_shutdown();
+}
+
+UTEST(sokol_gfx, make_pass_validate_depth_inv_pixelformat) {
+ setup(&(sg_desc){0});
+ const sg_image_desc img_desc = {
+ .render_target = true,
+ .width = 8,
+ .height = 8,
+ };
+ const sg_pass pass = sg_make_pass(&(sg_pass_desc){
+ .color_attachments[0].image = sg_make_image(&img_desc),
+ .depth_stencil_attachment.image = sg_make_image(&img_desc),
+ });
+ T(sg_query_pass_state(pass) == SG_RESOURCESTATE_FAILED);
+ T(log_items[0] == SG_LOGITEM_VALIDATE_PASSDESC_DEPTH_INV_PIXELFORMAT);
+ T(log_items[1] == SG_LOGITEM_VALIDATION_FAILED);
+ sg_shutdown();
+}
+
+UTEST(sokol_gfx, make_pass_validate_image_sizes) {
+ setup(&(sg_desc){0});
+ const sg_image img0 = sg_make_image(&(sg_image_desc){
+ .render_target = true,
+ .width = 64,
+ .height = 64,
+ });
+ const sg_image img1 = sg_make_image(&(sg_image_desc){
+ .render_target = true,
+ .width = 32,
+ .height = 32,
+ });
+ const sg_pass pass = sg_make_pass(&(sg_pass_desc){
+ .color_attachments = {
+ [0].image = img0,
+ [1].image = img1,
+ }
+ });
+ T(sg_query_pass_state(pass) == SG_RESOURCESTATE_FAILED);
+ T(log_items[0] == SG_LOGITEM_VALIDATE_PASSDESC_IMAGE_SIZES);
+ T(log_items[1] == SG_LOGITEM_VALIDATE_PASSDESC_IMAGE_SIZES);
+ T(log_items[2] == SG_LOGITEM_VALIDATION_FAILED);
+ sg_shutdown();
+}
+
+UTEST(sokol_gfx, make_pass_validate_image_sample_counts) {
+ setup(&(sg_desc){0});
+ const sg_image img0 = sg_make_image(&(sg_image_desc){
+ .render_target = true,
+ .width = 64,
+ .height = 64,
+ .sample_count = 4,
+ });
+ const sg_image img1 = sg_make_image(&(sg_image_desc){
+ .render_target = true,
+ .width = 64,
+ .height = 64,
+ .sample_count = 2,
+ });
+ const sg_pass pass = sg_make_pass(&(sg_pass_desc){
+ .color_attachments = {
+ [0].image = img0,
+ [1].image = img1,
+ }
+ });
+ T(sg_query_pass_state(pass) == SG_RESOURCESTATE_FAILED);
+ T(log_items[0] == SG_LOGITEM_VALIDATE_PASSDESC_IMAGE_SAMPLE_COUNTS);
+ T(log_items[1] == SG_LOGITEM_VALIDATION_FAILED);
+ sg_shutdown();
+}
+
+UTEST(sokol_gfx, make_pass_validate_resolve_color_image_msaa) {
+ setup(&(sg_desc){0});
+ const sg_image color_img = sg_make_image(&(sg_image_desc){
+ .render_target = true,
+ .width = 64,
+ .height = 64,
+ .sample_count = 1,
+ });
+ const sg_image resolve_img = sg_make_image(&(sg_image_desc){
+ .render_target = true,
+ .width = 64,
+ .height = 64,
+ .sample_count = 1,
+ });
+ const sg_pass pass = sg_make_pass(&(sg_pass_desc){
+ .color_attachments[0].image = color_img,
+ .resolve_attachments[0].image = resolve_img,
+ });
+ T(sg_query_pass_state(pass) == SG_RESOURCESTATE_FAILED);
+ T(log_items[0] == SG_LOGITEM_VALIDATE_PASSDESC_RESOLVE_COLOR_IMAGE_MSAA);
+ T(log_items[1] == SG_LOGITEM_VALIDATION_FAILED);
+ sg_shutdown();
+}
+
+UTEST(sokol_gfx, make_pass_validate_resolve_image) {
+ setup(&(sg_desc){0});
+ const sg_image color_img = sg_make_image(&(sg_image_desc){
+ .render_target = true,
+ .width = 64,
+ .height = 64,
+ .sample_count = 4,
+ });
+ const sg_image resolve_img = sg_make_image(&(sg_image_desc){
+ .render_target = true,
+ .width = 64,
+ .height = 64,
+ .sample_count = 1,
+ });
+ sg_destroy_image(resolve_img);
+ const sg_pass pass = sg_make_pass(&(sg_pass_desc){
+ .color_attachments[0].image = color_img,
+ .resolve_attachments[0].image = resolve_img,
+ });
+ T(sg_query_pass_state(pass) == SG_RESOURCESTATE_FAILED);
+ T(log_items[0] == SG_LOGITEM_VALIDATE_PASSDESC_RESOLVE_IMAGE);
+ T(log_items[1] == SG_LOGITEM_VALIDATION_FAILED);
+ sg_shutdown();
+}
+
+UTEST(sokol_gfx, make_pass_validate_resolve_sample_count) {
+ setup(&(sg_desc){0});
+ const sg_image color_img = sg_make_image(&(sg_image_desc){
+ .render_target = true,
+ .width = 64,
+ .height = 64,
+ .sample_count = 4,
+ });
+ const sg_image resolve_img = sg_make_image(&(sg_image_desc){
+ .render_target = true,
+ .width = 64,
+ .height = 64,
+ .sample_count = 4,
+ });
+ const sg_pass pass = sg_make_pass(&(sg_pass_desc){
+ .color_attachments[0].image = color_img,
+ .resolve_attachments[0].image = resolve_img,
+ });
+ T(sg_query_pass_state(pass) == SG_RESOURCESTATE_FAILED);
+ T(log_items[0] == SG_LOGITEM_VALIDATE_PASSDESC_RESOLVE_SAMPLE_COUNT);
+ T(log_items[1] == SG_LOGITEM_VALIDATION_FAILED);
+ sg_shutdown();
+}
+
+UTEST(sokol_gfx, make_pass_validate_resolve_miplevel) {
+ setup(&(sg_desc){0});
+ const sg_image color_img = sg_make_image(&(sg_image_desc){
+ .render_target = true,
+ .width = 64,
+ .height = 64,
+ .sample_count = 4,
+ });
+ const sg_image resolve_img = sg_make_image(&(sg_image_desc){
+ .render_target = true,
+ .width = 64,
+ .height = 64,
+ .sample_count = 1,
+ });
+ const sg_pass pass = sg_make_pass(&(sg_pass_desc){
+ .color_attachments[0] = { .image = color_img },
+ .resolve_attachments[0] = { .image = resolve_img, .mip_level = 1 },
+ });
+ T(sg_query_pass_state(pass) == SG_RESOURCESTATE_FAILED);
+ T(log_items[0] == SG_LOGITEM_VALIDATE_PASSDESC_RESOLVE_MIPLEVEL);
+ // FIXME: these are confusing
+ T(log_items[1] == SG_LOGITEM_VALIDATE_PASSDESC_RESOLVE_IMAGE_SIZES);
+ T(log_items[2] == SG_LOGITEM_VALIDATE_PASSDESC_RESOLVE_IMAGE_SIZES);
+ T(log_items[3] == SG_LOGITEM_VALIDATION_FAILED);
+ sg_shutdown();
+}
+
+UTEST(sokol_gfx, make_pass_validate_resolve_face) {
+ setup(&(sg_desc){0});
+ const sg_image color_img = sg_make_image(&(sg_image_desc){
+ .render_target = true,
+ .width = 64,
+ .height = 64,
+ .sample_count = 4,
+ });
+ const sg_image resolve_img = sg_make_image(&(sg_image_desc){
+ .render_target = true,
+ .type = SG_IMAGETYPE_CUBE,
+ .width = 64,
+ .height = 64,
+ .sample_count = 1,
+ });
+ const sg_pass pass = sg_make_pass(&(sg_pass_desc){
+ .color_attachments[0] = { .image = color_img },
+ .resolve_attachments[0] = { .image = resolve_img, .slice = 6 },
+ });
+ T(sg_query_pass_state(pass) == SG_RESOURCESTATE_FAILED);
+ T(log_items[0] == SG_LOGITEM_VALIDATE_PASSDESC_RESOLVE_FACE);
+ T(log_items[1] == SG_LOGITEM_VALIDATION_FAILED);
+ sg_shutdown();
+}
+
+UTEST(sokol_gfx, make_pass_validate_resolve_layer) {
+ setup(&(sg_desc){0});
+ const sg_image color_img = sg_make_image(&(sg_image_desc){
+ .render_target = true,
+ .width = 64,
+ .height = 64,
+ .sample_count = 4,
+ });
+ const sg_image resolve_img = sg_make_image(&(sg_image_desc){
+ .render_target = true,
+ .type = SG_IMAGETYPE_ARRAY,
+ .width = 64,
+ .height = 64,
+ .num_slices = 4,
+ .sample_count = 1,
+ });
+ const sg_pass pass = sg_make_pass(&(sg_pass_desc){
+ .color_attachments[0] = { .image = color_img },
+ .resolve_attachments[0] = { .image = resolve_img, .slice = 4 },
+ });
+ T(sg_query_pass_state(pass) == SG_RESOURCESTATE_FAILED);
+ T(log_items[0] == SG_LOGITEM_VALIDATE_PASSDESC_RESOLVE_LAYER);
+ T(log_items[1] == SG_LOGITEM_VALIDATION_FAILED);
+ sg_shutdown();
+}
+
+UTEST(sokol_gfx, make_pass_validate_resolve_slice) {
+ setup(&(sg_desc){0});
+ const sg_image color_img = sg_make_image(&(sg_image_desc){
+ .render_target = true,
+ .width = 64,
+ .height = 64,
+ .sample_count = 4,
+ });
+ const sg_image resolve_img = sg_make_image(&(sg_image_desc){
+ .render_target = true,
+ .type = SG_IMAGETYPE_3D,
+ .width = 64,
+ .height = 64,
+ .num_slices = 4,
+ .sample_count = 1,
+ });
+ const sg_pass pass = sg_make_pass(&(sg_pass_desc){
+ .color_attachments[0] = { .image = color_img },
+ .resolve_attachments[0] = { .image = resolve_img, .slice = 4 },
+ });
+ T(sg_query_pass_state(pass) == SG_RESOURCESTATE_FAILED);
+ T(log_items[0] == SG_LOGITEM_VALIDATE_PASSDESC_RESOLVE_SLICE);
+ T(log_items[1] == SG_LOGITEM_VALIDATION_FAILED);
+ sg_shutdown();
+}
+
+UTEST(sokol_gfx, make_pass_validate_resolve_image_no_rt) {
+ setup(&(sg_desc){0});
+ const sg_image color_img = sg_make_image(&(sg_image_desc){
+ .render_target = true,
+ .width = 64,
+ .height = 64,
+ .sample_count = 4,
+ });
+ const sg_image resolve_img = sg_make_image(&(sg_image_desc){
+ .width = 64,
+ .height = 64,
+ .usage = SG_USAGE_DYNAMIC,
+ .sample_count = 1,
+ });
+ const sg_pass pass = sg_make_pass(&(sg_pass_desc){
+ .color_attachments[0] = { .image = color_img },
+ .resolve_attachments[0] = { .image = resolve_img },
+ });
+ T(sg_query_pass_state(pass) == SG_RESOURCESTATE_FAILED);
+ T(log_items[0] == SG_LOGITEM_VALIDATE_PASSDESC_RESOLVE_IMAGE_NO_RT);
+ T(log_items[1] == SG_LOGITEM_VALIDATION_FAILED);
+ sg_shutdown();
+}
+
+UTEST(sokol_gfx, make_pass_validate_resolve_image_sizes) {
+ setup(&(sg_desc){0});
+ const sg_image color_img = sg_make_image(&(sg_image_desc){
+ .render_target = true,
+ .width = 64,
+ .height = 64,
+ .sample_count = 4,
+ });
+ const sg_image resolve_img = sg_make_image(&(sg_image_desc){
+ .render_target = true,
+ .width = 32,
+ .height = 32,
+ .sample_count = 1,
+ });
+ const sg_pass pass = sg_make_pass(&(sg_pass_desc){
+ .color_attachments[0] = { .image = color_img },
+ .resolve_attachments[0] = { .image = resolve_img },
+ });
+ T(sg_query_pass_state(pass) == SG_RESOURCESTATE_FAILED);
+ T(log_items[0] == SG_LOGITEM_VALIDATE_PASSDESC_RESOLVE_IMAGE_SIZES);
+ T(log_items[1] == SG_LOGITEM_VALIDATE_PASSDESC_RESOLVE_IMAGE_SIZES);
+ T(log_items[2] == SG_LOGITEM_VALIDATION_FAILED);
+ sg_shutdown();
+}
+
+UTEST(sokol_gfx, make_pass_validate_resolve_image_format) {
+ setup(&(sg_desc){0});
+ const sg_image color_img = sg_make_image(&(sg_image_desc){
+ .render_target = true,
+ .width = 64,
+ .height = 64,
+ .sample_count = 4,
+ });
+ const sg_image resolve_img = sg_make_image(&(sg_image_desc){
+ .render_target = true,
+ .width = 64,
+ .height = 64,
+ .pixel_format = SG_PIXELFORMAT_R8,
+ .sample_count = 1,
+ });
+ const sg_pass pass = sg_make_pass(&(sg_pass_desc){
+ .color_attachments[0] = { .image = color_img },
+ .resolve_attachments[0] = { .image = resolve_img },
+ });
+ T(sg_query_pass_state(pass) == SG_RESOURCESTATE_FAILED);
+ T(log_items[0] == SG_LOGITEM_VALIDATE_PASSDESC_RESOLVE_IMAGE_FORMAT);
+ T(log_items[1] == SG_LOGITEM_VALIDATION_FAILED);
+ sg_shutdown();
+}
+
+UTEST(sokol_gfx, make_pass_validate_depth_image) {
+ setup(&(sg_desc){0});
+ const sg_image color_img = sg_make_image(&(sg_image_desc){
+ .render_target = true,
+ .width = 64,
+ .height = 64,
+ });
+ const sg_image depth_img = sg_make_image(&(sg_image_desc){
+ .render_target = true,
+ .width = 64,
+ .height = 64,
+ .pixel_format = SG_PIXELFORMAT_DEPTH,
+ });
+ sg_destroy_image(depth_img);
+ const sg_pass pass = sg_make_pass(&(sg_pass_desc){
+ .color_attachments[0] = { .image = color_img },
+ .depth_stencil_attachment.image = depth_img,
+ });
+ T(sg_query_pass_state(pass) == SG_RESOURCESTATE_FAILED);
+ T(log_items[0] == SG_LOGITEM_VALIDATE_PASSDESC_DEPTH_IMAGE);
+ T(log_items[1] == SG_LOGITEM_VALIDATION_FAILED);
+ sg_shutdown();
+}
+
+UTEST(sokol_gfx, make_pass_validate_depth_miplevel) {
+ setup(&(sg_desc){0});
+ const sg_image color_img = sg_make_image(&(sg_image_desc){
+ .render_target = true,
+ .width = 64,
+ .height = 64,
+ });
+ const sg_image depth_img = sg_make_image(&(sg_image_desc){
+ .render_target = true,
+ .width = 64,
+ .height = 64,
+ .pixel_format = SG_PIXELFORMAT_DEPTH,
+ });
+ const sg_pass pass = sg_make_pass(&(sg_pass_desc){
+ .color_attachments[0] = { .image = color_img },
+ .depth_stencil_attachment = { .image = depth_img, .mip_level = 1 },
+ });
+ T(sg_query_pass_state(pass) == SG_RESOURCESTATE_FAILED);
+ T(log_items[0] == SG_LOGITEM_VALIDATE_PASSDESC_DEPTH_MIPLEVEL);
+ // FIXME: these additional validation errors are confusing
+ T(log_items[1] == SG_LOGITEM_VALIDATE_PASSDESC_DEPTH_IMAGE_SIZES);
+ T(log_items[2] == SG_LOGITEM_VALIDATE_PASSDESC_DEPTH_IMAGE_SIZES);
+ T(log_items[3] == SG_LOGITEM_VALIDATION_FAILED);
+ sg_shutdown();
+}
+
+UTEST(sokol_gfx, make_pass_validate_depth_face) {
+ setup(&(sg_desc){0});
+ const sg_image color_img = sg_make_image(&(sg_image_desc){
+ .render_target = true,
+ .width = 64,
+ .height = 64,
+ });
+ const sg_image depth_img = sg_make_image(&(sg_image_desc){
+ .render_target = true,
+ .type = SG_IMAGETYPE_CUBE,
+ .width = 64,
+ .height = 64,
+ .pixel_format = SG_PIXELFORMAT_DEPTH,
+ });
+ const sg_pass pass = sg_make_pass(&(sg_pass_desc){
+ .color_attachments[0] = { .image = color_img },
+ .depth_stencil_attachment = { .image = depth_img, .slice = 6 },
+ });
+ T(sg_query_pass_state(pass) == SG_RESOURCESTATE_FAILED);
+ T(log_items[0] == SG_LOGITEM_VALIDATE_PASSDESC_DEPTH_FACE);
+ T(log_items[1] == SG_LOGITEM_VALIDATION_FAILED);
+ sg_shutdown();
+}
+
+UTEST(sokol_gfx, make_pass_validate_depth_layer) {
+ setup(&(sg_desc){0});
+ const sg_image color_img = sg_make_image(&(sg_image_desc){
+ .render_target = true,
+ .width = 64,
+ .height = 64,
+ });
+ const sg_image depth_img = sg_make_image(&(sg_image_desc){
+ .render_target = true,
+ .type = SG_IMAGETYPE_ARRAY,
+ .width = 64,
+ .height = 64,
+ .num_slices = 4,
+ .pixel_format = SG_PIXELFORMAT_DEPTH,
+ });
+ const sg_pass pass = sg_make_pass(&(sg_pass_desc){
+ .color_attachments[0] = { .image = color_img },
+ .depth_stencil_attachment = { .image = depth_img, .slice = 4 },
+ });
+ T(sg_query_pass_state(pass) == SG_RESOURCESTATE_FAILED);
+ T(log_items[0] == SG_LOGITEM_VALIDATE_PASSDESC_DEPTH_LAYER);
+ T(log_items[1] == SG_LOGITEM_VALIDATION_FAILED);
+ sg_shutdown();
+}
+
+// NOTE: VALIDATE_PASSDESC_DEPTH_SLICE can't actually happen because VALIDATE_IMAGEDESC_DEPTH_3D_IMAGE
+
+// NOTE: VALIDATE_DEPTH_IMAGE_NO_RT can't actually happen because VALIDATE_IMAGEDESC_NONRT_PIXELFORMAT
+
+UTEST(sokol_gfx, make_pass_validate_depth_image_sizes) {
+ setup(&(sg_desc){0});
+ const sg_image color_img = sg_make_image(&(sg_image_desc){
+ .render_target = true,
+ .width = 64,
+ .height = 64,
+ });
+ const sg_image depth_img = sg_make_image(&(sg_image_desc){
+ .render_target = true,
+ .width = 32,
+ .height = 32,
+ .pixel_format = SG_PIXELFORMAT_DEPTH,
+ });
+ const sg_pass pass = sg_make_pass(&(sg_pass_desc){
+ .color_attachments[0] = { .image = color_img },
+ .depth_stencil_attachment = { .image = depth_img },
+ });
+ T(sg_query_pass_state(pass) == SG_RESOURCESTATE_FAILED);
+ T(log_items[0] == SG_LOGITEM_VALIDATE_PASSDESC_DEPTH_IMAGE_SIZES);
+ T(log_items[1] == SG_LOGITEM_VALIDATE_PASSDESC_DEPTH_IMAGE_SIZES);
+ T(log_items[2] == SG_LOGITEM_VALIDATION_FAILED);
+ sg_shutdown();
+}
+
+UTEST(sokol_gfx, make_pass_validate_depth_image_sample_count) {
+ setup(&(sg_desc){0});
+ const sg_image color_img = sg_make_image(&(sg_image_desc){
+ .render_target = true,
+ .width = 64,
+ .height = 64,
+ .sample_count = 4,
+ });
+ const sg_image depth_img = sg_make_image(&(sg_image_desc){
+ .render_target = true,
+ .width = 64,
+ .height = 64,
+ .pixel_format = SG_PIXELFORMAT_DEPTH,
+ .sample_count = 2,
+ });
+ const sg_pass pass = sg_make_pass(&(sg_pass_desc){
+ .color_attachments[0] = { .image = color_img },
+ .depth_stencil_attachment = { .image = depth_img },
+ });
+ T(sg_query_pass_state(pass) == SG_RESOURCESTATE_FAILED);
+ T(log_items[0] == SG_LOGITEM_VALIDATE_PASSDESC_DEPTH_IMAGE_SAMPLE_COUNT);
+ T(log_items[1] == SG_LOGITEM_VALIDATION_FAILED);
+ sg_shutdown();
+}