aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndre Weissflog <floooh@gmail.com>2023-05-15 17:49:27 +0200
committerAndre Weissflog <floooh@gmail.com>2023-05-15 17:49:27 +0200
commit726fce2cc7f7bec2aa72af49f0323bb40cab9647 (patch)
tree365e5b3e72555e8ef8c43ee63a96375f1a82c1f2
parentc8c88229a228afc22dc211c58336737111f92286 (diff)
add sokol-gfx validation tests for buffer and image creation
-rw-r--r--tests/functional/sokol_gfx_test.c311
1 files changed, 298 insertions, 13 deletions
diff --git a/tests/functional/sokol_gfx_test.c b/tests/functional/sokol_gfx_test.c
index 1f526d06..ca1fd369 100644
--- a/tests/functional/sokol_gfx_test.c
+++ b/tests/functional/sokol_gfx_test.c
@@ -11,8 +11,9 @@
#define T(b) EXPECT_TRUE(b)
+#define MAX_LOGITEMS (32)
static int num_log_called = 0;
-static sg_log_item log_item;
+static sg_log_item log_items[MAX_LOGITEMS];
static void test_logger(const char* tag, uint32_t log_level, uint32_t log_item_id, const char* message_or_null, uint32_t line_nr, const char* filename_or_null, void* user_data) {
(void)tag;
@@ -21,8 +22,9 @@ static void test_logger(const char* tag, uint32_t log_level, uint32_t log_item_i
(void)line_nr;
(void)filename_or_null;
(void)user_data;
- num_log_called++;
- log_item = log_item_id;
+ if (num_log_called < MAX_LOGITEMS) {
+ log_items[num_log_called++] = log_item_id;
+ }
if (message_or_null) {
printf("%s\n", message_or_null);
}
@@ -30,6 +32,7 @@ static void test_logger(const char* tag, uint32_t log_level, uint32_t log_item_i
static void setup(const sg_desc* desc) {
num_log_called = 0;
+ memset(log_items, 0, sizeof(log_items));
sg_desc desc_with_logger = *desc;
desc_with_logger.logger.func = test_logger;
sg_setup(&desc_with_logger);
@@ -1437,7 +1440,7 @@ UTEST(sokol_gfx, make_dealloc_buffer_warns) {
sg_buffer buf = create_buffer();
T(sg_query_buffer_state(buf) == SG_RESOURCESTATE_VALID);
sg_dealloc_buffer(buf);
- T(log_item == SG_LOGITEM_DEALLOC_BUFFER_INVALID_STATE);
+ T(log_items[0] == SG_LOGITEM_DEALLOC_BUFFER_INVALID_STATE);
T(num_log_called == 1);
T(sg_query_buffer_state(buf) == SG_RESOURCESTATE_VALID);
sg_destroy_buffer(buf);
@@ -1450,7 +1453,7 @@ UTEST(sokol_gfx, make_dealloc_image_warns) {
sg_image img = create_image();
T(sg_query_image_state(img) == SG_RESOURCESTATE_VALID);
sg_dealloc_image(img);
- T(log_item == SG_LOGITEM_DEALLOC_IMAGE_INVALID_STATE);
+ T(log_items[0] == SG_LOGITEM_DEALLOC_IMAGE_INVALID_STATE);
T(num_log_called == 1);
T(sg_query_image_state(img) == SG_RESOURCESTATE_VALID);
sg_destroy_image(img);
@@ -1463,7 +1466,7 @@ UTEST(sokol_gfx, make_dealloc_shader_warns) {
sg_shader shd = create_shader();
T(sg_query_shader_state(shd) == SG_RESOURCESTATE_VALID);
sg_dealloc_shader(shd);
- T(log_item == SG_LOGITEM_DEALLOC_SHADER_INVALID_STATE);
+ T(log_items[0] == SG_LOGITEM_DEALLOC_SHADER_INVALID_STATE);
T(num_log_called == 1);
T(sg_query_shader_state(shd) == SG_RESOURCESTATE_VALID);
sg_destroy_shader(shd);
@@ -1476,7 +1479,7 @@ UTEST(sokol_gfx, make_dealloc_pipeline_warns) {
sg_pipeline pip = create_pipeline();
T(sg_query_pipeline_state(pip) == SG_RESOURCESTATE_VALID);
sg_dealloc_pipeline(pip);
- T(log_item == SG_LOGITEM_DEALLOC_PIPELINE_INVALID_STATE);
+ T(log_items[0] == SG_LOGITEM_DEALLOC_PIPELINE_INVALID_STATE);
T(num_log_called == 1);
T(sg_query_pipeline_state(pip) == SG_RESOURCESTATE_VALID);
sg_destroy_pipeline(pip);
@@ -1489,7 +1492,7 @@ UTEST(sokol_gfx, make_dealloc_pass_warns) {
sg_pass pass = create_pass();
T(sg_query_pass_state(pass) == SG_RESOURCESTATE_VALID);
sg_dealloc_pass(pass);
- T(log_item == SG_LOGITEM_DEALLOC_PASS_INVALID_STATE);
+ T(log_items[0] == SG_LOGITEM_DEALLOC_PASS_INVALID_STATE);
T(num_log_called == 1);
T(sg_query_pass_state(pass) == SG_RESOURCESTATE_VALID);
sg_destroy_pass(pass);
@@ -1502,7 +1505,7 @@ UTEST(sokol_gfx, alloc_uninit_buffer_warns) {
sg_buffer buf = sg_alloc_buffer();
T(sg_query_buffer_state(buf) == SG_RESOURCESTATE_ALLOC);
sg_uninit_buffer(buf);
- T(log_item == SG_LOGITEM_UNINIT_BUFFER_INVALID_STATE);
+ T(log_items[0] == SG_LOGITEM_UNINIT_BUFFER_INVALID_STATE);
T(num_log_called == 1);
T(sg_query_buffer_state(buf) == SG_RESOURCESTATE_ALLOC);
sg_shutdown();
@@ -1513,7 +1516,7 @@ UTEST(sokol_gfx, alloc_uninit_image_warns) {
sg_image img = sg_alloc_image();
T(sg_query_image_state(img) == SG_RESOURCESTATE_ALLOC);
sg_uninit_image(img);
- T(log_item == SG_LOGITEM_UNINIT_IMAGE_INVALID_STATE);
+ T(log_items[0] == SG_LOGITEM_UNINIT_IMAGE_INVALID_STATE);
T(num_log_called == 1);
T(sg_query_image_state(img) == SG_RESOURCESTATE_ALLOC);
sg_shutdown();
@@ -1524,7 +1527,7 @@ UTEST(sokol_gfx, alloc_uninit_shader_warns) {
sg_shader shd = sg_alloc_shader();
T(sg_query_shader_state(shd) == SG_RESOURCESTATE_ALLOC);
sg_uninit_shader(shd);
- T(log_item == SG_LOGITEM_UNINIT_SHADER_INVALID_STATE);
+ T(log_items[0] == SG_LOGITEM_UNINIT_SHADER_INVALID_STATE);
T(num_log_called == 1);
T(sg_query_shader_state(shd) == SG_RESOURCESTATE_ALLOC);
sg_shutdown();
@@ -1535,7 +1538,7 @@ UTEST(sokol_gfx, alloc_uninit_pipeline_warns) {
sg_pipeline pip = sg_alloc_pipeline();
T(sg_query_pipeline_state(pip) == SG_RESOURCESTATE_ALLOC);
sg_uninit_pipeline(pip);
- T(log_item == SG_LOGITEM_UNINIT_PIPELINE_INVALID_STATE);
+ T(log_items[0] == SG_LOGITEM_UNINIT_PIPELINE_INVALID_STATE);
T(num_log_called == 1);
T(sg_query_pipeline_state(pip) == SG_RESOURCESTATE_ALLOC);
sg_shutdown();
@@ -1546,7 +1549,7 @@ UTEST(sokol_gfx, alloc_uninit_pass_warns) {
sg_pass pass = sg_alloc_pass();
T(sg_query_pass_state(pass) == SG_RESOURCESTATE_ALLOC);
sg_uninit_pass(pass);
- T(log_item == SG_LOGITEM_UNINIT_PASS_INVALID_STATE);
+ T(log_items[0] == SG_LOGITEM_UNINIT_PASS_INVALID_STATE);
T(num_log_called == 1);
T(sg_query_pass_state(pass) == SG_RESOURCESTATE_ALLOC);
sg_shutdown();
@@ -1640,3 +1643,285 @@ UTEST(sokol_gfx, make_pass_with_nonvalid_color_images) {
T(sg_query_pass_state(pass) == SG_RESOURCESTATE_INVALID);
sg_shutdown();
}
+
+UTEST(sokol_gfx, make_buffer_validate_start_canary) {
+ setup(&(sg_desc){0});
+ const uint32_t data[32] = {0};
+ sg_buffer buf = sg_make_buffer(&(sg_buffer_desc){
+ ._start_canary = 1234,
+ .data = SG_RANGE(data),
+ });
+ T(sg_query_buffer_state(buf) == SG_RESOURCESTATE_FAILED);
+ T(log_items[0] == SG_LOGITEM_VALIDATE_BUFFERDESC_CANARY);
+ T(log_items[1] == SG_LOGITEM_VALIDATION_FAILED);
+ sg_shutdown();
+}
+
+UTEST(sokol_gfx, make_buffer_validate_end_canary) {
+ setup(&(sg_desc){0});
+ const uint32_t data[32] = {0};
+ sg_buffer buf = sg_make_buffer(&(sg_buffer_desc){
+ .data = SG_RANGE(data),
+ ._end_canary = 1234,
+ });
+ T(sg_query_buffer_state(buf) == SG_RESOURCESTATE_FAILED);
+ T(log_items[0] == SG_LOGITEM_VALIDATE_BUFFERDESC_CANARY);
+ T(log_items[1] == SG_LOGITEM_VALIDATION_FAILED);
+ sg_shutdown();
+}
+
+UTEST(sokol_gfx, make_buffer_validate_immutable_nodata) {
+ setup(&(sg_desc){0});
+ sg_buffer buf = sg_make_buffer(&(sg_buffer_desc){ 0 });
+ T(sg_query_buffer_state(buf) == SG_RESOURCESTATE_FAILED);
+ T(log_items[0] == SG_LOGITEM_VALIDATE_BUFFERDESC_SIZE);
+ T(log_items[1] == SG_LOGITEM_VALIDATE_BUFFERDESC_DATA);
+ T(log_items[2] == SG_LOGITEM_VALIDATION_FAILED);
+ sg_shutdown();
+}
+
+UTEST(sokol_gfx, make_buffer_validate_size_mismatch) {
+ setup(&(sg_desc){0});
+ const uint32_t data[16] = { 0 };
+ sg_buffer buf = sg_make_buffer(&(sg_buffer_desc){
+ .size = 15 * sizeof(uint32_t),
+ .data = SG_RANGE(data),
+ });
+ T(sg_query_buffer_state(buf) == SG_RESOURCESTATE_FAILED);
+ T(log_items[0] == SG_LOGITEM_VALIDATE_BUFFERDESC_DATA_SIZE);
+ T(log_items[1] == SG_LOGITEM_VALIDATION_FAILED);
+ sg_shutdown();
+}
+
+UTEST(sokol_gfx, make_buffer_validate_data_ptr_but_no_size) {
+ setup(&(sg_desc){0});
+ const uint32_t data[16] = {0};
+ sg_buffer buf = sg_make_buffer(&(sg_buffer_desc){
+ .data.ptr = data,
+ });
+ T(sg_query_buffer_state(buf) == SG_RESOURCESTATE_FAILED);
+ T(log_items[0] == SG_LOGITEM_VALIDATE_BUFFERDESC_SIZE);
+ T(log_items[1] == SG_LOGITEM_VALIDATE_BUFFERDESC_DATA);
+ T(log_items[2] == SG_LOGITEM_VALIDATION_FAILED);
+ sg_shutdown();
+}
+
+UTEST(sokol_gfx, make_image_validate_start_canary) {
+ setup(&(sg_desc){0});
+ const uint32_t pixels[8][8] = {0};
+ sg_image img = sg_make_image(&(sg_image_desc){
+ ._start_canary = 1234,
+ .width = 8,
+ .height = 8,
+ .data.subimage[0][0] = SG_RANGE(pixels),
+ });
+ T(sg_query_image_state(img) == SG_RESOURCESTATE_FAILED);
+ T(log_items[0] == SG_LOGITEM_VALIDATE_IMAGEDESC_CANARY);
+ T(log_items[1] == SG_LOGITEM_VALIDATION_FAILED);
+ sg_shutdown();
+}
+
+UTEST(sokol_gfx, make_image_validate_end_canary) {
+ setup(&(sg_desc){0});
+ const uint32_t pixels[8][8] = {0};
+ sg_image img = sg_make_image(&(sg_image_desc){
+ .width = 8,
+ .height = 8,
+ .data.subimage[0][0] = SG_RANGE(pixels),
+ ._end_canary = 1234,
+ });
+ T(sg_query_image_state(img) == SG_RESOURCESTATE_FAILED);
+ T(log_items[0] == SG_LOGITEM_VALIDATE_IMAGEDESC_CANARY);
+ T(log_items[1] == SG_LOGITEM_VALIDATION_FAILED);
+ sg_shutdown();
+}
+
+UTEST(sokol_gfx, make_image_zero_width_height) {
+ setup(&(sg_desc){0});
+ const uint32_t pixels[8][8] = {0};
+ sg_image img = sg_make_image(&(sg_image_desc){
+ .width = 0,
+ .height = 0,
+ .data.subimage[0][0] = SG_RANGE(pixels),
+ });
+ T(sg_query_image_state(img) == SG_RESOURCESTATE_FAILED);
+ T(log_items[0] == SG_LOGITEM_VALIDATE_IMAGEDESC_WIDTH);
+ T(log_items[1] == SG_LOGITEM_VALIDATE_IMAGEDESC_HEIGHT);
+ T(log_items[2] == SG_LOGITEM_VALIDATE_IMAGEDATA_DATA_SIZE);
+ T(log_items[3] == SG_LOGITEM_VALIDATION_FAILED);
+ sg_shutdown();
+}
+
+UTEST(sokol_gfx, make_image_validate_msaa_no_rt) {
+ setup(&(sg_desc){0});
+ const uint32_t pixels[8][8] = {0};
+ sg_image img = sg_make_image(&(sg_image_desc){
+ .width = 8,
+ .height = 8,
+ .sample_count = 4,
+ .data.subimage[0][0] = SG_RANGE(pixels),
+ });
+ T(sg_query_image_state(img) == SG_RESOURCESTATE_FAILED);
+ T(log_items[0] == SG_LOGITEM_VALIDATE_IMAGEDESC_MSAA_BUT_NO_RT);
+ T(log_items[1] == SG_LOGITEM_VALIDATION_FAILED);
+ sg_shutdown();
+}
+
+UTEST(sokol_gfx, make_image_validate_msaa_num_mipmaps) {
+ setup(&(sg_desc){0});
+ sg_image img = sg_make_image(&(sg_image_desc){
+ .render_attachment = true,
+ .width = 64,
+ .height = 64,
+ .sample_count = 4,
+ .num_mipmaps = 2,
+ });
+ T(sg_query_image_state(img) == SG_RESOURCESTATE_FAILED);
+ T(log_items[0] == SG_LOGITEM_VALIDATE_IMAGEDESC_MSAA_NUM_MIPMAPS);
+ T(log_items[1] == SG_LOGITEM_VALIDATION_FAILED);
+ sg_shutdown();
+}
+
+UTEST(sokol_gfx, make_image_validate_msaa_3d_image) {
+ setup(&(sg_desc){0});
+ sg_image img = sg_make_image(&(sg_image_desc){
+ .render_attachment = true,
+ .type = SG_IMAGETYPE_3D,
+ .width = 32,
+ .height = 32,
+ .num_slices = 32,
+ .sample_count = 4,
+ });
+ T(sg_query_image_state(img) == SG_RESOURCESTATE_FAILED);
+ T(log_items[0] == SG_LOGITEM_VALIDATE_IMAGEDESC_MSAA_3D_IMAGE);
+ T(log_items[1] == SG_LOGITEM_VALIDATION_FAILED);
+ sg_shutdown();
+}
+
+UTEST(sokol_gfx, make_image_validate_depth_3d_image_with_depth_format) {
+ setup(&(sg_desc){0});
+ sg_image img = sg_make_image(&(sg_image_desc){
+ .render_attachment = true,
+ .type = SG_IMAGETYPE_3D,
+ .width = 8,
+ .height = 8,
+ .num_slices = 8,
+ .pixel_format = SG_PIXELFORMAT_DEPTH,
+ });
+ T(sg_query_image_state(img) == SG_RESOURCESTATE_FAILED);
+ T(log_items[0] == SG_LOGITEM_VALIDATE_IMAGEDESC_DEPTH_3D_IMAGE);
+ T(log_items[1] == SG_LOGITEM_VALIDATION_FAILED);
+ sg_shutdown();
+}
+
+UTEST(sokol_gfx, make_image_validate_rt_immutable) {
+ setup(&(sg_desc){0});
+ sg_image img = sg_make_image(&(sg_image_desc){
+ .render_attachment = true,
+ .usage = SG_USAGE_DYNAMIC,
+ .width = 8,
+ .height = 8,
+ });
+ T(sg_query_image_state(img) == SG_RESOURCESTATE_FAILED);
+ T(log_items[0] == SG_LOGITEM_VALIDATE_IMAGEDESC_RT_IMMUTABLE);
+ T(log_items[1] == SG_LOGITEM_VALIDATION_FAILED);
+ sg_shutdown();
+}
+
+UTEST(sokol_gfx, make_image_validate_dynamic_no_data) {
+ setup(&(sg_desc){0});
+ uint32_t pixels[8][8] = {0};
+ sg_image img = sg_make_image(&(sg_image_desc){
+ .width = 8,
+ .height = 8,
+ .usage = SG_USAGE_DYNAMIC,
+ .data.subimage[0][0] = SG_RANGE(pixels),
+ });
+ T(sg_query_image_state(img) == SG_RESOURCESTATE_FAILED);
+ T(log_items[0] == SG_LOGITEM_VALIDATE_IMAGEDESC_DYNAMIC_NO_DATA);
+ T(log_items[1] == SG_LOGITEM_VALIDATION_FAILED);
+ sg_shutdown();
+}
+
+UTEST(sokol_gfx, make_image_valiate_compressed_immutable) {
+ setup(&(sg_desc){0});
+ sg_image img = sg_make_image(&(sg_image_desc){
+ .width = 8,
+ .height = 8,
+ .pixel_format = SG_PIXELFORMAT_BC1_RGBA,
+ .usage = SG_USAGE_DYNAMIC,
+ });
+ T(sg_query_image_state(img) == SG_RESOURCESTATE_FAILED);
+ T(log_items[0] == SG_LOGITEM_VALIDATE_IMAGEDESC_COMPRESSED_IMMUTABLE);
+ T(log_items[1] == SG_LOGITEM_VALIDATION_FAILED);
+ sg_shutdown();
+}
+
+UTEST(sokol_gfx, make_image_validate_nodata) {
+ setup(&(sg_desc){0});
+ sg_image img = sg_make_image(&(sg_image_desc){
+ .width = 8,
+ .height = 8,
+ });
+ T(sg_query_image_state(img) == SG_RESOURCESTATE_FAILED);
+ T(log_items[0] == SG_LOGITEM_VALIDATE_IMAGEDATA_NODATA);
+ T(log_items[1] == SG_LOGITEM_VALIDATE_IMAGEDATA_DATA_SIZE);
+ T(log_items[2] == SG_LOGITEM_VALIDATION_FAILED);
+ sg_shutdown();
+}
+
+UTEST(sokol_gfx, make_image_validate_data_size) {
+ setup(&(sg_desc){0});
+ uint32_t pixels[4][4] = {0};
+ sg_image img = sg_make_image(&(sg_image_desc){
+ .width = 8,
+ .height = 8,
+ .data.subimage[0][0] = SG_RANGE(pixels),
+ });
+ T(sg_query_image_state(img) == SG_RESOURCESTATE_FAILED);
+ T(log_items[0] == SG_LOGITEM_VALIDATE_IMAGEDATA_DATA_SIZE);
+ T(log_items[1] == SG_LOGITEM_VALIDATION_FAILED);
+ sg_shutdown();
+}
+
+UTEST(sokol_gfx, make_image_validate_missing_mipdata) {
+ setup(&(sg_desc){0});
+ uint32_t mip0[8][8] = {0};
+ uint32_t mip1[4][4] = {0};
+ uint32_t mip2[2][2] = {0};
+ sg_image img = sg_make_image(&(sg_image_desc){
+ .width = 8,
+ .height = 8,
+ .num_mipmaps = 4,
+ .data.subimage[0][0] = SG_RANGE(mip0),
+ .data.subimage[0][1] = SG_RANGE(mip1),
+ .data.subimage[0][2] = SG_RANGE(mip2),
+ });
+ T(sg_query_image_state(img) == SG_RESOURCESTATE_FAILED);
+ T(log_items[0] == SG_LOGITEM_VALIDATE_IMAGEDATA_NODATA);
+ T(log_items[1] == SG_LOGITEM_VALIDATE_IMAGEDATA_DATA_SIZE);
+ T(log_items[2] == SG_LOGITEM_VALIDATION_FAILED);
+ sg_shutdown();
+}
+
+UTEST(sokol_gfx, make_image_validate_wrong_mipsize) {
+ setup(&(sg_desc){0});
+ uint32_t mip0[8][8] = {0};
+ uint32_t mip1[4][4] = {0};
+ uint32_t mip2[2][2] = {0};
+ uint32_t mip3[1][1] = {0};
+ sg_image img = sg_make_image(&(sg_image_desc){
+ .width = 8,
+ .height = 8,
+ .num_mipmaps = 4,
+ .data.subimage[0][0] = SG_RANGE(mip0),
+ .data.subimage[0][1] = SG_RANGE(mip2),
+ .data.subimage[0][2] = SG_RANGE(mip1),
+ .data.subimage[0][3] = SG_RANGE(mip3)
+ });
+ T(sg_query_image_state(img) == SG_RESOURCESTATE_FAILED);
+ T(log_items[0] == SG_LOGITEM_VALIDATE_IMAGEDATA_DATA_SIZE);
+ T(log_items[1] == SG_LOGITEM_VALIDATE_IMAGEDATA_DATA_SIZE);
+ T(log_items[2] == SG_LOGITEM_VALIDATION_FAILED);
+ sg_shutdown();
+}