Files
chimera-gfx-Public/tests/test_mock_integration.c
Chimera GFX release export a6037502d7
phase0-ci / build-and-audit (push) Successful in 2m14s
Publish Chimera GFX source
2026-09-03 03:27:14 +02:00

170 lines
7.8 KiB
C

/* SPDX-License-Identifier: GPL-3.0-or-later */
#include <chimera/gfx/chimera_gfx.h>
#include <stdint.h>
#include <stdio.h>
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;
}