/* SPDX-License-Identifier: GPL-3.0-or-later */ #include #include #include static int failures; #define CHECK(expression) \ do { \ if (!(expression)) { \ (void)fprintf(stderr, "%s:%d: check failed: %s\n", __FILE__, \ __LINE__, #expression); \ failures += 1; \ } \ } while (0) static void test_complete_lifecycle(void) { static const uint32_t pixels[4] = { UINT32_C(0xff0000ff), UINT32_C(0xff00ff00), UINT32_C(0xffff0000), UINT32_C(0xffffffff)}; chimera_gfx_config config = CHIMERA_GFX_CONFIG_INIT; chimera_gfx_context *context = NULL; chimera_gfx_surface *surface = NULL; chimera_gfx_texture *texture = NULL; chimera_gfx_surface_desc surface_desc = CHIMERA_GFX_SURFACE_DESC_INIT(2u, 2u); chimera_gfx_texture_desc texture_desc = CHIMERA_GFX_TEXTURE_DESC_INIT(2u, 2u); chimera_gfx_texture_upload_info upload = CHIMERA_GFX_TEXTURE_UPLOAD_INIT( pixels, 2u * sizeof(uint32_t), sizeof(pixels)); chimera_gfx_present_info present_info; chimera_gfx_surface_stats stats = CHIMERA_GFX_SURFACE_STATS_INIT; CHECK(chimera_gfx_create(&config, &context) == CHIMERA_GFX_STATUS_OK); CHECK(chimera_gfx_surface_create(context, &surface_desc, &surface) == CHIMERA_GFX_STATUS_OK); CHECK(chimera_gfx_texture_create(context, &texture_desc, &texture) == CHIMERA_GFX_STATUS_OK); present_info = (chimera_gfx_present_info)CHIMERA_GFX_PRESENT_INFO_INIT( surface, texture); CHECK(chimera_gfx_present(context, &present_info) == CHIMERA_GFX_STATUS_INVALID_STATE); CHECK(chimera_gfx_texture_upload(texture, &upload) == CHIMERA_GFX_STATUS_OK); CHECK(chimera_gfx_present(context, &present_info) == CHIMERA_GFX_STATUS_OK); CHECK(chimera_gfx_present(context, &present_info) == CHIMERA_GFX_STATUS_OK); CHECK(chimera_gfx_surface_get_stats(surface, &stats) == CHIMERA_GFX_STATUS_OK); CHECK(stats.api_version == CHIMERA_GFX_API_VERSION); CHECK(stats.present_count == 2u); CHECK(stats.last_present_serial == 2u); CHECK(stats.last_texture_hash != 0u); CHECK(chimera_gfx_context_destroy(context) == CHIMERA_GFX_STATUS_RESOURCE_BUSY); CHECK(chimera_gfx_texture_destroy(texture) == CHIMERA_GFX_STATUS_OK); CHECK(chimera_gfx_surface_destroy(surface) == CHIMERA_GFX_STATUS_OK); CHECK(chimera_gfx_texture_destroy(NULL) == CHIMERA_GFX_STATUS_OK); CHECK(chimera_gfx_surface_destroy(NULL) == CHIMERA_GFX_STATUS_OK); CHECK(chimera_gfx_context_destroy(context) == CHIMERA_GFX_STATUS_OK); } static void test_resource_validation(void) { static const uint32_t pixels[4] = {0u, 0u, 0u, 0u}; chimera_gfx_config config = CHIMERA_GFX_CONFIG_INIT; chimera_gfx_context *context = NULL; chimera_gfx_surface *surface = NULL; chimera_gfx_texture *texture = NULL; chimera_gfx_texture *invalid_texture = NULL; chimera_gfx_surface_desc surface_desc = CHIMERA_GFX_SURFACE_DESC_INIT(2u, 2u); chimera_gfx_texture_desc texture_desc = CHIMERA_GFX_TEXTURE_DESC_INIT(2u, 2u); chimera_gfx_texture_upload_info upload = CHIMERA_GFX_TEXTURE_UPLOAD_INIT( pixels, sizeof(uint32_t), sizeof(pixels)); CHECK(chimera_gfx_create(&config, &context) == CHIMERA_GFX_STATUS_OK); CHECK(chimera_gfx_surface_create(context, &surface_desc, &surface) == CHIMERA_GFX_STATUS_OK); CHECK(chimera_gfx_texture_create(context, &texture_desc, &texture) == CHIMERA_GFX_STATUS_OK); CHECK(chimera_gfx_texture_upload(texture, &upload) == CHIMERA_GFX_STATUS_INVALID_ARGUMENT); texture_desc.api_version += 1u; CHECK( chimera_gfx_texture_create(context, &texture_desc, &invalid_texture) == CHIMERA_GFX_STATUS_VERSION_MISMATCH); CHECK(invalid_texture == NULL); CHECK(chimera_gfx_surface_destroy(surface) == CHIMERA_GFX_STATUS_OK); CHECK(chimera_gfx_texture_destroy(texture) == CHIMERA_GFX_STATUS_OK); CHECK(chimera_gfx_context_destroy(context) == CHIMERA_GFX_STATUS_OK); } static void test_ownership_dimensions_and_limits(void) { static const uint32_t pixels[2] = {0u, 0u}; chimera_gfx_config config = CHIMERA_GFX_CONFIG_INIT; chimera_gfx_context *first_context = NULL; chimera_gfx_context *second_context = NULL; chimera_gfx_surface *surface = NULL; chimera_gfx_surface *surfaces[17] = {NULL}; chimera_gfx_texture *texture = NULL; chimera_gfx_surface_desc surface_desc = CHIMERA_GFX_SURFACE_DESC_INIT(2u, 2u); chimera_gfx_texture_desc texture_desc = CHIMERA_GFX_TEXTURE_DESC_INIT(1u, 2u); chimera_gfx_texture_upload_info upload = CHIMERA_GFX_TEXTURE_UPLOAD_INIT( pixels, sizeof(uint32_t), sizeof(pixels)); chimera_gfx_present_info present_info; chimera_gfx_surface_stats stats = CHIMERA_GFX_SURFACE_STATS_INIT; size_t index; CHECK(chimera_gfx_create(&config, &first_context) == CHIMERA_GFX_STATUS_OK); CHECK(chimera_gfx_create(&config, &second_context) == CHIMERA_GFX_STATUS_OK); CHECK(chimera_gfx_surface_create(first_context, &surface_desc, &surface) == CHIMERA_GFX_STATUS_OK); CHECK(chimera_gfx_texture_create(second_context, &texture_desc, &texture) == CHIMERA_GFX_STATUS_OK); CHECK(chimera_gfx_texture_upload(texture, &upload) == CHIMERA_GFX_STATUS_OK); present_info = (chimera_gfx_present_info)CHIMERA_GFX_PRESENT_INFO_INIT( surface, texture); CHECK(chimera_gfx_present(first_context, &present_info) == CHIMERA_GFX_STATUS_INVALID_ARGUMENT); CHECK(chimera_gfx_texture_destroy(texture) == CHIMERA_GFX_STATUS_OK); CHECK(chimera_gfx_context_destroy(second_context) == CHIMERA_GFX_STATUS_OK); texture = NULL; CHECK(chimera_gfx_texture_create(first_context, &texture_desc, &texture) == CHIMERA_GFX_STATUS_OK); CHECK(chimera_gfx_texture_upload(texture, &upload) == CHIMERA_GFX_STATUS_OK); present_info = (chimera_gfx_present_info)CHIMERA_GFX_PRESENT_INFO_INIT( surface, texture); CHECK(chimera_gfx_present(first_context, &present_info) == CHIMERA_GFX_STATUS_INVALID_ARGUMENT); CHECK(chimera_gfx_texture_destroy(texture) == CHIMERA_GFX_STATUS_OK); stats.struct_size = sizeof(stats) - 1u; CHECK(chimera_gfx_surface_get_stats(surface, &stats) == CHIMERA_GFX_STATUS_INVALID_ARGUMENT); CHECK(chimera_gfx_surface_destroy(surface) == CHIMERA_GFX_STATUS_OK); surface_desc = (chimera_gfx_surface_desc)CHIMERA_GFX_SURFACE_DESC_INIT(1u, 1u); for (index = 0u; index < 16u; ++index) { CHECK(chimera_gfx_surface_create(first_context, &surface_desc, &surfaces[index]) == CHIMERA_GFX_STATUS_OK); } CHECK(chimera_gfx_surface_create(first_context, &surface_desc, &surfaces[16]) == CHIMERA_GFX_STATUS_LIMIT_EXCEEDED); CHECK(surfaces[16] == NULL); for (index = 0u; index < 16u; ++index) { CHECK(chimera_gfx_surface_destroy(surfaces[index]) == CHIMERA_GFX_STATUS_OK); } surface_desc.width = 4097u; CHECK(chimera_gfx_surface_create(first_context, &surface_desc, &surface) == CHIMERA_GFX_STATUS_LIMIT_EXCEEDED); CHECK(surface == NULL); CHECK(chimera_gfx_context_destroy(first_context) == CHIMERA_GFX_STATUS_OK); } int main(void) { test_complete_lifecycle(); test_resource_validation(); test_ownership_dimensions_and_limits(); return failures == 0 ? 0 : 1; }