From 6e26d320c623c4e933586371f9451186c128f29d Mon Sep 17 00:00:00 2001 From: Sylvain Date: Tue, 16 Mar 2021 15:09:34 +0100 Subject: [PATCH] Add sysrender interface --- src/render/SDL_render.c | 90 ++++++++++++++++++++++++++++++++++++++ src/render/SDL_sysrender.h | 7 ++- 2 files changed, 96 insertions(+), 1 deletion(-) diff --git a/src/render/SDL_render.c b/src/render/SDL_render.c index 99050ccb9..e7aa73fcb 100644 --- a/src/render/SDL_render.c +++ b/src/render/SDL_render.c @@ -562,6 +562,25 @@ QueueCmdCopyEx(SDL_Renderer *renderer, SDL_Texture * texture, return retval; } +static int +QueueCmdGeometry(SDL_Renderer *renderer, SDL_Texture *texture, + SDL_Vertex *vertices, int num_vertices, int *indices, int num_indices, float scale_x, float scale_y) +{ + SDL_RenderCommand *cmd; + int retval = -1; + if (texture) { + cmd = PrepQueueCmdDrawTexture(renderer, texture, SDL_RENDERCMD_GEOMETRY); + } else { + cmd = PrepQueueCmdDrawSolid(renderer, SDL_RENDERCMD_GEOMETRY); + } + if (cmd != NULL) { + retval = renderer->QueueGeometry(renderer, cmd, texture, vertices, num_vertices, indices, num_indices, scale_x, scale_y); + if (retval < 0) { + cmd->command = SDL_RENDERCMD_NO_OP; + } + } + return retval; +} static int UpdateLogicalSize(SDL_Renderer *renderer); @@ -3303,6 +3322,77 @@ SDL_RenderCopyExF(SDL_Renderer * renderer, SDL_Texture * texture, return retval < 0 ? retval : FlushRenderCommandsIfNotBatching(renderer); } +int +SDL_RenderGeometry(SDL_Renderer *renderer, + SDL_Texture *texture, + SDL_Vertex *vertices, int num_vertices, + int *indices, int num_indices) +{ + int i; + int retval; + int count = indices ? num_indices : num_vertices; + + CHECK_RENDERER_MAGIC(renderer, -1); + + if (!renderer->QueueGeometry) { + return SDL_Unsupported(); + } + + if (texture) { + CHECK_TEXTURE_MAGIC(texture, -1); + + if (renderer != texture->renderer) { + return SDL_SetError("Texture was not created with this renderer"); + } + } + + if (!vertices) { + return SDL_InvalidParamError("points"); + } + + if (count % 3 != 0) { + return SDL_InvalidParamError(indices ? "num_indices" : "num_vertices"); + } + + /* Don't draw while we're hidden */ + if (renderer->hidden) { + return 0; + } + + if (num_vertices < 3) { + return 0; + } + + if (texture && texture->native) { + texture = texture->native; + } + + if (texture) { + for (i = 0; i < num_vertices; ++i) { + if (vertices[i].tex_coord.x < 0 || vertices[i].tex_coord.y < 0 || vertices[i].tex_coord.x >= texture->w || vertices[i].tex_coord.y >= texture->h) { + return SDL_SetError("Values of 'vertices' out of bounds"); + } + } + } + + if (indices) { + for (i = 0; i < num_indices; ++i) { + if (indices[i] < 0 || indices[i] >= num_vertices) { + return SDL_SetError("Values of 'indices' out of bounds"); + } + } + } + + + if (texture) { + texture->last_command_generation = renderer->render_command_generation; + } + + retval = QueueCmdGeometry(renderer, texture, vertices, num_vertices, indices, num_indices, renderer->scale.x, renderer->scale.y); + + return retval < 0 ? retval : FlushRenderCommandsIfNotBatching(renderer); +} + int SDL_RenderReadPixels(SDL_Renderer * renderer, const SDL_Rect * rect, Uint32 format, void * pixels, int pitch) diff --git a/src/render/SDL_sysrender.h b/src/render/SDL_sysrender.h index 87d14c259..1beb4b248 100644 --- a/src/render/SDL_sysrender.h +++ b/src/render/SDL_sysrender.h @@ -75,7 +75,8 @@ typedef enum SDL_RENDERCMD_DRAW_LINES, SDL_RENDERCMD_FILL_RECTS, SDL_RENDERCMD_COPY, - SDL_RENDERCMD_COPY_EX + SDL_RENDERCMD_COPY_EX, + SDL_RENDERCMD_GEOMETRY } SDL_RenderCommandType; typedef struct SDL_RenderCommand @@ -128,6 +129,10 @@ struct SDL_Renderer int (*QueueCopyEx) (SDL_Renderer * renderer, SDL_RenderCommand *cmd, SDL_Texture * texture, const SDL_Rect * srcquad, const SDL_FRect * dstrect, const double angle, const SDL_FPoint *center, const SDL_RendererFlip flip); + + int (*QueueGeometry) (SDL_Renderer *renderer, SDL_RenderCommand *cmd, SDL_Texture *texture, + SDL_Vertex *vertices, int num_vertices, int *indices, int num_indices, float scale_x, float scale_y); + int (*RunCommandQueue) (SDL_Renderer * renderer, SDL_RenderCommand *cmd, void *vertices, size_t vertsize); int (*UpdateTexture) (SDL_Renderer * renderer, SDL_Texture * texture, const SDL_Rect * rect, const void *pixels,