From 6314ad7f26595b2d2c2af77fc2237166a926d7f8 Mon Sep 17 00:00:00 2001 From: Andrew Kesterson Date: Sun, 24 May 2026 21:59:29 -0400 Subject: [PATCH] Start abstracting the rendering backend away to make it easier to switch to GPU rendering later --- include/akgl/SDL_GameControllerDB.h | 2 +- include/akgl/actor.h | 4 +- include/akgl/game.h | 3 +- include/akgl/renderer.h | 25 +++++++ include/akgl/tilemap.h | 4 +- src/actor.c | 8 +-- src/draw.c | 4 +- src/game.c | 41 ++---------- src/renderer.c | 100 ++++++++++++++++++++++++++++ src/sprite.c | 2 +- src/text.c | 4 +- src/tilemap.c | 16 ++--- src/util.c | 28 ++------ 13 files changed, 159 insertions(+), 82 deletions(-) create mode 100644 include/akgl/renderer.h create mode 100644 src/renderer.c diff --git a/include/akgl/SDL_GameControllerDB.h b/include/akgl/SDL_GameControllerDB.h index f2ee080..941ff3d 100644 --- a/include/akgl/SDL_GameControllerDB.h +++ b/include/akgl/SDL_GameControllerDB.h @@ -1,7 +1,7 @@ #ifndef _SDL_GAMECONTROLLERDB_H_ #define _SDL_GAMECONTROLLERDB_H_ -// Taken from https://raw.githubusercontent.com/mdqinc/SDL_GameControllerDB/refs/heads/master/gamecontrollerdb.txt on Sun May 24 07:53:58 PM EDT 2026 +// Taken from https://raw.githubusercontent.com/mdqinc/SDL_GameControllerDB/refs/heads/master/gamecontrollerdb.txt on Sun May 24 09:58:23 PM EDT 2026 #define AKGL_SDL_GAMECONTROLLER_DB_LEN 2228 diff --git a/include/akgl/actor.h b/include/akgl/actor.h index 7778381..13b8d50 100644 --- a/include/akgl/actor.h +++ b/include/akgl/actor.h @@ -77,7 +77,7 @@ typedef struct akgl_Actor { struct akgl_Actor *children[AKGL_ACTOR_MAX_CHILDREN]; struct akgl_Actor *parent; akerr_ErrorContext AKERR_NOIGNORE *(*updatefunc)(struct akgl_Actor *obj); - akerr_ErrorContext AKERR_NOIGNORE *(*renderfunc)(struct akgl_Actor *obj, SDL_Renderer *renderer); + akerr_ErrorContext AKERR_NOIGNORE *(*renderfunc)(struct akgl_Actor *obj); akerr_ErrorContext AKERR_NOIGNORE *(*facefunc)(struct akgl_Actor *obj); akerr_ErrorContext AKERR_NOIGNORE *(*movementlogicfunc)(struct akgl_Actor *obj, SDL_Time curtimems); akerr_ErrorContext AKERR_NOIGNORE *(*changeframefunc)(struct akgl_Actor *obj, akgl_Sprite *curSprite, SDL_Time curtimems); @@ -86,7 +86,7 @@ typedef struct akgl_Actor { akerr_ErrorContext AKERR_NOIGNORE *akgl_actor_initialize(akgl_Actor *obj, char *name); akerr_ErrorContext AKERR_NOIGNORE *akgl_actor_set_character(akgl_Actor *obj, char *basecharname); -akerr_ErrorContext AKERR_NOIGNORE *akgl_actor_render(akgl_Actor *obj, SDL_Renderer *renderer); +akerr_ErrorContext AKERR_NOIGNORE *akgl_actor_render(akgl_Actor *obj); akerr_ErrorContext AKERR_NOIGNORE *akgl_actor_update(akgl_Actor *obj); akerr_ErrorContext AKERR_NOIGNORE *akgl_actor_logic_movement(akgl_Actor *obj, SDL_Time curtimems); akerr_ErrorContext AKERR_NOIGNORE *akgl_actor_logic_changeframe(akgl_Actor *obj, akgl_Sprite *curSprite, SDL_Time curtimems); diff --git a/include/akgl/game.h b/include/akgl/game.h index b22d69c..76ea81f 100644 --- a/include/akgl/game.h +++ b/include/akgl/game.h @@ -5,6 +5,7 @@ #include "types.h" #include #include "tilemap.h" +#include "renderer.h" #define AKGL_VERSION "0.1.0" @@ -41,13 +42,13 @@ typedef struct { } akgl_Game; extern SDL_Window *window; -extern SDL_Renderer *renderer; extern akgl_Tilemap gamemap; extern MIX_Audio *bgm; extern MIX_Mixer *akgl_mixer; extern MIX_Track *akgl_tracks[AKGL_GAME_AUDIO_MAX_TRACKS]; extern SDL_FRect camera; extern akgl_Game game; +extern akgl_RenderBackend renderer; #define AKGL_BITMASK_HAS(x, y) (x & y) == y #define AKGL_BITMASK_ADD(x, y) x |= y diff --git a/include/akgl/renderer.h b/include/akgl/renderer.h new file mode 100644 index 0000000..4b7db3c --- /dev/null +++ b/include/akgl/renderer.h @@ -0,0 +1,25 @@ +#ifndef _RENDERER_H_ +#define _RENDERER_H_ + +#include + +#include + +typedef struct akgl_RenderBackend { + SDL_Renderer *sdl_renderer; + akerr_ErrorContext AKERR_NOIGNORE *(*shutdown)(struct akgl_RenderBackend *self); + akerr_ErrorContext AKERR_NOIGNORE *(*frame_start)(struct akgl_RenderBackend *self); + akerr_ErrorContext AKERR_NOIGNORE *(*frame_end)(struct akgl_RenderBackend *self); + akerr_ErrorContext AKERR_NOIGNORE *(*draw_texture)(struct akgl_RenderBackend *self, SDL_Texture *texture, SDL_FRect *src, SDL_FRect *dest, double angle, SDL_FPoint *center, SDL_FlipMode flip); + akerr_ErrorContext AKERR_NOIGNORE *(*draw_mesh)(struct akgl_RenderBackend *self); +} akgl_RenderBackend; + +akerr_ErrorContext AKERR_NOIGNORE *akgl_render_2d_shutdown(akgl_RenderBackend *self); +akerr_ErrorContext AKERR_NOIGNORE *akgl_render_2d_frame_start(akgl_RenderBackend *self); +akerr_ErrorContext AKERR_NOIGNORE *akgl_render_2d_frame_end(akgl_RenderBackend *self); +akerr_ErrorContext AKERR_NOIGNORE *akgl_render_2d_draw_texture(akgl_RenderBackend *self, SDL_Texture *texture, SDL_FRect *src, SDL_FRect *dest, double angle, SDL_FPoint *center, SDL_FlipMode flip); +akerr_ErrorContext AKERR_NOIGNORE *akgl_render_2d_draw_mesh(akgl_RenderBackend *self); + +akerr_ErrorContext AKERR_NOIGNORE *akgl_render_init2d(akgl_RenderBackend *self); + +#endif // _RENDERER_H_ diff --git a/include/akgl/tilemap.h b/include/akgl/tilemap.h index 6f8a917..a02a0fe 100644 --- a/include/akgl/tilemap.h +++ b/include/akgl/tilemap.h @@ -101,8 +101,8 @@ typedef struct { } akgl_Tilemap; akerr_ErrorContext AKERR_NOIGNORE *akgl_tilemap_load(char *fname, akgl_Tilemap *dest); -akerr_ErrorContext AKERR_NOIGNORE *akgl_tilemap_draw(SDL_Renderer *renderer, akgl_Tilemap *dest, SDL_FRect *viewport, int layeridx); -akerr_ErrorContext AKERR_NOIGNORE *akgl_tilemap_draw_tileset(SDL_Renderer *renderer, akgl_Tilemap *dest, int tilesetidx); +akerr_ErrorContext AKERR_NOIGNORE *akgl_tilemap_draw(akgl_Tilemap *dest, SDL_FRect *viewport, int layeridx); +akerr_ErrorContext AKERR_NOIGNORE *akgl_tilemap_draw_tileset(akgl_Tilemap *dest, int tilesetidx); /* * These functions are part of the internal API and should not be called by the user. diff --git a/src/actor.c b/src/actor.c index 530615c..36db925 100644 --- a/src/actor.c +++ b/src/actor.c @@ -179,7 +179,6 @@ static akerr_ErrorContext *actor_visible(akgl_Actor *obj, SDL_FRect *camera, boo akgl_Sprite *curSprite = NULL; FAIL_ZERO_RETURN(errctx, obj, AKERR_NULLPOINTER, "NULL actor"); - FAIL_ZERO_RETURN(errctx, renderer, AKERR_NULLPOINTER, "NULL renderer"); FAIL_ZERO_RETURN(errctx, obj->basechar, AKERR_NULLPOINTER, "Actor has NULL base character reference"); ATTEMPT { @@ -203,7 +202,7 @@ static akerr_ErrorContext *actor_visible(akgl_Actor *obj, SDL_FRect *camera, boo SUCCEED_RETURN(errctx); } -akerr_ErrorContext *akgl_actor_render(akgl_Actor *obj, SDL_Renderer *renderer) +akerr_ErrorContext *akgl_actor_render(akgl_Actor *obj) { PREPARE_ERROR(errctx); akgl_Sprite *curSprite = NULL; @@ -212,7 +211,6 @@ akerr_ErrorContext *akgl_actor_render(akgl_Actor *obj, SDL_Renderer *renderer) SDL_FRect dest; FAIL_ZERO_RETURN(errctx, obj, AKERR_NULLPOINTER, "NULL actor"); - FAIL_ZERO_RETURN(errctx, renderer, AKERR_NULLPOINTER, "NULL renderer"); FAIL_ZERO_RETURN(errctx, obj->basechar, AKERR_NULLPOINTER, "Actor has NULL base character reference"); ATTEMPT { @@ -258,7 +256,7 @@ akerr_ErrorContext *akgl_actor_render(akgl_Actor *obj, SDL_Renderer *renderer) dest.w = curSprite->width * obj->scale; dest.h = curSprite->width * obj->scale; - SDL_RenderTexture(renderer, curSprite->sheet->texture, &src, &dest); + PASS(errctx, renderer.draw_texture(&renderer, curSprite->sheet->texture, &src, &dest, 0, NULL, SDL_FLIP_NONE)); SUCCEED_RETURN(errctx); } @@ -307,7 +305,7 @@ void akgl_registry_iterate_actor(void *userdata, SDL_PropertiesID registry, cons obj->scale = 1.0; } if ( AKGL_BITMASK_HAS(opflags->flags, AKGL_ITERATOR_OP_RENDER) ) { - CATCH(errctx, obj->renderfunc(obj, renderer)); + CATCH(errctx, obj->renderfunc(obj)); } } CLEANUP { } PROCESS(errctx) { diff --git a/src/draw.c b/src/draw.c index 3338b2b..ad4f9a4 100644 --- a/src/draw.c +++ b/src/draw.c @@ -20,11 +20,11 @@ void akgl_draw_background(int w, int h) for (x = 0; x < w; x += dx) { /* use an 8x8 checkerboard pattern */ i = (((x ^ y) >> 3) & 1); - SDL_SetRenderDrawColor(renderer, col[i].r, col[i].g, col[i].b, col[i].a); + SDL_SetRenderDrawColor(renderer.sdl_renderer, col[i].r, col[i].g, col[i].b, col[i].a); rect.x = (float)x; rect.y = (float)y; - SDL_RenderFillRect(renderer, &rect); + SDL_RenderFillRect(renderer.sdl_renderer, &rect); } } } diff --git a/src/game.c b/src/game.c index 32d00ea..6bf248a 100644 --- a/src/game.c +++ b/src/game.c @@ -18,7 +18,7 @@ #include SDL_Window *window = NULL; -SDL_Renderer *renderer = NULL; +akgl_RenderBackend renderer; akgl_Frame ball; akgl_Frame paddle1; akgl_Frame paddle2; @@ -87,59 +87,28 @@ akerr_ErrorContext AKERR_NOIGNORE *akgl_game_init() } PASS(errctx, akgl_controller_open_gamepads()); - SUCCEED_RETURN(errctx); -} - -akerr_ErrorContext AKERR_NOIGNORE *akgl_game_init_screen() -{ - akgl_String *width = NULL; - akgl_String *height = NULL; - int screenwidth; - int screenheight; - - PREPARE_ERROR(e); - - PASS(e, akgl_get_property("game.screenwidth", &width, "0")); - PASS(e, akgl_get_property("game.screenheight", &height, "0")); - PASS(e, aksl_atoi(width->data, &screenwidth)); - PASS(e, aksl_atoi(height->data, &screenheight)); - SDL_Log("Initializing screen (%sx%s = %dx%d)", width->data, height->data, screenwidth, screenheight); - PASS(e, akgl_heap_release_string(width)); - PASS(e, akgl_heap_release_string(height)); - FAIL_ZERO_RETURN( - e, - SDL_CreateWindowAndRenderer(game.uri, screenwidth, screenheight, 0, &window, &renderer), - AKGL_ERR_SDL, - "Couldn't create window/renderer: %s", - SDL_GetError()); - - FAIL_ZERO_RETURN( - e, + errctx, MIX_Init(), AKGL_ERR_SDL, "Couldn't initialize audio: %s", SDL_GetError()); akgl_mixer = MIX_CreateMixerDevice(SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK, 0); FAIL_ZERO_RETURN( - e, + errctx, akgl_mixer, AKGL_ERR_SDL, "Unable to create mixer device: %s", SDL_GetError()); FAIL_ZERO_RETURN( - e, + errctx, TTF_Init(), AKGL_ERR_SDL, "Couldn't initialize front engine: %s", SDL_GetError()); - camera.x = 0; - camera.y = 0; - camera.w = screenwidth; - camera.h = screenheight; - SUCCEED_RETURN(e); + SUCCEED_RETURN(errctx); } void akgl_game_updateFPS() diff --git a/src/renderer.c b/src/renderer.c new file mode 100644 index 0000000..3b1f8b2 --- /dev/null +++ b/src/renderer.c @@ -0,0 +1,100 @@ +#include + +#include +#include +#include +#include +#include + +#include +#include + +akerr_ErrorContext AKERR_NOIGNORE *akgl_render_init2d(akgl_RenderBackend *self) +{ + akgl_String *width = NULL; + akgl_String *height = NULL; + int screenwidth; + int screenheight; + PREPARE_ERROR(e); + FAIL_ZERO_RETURN(e, self, AKERR_NULLPOINTER, "self"); + + PASS(e, akgl_get_property("game.screenwidth", &width, "0")); + PASS(e, akgl_get_property("game.screenheight", &height, "0")); + PASS(e, aksl_atoi(width->data, &screenwidth)); + PASS(e, aksl_atoi(height->data, &screenheight)); + SDL_Log("Initializing screen (%sx%s = %dx%d)", width->data, height->data, screenwidth, screenheight); + PASS(e, akgl_heap_release_string(width)); + PASS(e, akgl_heap_release_string(height)); + + FAIL_ZERO_RETURN( + e, + SDL_CreateWindowAndRenderer(game.uri, screenwidth, screenheight, 0, &window, &self->sdl_renderer), + AKGL_ERR_SDL, + "Couldn't create window/renderer: %s", + SDL_GetError()); + + camera.x = 0; + camera.y = 0; + camera.w = screenwidth; + camera.h = screenheight; + + self->shutdown = &akgl_render_2d_shutdown; + self->frame_start = &akgl_render_2d_frame_start; + self->frame_end = &akgl_render_2d_frame_end; + self->draw_texture = &akgl_render_2d_draw_texture; + self->draw_mesh = &akgl_render_2d_draw_mesh; + SUCCEED_RETURN(e); +} + + +akerr_ErrorContext AKERR_NOIGNORE *akgl_render_2d_shutdown(akgl_RenderBackend *self) +{ + PREPARE_ERROR(e); + SUCCEED_RETURN(e); +} + +akerr_ErrorContext AKERR_NOIGNORE *akgl_render_2d_frame_start(akgl_RenderBackend *self) +{ + PREPARE_ERROR(e); + SUCCEED_RETURN(e); +} + +akerr_ErrorContext AKERR_NOIGNORE *akgl_render_2d_frame_end(akgl_RenderBackend *self) +{ + PREPARE_ERROR(e); + FAIL_ZERO_RETURN(e, renderer.sdl_renderer, AKERR_NULLPOINTER, "No valid SDL rendering backend"); + SDL_RenderPresent(renderer.sdl_renderer); + SUCCEED_RETURN(e); +} + +akerr_ErrorContext AKERR_NOIGNORE *akgl_render_2d_draw_texture(akgl_RenderBackend *self, SDL_Texture *texture, SDL_FRect *src, SDL_FRect *dest, double angle, SDL_FPoint *center, SDL_FlipMode flip) +{ + PREPARE_ERROR(e); + FAIL_ZERO_RETURN(e, self, AKERR_NULLPOINTER, "self"); + FAIL_ZERO_RETURN(e, texture, AKERR_NULLPOINTER, "texture"); + //FAIL_ZERO_RETURN(e, src, AKERR_NULLPOINTER, "src"); + //FAIL_ZERO_RETURN(e, dest, AKERR_NULLPOINTER, "dest"); + + if ( angle != 0 ) { + FAIL_ZERO_RETURN(e, center, AKERR_NULLPOINTER, "center"); + FAIL_ZERO_RETURN( + e, + SDL_RenderTextureRotated(self->sdl_renderer, texture, src, dest, angle, center, flip), + AKERR_NULLPOINTER, "%s", SDL_GetError() + ); + } else { + FAIL_ZERO_RETURN( + e, + SDL_RenderTexture(self->sdl_renderer, texture, src, dest), + AKERR_NULLPOINTER, "%s", SDL_GetError() + ); + } + SUCCEED_RETURN(e); +} + +akerr_ErrorContext AKERR_NOIGNORE *akgl_render_2d_draw_mesh(akgl_RenderBackend *self) +{ + PREPARE_ERROR(e); + FAIL_RETURN(e, AKERR_API, "Not implemented"); +} + diff --git a/src/sprite.c b/src/sprite.c index 800eccb..3739ddc 100644 --- a/src/sprite.c +++ b/src/sprite.c @@ -174,7 +174,7 @@ akerr_ErrorContext *akgl_spritesheet_initialize(akgl_SpriteSheet *sheet, int spr strncpy((char *)&sheet->name, filename, AKGL_SPRITE_SHEET_MAX_FILENAME_LENGTH); //snprintf((char *)&tmpstr->data, AKGL_MAX_STRING_LENGTH, "%s%s", SDL_GetBasePath(), filename); - sheet->texture = IMG_LoadTexture(renderer, filename); + sheet->texture = IMG_LoadTexture(renderer.sdl_renderer, filename); FAIL_ZERO_BREAK(errctx, sheet->texture, AKGL_ERR_SDL, "Failed loading asset %s : %s", filename, SDL_GetError()); FAIL_ZERO_BREAK( diff --git a/src/text.c b/src/text.c index 40a4b7c..25b0106 100644 --- a/src/text.c +++ b/src/text.c @@ -49,12 +49,12 @@ akerr_ErrorContext AKERR_NOIGNORE *akgl_text_rendertextat(TTF_Font *font, char * color); } FAIL_ZERO_RETURN(errctx, textsurf, AKERR_NULLPOINTER, "%s", SDL_GetError()); - texture = SDL_CreateTextureFromSurface(renderer, textsurf); + texture = SDL_CreateTextureFromSurface(renderer.sdl_renderer, textsurf); FAIL_ZERO_RETURN(errctx, texture, AKERR_NULLPOINTER, "%s", SDL_GetError()); dest.x = x; dest.y = y; SDL_GetTextureSize(texture, &dest.w, &dest.h); - FAIL_ZERO_RETURN(errctx, SDL_RenderTexture(renderer, texture, NULL, &dest), AKERR_NULLPOINTER, "%s", SDL_GetError()); + PASS(errctx, renderer.draw_texture(&renderer, texture, NULL, &dest, 0, NULL, SDL_FLIP_NONE)); SDL_DestroyTexture(texture); SDL_DestroySurface(textsurf); SUCCEED_RETURN(errctx); diff --git a/src/tilemap.c b/src/tilemap.c index e98ef15..4db41d3 100644 --- a/src/tilemap.c +++ b/src/tilemap.c @@ -135,7 +135,7 @@ akerr_ErrorContext *akgl_tilemap_load_tilesets_each(json_t *tileset, akgl_Tilema } PROCESS(e) { } FINISH(e, true); - dest->tilesets[tsidx].texture = IMG_LoadTexture(renderer, (char *)&dest->tilesets[tsidx].imagefilename); + dest->tilesets[tsidx].texture = IMG_LoadTexture(renderer.sdl_renderer, (char *)&dest->tilesets[tsidx].imagefilename); FAIL_ZERO_RETURN(e, dest->tilesets[tsidx].texture, AKERR_NULLPOINTER, "Failed loading tileset image : %s", SDL_GetError()); SUCCEED_RETURN(e); @@ -372,7 +372,7 @@ akerr_ErrorContext *akgl_tilemap_load_layer_image(akgl_Tilemap *dest, json_t *ro ); RESTORE_GCC_WARNINGS - dest->layers[layerid].texture = IMG_LoadTexture(renderer, (char *)fpath->data); + dest->layers[layerid].texture = IMG_LoadTexture(renderer.sdl_renderer, (char *)fpath->data); FAIL_ZERO_BREAK(errctx, dest->layers[layerid].texture, AKGL_ERR_SDL, "%s", SDL_GetError()); dest->layers[layerid].width = dest->layers[layerid].texture->w; dest->layers[layerid].height = dest->layers[layerid].texture->h; @@ -500,7 +500,7 @@ akerr_ErrorContext *akgl_tilemap_load(char *fname, akgl_Tilemap *dest) SUCCEED_RETURN(errctx); } -akerr_ErrorContext *akgl_tilemap_draw(SDL_Renderer *renderer, akgl_Tilemap *map, SDL_FRect *viewport, int layeridx) +akerr_ErrorContext *akgl_tilemap_draw(akgl_Tilemap *map, SDL_FRect *viewport, int layeridx) { PREPARE_ERROR(errctx); SDL_FRect dest = {.x = 0, .y = 0, .w = 0, .h = 0};; @@ -556,7 +556,7 @@ akerr_ErrorContext *akgl_tilemap_draw(SDL_Renderer *renderer, akgl_Tilemap *map, src.h = map->layers[layeridx].height; dest.w = map->layers[layeridx].width; dest.h = map->layers[layeridx].height; - SDL_RenderTexture(renderer, map->layers[layeridx].texture, &src, &dest); + PASS(errctx, renderer.draw_texture(&renderer, map->layers[layeridx].texture, &src, &dest, 0, NULL, SDL_FLIP_NONE)); SUCCEED_RETURN(errctx); } @@ -611,7 +611,7 @@ akerr_ErrorContext *akgl_tilemap_draw(SDL_Renderer *renderer, akgl_Tilemap *map, dest.y, dest.w, dest.h);*/ - SDL_RenderTexture(renderer, map->tilesets[tilesetidx].texture, &src, &dest); + PASS(errctx, renderer.draw_texture(&renderer, map->tilesets[tilesetidx].texture, &src, &dest, 0, NULL, SDL_FLIP_NONE)); } } dest.x += map->tilewidth; @@ -621,14 +621,14 @@ akerr_ErrorContext *akgl_tilemap_draw(SDL_Renderer *renderer, akgl_Tilemap *map, SUCCEED_RETURN(errctx); } -akerr_ErrorContext *akgl_tilemap_draw_tileset(SDL_Renderer *renderer, akgl_Tilemap *map, int tilesetidx) +akerr_ErrorContext *akgl_tilemap_draw_tileset(akgl_Tilemap *map, int tilesetidx) { PREPARE_ERROR(errctx); SDL_FRect dest; SDL_FRect src; int tilenum = 0; /* - * Render every tile in a tileset to the given renderer + * Render every tile in a tileset to the default renderer * (this is a debugging tool that shows that the recorded tile offsets are correct, * by proving that we can reconstruct the original tileset image) */ @@ -666,7 +666,7 @@ akerr_ErrorContext *akgl_tilemap_draw_tileset(SDL_Renderer *renderer, akgl_Tilem dest.y, dest.w, dest.h);*/ - SDL_RenderTexture(renderer, map->tilesets[tilesetidx].texture, &src, &dest); + PASS(errctx, renderer.draw_texture(&renderer, map->tilesets[tilesetidx].texture, &src, &dest, 0, NULL, SDL_FLIP_NONE)); } SUCCEED_RETURN(errctx); } diff --git a/src/util.c b/src/util.c index 7e7b674..28ff3d5 100644 --- a/src/util.c +++ b/src/util.c @@ -202,17 +202,9 @@ akerr_ErrorContext *akgl_render_and_compare(SDL_Texture *t1, SDL_Texture *t2, in FAIL_ZERO_BREAK(errctx, t2, AKERR_NULLPOINTER, "NULL texture"); CATCH(errctx, akgl_heap_next_string(&tmpstring)); - SDL_RenderClear(renderer); - FAIL_ZERO_BREAK( - errctx, - SDL_RenderTexture( - renderer, - t1, - &src, - &dest), - AKGL_ERR_SDL, - "Failed to render test texture"); - s1 = SDL_RenderReadPixels(renderer, &read); + SDL_RenderClear(renderer.sdl_renderer); + CATCH(errctx, renderer.draw_texture(&renderer, t1, &src, &dest, 0, NULL, SDL_FLIP_NONE)); + s1 = SDL_RenderReadPixels(renderer.sdl_renderer, &read); FAIL_ZERO_BREAK(errctx, s1, AKGL_ERR_SDL, "Failed to read pixels from renderer"); if ( writeout != NULL ) { @@ -226,18 +218,10 @@ akerr_ErrorContext *akgl_render_and_compare(SDL_Texture *t1, SDL_Texture *t2, in SDL_GetError()); } - SDL_RenderClear(renderer); + SDL_RenderClear(renderer.sdl_renderer); - FAIL_ZERO_BREAK( - errctx, - SDL_RenderTexture( - renderer, - t2, - &src, - &dest), - AKGL_ERR_SDL, - "Failed to render test texture"); - s2 = SDL_RenderReadPixels(renderer, &read); + CATCH(errctx, renderer.draw_texture(&renderer, t1, &src, &dest, 0, NULL, SDL_FLIP_NONE)); + s2 = SDL_RenderReadPixels(renderer.sdl_renderer, &read); FAIL_ZERO_BREAK(errctx, s2, AKGL_ERR_SDL, "Failed to read pixels from renderer"); CATCH(errctx, akgl_compare_sdl_surfaces(s1, s2));