170 lines
7.8 KiB
C
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;
|
|
}
|